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' ) ;
@@ -147,50 +156,38 @@ class Module {
147156 }
148157
149158 get identifier ( ) {
150- if ( this [ kWrap ] === undefined ) {
151- throw new ERR_VM_MODULE_NOT_MODULE ( ) ;
152- }
159+ validateInternalField ( this , kWrap , 'Module' ) ;
153160 return this [ kWrap ] . url ;
154161 }
155162
156163 get context ( ) {
157- if ( this [ kWrap ] === undefined ) {
158- throw new ERR_VM_MODULE_NOT_MODULE ( ) ;
159- }
164+ validateInternalField ( this , kWrap , 'Module' ) ;
160165 return this [ kContext ] ;
161166 }
162167
163168 get namespace ( ) {
164- if ( this [ kWrap ] === undefined ) {
165- throw new ERR_VM_MODULE_NOT_MODULE ( ) ;
166- }
169+ validateInternalField ( this , kWrap , 'Module' ) ;
167170 if ( this [ kWrap ] . getStatus ( ) < kInstantiated ) {
168171 throw new ERR_VM_MODULE_STATUS ( 'must not be unlinked or linking' ) ;
169172 }
170173 return this [ kWrap ] . getNamespace ( ) ;
171174 }
172175
173176 get status ( ) {
174- if ( this [ kWrap ] === undefined ) {
175- throw new ERR_VM_MODULE_NOT_MODULE ( ) ;
176- }
177+ validateInternalField ( this , kWrap , 'Module' ) ;
177178 return STATUS_MAP [ this [ kWrap ] . getStatus ( ) ] ;
178179 }
179180
180181 get error ( ) {
181- if ( this [ kWrap ] === undefined ) {
182- throw new ERR_VM_MODULE_NOT_MODULE ( ) ;
183- }
182+ validateInternalField ( this , kWrap , 'Module' ) ;
184183 if ( this [ kWrap ] . getStatus ( ) !== kErrored ) {
185184 throw new ERR_VM_MODULE_STATUS ( 'must be errored' ) ;
186185 }
187186 return this [ kWrap ] . getError ( ) ;
188187 }
189188
190189 async link ( linker ) {
191- if ( this [ kWrap ] === undefined ) {
192- throw new ERR_VM_MODULE_NOT_MODULE ( ) ;
193- }
190+ validateInternalField ( this , kWrap , 'Module' ) ;
194191 validateFunction ( linker , 'linker' ) ;
195192 if ( this . status === 'linked' ) {
196193 throw new ERR_VM_MODULE_ALREADY_LINKED ( ) ;
@@ -203,10 +200,7 @@ class Module {
203200 }
204201
205202 async evaluate ( options = kEmptyObject ) {
206- if ( this [ kWrap ] === undefined ) {
207- throw new ERR_VM_MODULE_NOT_MODULE ( ) ;
208- }
209-
203+ validateInternalField ( this , kWrap , 'Module' ) ;
210204 validateObject ( options , 'options' ) ;
211205
212206 let timeout = options . timeout ;
@@ -229,9 +223,7 @@ class Module {
229223 }
230224
231225 [ customInspectSymbol ] ( depth , options ) {
232- if ( this [ kWrap ] === undefined ) {
233- throw new ERR_VM_MODULE_NOT_MODULE ( ) ;
234- }
226+ validateInternalField ( this , kWrap , 'Module' ) ;
235227 if ( typeof depth === 'number' && depth < 0 )
236228 return this ;
237229
@@ -306,7 +298,7 @@ class SourceTextModule extends Module {
306298
307299 const promises = this [ kWrap ] . link ( async ( identifier , attributes ) => {
308300 const module = await linker ( identifier , this , { attributes, assert : attributes } ) ;
309- if ( module [ kWrap ] === undefined ) {
301+ if ( ! isModule ( module ) ) {
310302 throw new ERR_VM_MODULE_NOT_MODULE ( ) ;
311303 }
312304 if ( module . context !== this . context ) {
@@ -337,19 +329,13 @@ class SourceTextModule extends Module {
337329 }
338330
339331 get dependencySpecifiers ( ) {
340- if ( this [ kWrap ] === undefined ) {
341- throw new ERR_VM_MODULE_NOT_MODULE ( ) ;
342- }
343- if ( this [ kDependencySpecifiers ] === undefined ) {
344- this [ kDependencySpecifiers ] = this [ kWrap ] . getStaticDependencySpecifiers ( ) ;
345- }
332+ validateInternalField ( this , kDependencySpecifiers , 'SourceTextModule' ) ;
333+ this [ kDependencySpecifiers ] ??= this [ kWrap ] . getStaticDependencySpecifiers ( ) ;
346334 return this [ kDependencySpecifiers ] ;
347335 }
348336
349337 get status ( ) {
350- if ( this [ kWrap ] === undefined ) {
351- throw new ERR_VM_MODULE_NOT_MODULE ( ) ;
352- }
338+ validateInternalField ( this , kDependencySpecifiers , 'SourceTextModule' ) ;
353339 if ( this . #error !== kNoError ) {
354340 return 'errored' ;
355341 }
@@ -360,9 +346,7 @@ class SourceTextModule extends Module {
360346 }
361347
362348 get error ( ) {
363- if ( this [ kWrap ] === undefined ) {
364- throw new ERR_VM_MODULE_NOT_MODULE ( ) ;
365- }
349+ validateInternalField ( this , kDependencySpecifiers , 'SourceTextModule' ) ;
366350 if ( this . #error !== kNoError ) {
367351 return this . #error;
368352 }
@@ -415,9 +399,7 @@ class SyntheticModule extends Module {
415399 }
416400
417401 setExport ( name , value ) {
418- if ( this [ kWrap ] === undefined ) {
419- throw new ERR_VM_MODULE_NOT_MODULE ( ) ;
420- }
402+ validateInternalField ( this , kWrap , 'SyntheticModule' ) ;
421403 validateString ( name , 'name' ) ;
422404 if ( this [ kWrap ] . getStatus ( ) < kInstantiated ) {
423405 throw new ERR_VM_MODULE_STATUS ( 'must be linked' ) ;
@@ -432,7 +414,7 @@ function importModuleDynamicallyWrap(importModuleDynamically) {
432414 if ( isModuleNamespaceObject ( m ) ) {
433415 return m ;
434416 }
435- if ( ! m || m [ kWrap ] === undefined ) {
417+ if ( ! isModule ( m ) ) {
436418 throw new ERR_VM_MODULE_NOT_MODULE ( ) ;
437419 }
438420 if ( m . status === 'errored' ) {
0 commit comments