vimquest
vimquest

Reputation: 27

Node.js Bytecode Constant Pool Output

I'm extracting the bytecode generated by Node.js like so: 'node --print-bytecode ~/example.js'. The output looks almost identical as the output of d8. However, there are a couple of minor differences. Take for example this function:

`[generated bytecode for function: emitPromiseRejectionWarnings]
Parameter count 1
Frame size 120
 2658 E> 0x20948dedb3ba @    0 : a0                StackCheck 
 2702 S> 0x20948dedb3bb @    1 : 1b 08             LdaImmutableCurrentContextSlot [8]
         0x20948dedb3bd @    3 : a5 00             ThrowReferenceErrorIfHole [0]
         0x20948dedb3bf @    5 : 26 f1             Star r10
 2695 E> 0x20948dedb3c1 @    7 : 28 f1 01 00       LdaNamedProperty r10, [1], [0]
         0x20948dedb3c5 @   11 : 26 f1             Star r10
         0x20948dedb3c7 @   13 : 0b                LdaZero 
 2702 E> 0x20948dedb3c8 @   14 : 67 f1 02          TestGreaterThan r10, [2]
         0x20948dedb3cb @   17 : 94 5d             JumpIfFalse [93] (0x20948dedb428 @ 110)
 2665 E> 0x20948dedb3cd @   19 : a0                StackCheck 
         0x20948dedb3ce @   20 : 1b 08             LdaImmutableCurrentContextSlot [8]
 2742 E> 0x20948dedb3d0 @   22 : a5 00             ThrowReferenceErrorIfHole [0]
         0x20948dedb3d2 @   24 : 26 f0             Star r11
 2765 E> 0x20948dedb3d4 @   26 : 28 f0 02 03       LdaNamedProperty r11, [2], [3]
         0x20948dedb3d8 @   30 : 26 f1             Star r10
 2765 E> 0x20948dedb3da @   32 : 56 f1 f0 05       CallProperty0 r10, r11, [5]
         0x20948dedb3de @   36 : 26 f5             Star r6
         0x20948dedb3e0 @   38 : 97 06             JumpIfUndefined [6] (0x20948dedb3e6 @ 44)
         0x20948dedb3e2 @   40 : 25 f5             Ldar r6
         0x20948dedb3e4 @   42 : 96 10             JumpIfNotNull [16] (0x20948dedb3f4 @ 58)
         0x20948dedb3e6 @   44 : 0c 4d             LdaSmi [77]
         0x20948dedb3e8 @   46 : 26 f1             Star r10
         0x20948dedb3ea @   48 : 12 03             LdaConstant [3]
         0x20948dedb3ec @   50 : 26 f0             Star r11
         0x20948dedb3ee @   52 : 5e c1 00 f1 02    CallRuntime [NewTypeError], r10-r11
 2721 E> 0x20948dedb3f3 @   57 : a2                Throw 
 2742 S> 0x20948dedb3f4 @   58 : 28 f5 03 07       LdaNamedProperty r6, [3], [7]
         0x20948dedb3f8 @   62 : 26 f7             Star r4
 2742 S> 0x20948dedb3fa @   64 : 28 f5 04 09       LdaNamedProperty r6, [4], [9]
         0x20948dedb3fe @   68 : 26 f6             Star r5
 2778 S> 0x20948dedb400 @   70 : 1b 04             LdaImmutableCurrentContextSlot [4]
         0x20948dedb402 @   72 : 26 f0             Star r11
 2791 E> 0x20948dedb404 @   74 : 28 f0 05 0b       LdaNamedProperty r11, [5], [11]
         0x20948dedb408 @   78 : 26 f1             Star r10
         0x20948dedb40a @   80 : 12 06             LdaConstant [6]
         0x20948dedb40c @   82 : 26 ef             Star r12
 2791 E> 0x20948dedb40e @   84 : 58 f1 f0 ef f7 0d CallProperty2 r10, r11, r12, r4, [13]
         0x20948dedb414 @   90 : 91 11             JumpIfToBooleanTrue [17] (0x20948dedb425 @ 107)
 2834 S> 0x20948dedb416 @   92 : 1b 04             LdaImmutableCurrentContextSlot [4]
         0x20948dedb418 @   94 : 26 f0             Star r11
 2842 E> 0x20948dedb41a @   96 : 28 f0 07 0f       LdaNamedProperty r11, [7], [15]
         0x20948dedb41e @  100 : 26 f1             Star r10
 2842 E> 0x20948dedb420 @  102 : 57 f1 f0 f6 11    CallProperty1 r10, r11, r5, [17]
         0x20948dedb425 @  107 : 85 6a 00          JumpLoop [106], [0] (0x20948dedb3bb @ 1)
 2896 S> 0x20948dedb428 @  110 : 11                LdaFalse 
         0x20948dedb429 @  111 : 26 f4             Star r7
 2915 S> 0x20948dedb42b @  113 : 1b 07             LdaImmutableCurrentContextSlot [7]
         0x20948dedb42d @  115 : a5 08             ThrowReferenceErrorIfHole [8]
         0x20948dedb42f @  117 : 26 f1             Star r10
 2942 E> 0x20948dedb431 @  119 : 28 f1 01 13       LdaNamedProperty r10, [1], [19]
         0x20948dedb435 @  123 : 26 f3             Star r8
 2962 S> 0x20948dedb437 @  125 : 25 f3             Ldar r8
         0x20948dedb439 @  127 : 73 15             ToNumeric [21]
         0x20948dedb43b @  129 : 26 f1             Star r10
         0x20948dedb43d @  131 : 4b 15             Dec [21]
         0x20948dedb43f @  133 : 26 f3             Star r8
         0x20948dedb441 @  135 : 25 f1             Ldar r10
 2962 E> 0x20948dedb443 @  137 : 92 80             JumpIfToBooleanFalse [128] (0x20948dedb4c3 @ 265)
 2952 E> 0x20948dedb445 @  139 : a0                StackCheck 
 2988 S> 0x20948dedb446 @  140 : 1b 07             LdaImmutableCurrentContextSlot [7]
         0x20948dedb448 @  142 : a5 08             ThrowReferenceErrorIfHole [8]
         0x20948dedb44a @  144 : 26 f0             Star r11
 3015 E> 0x20948dedb44c @  146 : 28 f0 02 16       LdaNamedProperty r11, [2], [22]
         0x20948dedb450 @  150 : 26 f1             Star r10
 3015 E> 0x20948dedb452 @  152 : 56 f1 f0 18       CallProperty0 r10, r11, [24]
         0x20948dedb456 @  156 : 26 f9             Star r2
 3048 S> 0x20948dedb458 @  158 : 1b 06             LdaImmutableCurrentContextSlot [6]
         0x20948dedb45a @  160 : a5 09             ThrowReferenceErrorIfHole [9]
         0x20948dedb45c @  162 : 26 f0             Star r11
 3071 E> 0x20948dedb45e @  164 : 28 f0 0a 1a       LdaNamedProperty r11, [10], [26]
         0x20948dedb462 @  168 : 26 f1             Star r10
 3071 E> 0x20948dedb464 @  170 : 57 f1 f0 f9 1c    CallProperty1 r10, r11, r2, [28]
         0x20948dedb469 @  175 : 26 f8             Star r3
 3089 S> 0x20948dedb46b @  177 : 97 55             JumpIfUndefined [85] (0x20948dedb4c0 @ 262)
 3128 S> 0x20948dedb46d @  179 : 10                LdaTrue 
 3147 E> 0x20948dedb46e @  180 : 2c f8 0b 1e       StaNamedProperty r3, [11], [30]
         0x20948dedb472 @  184 : 27 f8 f2          Mov r3, r9
         0x20948dedb475 @  187 : 25 f2             Ldar r9
         0x20948dedb477 @  189 : 97 06             JumpIfUndefined [6] (0x20948dedb47d @ 195)
         0x20948dedb479 @  191 : 25 f2             Ldar r9
         0x20948dedb47b @  193 : 96 10             JumpIfNotNull [16] (0x20948dedb48b @ 209)
         0x20948dedb47d @  195 : 0c 4d             LdaSmi [77]
         0x20948dedb47f @  197 : 26 f1             Star r10
         0x20948dedb481 @  199 : 12 0c             LdaConstant [12]
         0x20948dedb483 @  201 : 26 f0             Star r11
 3185 E> 0x20948dedb485 @  203 : 5e c1 00 f1 02    CallRuntime [NewTypeError], r10-r11
 3169 E> 0x20948dedb48a @  208 : a2                Throw 
 3185 S> 0x20948dedb48b @  209 : 28 f2 0c 20       LdaNamedProperty r9, [12], [32]
         0x20948dedb48f @  213 : 26 fb             Star r0
 3185 S> 0x20948dedb491 @  215 : 28 f2 0d 22       LdaNamedProperty r9, [13], [34]
         0x20948dedb495 @  219 : 26 fa             Star r1
 3204 S> 0x20948dedb497 @  221 : 1b 04             LdaImmutableCurrentContextSlot [4]
         0x20948dedb499 @  223 : 26 f0             Star r11
 3217 E> 0x20948dedb49b @  225 : 28 f0 05 24       LdaNamedProperty r11, [5], [36]
         0x20948dedb49f @  229 : 26 f1             Star r10
         0x20948dedb4a1 @  231 : 12 0e             LdaConstant [14]
         0x20948dedb4a3 @  233 : 26 ef             Star r12
         0x20948dedb4a5 @  235 : 27 fb ee          Mov r0, r13
         0x20948dedb4a8 @  238 : 27 f9 ed          Mov r2, r14
 3217 E> 0x20948dedb4ab @  241 : 55 f1 f0 04 26    CallProperty r10, r11-r14, [38]
         0x20948dedb4b0 @  246 : 91 0d             JumpIfToBooleanTrue [13] (0x20948dedb4bd @ 259)
 3272 S> 0x20948dedb4b2 @  248 : 1b 0d             LdaImmutableCurrentContextSlot [13]
         0x20948dedb4b4 @  250 : 26 f1             Star r10
 3272 E> 0x20948dedb4b6 @  252 : 5c f1 fa fb 28    CallUndefinedReceiver2 r10, r1, r0, [40]
         0x20948dedb4bb @  257 : 86 05             Jump [5] (0x20948dedb4c0 @ 262)
 3321 S> 0x20948dedb4bd @  259 : 10                LdaTrue 
         0x20948dedb4be @  260 : 26 f4             Star r7
         0x20948dedb4c0 @  262 : 85 89 00          JumpLoop [137], [0] (0x20948dedb437 @ 125)
 3362 S> 0x20948dedb4c3 @  265 : 25 f4             Ldar r7
         0x20948dedb4c5 @  267 : 91 13             JumpIfToBooleanTrue [19] (0x20948dedb4d8 @ 286)
         0x20948dedb4c7 @  269 : 1b 07             LdaImmutableCurrentContextSlot [7]
 3385 E> 0x20948dedb4c9 @  271 : a5 08             ThrowReferenceErrorIfHole [8]
         0x20948dedb4cb @  273 : 26 f1             Star r10
 3412 E> 0x20948dedb4cd @  275 : 28 f1 01 2a       LdaNamedProperty r10, [1], [42]
         0x20948dedb4d1 @  279 : 26 f1             Star r10
         0x20948dedb4d3 @  281 : 0b                LdaZero 
 3419 E> 0x20948dedb4d4 @  282 : 65 f1 2c          TestEqualStrict r10, [44]
         0x20948dedb4d7 @  285 : 4f                LogicalNot 
 3425 S> 0x20948dedb4d8 @  286 : a4                Return 
Constant pool (size = 15)
Handler Table (size = 0)
`

In d8's output, a constant table accessed e.g. by the LdaConstant instruction, was listed under "Constant pool". Node.js' output only contains the size of this table, but not the content. Is there a way to enable outputting this information also?

Thanks.

Upvotes: 1

Views: 568

Answers (2)

ZhefengJin
ZhefengJin

Reputation: 1102

Official Node.js will not print constant pool.
You need to rebuild it with modified source of the Node.js.
To do this, go the \deps\v8\src\objects.h in Node.js's source tree and insert the following line.

#define OBJECT_PRINT 1

Then rebuild and use it.

Upvotes: 0

jmrk
jmrk

Reputation: 40521

A look at the source:

  os << "Constant pool (size = " << constant_pool()->length() << ")\n";
#ifdef OBJECT_PRINT
  if (constant_pool()->length() > 0) {
    constant_pool()->Print();
  }
#endif

reveals that you'll have to compile with OBJECT_PRINT if you want to print the constant pool entries. In standalone V8, you do that by adding v8_enable_object_print = true to your args.gn. I don't know how to do it in Node. Debug builds of both V8 and Node should enable it by default.

Upvotes: 2

Related Questions