| 
1 | 1 | 'use strict';  | 
2 |  | -const common = require('../common');  | 
 | 2 | +require('../common');  | 
3 | 3 | const assert = require('assert');  | 
4 | 4 | const cp = require('child_process');  | 
5 | 5 | 
 
  | 
 | 6 | +function getPrintedStackTrace(stderr) {  | 
 | 7 | + const lines = stderr.split('\n');  | 
 | 8 | + | 
 | 9 | + let state = 'initial';  | 
 | 10 | + const result = {  | 
 | 11 | + message: [],  | 
 | 12 | + nativeStack: [],  | 
 | 13 | + jsStack: [],  | 
 | 14 | + };  | 
 | 15 | + for (let i = 0; i < lines.length; ++i) {  | 
 | 16 | + const line = lines[i].trim();  | 
 | 17 | + if (line.length === 0) {  | 
 | 18 | + continue; // Skip empty lines.  | 
 | 19 | + }  | 
 | 20 | + | 
 | 21 | + switch (state) {  | 
 | 22 | + case 'initial':  | 
 | 23 | + result.message.push(line);  | 
 | 24 | + if (line.includes('Native stack trace')) {  | 
 | 25 | + state = 'native-stack';  | 
 | 26 | + } else {  | 
 | 27 | + result.message.push(line);  | 
 | 28 | + }  | 
 | 29 | + break;  | 
 | 30 | + case 'native-stack':  | 
 | 31 | + if (line.includes('JavaScript stack trace')) {  | 
 | 32 | + state = 'js-stack';  | 
 | 33 | + } else {  | 
 | 34 | + result.nativeStack.push(line);  | 
 | 35 | + }  | 
 | 36 | + break;  | 
 | 37 | + case 'js-stack':  | 
 | 38 | + result.jsStack.push(line);  | 
 | 39 | + break;  | 
 | 40 | + }  | 
 | 41 | + }  | 
 | 42 | + return result;  | 
 | 43 | +}  | 
 | 44 | + | 
6 | 45 | if (process.argv[2] === 'child') {  | 
7 | 46 |  process.abort();  | 
8 | 47 | } else {  | 
9 | 48 |  const child = cp.spawnSync(`${process.execPath}`, [`${__filename}`, 'child']);  | 
10 | 49 |  const stderr = child.stderr.toString();  | 
11 | 50 | 
 
  | 
12 | 51 |  assert.strictEqual(child.stdout.toString(), '');  | 
13 |  | - const { nativeStack, jsStack } = common.getPrintedStackTrace(stderr);  | 
 | 52 | + const { nativeStack, jsStack } = getPrintedStackTrace(stderr);  | 
14 | 53 | 
 
  | 
15 | 54 |  if (!nativeStack.every((frame, index) => frame.startsWith(`${index + 1}:`))) {  | 
16 | 55 |  assert.fail(`Each frame should start with a frame number:\n${stderr}`);  | 
17 | 56 |  }  | 
18 | 57 | 
 
  | 
19 | 58 |  // For systems that don't support backtraces, the native stack is  | 
20 | 59 |  // going to be empty.  | 
21 |  | - if (!common.isWindows && nativeStack.length > 0) {  | 
 | 60 | + if (process.platform !== 'win32' && nativeStack.length > 0) {  | 
22 | 61 |  const { getBinaryPath } = require('../common/shared-lib-util');  | 
23 | 62 |  if (!nativeStack.some((frame) => frame.includes(`[${getBinaryPath()}]`))) {  | 
24 | 63 |  assert.fail(`Some native stack frame include the binary name:\n${stderr}`);  | 
 | 
0 commit comments