@@ -1636,8 +1636,8 @@ def visit_heredoc(node)
1636
1636
elsif node . parts . length == 1 && node . parts . first . is_a? ( TStringContent )
1637
1637
visit ( node . parts . first )
1638
1638
else
1639
- visit_string_parts ( node )
1640
- builder . concatstrings ( node . parts . length )
1639
+ length = visit_string_parts ( node )
1640
+ builder . concatstrings ( length )
1641
1641
end
1642
1642
end
1643
1643
@@ -2026,10 +2026,9 @@ def visit_rational(node)
2026
2026
def visit_regexp_literal ( node )
2027
2027
builder . putobject ( node . accept ( RubyVisitor . new ) )
2028
2028
rescue RubyVisitor ::CompilationError
2029
- visit_string_parts ( node )
2030
-
2031
2029
flags = RubyVisitor . new . visit_regexp_literal_flags ( node )
2032
- builder . toregexp ( flags , node . parts . length )
2030
+ length = visit_string_parts ( node )
2031
+ builder . toregexp ( flags , length )
2033
2032
end
2034
2033
2035
2034
def visit_rest_param ( node )
@@ -2086,8 +2085,8 @@ def visit_string_literal(node)
2086
2085
if node . parts . length == 1 && node . parts . first . is_a? ( TStringContent )
2087
2086
visit ( node . parts . first )
2088
2087
else
2089
- visit_string_parts ( node )
2090
- builder . concatstrings ( node . parts . length )
2088
+ length = visit_string_parts ( node )
2089
+ builder . concatstrings ( length )
2091
2090
end
2092
2091
end
2093
2092
@@ -2114,13 +2113,7 @@ def visit_symbols(node)
2114
2113
element . parts . first . is_a? ( TStringContent )
2115
2114
builder . putobject ( element . parts . first . value . to_sym )
2116
2115
else
2117
- length = element . parts . length
2118
- unless element . parts . first . is_a? ( TStringContent )
2119
- builder . putobject ( "" )
2120
- length += 1
2121
- end
2122
-
2123
- visit_string_parts ( element )
2116
+ length = visit_string_parts ( element )
2124
2117
builder . concatstrings ( length )
2125
2118
builder . intern
2126
2119
end
@@ -2299,13 +2292,7 @@ def visit_word(node)
2299
2292
if node . parts . length == 1 && node . parts . first . is_a? ( TStringContent )
2300
2293
visit ( node . parts . first )
2301
2294
else
2302
- length = node . parts . length
2303
- unless node . parts . first . is_a? ( TStringContent )
2304
- builder . putobject ( "" )
2305
- length += 1
2306
- end
2307
-
2308
- visit_string_parts ( node )
2295
+ length = visit_string_parts ( node )
2309
2296
builder . concatstrings ( length )
2310
2297
end
2311
2298
end
@@ -2330,8 +2317,8 @@ def visit_words(node)
2330
2317
2331
2318
def visit_xstring_literal ( node )
2332
2319
builder . putself
2333
- visit_string_parts ( node )
2334
- builder . concatstrings ( node . parts . length ) if node . parts . length > 1
2320
+ length = visit_string_parts ( node )
2321
+ builder . concatstrings ( node . parts . length ) if length > 1
2335
2322
builder . send ( :` , 1 , VM_CALL_FCALL | VM_CALL_ARGS_SIMPLE )
2336
2323
end
2337
2324
@@ -2493,6 +2480,13 @@ def push_interpolate
2493
2480
# heredocs, etc. This method will visit all the parts of a string within
2494
2481
# those containers.
2495
2482
def visit_string_parts ( node )
2483
+ length = 0
2484
+
2485
+ unless node . parts . first . is_a? ( TStringContent )
2486
+ builder . putobject ( "" )
2487
+ length += 1
2488
+ end
2489
+
2496
2490
node . parts . each do |part |
2497
2491
case part
2498
2492
when StringDVar
@@ -2504,7 +2498,11 @@ def visit_string_parts(node)
2504
2498
when TStringContent
2505
2499
builder . putobject ( part . accept ( RubyVisitor . new ) )
2506
2500
end
2501
+
2502
+ length += 1
2507
2503
end
2504
+
2505
+ length
2508
2506
end
2509
2507
2510
2508
# The current instruction sequence that we're compiling is always stored
0 commit comments