Skip to content

Commit 08ffe94

Browse files
committed
Workaround ECJ bugs
1 parent 3ee767b commit 08ffe94

File tree

13 files changed

+36
-90
lines changed

13 files changed

+36
-90
lines changed

src/main/java/org/truffleruby/core/array/ArrayNodes.java

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@
4545
import org.truffleruby.core.array.ArrayEachIteratorNode.ArrayElementConsumerNode;
4646
import org.truffleruby.core.array.ArrayIndexNodes.ReadNormalizedNode;
4747
import org.truffleruby.core.array.ArrayIndexNodes.ReadSliceNormalizedNode;
48-
import org.truffleruby.core.array.ArrayNodesFactory.ReplaceNodeFactory;
4948
import org.truffleruby.core.array.library.ArrayStoreLibrary;
5049
import org.truffleruby.core.array.library.NativeArrayStorage;
5150
import org.truffleruby.core.array.library.SharedArrayStorage;
@@ -64,7 +63,6 @@
6463
import org.truffleruby.core.kernel.KernelNodes;
6564
import org.truffleruby.core.kernel.KernelNodes.SameOrEqlNode;
6665
import org.truffleruby.core.kernel.KernelNodes.SameOrEqualNode;
67-
import org.truffleruby.core.kernel.KernelNodesFactory;
6866
import org.truffleruby.core.klass.RubyClass;
6967
import org.truffleruby.core.numeric.FixnumLowerNode;
7068
import org.truffleruby.core.proc.RubyProc;
@@ -1103,7 +1101,6 @@ static boolean include(RubyArray array, Object value,
11031101
public abstract static class InitializeNode extends CoreMethodArrayArgumentsNode {
11041102

11051103
@Child private DispatchNode toAryNode;
1106-
@Child private KernelNodes.RespondToNode respondToToAryNode;
11071104

11081105
protected abstract RubyArray executeInitialize(RubyArray array, Object size, Object fillingValue,
11091106
Object block);
@@ -1244,9 +1241,10 @@ RubyArray initializeFromArray(RubyArray array, RubyArray copy, NotProvided unuse
12441241
@Specialization(
12451242
guards = { "!isImplicitLong(object)", "wasProvided(object)", "!isRubyArray(object)" })
12461243
RubyArray initialize(RubyArray array, Object object, NotProvided unusedValue, Nil block,
1244+
@Cached KernelNodes.RespondToNode respondToNode,
12471245
@Cached @Shared ToIntNode toIntNode) {
12481246
RubyArray copy = null;
1249-
if (respondToToAry(object)) {
1247+
if (respondToNode.executeDoesRespondTo(object, coreSymbols().TO_ARY, true)) {
12501248
Object toAryResult = callToAry(object);
12511249
if (toAryResult instanceof RubyArray) {
12521250
copy = (RubyArray) toAryResult;
@@ -1261,14 +1259,6 @@ RubyArray initialize(RubyArray array, Object object, NotProvided unusedValue, Ni
12611259
}
12621260
}
12631261

1264-
public boolean respondToToAry(Object object) {
1265-
if (respondToToAryNode == null) {
1266-
CompilerDirectives.transferToInterpreterAndInvalidate();
1267-
respondToToAryNode = insert(KernelNodesFactory.RespondToNodeFactory.create());
1268-
}
1269-
return respondToToAryNode.executeDoesRespondTo(object, coreSymbols().TO_ARY, true);
1270-
}
1271-
12721262
protected Object callToAry(Object object) {
12731263
if (toAryNode == null) {
12741264
CompilerDirectives.transferToInterpreterAndInvalidate();
@@ -1786,7 +1776,7 @@ public abstract static class ReplaceNode extends CoreMethodNode {
17861776

17871777
@NeverDefault
17881778
public static ReplaceNode create() {
1789-
return ReplaceNodeFactory.create(null, null);
1779+
return ArrayNodesFactory.ReplaceNodeFactory.create(null, null);
17901780
}
17911781

17921782
public abstract RubyArray executeReplace(RubyArray array, RubyArray other);

src/main/java/org/truffleruby/core/basicobject/BasicObjectNodes.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
import org.truffleruby.annotations.Split;
2727
import org.truffleruby.builtins.CoreMethodArrayArgumentsNode;
2828
import org.truffleruby.builtins.CoreMethodNode;
29-
import org.truffleruby.core.basicobject.BasicObjectNodesFactory.InstanceExecNodeFactory;
3029
import org.truffleruby.core.cast.BooleanCastNode;
3130
import org.truffleruby.core.cast.NameToJavaStringNode;
3231
import org.truffleruby.core.cast.ToIntNode;
@@ -385,14 +384,8 @@ private static LexicalScope prependReceiverClassToScope(LexicalScope callerLexic
385384
@CoreMethod(names = "instance_exec", needsBlock = true, rest = true)
386385
public abstract static class InstanceExecNode extends CoreMethodArrayArgumentsNode {
387386

388-
public static InstanceExecNode create() {
389-
return InstanceExecNodeFactory.create(null);
390-
}
391-
392387
@Child private CallBlockNode callBlockNode = CallBlockNode.create();
393388

394-
abstract Object executeInstanceExec(VirtualFrame frame, Object self, Object[] args, RubyProc block);
395-
396389
@Specialization
397390
Object instanceExec(VirtualFrame frame, Object receiver, Object[] arguments, RubyProc block) {
398391
final DeclarationContext declarationContext = new DeclarationContext(

src/main/java/org/truffleruby/core/binding/BindingNodes.java

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@
5555
import com.oracle.truffle.api.frame.VirtualFrame;
5656
import com.oracle.truffle.api.source.SourceSection;
5757
import org.truffleruby.language.locals.WriteFrameSlotNode;
58-
import org.truffleruby.language.locals.WriteFrameSlotNodeGen;
5958
import org.truffleruby.parser.BlockDescriptorInfo;
6059
import org.truffleruby.parser.TranslatorEnvironment;
6160

@@ -333,7 +332,7 @@ static Object localVariableSetCached(RubyBinding binding, String name, Object va
333332
@Cached("name") String cachedName,
334333
@Cached("getFrameDescriptor(binding)") FrameDescriptor cachedFrameDescriptor,
335334
@Cached("findFrameSlotOrNull(name, binding.getFrame())") FrameSlotAndDepth cachedFrameSlot,
336-
@Cached("createWriteNode(cachedFrameSlot.slot)") WriteFrameSlotNode writeLocalVariableNode) {
335+
@Cached(parameters = "cachedFrameSlot.slot") WriteFrameSlotNode writeLocalVariableNode) {
337336
final MaterializedFrame frame = RubyArguments
338337
.getDeclarationFrame(binding.getFrame(), cachedFrameSlot.depth);
339338
writeLocalVariableNode.executeWrite(frame, value);
@@ -352,7 +351,7 @@ static Object localVariableSetNewCached(RubyBinding binding, String name, Object
352351
@Cached("getFrameDescriptor(binding)") FrameDescriptor cachedFrameDescriptor,
353352
@Cached("findFrameSlotOrNull(name, binding.getFrame())") FrameSlotAndDepth cachedFrameSlot,
354353
@Cached("newFrameDescriptor(cachedFrameDescriptor, name)") FrameDescriptor newDescriptor,
355-
@Cached("createWriteNode(NEW_VAR_INDEX)") WriteFrameSlotNode writeLocalVariableNode) {
354+
@Cached(parameters = "NEW_VAR_INDEX") WriteFrameSlotNode writeLocalVariableNode) {
356355
final MaterializedFrame frame = newFrame(binding, newDescriptor);
357356
writeLocalVariableNode.executeWrite(frame, value);
358357
return value;
@@ -387,10 +386,6 @@ static Object localVariableSetLastLine(Node node, RubyBinding binding, String na
387386
coreExceptions(node).nameError("Bad local variable name", binding, name, node));
388387
}
389388

390-
protected static WriteFrameSlotNode createWriteNode(int frameSlot) {
391-
return WriteFrameSlotNodeGen.create(frameSlot);
392-
}
393-
394389
protected int getCacheLimit() {
395390
return getLanguage().options.BINDING_LOCAL_VARIABLE_CACHE;
396391
}

src/main/java/org/truffleruby/core/hash/HashNodes.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,6 @@
2828
import org.truffleruby.core.array.ArrayBuilderNode.BuilderState;
2929
import org.truffleruby.core.array.ArrayHelpers;
3030
import org.truffleruby.core.array.RubyArray;
31-
import org.truffleruby.core.hash.HashNodesFactory.CopyHashAndSetRuby2KeywordsNodeGen;
32-
import org.truffleruby.core.hash.HashNodesFactory.InitializeCopyNodeFactory;
3331
import org.truffleruby.core.hash.library.EmptyHashStore;
3432
import org.truffleruby.core.hash.library.HashStoreLibrary;
3533
import org.truffleruby.core.hash.library.HashStoreLibrary.EachEntryCallback;
@@ -172,7 +170,7 @@ public abstract static class CopyHashAndSetRuby2KeywordsNode extends RubyBaseNod
172170

173171
@NeverDefault
174172
public static CopyHashAndSetRuby2KeywordsNode create() {
175-
return CopyHashAndSetRuby2KeywordsNodeGen.create();
173+
return HashNodesFactory.CopyHashAndSetRuby2KeywordsNodeGen.create();
176174
}
177175

178176
public abstract RubyHash execute(RubyHash self, boolean ruby2_keywords);
@@ -419,7 +417,7 @@ public abstract static class InitializeCopyNode extends CoreMethodArrayArguments
419417

420418
@NeverDefault
421419
public static InitializeCopyNode create() {
422-
return InitializeCopyNodeFactory.create(null);
420+
return HashNodesFactory.InitializeCopyNodeFactory.create(null);
423421
}
424422

425423
public abstract RubyHash execute(RubyHash self, RubyHash from);

src/main/java/org/truffleruby/core/kernel/KernelNodes.java

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,6 @@
8585
import org.truffleruby.core.support.TypeNodes;
8686
import org.truffleruby.core.support.TypeNodes.CheckFrozenNode;
8787
import org.truffleruby.core.support.TypeNodes.ObjectInstanceVariablesNode;
88-
import org.truffleruby.core.support.TypeNodesFactory.ObjectInstanceVariablesNodeFactory;
8988
import org.truffleruby.core.symbol.RubySymbol;
9089
import org.truffleruby.core.symbol.SymbolNodes;
9190
import org.truffleruby.core.thread.RubyThread;
@@ -126,7 +125,6 @@
126125
import org.truffleruby.language.objects.FreezeNode;
127126
import org.truffleruby.language.objects.IsANode;
128127
import org.truffleruby.language.objects.IsCopyableObjectNode;
129-
import org.truffleruby.language.objects.IsCopyableObjectNodeGen;
130128
import org.truffleruby.language.objects.IsFrozenNode;
131129
import org.truffleruby.language.objects.LazySingletonClassNode;
132130
import org.truffleruby.language.objects.LogicalClassNode;
@@ -534,10 +532,9 @@ RubyDynamicObject copy(RubyIntOrLongRange range,
534532
@Primitive(name = "kernel_clone") // "clone"
535533
public abstract static class CloneNode extends PrimitiveArrayArgumentsNode {
536534

537-
@Child IsCopyableObjectNode isCopyableObjectNode = IsCopyableObjectNodeGen.create();
538-
539535
@Specialization(guards = "isCopyableObjectNode.execute(object)")
540536
static RubyDynamicObject copyable(Object object, Object freeze,
537+
@Cached @Shared IsCopyableObjectNode isCopyableObjectNode,
541538
@Cached MetaClassNode metaClassNode,
542539
@Cached CopyNode copyNode,
543540
@Cached DispatchNode initializeCloneNode,
@@ -576,6 +573,7 @@ static RubyDynamicObject copyable(Object object, Object freeze,
576573

577574
@Specialization(guards = "!isCopyableObjectNode.execute(object)")
578575
Object notCopyable(Object object, Object freeze,
576+
@Cached @Shared IsCopyableObjectNode isCopyableObjectNode,
579577
@Cached InlinedBranchProfile cantUnfreezeErrorProfile) {
580578
if (forceNotFrozen(freeze)) {
581579
raiseCantUnfreezeError(cantUnfreezeErrorProfile, object);
@@ -1084,14 +1082,11 @@ private void removeField(RubyDynamicObject object, String name) {
10841082
@CoreMethod(names = "instance_variables")
10851083
public abstract static class InstanceVariablesNode extends CoreMethodArrayArgumentsNode {
10861084

1087-
@Child private ObjectInstanceVariablesNode instanceVariablesNode = ObjectInstanceVariablesNodeFactory
1088-
.create(null);
1089-
10901085
@Specialization
1091-
RubyArray instanceVariables(Object self) {
1086+
RubyArray instanceVariables(Object self,
1087+
@Cached ObjectInstanceVariablesNode instanceVariablesNode) {
10921088
return instanceVariablesNode.executeGetIVars(self);
10931089
}
1094-
10951090
}
10961091

10971092
@Primitive(name = "any_instance_variable?")

src/main/java/org/truffleruby/core/kernel/TruffleKernelNodes.java

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
import org.truffleruby.builtins.PrimitiveArrayArgumentsNode;
2828
import org.truffleruby.core.basicobject.RubyBasicObject;
2929
import org.truffleruby.core.encoding.Encodings;
30-
import org.truffleruby.core.kernel.TruffleKernelNodesFactory.GetSpecialVariableStorageNodeGen;
3130
import org.truffleruby.core.module.RubyModule;
3231
import org.truffleruby.core.proc.RubyProc;
3332
import org.truffleruby.core.symbol.RubySymbol;
@@ -213,15 +212,15 @@ public abstract static class GetSpecialVariableStorage extends RubyBaseNode {
213212

214213
@NeverDefault
215214
public static GetSpecialVariableStorage create() {
216-
return GetSpecialVariableStorageNodeGen.create();
215+
return TruffleKernelNodesFactory.GetSpecialVariableStorageNodeGen.create();
217216
}
218217

219218
public final SpecialVariableStorage executeCached(Frame frame) {
220219
return execute(frame, this);
221220
}
222221

223222
public static SpecialVariableStorage executeUncached(Frame frame) {
224-
return GetSpecialVariableStorageNodeGen.getUncached().execute(frame, null);
223+
return TruffleKernelNodesFactory.GetSpecialVariableStorageNodeGen.getUncached().execute(frame, null);
225224
}
226225

227226
public abstract SpecialVariableStorage execute(Frame frame, Node node);
@@ -367,10 +366,6 @@ public Object shareSlow(MaterializedFrame aFrame, SpecialVariableStorage storage
367366
// TODO: should invalidate here?
368367
return nil;
369368
}
370-
371-
public static GetSpecialVariableStorage create() {
372-
return GetSpecialVariableStorageNodeGen.create();
373-
}
374369
}
375370

376371
@Primitive(name = "regexp_last_match_set")

src/main/java/org/truffleruby/core/klass/ClassNodes.java

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,8 @@
3030
import org.truffleruby.language.control.RaiseException;
3131
import org.truffleruby.language.dispatch.DispatchNode;
3232
import org.truffleruby.language.objects.InitializeClassNode;
33-
import org.truffleruby.language.objects.InitializeClassNodeGen;
3433
import org.truffleruby.language.objects.shared.SharedObjects;
3534

36-
import com.oracle.truffle.api.CompilerDirectives;
3735
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
3836
import com.oracle.truffle.api.dsl.Cached;
3937
import com.oracle.truffle.api.dsl.Specialization;
@@ -216,11 +214,11 @@ private static RubyClass getClassClass(RubyClass rubyClass) {
216214
@Primitive(name = "class_new")
217215
public abstract static class NewClassNode extends PrimitiveArrayArgumentsNode {
218216

219-
@Child private InitializeClassNode initializeClassNode;
220217
private final BranchProfile errorProfile = BranchProfile.create();
221218

222219
@Specialization
223-
RubyClass newClass(RubyClass superclass, boolean callInherited, Object maybeBlock) {
220+
RubyClass newClass(RubyClass superclass, boolean callInherited, Object maybeBlock,
221+
@Cached InitializeClassNode initializeClassNode) {
224222
if (superclass.isSingleton) {
225223
errorProfile.enter();
226224
throw new RaiseException(getContext(), coreExceptions().typeErrorSubclassSingletonClass(this));
@@ -240,11 +238,6 @@ RubyClass newClass(RubyClass superclass, boolean callInherited, Object maybeBloc
240238
null,
241239
superclass);
242240

243-
if (initializeClassNode == null) {
244-
CompilerDirectives.transferToInterpreterAndInvalidate();
245-
initializeClassNode = insert(InitializeClassNodeGen.create());
246-
}
247-
248241
initializeClassNode.executeInitialize(newRubyClass, superclass, callInherited, maybeBlock);
249242

250243
return newRubyClass;

src/main/java/org/truffleruby/core/module/ModuleNodes.java

Lines changed: 9 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,6 @@
6262
import org.truffleruby.core.method.MethodFilter;
6363
import org.truffleruby.core.method.RubyMethod;
6464
import org.truffleruby.core.method.RubyUnboundMethod;
65-
import org.truffleruby.core.module.ModuleNodesFactory.GeneratedReaderNodeFactory;
66-
import org.truffleruby.core.module.ModuleNodesFactory.GeneratedWriterNodeFactory;
67-
import org.truffleruby.core.module.ModuleNodesFactory.IsSubclassOfOrEqualToNodeFactory;
6865
import org.truffleruby.core.proc.RubyProc;
6966
import org.truffleruby.core.string.RubyString;
7067
import org.truffleruby.core.string.StringHelperNodes;
@@ -110,7 +107,6 @@
110107
import org.truffleruby.language.objects.IsANode;
111108
import org.truffleruby.language.objects.IsFrozenNode;
112109
import org.truffleruby.language.objects.SingletonClassNode;
113-
import org.truffleruby.language.objects.SingletonClassNodeGen;
114110
import org.truffleruby.language.objects.WriteObjectFieldNode;
115111
import org.truffleruby.language.objects.classvariables.CheckClassVariableNameNode;
116112
import org.truffleruby.language.objects.classvariables.ClassVariableStorage;
@@ -298,7 +294,7 @@ public abstract static class CompareNode extends CoreMethodArrayArgumentsNode {
298294
private Object isSubclass(RubyModule self, RubyModule other) {
299295
if (subclassNode == null) {
300296
CompilerDirectives.transferToInterpreterAndInvalidate();
301-
subclassNode = insert(IsSubclassOfOrEqualToNodeFactory.create(null));
297+
subclassNode = insert(ModuleNodesFactory.IsSubclassOfOrEqualToNodeFactory.create(null));
302298
}
303299
return subclassNode.executeIsSubclassOfOrEqualTo(self, other);
304300
}
@@ -519,8 +515,8 @@ private RubySymbol createAccessor(RubyModule module, String name, Accessor acces
519515
null);
520516

521517
final NodeFactory<? extends RubyBaseNode> alwaysInlinedNodeFactory = accessor == READER
522-
? GeneratedReaderNodeFactory.getInstance()
523-
: GeneratedWriterNodeFactory.getInstance();
518+
? ModuleNodesFactory.GeneratedReaderNodeFactory.getInstance()
519+
: ModuleNodesFactory.GeneratedWriterNodeFactory.getInstance();
524520

525521
final RubyRootNode reRaiseRootNode = new RubyRootNode(
526522
getLanguage(),
@@ -1467,21 +1463,21 @@ RubyModule initialize(RubyModule module, RubyProc block,
14671463
@CoreMethod(names = "initialize_copy", required = 1)
14681464
public abstract static class InitializeCopyNode extends CoreMethodArrayArgumentsNode {
14691465

1470-
@Child private SingletonClassNode singletonClassNode;
1471-
14721466
@Specialization(guards = { "!isRubyClass(self)", "!isRubyClass(from)" })
1473-
Object initializeCopyModule(RubyModule self, RubyModule from) {
1467+
Object initializeCopyModule(RubyModule self, RubyModule from,
1468+
@Cached @Shared SingletonClassNode singletonClassNode) {
14741469
self.fields.initCopy(from);
14751470

1476-
final RubyClass selfMetaClass = getSingletonClass(self);
1477-
final RubyClass fromMetaClass = getSingletonClass(from);
1471+
final RubyClass selfMetaClass = singletonClassNode.execute(self);
1472+
final RubyClass fromMetaClass = singletonClassNode.execute(from);
14781473
selfMetaClass.fields.initCopy(fromMetaClass);
14791474

14801475
return nil;
14811476
}
14821477

14831478
@Specialization
14841479
Object initializeCopyClass(RubyClass self, RubyClass from,
1480+
@Cached @Shared SingletonClassNode singletonClassNode,
14851481
@Cached InlinedBranchProfile errorProfile) {
14861482
if (from == coreLibrary().basicObjectClass) {
14871483
errorProfile.enter(this);
@@ -1493,7 +1489,7 @@ Object initializeCopyClass(RubyClass self, RubyClass from,
14931489

14941490
self.fields.initCopy(from);
14951491

1496-
final RubyClass selfMetaClass = getSingletonClass(self);
1492+
final RubyClass selfMetaClass = singletonClassNode.execute(self);
14971493
final RubyClass fromMetaClass = from.getMetaClass();
14981494

14991495
assert fromMetaClass.isSingleton;
@@ -1504,15 +1500,6 @@ Object initializeCopyClass(RubyClass self, RubyClass from,
15041500
return nil;
15051501
}
15061502

1507-
protected RubyClass getSingletonClass(RubyModule object) {
1508-
if (singletonClassNode == null) {
1509-
CompilerDirectives.transferToInterpreterAndInvalidate();
1510-
singletonClassNode = insert(SingletonClassNodeGen.create());
1511-
}
1512-
1513-
return singletonClassNode.execute(object);
1514-
}
1515-
15161503
}
15171504

15181505
@CoreMethod(names = "included", needsSelf = false, required = 1, visibility = Visibility.PRIVATE)

src/main/java/org/truffleruby/core/numeric/FloatNodes.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535
import org.truffleruby.core.cast.FloatToIntegerNode;
3636
import org.truffleruby.core.encoding.Encodings;
3737
import org.truffleruby.core.encoding.TStringUtils;
38-
import org.truffleruby.core.numeric.FloatNodesFactory.ModNodeFactory;
3938
import org.truffleruby.core.string.RubyString;
4039
import org.truffleruby.core.string.StringUtils;
4140
import org.truffleruby.core.thread.RubyThread;
@@ -230,7 +229,7 @@ public abstract static class ModNode extends CoreMethodArrayArgumentsNode {
230229

231230
@NeverDefault
232231
public static ModNode create() {
233-
return ModNodeFactory.create(null);
232+
return FloatNodesFactory.ModNodeFactory.create(null);
234233
}
235234

236235
public abstract Object executeMod(double a, double b);

0 commit comments

Comments
 (0)