Skip to content

Commit 153ae07

Browse files
committed
WriteObjectFieldNode supports DSL inlining
1 parent 0da6538 commit 153ae07

File tree

10 files changed

+37
-43
lines changed

10 files changed

+37
-43
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1854,6 +1854,7 @@ public abstract static class SetMarkList extends CoreMethodArrayArgumentsNode {
18541854
protected Object setMarkList(RubyDynamicObject structOwner,
18551855
@Cached WriteObjectFieldNode writeMarkedNode) {
18561856
writeMarkedNode.execute(
1857+
this,
18571858
structOwner,
18581859
Layouts.MARKED_OBJECTS_IDENTIFIER,
18591860
getContext().getMarkingService()

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

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1543,7 +1543,6 @@ public void accept(CallBlockNode yieldNode, RubyArray array, Object state, Objec
15431543
public abstract static class PackNode extends CoreMethodNode {
15441544

15451545
@Child private TruffleString.FromByteArrayNode fromByteArrayNode = TruffleString.FromByteArrayNode.create();
1546-
@Child private WriteObjectFieldNode writeAssociatedNode;
15471546

15481547
@Specialization(
15491548
guards = {
@@ -1556,6 +1555,7 @@ protected RubyString packCached(RubyArray array, Object format,
15561555
@Cached @Shared InlinedBranchProfile exceptionProfile,
15571556
@Cached @Shared InlinedConditionProfile resizeProfile,
15581557
@Cached @Shared RubyStringLibrary libFormat,
1558+
@Cached @Shared WriteObjectFieldNode writeAssociatedNode,
15591559
@Cached("asTruffleStringUncached(formatAsString)") TruffleString cachedFormat,
15601560
@Cached("libFormat.getEncoding(formatAsString)") RubyEncoding cachedEncoding,
15611561
@Cached("cachedFormat.byteLength(cachedEncoding.tencoding)") int cachedFormatLength,
@@ -1570,7 +1570,7 @@ protected RubyString packCached(RubyArray array, Object format,
15701570
throw FormatExceptionTranslator.translate(getContext(), this, e);
15711571
}
15721572

1573-
return finishPack(cachedFormatLength, result, resizeProfile);
1573+
return finishPack(cachedFormatLength, result, resizeProfile, writeAssociatedNode);
15741574
}
15751575

15761576
@Specialization(guards = { "libFormat.isRubyString(formatAsString)" }, replaces = "packCached", limit = "1")
@@ -1580,6 +1580,7 @@ protected RubyString packUncached(RubyArray array, Object format,
15801580
@Cached @Shared InlinedBranchProfile exceptionProfile,
15811581
@Cached @Shared InlinedConditionProfile resizeProfile,
15821582
@Cached @Shared RubyStringLibrary libFormat,
1583+
@Cached @Shared WriteObjectFieldNode writeAssociatedNode,
15831584
@Cached ToJavaStringNode toJavaStringNode,
15841585
@Cached IndirectCallNode callPackNode) {
15851586
final String formatString = toJavaStringNode.execute(formatAsString);
@@ -1595,10 +1596,11 @@ protected RubyString packUncached(RubyArray array, Object format,
15951596
}
15961597

15971598
int formatLength = libFormat.getTString(formatAsString).byteLength(libFormat.getTEncoding(formatAsString));
1598-
return finishPack(formatLength, result, resizeProfile);
1599+
return finishPack(formatLength, result, resizeProfile, writeAssociatedNode);
15991600
}
16001601

1601-
private RubyString finishPack(int formatLength, BytesResult result, InlinedConditionProfile resizeProfile) {
1602+
private RubyString finishPack(int formatLength, BytesResult result, InlinedConditionProfile resizeProfile,
1603+
WriteObjectFieldNode writeAssociatedNode) {
16021604
byte[] bytes = result.getOutput();
16031605

16041606
if (resizeProfile.profile(this, bytes.length != result.getOutputLength())) {
@@ -1609,12 +1611,7 @@ private RubyString finishPack(int formatLength, BytesResult result, InlinedCondi
16091611
final RubyString string = createString(fromByteArrayNode, bytes, rubyEncoding);
16101612

16111613
if (result.getAssociated() != null) {
1612-
if (writeAssociatedNode == null) {
1613-
CompilerDirectives.transferToInterpreterAndInvalidate();
1614-
writeAssociatedNode = insert(WriteObjectFieldNode.create());
1615-
}
1616-
1617-
writeAssociatedNode.execute(string, Layouts.ASSOCIATED_IDENTIFIER, result.getAssociated());
1614+
writeAssociatedNode.execute(this, string, Layouts.ASSOCIATED_IDENTIFIER, result.getAssociated());
16181615
}
16191616

16201617
return string;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1036,7 +1036,7 @@ protected Object instanceVariableSet(RubyDynamicObject object, Object name, Obje
10361036
final String nameString = nameToJavaStringNode.execute(name);
10371037
checkIVarNameNode.execute(object, nameString, name);
10381038
raiseIfFrozenNode.execute(object);
1039-
writeNode.execute(object, nameString, value);
1039+
writeNode.execute(this, object, nameString, value);
10401040
return value;
10411041
}
10421042

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -452,7 +452,7 @@ protected Object writer(Frame callerFrame, Object self, Object[] rubyArgs, RootC
452452
CompilerAsserts.partialEvaluationConstant(ivarName);
453453

454454
final Object value = RubyArguments.getArgument(rubyArgs, 0);
455-
writeObjectFieldNode.execute((RubyDynamicObject) self, ivarName, value);
455+
writeObjectFieldNode.execute(this, (RubyDynamicObject) self, ivarName, value);
456456
return value;
457457
}
458458

src/main/java/org/truffleruby/core/string/StringNodes.java

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1532,8 +1532,6 @@ protected int getCodeRange(Object string,
15321532
@CoreMethod(names = "initialize_copy", required = 1, raiseIfNotMutableSelf = true)
15331533
public abstract static class InitializeCopyNode extends CoreMethodArrayArgumentsNode {
15341534

1535-
@Child private WriteObjectFieldNode writeAssociatedNode; // for synchronization
1536-
15371535
@Specialization(guards = "areEqual(self, from)")
15381536
protected Object initializeCopySelfIsSameAsFrom(RubyString self, Object from) {
15391537
return self;
@@ -1546,12 +1544,13 @@ protected Object initializeCopySelfIsSameAsFrom(RubyString self, Object from) {
15461544
"tstring.isImmutable()" }, limit = "1")
15471545
protected Object initializeCopyImmutable(RubyString self, Object from,
15481546
@Cached @Shared RubyStringLibrary stringsFrom,
1547+
@Cached @Shared WriteObjectFieldNode writeAssociatedNode,
15491548
@Cached @Shared StringHelperNodes.StringGetAssociatedNode stringGetAssociatedNode,
15501549
@Bind("stringsFrom.getTString(from)") AbstractTruffleString tstring) {
15511550
self.setTString(tstring, stringsFrom.getEncoding(from));
15521551

15531552
final Object associated = stringGetAssociatedNode.execute(from);
1554-
copyAssociated(self, associated);
1553+
copyAssociated(self, associated, writeAssociatedNode);
15551554
return self;
15561555
}
15571556

@@ -1562,6 +1561,7 @@ protected Object initializeCopyImmutable(RubyString self, Object from,
15621561
"tstring.isMutable()" }, limit = "1")
15631562
protected Object initializeCopyMutable(RubyString self, Object from,
15641563
@Cached @Shared RubyStringLibrary stringsFrom,
1564+
@Cached @Shared WriteObjectFieldNode writeAssociatedNode,
15651565
@Cached @Shared StringHelperNodes.StringGetAssociatedNode stringGetAssociatedNode,
15661566
@Cached MutableTruffleString.SubstringByteIndexNode copyMutableTruffleStringNode,
15671567
@Bind("stringsFrom.getTString(from)") AbstractTruffleString tstring) {
@@ -1573,14 +1573,15 @@ protected Object initializeCopyMutable(RubyString self, Object from,
15731573
self.setTString(copy, encoding);
15741574

15751575
final Object associated = stringGetAssociatedNode.execute(from);
1576-
copyAssociated(self, associated);
1576+
copyAssociated(self, associated, writeAssociatedNode);
15771577
return self;
15781578
}
15791579

15801580
@Specialization(guards = { "!areEqual(self, from)", "tstring.isNative()" })
15811581
protected Object initializeCopyNative(RubyString self, RubyString from,
15821582
@Cached @Shared RubyStringLibrary stringsFrom,
15831583
@Cached @Shared StringHelperNodes.StringGetAssociatedNode stringGetAssociatedNode,
1584+
@Cached @Shared WriteObjectFieldNode writeAssociatedNode,
15841585
@Cached TruffleString.GetInternalNativePointerNode getInternalNativePointerNode,
15851586
@Cached MutableTruffleString.FromNativePointerNode fromNativePointerNode,
15861587
@Bind("from.tstring") AbstractTruffleString tstring) {
@@ -1597,22 +1598,17 @@ protected Object initializeCopyNative(RubyString self, RubyString from,
15971598
self.setTString(copy, encoding);
15981599

15991600
final Object associated = stringGetAssociatedNode.execute(from);
1600-
copyAssociated(self, associated);
1601+
copyAssociated(self, associated, writeAssociatedNode);
16011602
return self;
16021603
}
16031604

16041605
protected static boolean areEqual(Object one, Object two) {
16051606
return one == two;
16061607
}
16071608

1608-
private void copyAssociated(RubyString self, Object associated) {
1609+
private void copyAssociated(RubyString self, Object associated, WriteObjectFieldNode writeAssociatedNode) {
16091610
if (associated != null) {
1610-
if (writeAssociatedNode == null) {
1611-
CompilerDirectives.transferToInterpreterAndInvalidate();
1612-
writeAssociatedNode = insert(WriteObjectFieldNode.create());
1613-
}
1614-
1615-
writeAssociatedNode.execute(self, Layouts.ASSOCIATED_IDENTIFIER, associated);
1611+
writeAssociatedNode.execute(this, self, Layouts.ASSOCIATED_IDENTIFIER, associated);
16161612
}
16171613
}
16181614
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,7 @@ public abstract static class ObjectIVarSetPrimitiveNode extends PrimitiveArrayAr
336336
@Specialization
337337
protected Object ivarSet(RubyDynamicObject object, RubySymbol name, Object value,
338338
@Cached WriteObjectFieldNode writeNode) {
339-
writeNode.execute(object, name.getString(), value);
339+
writeNode.execute(this, object, name.getString(), value);
340340
return value;
341341
}
342342
}
@@ -389,7 +389,7 @@ public abstract static class ObjectHiddenVarSetNode extends PrimitiveArrayArgume
389389
@Specialization
390390
protected Object objectHiddenVarSet(RubyDynamicObject object, Object identifier, Object value,
391391
@Cached WriteObjectFieldNode writeNode) {
392-
writeNode.execute(object, identifier, value);
392+
writeNode.execute(this, object, identifier, value);
393393
return value;
394394
}
395395
}

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
*/
1010
package org.truffleruby.core.support;
1111

12+
import com.oracle.truffle.api.dsl.Cached;
1213
import com.oracle.truffle.api.library.CachedLibrary;
1314
import com.oracle.truffle.api.object.DynamicObjectLibrary;
1415
import org.truffleruby.annotations.CoreModule;
@@ -30,11 +31,10 @@ public abstract class WeakRefNodes {
3031
@Primitive(name = "weakref_set_object")
3132
public abstract static class WeakRefSetObjectPrimitiveNode extends PrimitiveArrayArgumentsNode {
3233

33-
@Child WriteObjectFieldNode fieldNode = WriteObjectFieldNode.create(); // for synchronization
34-
3534
@Specialization
36-
protected Object weakRefSetObject(RubyDynamicObject weakRef, Object object) {
37-
fieldNode.execute(weakRef, FIELD_NAME, new TruffleWeakReference<>(object));
35+
protected Object weakRefSetObject(RubyDynamicObject weakRef, Object object,
36+
@Cached WriteObjectFieldNode fieldNode) {
37+
fieldNode.execute(this, weakRef, FIELD_NAME, new TruffleWeakReference<>(object));
3838
return object;
3939
}
4040

src/main/java/org/truffleruby/language/RubyDynamicObject.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,10 @@
99
*/
1010
package org.truffleruby.language;
1111

12+
import com.oracle.truffle.api.dsl.Bind;
1213
import com.oracle.truffle.api.interop.StopIterationException;
1314
import com.oracle.truffle.api.interop.UnknownKeyException;
15+
import com.oracle.truffle.api.nodes.Node;
1416
import org.truffleruby.RubyContext;
1517
import org.truffleruby.RubyLanguage;
1618
import org.truffleruby.core.array.ArrayUtils;
@@ -588,7 +590,8 @@ public void writeMember(String name, Object value,
588590
@Cached @Shared IsFrozenNode isFrozenNode,
589591
@Shared @Cached ConditionProfile dynamicProfile,
590592
@Shared @Cached TranslateInteropRubyExceptionNode translateRubyException,
591-
@Shared @Cached BranchProfile errorProfile)
593+
@Shared @Cached BranchProfile errorProfile,
594+
@Bind("$node") Node node)
592595
throws UnknownIdentifierException, UnsupportedMessageException {
593596
Object dynamic;
594597
try {
@@ -603,7 +606,7 @@ public void writeMember(String name, Object value,
603606
throw UnsupportedMessageException.create();
604607
}
605608
if (isIVar(name)) {
606-
writeObjectFieldNode.execute(this, name, value);
609+
writeObjectFieldNode.execute(node, this, name, value);
607610
} else {
608611
errorProfile.enter();
609612
throw UnknownIdentifierException.create(name);

src/main/java/org/truffleruby/language/objects/WriteInstanceVariableNode.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,10 @@ private void write(Object object, Object value) {
6565

6666
if (writeNode == null) {
6767
CompilerDirectives.transferToInterpreterAndInvalidate();
68-
writeNode = insert(WriteObjectFieldNode.create());
68+
writeNode = insert(WriteObjectFieldNodeGen.create());
6969
}
7070

71-
writeNode.execute((RubyDynamicObject) object, name, value);
71+
writeNode.execute(this, (RubyDynamicObject) object, name, value);
7272
}
7373

7474
@Override

src/main/java/org/truffleruby/language/objects/WriteObjectFieldNode.java

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
*/
1010
package org.truffleruby.language.objects;
1111

12-
import com.oracle.truffle.api.dsl.NeverDefault;
12+
import com.oracle.truffle.api.dsl.GenerateInline;
13+
import com.oracle.truffle.api.nodes.Node;
1314
import org.truffleruby.language.RubyBaseNode;
1415
import org.truffleruby.language.RubyDynamicObject;
1516
import org.truffleruby.language.objects.shared.WriteBarrierNode;
@@ -25,23 +26,19 @@
2526

2627
@ReportPolymorphism
2728
@GenerateUncached
29+
@GenerateInline(inlineByDefault = true)
2830
public abstract class WriteObjectFieldNode extends RubyBaseNode {
2931

30-
@NeverDefault
31-
public static WriteObjectFieldNode create() {
32-
return WriteObjectFieldNodeGen.create();
33-
}
34-
35-
public abstract void execute(RubyDynamicObject object, Object name, Object value);
32+
public abstract void execute(Node node, RubyDynamicObject object, Object name, Object value);
3633

3734
@Specialization(guards = "!objectLibrary.isShared(object)", limit = "getDynamicObjectCacheLimit()")
38-
protected void writeLocal(RubyDynamicObject object, Object name, Object value,
35+
protected static void writeLocal(RubyDynamicObject object, Object name, Object value,
3936
@CachedLibrary("object") DynamicObjectLibrary objectLibrary) {
4037
objectLibrary.put(object, name, value);
4138
}
4239

4340
@Specialization(guards = "objectLibrary.isShared(object)")
44-
protected void writeShared(RubyDynamicObject object, Object name, Object value,
41+
protected static void writeShared(RubyDynamicObject object, Object name, Object value,
4542
@CachedLibrary(limit = "getDynamicObjectCacheLimit()") DynamicObjectLibrary objectLibrary,
4643
@Cached WriteBarrierNode writeBarrierNode) {
4744

0 commit comments

Comments
 (0)