@@ -8,7 +8,7 @@ const { Worker } = require('worker_threads');
8
8
// Verify that Workers don't care about --stack-size, as they have their own
9
9
// fixed and known stack sizes.
10
10
11
- async function runWorker ( ) {
11
+ async function runWorker ( options = { } ) {
12
12
const empiricalStackDepth = new Uint32Array ( new SharedArrayBuffer ( 4 ) ) ;
13
13
const worker = new Worker ( `
14
14
const { workerData: { empiricalStackDepth } } = require('worker_threads');
@@ -18,26 +18,45 @@ async function runWorker() {
18
18
}
19
19
f();` , {
20
20
eval : true ,
21
- workerData : { empiricalStackDepth }
21
+ workerData : { empiricalStackDepth } ,
22
+ ...options
22
23
} ) ;
23
24
24
25
const [ error ] = await once ( worker , 'error' ) ;
25
26
26
- common . expectsError ( {
27
- constructor : RangeError ,
28
- message : 'Maximum call stack size exceeded'
29
- } ) ( error ) ;
27
+ if ( ! options . skipErrorCheck ) {
28
+ common . expectsError ( {
29
+ constructor : RangeError ,
30
+ message : 'Maximum call stack size exceeded'
31
+ } ) ( error ) ;
32
+ }
30
33
31
34
return empiricalStackDepth [ 0 ] ;
32
35
}
33
36
34
37
( async function ( ) {
35
- v8 . setFlagsFromString ( '--stack-size=500' ) ;
36
- const w1stack = await runWorker ( ) ;
37
- v8 . setFlagsFromString ( '--stack-size=1000' ) ;
38
- const w2stack = await runWorker ( ) ;
39
- // Make sure the two stack sizes are within 10 % of each other, i.e. not
40
- // affected by the different `--stack-size` settings.
41
- assert ( Math . max ( w1stack , w2stack ) / Math . min ( w1stack , w2stack ) < 1.1 ,
42
- `w1stack = ${ w1stack } , w2stack ${ w2stack } are too far apart` ) ;
38
+ {
39
+ v8 . setFlagsFromString ( '--stack-size=500' ) ;
40
+ const w1stack = await runWorker ( ) ;
41
+ v8 . setFlagsFromString ( '--stack-size=1000' ) ;
42
+ const w2stack = await runWorker ( ) ;
43
+ // Make sure the two stack sizes are within 10 % of each other, i.e. not
44
+ // affected by the different `--stack-size` settings.
45
+ assert ( Math . max ( w1stack , w2stack ) / Math . min ( w1stack , w2stack ) < 1.1 ,
46
+ `w1stack = ${ w1stack } , w2stack = ${ w2stack } are too far apart` ) ;
47
+ }
48
+
49
+ {
50
+ const w1stack = await runWorker ( { resourceLimits : { stackSizeMb : 0.5 } } ) ;
51
+ const w2stack = await runWorker ( { resourceLimits : { stackSizeMb : 1.0 } } ) ;
52
+ // Make sure the two stack sizes are at least 40 % apart from each other,
53
+ // i.e. affected by the different `stackSizeMb` settings.
54
+ assert ( w2stack > w1stack * 1.4 ,
55
+ `w1stack = ${ w1stack } , w2stack = ${ w2stack } are too close` ) ;
56
+ }
57
+
58
+ // Test that various low stack sizes result in an 'error' event.
59
+ for ( const stackSizeMb of [ 0.001 , 0.01 , 0.1 , 0.2 , 0.3 , 0.5 ] ) {
60
+ await runWorker ( { resourceLimits : { stackSizeMb } , skipErrorCheck : true } ) ;
61
+ }
43
62
} ) ( ) . then ( common . mustCall ( ) ) ;
0 commit comments