@@ -151,11 +151,7 @@ yp_static_node_literal_p(yp_node_t *node)
151
151
case YP_INTEGER_NODE :
152
152
case YP_NIL_NODE :
153
153
case YP_RATIONAL_NODE :
154
- case YP_SELF_NODE :
155
154
case YP_STRING_NODE :
156
- case YP_SOURCE_ENCODING_NODE :
157
- case YP_SOURCE_FILE_NODE :
158
- case YP_SOURCE_LINE_NODE :
159
155
case YP_SYMBOL_NODE :
160
156
case YP_TRUE_NODE :
161
157
return true;
@@ -167,13 +163,25 @@ yp_static_node_literal_p(yp_node_t *node)
167
163
static inline VALUE
168
164
yp_static_literal_value (yp_node_t * node )
169
165
{
170
- switch (YP_NODE_TYPE (node )) {
166
+ switch (YP_NODE_TYPE (node )) {
167
+ case YP_FALSE_NODE :
168
+ return Qfalse ;
169
+ case YP_FLOAT_NODE :
170
+ return parse_float (node );
171
+ case YP_IMAGINARY_NODE :
172
+ return parse_imaginary ((yp_imaginary_node_t * )node );
173
+ case YP_INTEGER_NODE :
174
+ return parse_integer (node );
171
175
case YP_NIL_NODE :
172
176
return Qnil ;
177
+ case YP_RATIONAL_NODE :
178
+ return parse_rational (node );
179
+ case YP_STRING_NODE :
180
+ return parse_string (& ((yp_string_node_t * )node )-> unescaped );
181
+ case YP_SYMBOL_NODE :
182
+ return ID2SYM (parse_string_symbol (& ((yp_symbol_node_t * )node )-> unescaped ));
173
183
case YP_TRUE_NODE :
174
184
return Qtrue ;
175
- case YP_FALSE_NODE :
176
- return Qfalse ;
177
185
// TODO: Implement this method for the other literal nodes described above
178
186
default :
179
187
rb_raise (rb_eArgError , "Don't have a literal value for this type" );
@@ -296,6 +304,9 @@ yp_compile_if(rb_iseq_t *iseq, const int line, yp_statements_node_t *node_body,
296
304
INIT_ANCHOR (then_seq );
297
305
if (node_body ) {
298
306
yp_compile_node (iseq , (yp_node_t * )node_body , then_seq , src , popped , compile_context );
307
+ if (popped ) {
308
+ ADD_INSN (ret , & line_node , pop );
309
+ }
299
310
}
300
311
else {
301
312
if (!popped ) {
@@ -334,9 +345,6 @@ yp_compile_if(rb_iseq_t *iseq, const int line, yp_statements_node_t *node_body,
334
345
ADD_LABEL (ret , end_label );
335
346
}
336
347
337
- if (popped ) {
338
- ADD_INSN (ret , & line_node , pop );
339
- }
340
348
return ;
341
349
}
342
350
@@ -427,10 +435,13 @@ yp_interpolated_node_compile(yp_node_list_t parts, rb_iseq_t *iseq, NODE dummy_l
427
435
ADD_INSN1 (ret , & dummy_line_node , putobject , parse_string (& string_node -> unescaped ));
428
436
}
429
437
else {
430
- YP_COMPILE (part );
438
+ YP_COMPILE_NOT_POPPED (part );
431
439
ADD_INSN (ret , & dummy_line_node , dup );
432
440
ADD_INSN1 (ret , & dummy_line_node , objtostring , new_callinfo (iseq , idTo_s , 0 , VM_CALL_FCALL | VM_CALL_ARGS_SIMPLE , NULL , FALSE));
433
441
ADD_INSN (ret , & dummy_line_node , anytostring );
442
+ if (popped ) {
443
+ ADD_INSN (ret , & dummy_line_node , pop );
444
+ }
434
445
}
435
446
}
436
447
}
@@ -550,7 +561,7 @@ yp_compile_node(rb_iseq_t *iseq, const yp_node_t *node, LINK_ANCHOR *const ret,
550
561
yp_and_node_t * and_node = (yp_and_node_t * ) node ;
551
562
552
563
LABEL * end_label = NEW_LABEL (lineno );
553
- YP_COMPILE (and_node -> left );
564
+ YP_COMPILE_NOT_POPPED (and_node -> left );
554
565
if (!popped ) {
555
566
ADD_INSN (ret , & dummy_line_node , dup );
556
567
}
@@ -574,7 +585,7 @@ yp_compile_node(rb_iseq_t *iseq, const yp_node_t *node, LINK_ANCHOR *const ret,
574
585
case YP_ARRAY_NODE : {
575
586
yp_array_node_t * array_node = (yp_array_node_t * ) node ;
576
587
yp_node_list_t elements = array_node -> elements ;
577
- if (elements .size == 1 && yp_static_node_literal_p (elements .nodes [0 ])) {
588
+ if (elements .size == 1 && yp_static_node_literal_p (elements .nodes [0 ]) && ! popped ) {
578
589
VALUE ary = rb_ary_hidden_new (1 );
579
590
rb_ary_push (ary , yp_static_literal_value (elements .nodes [0 ]));
580
591
OBJ_FREEZE (ary );
@@ -665,7 +676,7 @@ yp_compile_node(rb_iseq_t *iseq, const yp_node_t *node, LINK_ANCHOR *const ret,
665
676
}
666
677
} else {
667
678
yp_arguments_node_t * arguments = call_node -> arguments ;
668
- YP_COMPILE ((yp_node_t * ) arguments );
679
+ YP_COMPILE_NOT_POPPED ((yp_node_t * ) arguments );
669
680
orig_argc = (int )arguments -> arguments .size ;
670
681
}
671
682
@@ -1402,9 +1413,6 @@ yp_compile_node(rb_iseq_t *iseq, const yp_node_t *node, LINK_ANCHOR *const ret,
1402
1413
if (!popped ) {
1403
1414
ADD_INSN (ret , & dummy_line_node , intern );
1404
1415
}
1405
- else {
1406
- ADD_INSN (ret , & dummy_line_node , pop );
1407
- }
1408
1416
1409
1417
return ;
1410
1418
}
@@ -1638,7 +1646,7 @@ yp_compile_node(rb_iseq_t *iseq, const yp_node_t *node, LINK_ANCHOR *const ret,
1638
1646
yp_or_node_t * or_node = (yp_or_node_t * ) node ;
1639
1647
1640
1648
LABEL * end_label = NEW_LABEL (lineno );
1641
- YP_COMPILE (or_node -> left );
1649
+ YP_COMPILE_NOT_POPPED (or_node -> left );
1642
1650
1643
1651
if (!popped ) {
1644
1652
ADD_INSN (ret , & dummy_line_node , dup );
@@ -1901,10 +1909,6 @@ yp_compile_node(rb_iseq_t *iseq, const yp_node_t *node, LINK_ANCHOR *const ret,
1901
1909
INT2FIX (VM_DEFINECLASS_TYPE_SINGLETON_CLASS ));
1902
1910
RB_OBJ_WRITTEN (iseq , Qundef , (VALUE )singleton_class );
1903
1911
1904
- if (popped ) {
1905
- ADD_INSN (ret , & dummy_line_node , pop );
1906
- }
1907
-
1908
1912
return ;
1909
1913
}
1910
1914
case YP_SOURCE_ENCODING_NODE : {
0 commit comments