@@ -104,22 +104,32 @@ var module = (function () {
104
104
// Like, natives.fs is the contents of lib/fs.js
105
105
var natives = process . binding ( 'natives' ) ;
106
106
107
- function loadNative ( id ) {
107
+ // Native modules don't need a full require function. So we can bootstrap
108
+ // most of the system with this mini-require.
109
+ function requireNative ( id ) {
110
+ if ( internalModuleCache [ id ] ) return internalModuleCache [ id ] . exports ;
111
+ if ( ! natives [ id ] ) throw new Error ( 'No such native module ' + id ) ;
112
+
113
+ // REPL is a special case, because it needs the real require.
114
+ if ( id == 'repl' ) {
115
+ var replModule = new Module ( "repl" ) ;
116
+ replModule . _compile ( natives . repl , 'repl.js' ) ;
117
+ internalModuleCache . repl = replModule ;
118
+ return replModule . exports ;
119
+ }
120
+
121
+ var fn = process . compile (
122
+ "(function (exports, require) {" + natives [ id ] + "\n})" ,
123
+ id + '.js' ) ;
108
124
var m = new Module ( id ) ;
125
+ fn ( m . exports , requireNative ) ;
126
+ m . loaded = true ;
109
127
internalModuleCache [ id ] = m ;
110
- var e = m . _compile ( natives [ id ] , id + ".js" ) ;
111
- if ( e ) throw e ; // error compiling native module
112
- return m ;
128
+ return m . exports ;
113
129
}
114
130
115
131
exports . requireNative = requireNative ;
116
132
117
- function requireNative ( id ) {
118
- if ( internalModuleCache [ id ] ) return internalModuleCache [ id ] . exports ;
119
- if ( ! natives [ id ] ) throw new Error ( 'No such native module ' + id ) ;
120
- return loadNative ( id ) . exports ;
121
- }
122
-
123
133
124
134
// Modules
125
135
@@ -230,7 +240,7 @@ var module = (function () {
230
240
}
231
241
if ( natives [ id ] ) {
232
242
debug ( 'load native module ' + request ) ;
233
- return loadNative ( id ) . exports ;
243
+ return requireNative ( id ) ;
234
244
}
235
245
236
246
var cachedModule = moduleCache [ filename ] ;
0 commit comments