88 ArrayPrototypeSome,
99 ObjectDefineProperty,
1010 ObjectGetPrototypeOf,
11+ ObjectPrototypeHasOwnProperty,
1112 ObjectSetPrototypeOf,
1213 ReflectApply,
1314 SafePromiseAllReturnVoid,
@@ -43,6 +44,7 @@ const {
4344 validateObject,
4445 validateUint32,
4546 validateString,
47+ validateInternalField,
4648} = require ( 'internal/validators' ) ;
4749
4850const binding = internalBinding ( 'module_wrap' ) ;
@@ -75,6 +77,13 @@ const kLink = Symbol('kLink');
7577
7678const { isContext } = require ( 'internal/vm' ) ;
7779
80+ function isModule ( object ) {
81+ if ( typeof object !== 'object' || object === null || ! ObjectPrototypeHasOwnProperty ( object , kWrap ) ) {
82+ return false ;
83+ }
84+ return true ;
85+ }
86+
7887class Module {
7988 constructor ( options ) {
8089 emitExperimentalWarning ( 'VM Modules' ) ;
@@ -148,50 +157,38 @@ class Module {
148157 }
149158
150159 get identifier ( ) {
151- if ( this [ kWrap ] === undefined ) {
152- throw new ERR_VM_MODULE_NOT_MODULE ( ) ;
153- }
160+ validateInternalField ( this , kWrap , 'Module' ) ;
154161 return this [ kWrap ] . url ;
155162 }
156163
157164 get context ( ) {
158- if ( this [ kWrap ] === undefined ) {
159- throw new ERR_VM_MODULE_NOT_MODULE ( ) ;
160- }
165+ validateInternalField ( this , kWrap , 'Module' ) ;
161166 return this [ kContext ] ;
162167 }
163168
164169 get namespace ( ) {
165- if ( this [ kWrap ] === undefined ) {
166- throw new ERR_VM_MODULE_NOT_MODULE ( ) ;
167- }
170+ validateInternalField ( this , kWrap , 'Module' ) ;
168171 if ( this [ kWrap ] . getStatus ( ) < kInstantiated ) {
169172 throw new ERR_VM_MODULE_STATUS ( 'must not be unlinked or linking' ) ;
170173 }
171174 return this [ kWrap ] . getNamespace ( ) ;
172175 }
173176
174177 get status ( ) {
175- if ( this [ kWrap ] === undefined ) {
176- throw new ERR_VM_MODULE_NOT_MODULE ( ) ;
177- }
178+ validateInternalField ( this , kWrap , 'Module' ) ;
178179 return STATUS_MAP [ this [ kWrap ] . getStatus ( ) ] ;
179180 }
180181
181182 get error ( ) {
182- if ( this [ kWrap ] === undefined ) {
183- throw new ERR_VM_MODULE_NOT_MODULE ( ) ;
184- }
183+ validateInternalField ( this , kWrap , 'Module' ) ;
185184 if ( this [ kWrap ] . getStatus ( ) !== kErrored ) {
186185 throw new ERR_VM_MODULE_STATUS ( 'must be errored' ) ;
187186 }
188187 return this [ kWrap ] . getError ( ) ;
189188 }
190189
191190 async link ( linker ) {
192- if ( this [ kWrap ] === undefined ) {
193- throw new ERR_VM_MODULE_NOT_MODULE ( ) ;
194- }
191+ validateInternalField ( this , kWrap , 'Module' ) ;
195192 validateFunction ( linker , 'linker' ) ;
196193 if ( this . status === 'linked' ) {
197194 throw new ERR_VM_MODULE_ALREADY_LINKED ( ) ;
@@ -204,10 +201,7 @@ class Module {
204201 }
205202
206203 async evaluate ( options = kEmptyObject ) {
207- if ( this [ kWrap ] === undefined ) {
208- throw new ERR_VM_MODULE_NOT_MODULE ( ) ;
209- }
210-
204+ validateInternalField ( this , kWrap , 'Module' ) ;
211205 validateObject ( options , 'options' ) ;
212206
213207 let timeout = options . timeout ;
@@ -230,9 +224,7 @@ class Module {
230224 }
231225
232226 [ customInspectSymbol ] ( depth , options ) {
233- if ( this [ kWrap ] === undefined ) {
234- throw new ERR_VM_MODULE_NOT_MODULE ( ) ;
235- }
227+ validateInternalField ( this , kWrap , 'Module' ) ;
236228 if ( typeof depth === 'number' && depth < 0 )
237229 return this ;
238230
@@ -307,7 +299,7 @@ class SourceTextModule extends Module {
307299
308300 const promises = this [ kWrap ] . link ( async ( identifier , attributes ) => {
309301 const module = await linker ( identifier , this , { attributes, assert : attributes } ) ;
310- if ( module [ kWrap ] === undefined ) {
302+ if ( ! isModule ( module ) ) {
311303 throw new ERR_VM_MODULE_NOT_MODULE ( ) ;
312304 }
313305 if ( module . context !== this . context ) {
@@ -338,19 +330,13 @@ class SourceTextModule extends Module {
338330 }
339331
340332 get dependencySpecifiers ( ) {
341- if ( this [ kWrap ] === undefined ) {
342- throw new ERR_VM_MODULE_NOT_MODULE ( ) ;
343- }
344- if ( this [ kDependencySpecifiers ] === undefined ) {
345- this [ kDependencySpecifiers ] = this [ kWrap ] . getStaticDependencySpecifiers ( ) ;
346- }
333+ validateInternalField ( this , kDependencySpecifiers , 'SourceTextModule' ) ;
334+ this [ kDependencySpecifiers ] ??= this [ kWrap ] . getStaticDependencySpecifiers ( ) ;
347335 return this [ kDependencySpecifiers ] ;
348336 }
349337
350338 get status ( ) {
351- if ( this [ kWrap ] === undefined ) {
352- throw new ERR_VM_MODULE_NOT_MODULE ( ) ;
353- }
339+ validateInternalField ( this , kDependencySpecifiers , 'SourceTextModule' ) ;
354340 if ( this . #error !== kNoError ) {
355341 return 'errored' ;
356342 }
@@ -361,9 +347,7 @@ class SourceTextModule extends Module {
361347 }
362348
363349 get error ( ) {
364- if ( this [ kWrap ] === undefined ) {
365- throw new ERR_VM_MODULE_NOT_MODULE ( ) ;
366- }
350+ validateInternalField ( this , kDependencySpecifiers , 'SourceTextModule' ) ;
367351 if ( this . #error !== kNoError ) {
368352 return this . #error;
369353 }
@@ -416,9 +400,7 @@ class SyntheticModule extends Module {
416400 }
417401
418402 setExport ( name , value ) {
419- if ( this [ kWrap ] === undefined ) {
420- throw new ERR_VM_MODULE_NOT_MODULE ( ) ;
421- }
403+ validateInternalField ( this , kWrap , 'SyntheticModule' ) ;
422404 validateString ( name , 'name' ) ;
423405 if ( this [ kWrap ] . getStatus ( ) < kInstantiated ) {
424406 throw new ERR_VM_MODULE_STATUS ( 'must be linked' ) ;
@@ -433,7 +415,7 @@ function importModuleDynamicallyWrap(importModuleDynamically) {
433415 if ( isModuleNamespaceObject ( m ) ) {
434416 return m ;
435417 }
436- if ( ! m || m [ kWrap ] === undefined ) {
418+ if ( ! isModule ( m ) ) {
437419 throw new ERR_VM_MODULE_NOT_MODULE ( ) ;
438420 }
439421 if ( m . status === 'errored' ) {
0 commit comments