Skip to content

Commit 8fb27d4

Browse files
committed
Convert CheckFrozenNode to DSL inlinable
1 parent 4795370 commit 8fb27d4

File tree

5 files changed

+31
-38
lines changed

5 files changed

+31
-38
lines changed

src/main/java/org/truffleruby/cext/CExtNodes.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -944,7 +944,7 @@ public abstract static class CheckFrozenNode extends CoreMethodArrayArgumentsNod
944944
@Specialization
945945
boolean rb_check_frozen(Object object,
946946
@Cached TypeNodes.CheckFrozenNode raiseIfFrozenNode) {
947-
raiseIfFrozenNode.execute(object);
947+
raiseIfFrozenNode.execute(this, object);
948948
return true;
949949
}
950950

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

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@
7171
import org.truffleruby.core.range.RangeNodes.NormalizedStartLengthNode;
7272
import org.truffleruby.core.string.RubyString;
7373
import org.truffleruby.core.string.StringHelperNodes;
74-
import org.truffleruby.core.support.TypeNodes;
74+
import org.truffleruby.core.support.TypeNodes.CheckFrozenNode;
7575
import org.truffleruby.core.symbol.RubySymbol;
7676
import org.truffleruby.extra.ffi.Pointer;
7777
import org.truffleruby.interop.ToJavaStringNode;
@@ -661,38 +661,38 @@ RubyArray concatManyGeneral(RubyArray array, Object first, Object[] rest,
661661
@ImportStatic(ArrayGuards.class)
662662
public abstract static class DeleteNode extends CoreMethodArrayArgumentsNode {
663663

664-
@Child private TypeNodes.CheckFrozenNode raiseIfFrozenNode;
665-
666664
@Specialization(
667665
guards = "stores.isMutable(store)",
668666
limit = "storageStrategyLimit()")
669-
Object delete(RubyArray array, Object value, Object maybeBlock,
667+
Object deleteMutable(RubyArray array, Object value, Object maybeBlock,
670668
@Bind("array.getStore()") Object store,
671669
@CachedLibrary("store") ArrayStoreLibrary stores,
672670
@Cached @Shared SameOrEqualNode sameOrEqualNode,
673671
@Cached @Shared InlinedIntValueProfile arraySizeProfile,
674672
@Cached @Shared InlinedLoopConditionProfile loopProfile,
675-
@Cached @Shared CallBlockNode yieldNode) {
673+
@Cached @Shared CallBlockNode yieldNode,
674+
@Cached @Shared CheckFrozenNode raiseIfFrozenNode) {
676675

677676
return delete(array, value, maybeBlock, true, store, store, stores, stores, arraySizeProfile, loopProfile,
678-
yieldNode, sameOrEqualNode);
677+
yieldNode, sameOrEqualNode, raiseIfFrozenNode);
679678
}
680679

681680
@Specialization(
682681
guards = "!stores.isMutable(store)",
683682
limit = "storageStrategyLimit()")
684-
Object delete(RubyArray array, Object value, Object maybeBlock,
683+
Object deleteNotMutable(RubyArray array, Object value, Object maybeBlock,
685684
@Bind("array.getStore()") Object store,
686685
@CachedLibrary("store") ArrayStoreLibrary stores,
687686
@CachedLibrary(limit = "1") ArrayStoreLibrary newStores,
688687
@Cached @Shared SameOrEqualNode sameOrEqualNode,
689688
@Cached @Shared InlinedIntValueProfile arraySizeProfile,
690689
@Cached @Shared InlinedLoopConditionProfile loopProfile,
691-
@Cached @Shared CallBlockNode yieldNode) {
690+
@Cached @Shared CallBlockNode yieldNode,
691+
@Cached @Shared CheckFrozenNode raiseIfFrozenNode) {
692692

693693
final Object newStore = stores.allocator(store).allocate(arraySizeProfile.profile(this, array.size));
694694
return delete(array, value, maybeBlock, false, store, newStore, stores, newStores, arraySizeProfile,
695-
loopProfile, yieldNode, sameOrEqualNode);
695+
loopProfile, yieldNode, sameOrEqualNode, raiseIfFrozenNode);
696696
}
697697

698698
private Object delete(RubyArray array, Object value, Object maybeBlock,
@@ -704,7 +704,8 @@ private Object delete(RubyArray array, Object value, Object maybeBlock,
704704
InlinedIntValueProfile arraySizeProfile,
705705
InlinedLoopConditionProfile loopProfile,
706706
CallBlockNode yieldNode,
707-
SameOrEqualNode sameOrEqualNode) {
707+
SameOrEqualNode sameOrEqualNode,
708+
CheckFrozenNode raiseIfFrozenNode) {
708709

709710
assert !sameStores || (oldStore == newStore && oldStores == newStores);
710711

@@ -718,7 +719,7 @@ private Object delete(RubyArray array, Object value, Object maybeBlock,
718719
final Object stored = oldStores.read(oldStore, n);
719720

720721
if (sameOrEqualNode.execute(this, stored, value)) {
721-
checkFrozen(array);
722+
raiseIfFrozenNode.execute(this, array);
722723
found = stored;
723724
n++;
724725
} else {
@@ -747,14 +748,6 @@ private Object delete(RubyArray array, Object value, Object maybeBlock,
747748
}
748749
}
749750
}
750-
751-
public void checkFrozen(Object object) {
752-
if (raiseIfFrozenNode == null) {
753-
CompilerDirectives.transferToInterpreterAndInvalidate();
754-
raiseIfFrozenNode = insert(TypeNodes.CheckFrozenNode.create());
755-
}
756-
raiseIfFrozenNode.execute(object);
757-
}
758751
}
759752

760753
@CoreMethod(names = "delete_at", required = 1, raiseIfFrozenSelf = true, lowerFixnum = 1)

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -949,7 +949,7 @@ Object initializeCopy(Frame callerFrame, Object self, Object[] rubyArgs, RootCal
949949
@Cached LogicalClassNode lhsClassNode,
950950
@Cached LogicalClassNode rhsClassNode,
951951
@Cached InlinedBranchProfile errorProfile) {
952-
checkFrozenNode.execute(self);
952+
checkFrozenNode.execute(this, self);
953953

954954
if (lhsClassNode.execute(self) != rhsClassNode.execute(from)) {
955955
errorProfile.enter(this);
@@ -1038,7 +1038,7 @@ Object instanceVariableSet(RubyDynamicObject object, Object name, Object value,
10381038
@Cached TypeNodes.CheckFrozenNode raiseIfFrozenNode) {
10391039
final String nameString = nameToJavaStringNode.execute(this, name);
10401040
checkIVarNameNode.execute(object, nameString, name);
1041-
raiseIfFrozenNode.execute(object);
1041+
raiseIfFrozenNode.execute(this, object);
10421042
writeNode.execute(this, object, nameString, value);
10431043
return value;
10441044
}
@@ -1063,7 +1063,7 @@ Object removeInstanceVariable(RubyDynamicObject object, Object name,
10631063
@Cached TypeNodes.CheckFrozenNode raiseIfFrozenNode) {
10641064
final String nameString = nameToJavaStringNode.execute(this, name);
10651065
checkIVarNameNode.execute(object, nameString, name);
1066-
raiseIfFrozenNode.execute(object);
1066+
raiseIfFrozenNode.execute(this, object);
10671067
return removeIVar(object, nameString);
10681068
}
10691069

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2032,20 +2032,20 @@ public abstract static class RemoveMethodNode extends CoreMethodArrayArgumentsNo
20322032

20332033
private final BranchProfile errorProfile = BranchProfile.create();
20342034

2035-
@Child private TypeNodes.CheckFrozenNode raiseIfFrozenNode = TypeNodes.CheckFrozenNode.create();
20362035
@Child private DispatchNode methodRemovedNode = DispatchNode.create();
20372036

20382037
@Specialization
20392038
RubyModule removeMethods(RubyModule module, Object[] names,
2039+
@Cached TypeNodes.CheckFrozenNode raiseIfFrozenNode,
20402040
@Cached NameToJavaStringNode nameToJavaStringNode) {
20412041
for (Object name : names) {
2042-
removeMethod(module, nameToJavaStringNode.execute(this, name));
2042+
removeMethod(module, nameToJavaStringNode.execute(this, name), raiseIfFrozenNode);
20432043
}
20442044
return module;
20452045
}
20462046

2047-
private void removeMethod(RubyModule module, String name) {
2048-
raiseIfFrozenNode.execute(module);
2047+
private void removeMethod(RubyModule module, String name, TypeNodes.CheckFrozenNode raiseIfFrozenNode) {
2048+
raiseIfFrozenNode.execute(this, module);
20492049

20502050
if (module.fields.removeMethod(name)) {
20512051
if (RubyGuards.isSingletonClass(module)) {

src/main/java/org/truffleruby/core/support/TypeNodes.java

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
import java.util.List;
1414

1515
import com.oracle.truffle.api.dsl.Bind;
16+
import com.oracle.truffle.api.dsl.GenerateCached;
17+
import com.oracle.truffle.api.dsl.GenerateInline;
1618
import com.oracle.truffle.api.dsl.GenerateUncached;
1719
import com.oracle.truffle.api.dsl.NeverDefault;
1820
import com.oracle.truffle.api.nodes.Node;
@@ -452,30 +454,28 @@ public static TypeCheckFrozenNode create(RubyNode rubyNode) {
452454
@Specialization
453455
Object check(Object value,
454456
@Cached CheckFrozenNode checkFrozenNode) {
455-
checkFrozenNode.execute(value);
457+
checkFrozenNode.execute(this, value);
456458

457459
return value;
458460
}
459461
}
460462

461463
@GenerateUncached
464+
@GenerateInline
465+
@GenerateCached(false)
462466
public abstract static class CheckFrozenNode extends RubyBaseNode {
463467

464-
@NeverDefault
465-
public static CheckFrozenNode create() {
466-
return TypeNodesFactory.CheckFrozenNodeGen.create();
467-
}
468-
469-
public abstract void execute(Object object);
468+
public abstract void execute(Node node, Object object);
470469

471470
@Specialization
472-
void check(Object value,
473-
@Cached IsFrozenNode isFrozenNode,
471+
static void check(Node node, Object value,
472+
// IsFrozenNode can't be inlined since known bug (GR-45912)
473+
@Cached(inline = false) IsFrozenNode isFrozenNode,
474474
@Cached InlinedBranchProfile errorProfile) {
475475

476476
if (isFrozenNode.execute(value)) {
477-
errorProfile.enter(this);
478-
throw new RaiseException(getContext(), coreExceptions().frozenError(value, this));
477+
errorProfile.enter(node);
478+
throw new RaiseException(getContext(node), coreExceptions(node).frozenError(value, node));
479479
}
480480
}
481481
}

0 commit comments

Comments
 (0)