Skip to content

Commit 23f58bb

Browse files
committed
Use a dedicated node for frozen String literals, to avoid an extra DefinedWrapperNode
1 parent ab12b77 commit 23f58bb

File tree

2 files changed

+42
-5
lines changed

2 files changed

+42
-5
lines changed
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/*
2+
* Copyright (c) 2021 Oracle and/or its affiliates. All rights reserved. This
3+
* code is released under a tri EPL/GPL/LGPL license. You can use it,
4+
* redistribute it and/or modify it under the terms of the:
5+
*
6+
* Eclipse Public License version 2.0, or
7+
* GNU General Public License version 2, or
8+
* GNU Lesser General Public License version 2.1.
9+
*/
10+
package org.truffleruby.language.literal;
11+
12+
import org.truffleruby.RubyContext;
13+
import org.truffleruby.RubyLanguage;
14+
import org.truffleruby.core.string.CoreString;
15+
import org.truffleruby.core.string.ImmutableRubyString;
16+
import org.truffleruby.language.RubyContextSourceNode;
17+
18+
import com.oracle.truffle.api.frame.VirtualFrame;
19+
20+
public class FrozenStringLiteralNode extends RubyContextSourceNode {
21+
22+
private final ImmutableRubyString frozenString;
23+
private final CoreString definition;
24+
25+
public FrozenStringLiteralNode(ImmutableRubyString frozenString, CoreString definition) {
26+
this.frozenString = frozenString;
27+
this.definition = definition;
28+
}
29+
30+
@Override
31+
public ImmutableRubyString execute(VirtualFrame frame) {
32+
return frozenString;
33+
}
34+
35+
@Override
36+
public Object isDefined(VirtualFrame frame, RubyLanguage language, RubyContext context) {
37+
return definition.createInstance(context);
38+
}
39+
}

src/main/java/org/truffleruby/parser/BodyTranslator.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@
108108
import org.truffleruby.language.literal.BooleanLiteralNode;
109109
import org.truffleruby.language.literal.EncodingLiteralNode;
110110
import org.truffleruby.language.literal.FloatLiteralNode;
111+
import org.truffleruby.language.literal.FrozenStringLiteralNode;
111112
import org.truffleruby.language.literal.IntegerFixnumLiteralNode;
112113
import org.truffleruby.language.literal.LongFixnumLiteralNode;
113114
import org.truffleruby.language.literal.NilLiteralNode;
@@ -506,13 +507,11 @@ public RubyNode visitCallNode(CallParseNode node) {
506507
if (receiver instanceof StrParseNode && methodName.equals("freeze")) {
507508
final StrParseNode strNode = (StrParseNode) receiver;
508509
final Rope nodeRope = strNode.getValue();
509-
510510
final ImmutableRubyString frozenString = language
511511
.getFrozenStringLiteral(nodeRope.getBytes(), nodeRope.getEncoding(), strNode.getCodeRange());
512-
513512
return addNewlineIfNeeded(node, withSourceSection(
514513
sourceSection,
515-
new DefinedWrapperNode(language.coreStrings.METHOD, new ObjectLiteralNode(frozenString))));
514+
new FrozenStringLiteralNode(frozenString, language.coreStrings.METHOD)));
516515
}
517516

518517
if (receiver instanceof ConstParseNode &&
@@ -2862,8 +2861,7 @@ public RubyNode visitStrNode(StrParseNode node) {
28622861
if (node.isFrozen()) {
28632862
final ImmutableRubyString frozenString = language
28642863
.getFrozenStringLiteral(nodeRope.getBytes(), nodeRope.getEncoding(), node.getCodeRange());
2865-
2866-
ret = new DefinedWrapperNode(language.coreStrings.EXPRESSION, new ObjectLiteralNode(frozenString));
2864+
ret = new FrozenStringLiteralNode(frozenString, language.coreStrings.EXPRESSION);
28672865
} else {
28682866
final LeafRope cachedRope = language.ropeCache
28692867
.getRope(nodeRope.getBytes(), nodeRope.getEncoding(), node.getCodeRange());

0 commit comments

Comments
 (0)