|
9 | 9 | */
|
10 | 10 | package org.truffleruby.core.cast;
|
11 | 11 |
|
| 12 | +import com.oracle.truffle.api.CompilerDirectives; |
12 | 13 | import com.oracle.truffle.api.dsl.Cached;
|
13 | 14 | import com.oracle.truffle.api.dsl.ImportStatic;
|
14 | 15 | import com.oracle.truffle.api.dsl.NodeChild;
|
|
33 | 34 | @NodeChild(value = "value", type = RubyNode.class)
|
34 | 35 | public abstract class NameToJavaStringNode extends RubyNode {
|
35 | 36 |
|
| 37 | + @Child private ToJavaStringNode toJavaStringNode; |
| 38 | + |
36 | 39 | public static NameToJavaStringNode create() {
|
37 | 40 | return NameToJavaStringNodeGen.create(null);
|
38 | 41 | }
|
39 | 42 |
|
40 | 43 | public abstract String executeToJavaString(Object name);
|
41 | 44 |
|
42 | 45 | @Specialization(guards = "isRubyString(value)")
|
43 |
| - public String stringNameToJavaString(DynamicObject value, |
44 |
| - @Cached("create()") ToJavaStringNode toJavaStringNode) { |
45 |
| - return toJavaStringNode.executeToJavaString(value); |
| 46 | + public String stringNameToJavaString(DynamicObject value) { |
| 47 | + return executeToJavaString(value); |
46 | 48 | }
|
47 | 49 |
|
48 | 50 | @Specialization(guards = "isRubySymbol(value)")
|
49 |
| - public String symbolNameToJavaString(DynamicObject value, |
50 |
| - @Cached("create()") ToJavaStringNode toJavaStringNode) { |
| 51 | + public String symbolNameToJavaString(DynamicObject value) { |
| 52 | + return executeToJavaString(value); |
| 53 | + } |
| 54 | + |
| 55 | + private String executeToJavaString(DynamicObject value) { |
| 56 | + if (toJavaStringNode == null) { |
| 57 | + CompilerDirectives.transferToInterpreterAndInvalidate(); |
| 58 | + toJavaStringNode = insert(ToJavaStringNode.create()); |
| 59 | + } |
51 | 60 | return toJavaStringNode.executeToJavaString(value);
|
52 | 61 | }
|
53 | 62 |
|
|
0 commit comments