| 'use strict'; |
| const common = require('../common'); |
| |
| // https://github.com/nodejs/node/issues/45421 |
| // |
| // Check that node will NOT call v8::Isolate::SetIdle() when exiting |
| // due to an unhandled exception, otherwise the assertion(enabled in |
| // debug build only) in the SetIdle(), which checks that the vm state |
| // is either EXTERNAL or IDLE will fail. |
| // |
| // The root cause of this issue is that before PerIsolateMessageListener() |
| // is invoked by v8, v8 preserves the JS vm state, although it should |
| // switch to EXTERNEL. https://bugs.chromium.org/p/v8/issues/detail?id=13464 |
| // |
| // Therefore, this commit can be considered as an workaround of the v8 bug, |
| // but we also find it not useful to call SetIdle() when terminating. |
| |
| if (process.argv[2] === 'child') { |
| const { Worker } = require('worker_threads'); |
| new Worker('', { eval: true }); |
| throw new Error('xxx'); |
| } else { |
| const assert = require('assert'); |
| const { spawnSync } = require('child_process'); |
| const result = spawnSync(process.execPath, [__filename, 'child']); |
| |
| const stderr = result.stderr.toString().trim(); |
| // Expect error message to be preserved |
| assert.match(stderr, /xxx/); |
| // Expect no crash |
| assert(!common.nodeProcessAborted(result.status, result.signal), stderr); |
| } |