123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- var natives = process.binding('natives')
- var module = require('module')
- var normalRequire = require
- exports.source = src
- exports.require = req
- var vm = require('vm')
- // fallback for 0.x support
- var runInThisContext, ContextifyScript, Script
- /*istanbul ignore next*/
- try {
- ContextifyScript = process.binding('contextify').ContextifyScript;
- /*istanbul ignore next*/
- if (process.version.split('.')[0].length > 2) { // v10.0.0 and above
- runInThisContext = vm.runInThisContext;
- } else {
- runInThisContext = function runInThisContext(code, options) {
- var script = new ContextifyScript(code, options);
- return script.runInThisContext();
- }
- }
- } catch (er) {
- Script = process.binding('evals').NodeScript;
- runInThisContext = Script.runInThisContext;
- }
- var wrap = [
- '(function (internalBinding) {' +
- ' return function (exports, require, module, __filename, __dirname) { ',
- '\n };\n});'
- ];
- // Basically the same functionality as node's (buried deep)
- // NativeModule class, but without caching, or internal/ blocking,
- // or a class, since that's not really necessary. I assume that if
- // you're loading something with this module, it's because you WANT
- // a separate copy. However, to preserve semantics, any require()
- // calls made throughout the internal module load IS cached.
- function req (id, whitelist) {
- var cache = Object.create(null)
- if (Array.isArray(whitelist)) {
- // a whitelist of things to pull from the "actual" native modules
- whitelist.forEach(function (id) {
- cache[id] = {
- loading: false,
- loaded: true,
- filename: id + '.js',
- exports: require(id)
- }
- })
- }
- return req_(id, cache)
- }
- function req_ (id, cache) {
- // Buffer is special, because it's a type rather than a "normal"
- // class, and many things depend on `Buffer.isBuffer` working.
- if (id === 'buffer') {
- return require('buffer')
- }
- // native_module isn't actually a natives binding.
- // weird, right?
- if (id === 'native_module') {
- return {
- getSource: src,
- wrap: function (script) {
- return wrap[0] + script + wrap[1]
- },
- wrapper: wrap,
- _cache: cache,
- _source: natives,
- nonInternalExists: function (id) {
- return id.indexOf('internal/') !== 0;
- }
- }
- }
- var source = src(id)
- if (!source) {
- return undefined
- }
- source = wrap[0] + source + wrap[1]
- var internalBinding = function(name) {
- if (name === 'types') {
- return process.binding('util');
- } else {
- try {
- return process.binding(name);
- } catch (e) {}
- return {};
- }
- }
- var cachingRequire = function require (id) {
- if (cache[id]) {
- return cache[id].exports
- }
- if (id === 'internal/bootstrap/loaders' || id === 'internal/process') {
- // Provide just enough to keep `graceful-fs@3` working and tests passing.
- // For now.
- return {
- internalBinding: internalBinding,
- NativeModule: {
- _source: process.binding('natives'),
- nonInternalExists: function(id) {
- return !id.startsWith('internal/');
- }
- }
- };
- }
- return req_(id, cache)
- }
- var nm = {
- exports: {},
- loading: true,
- loaded: false,
- filename: id + '.js'
- }
- cache[id] = nm
- var fn
- var setV8Flags = false
- try {
- require('v8').setFlagsFromString('--allow_natives_syntax')
- setV8Flags = true
- } catch (e) {}
- try {
- /* istanbul ignore else */
- if (ContextifyScript) {
- fn = runInThisContext(source, {
- filename: nm.filename,
- lineOffset: 0,
- displayErrors: true
- });
- } else {
- fn = runInThisContext(source, nm.filename, true);
- }
- fn(internalBinding)(nm.exports, cachingRequire, nm, nm.filename, '<no dirname available>')
- nm.loaded = true
- } finally {
- nm.loading = false
- /*istanbul ignore next*/
- if (setV8Flags) {
- // Ref: https://github.com/nodejs/node/blob/591a24b819d53a555463b1cbf9290a6d8bcc1bcb/lib/internal/bootstrap_node.js#L429-L434
- var re = /^--allow[-_]natives[-_]syntax$/
- if (!process.execArgv.some(function (s) { return re.test(s) }))
- require('v8').setFlagsFromString('--noallow_natives_syntax')
- }
- }
- return nm.exports
- }
- function src (id) {
- return natives[id]
- }
|