Skip to content

Commit f8a5cc3

Browse files
committed
Address DynamicObject deprecations
1 parent 7bb0967 commit f8a5cc3

File tree

6 files changed

+47
-85
lines changed

6 files changed

+47
-85
lines changed

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

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import com.oracle.truffle.api.frame.Frame;
2222
import com.oracle.truffle.api.interop.InteropLibrary;
2323
import com.oracle.truffle.api.interop.UnsupportedMessageException;
24+
import com.oracle.truffle.api.object.PropertyGetter;
2425
import com.oracle.truffle.api.utilities.AssumedValue;
2526
import org.truffleruby.RubyContext;
2627
import org.truffleruby.builtins.CoreMethod;
@@ -438,24 +439,22 @@ protected RubyClass getClass(Object self) {
438439
@GenerateUncached
439440
public abstract static class CopyInstanceVariablesNode extends RubyBaseNode {
440441

441-
public static final Property[] EMPTY_PROPERTY_ARRAY = new Property[0];
442+
public static final PropertyGetter[] EMPTY_PROPERTY_GETTER_ARRAY = new PropertyGetter[0];
442443

443444
public abstract RubyDynamicObject execute(RubyDynamicObject newObject, RubyDynamicObject from);
444445

445446
@ExplodeLoop
446447
@Specialization(
447-
guards = { "from.getShape() == cachedShape", "properties.length <= MAX_EXPLODE_SIZE" },
448+
guards = { "from.getShape() == cachedShape", "propertyGetters.length <= MAX_EXPLODE_SIZE" },
448449
limit = "getDynamicObjectCacheLimit()")
449450
protected RubyDynamicObject copyCached(RubyDynamicObject newObject, RubyDynamicObject from,
450451
@Cached("from.getShape()") Shape cachedShape,
451-
// GR-25595: should probably be shared between specialization instances but Truffle does not support it yet
452-
@Cached DispatchNode allocateNode,
453-
@Cached(value = "getCopiedProperties(cachedShape)", dimensions = 1) Property[] properties,
454-
@Cached("createWriteFieldNodes(properties)") DynamicObjectLibrary[] writeFieldNodes) {
455-
for (int i = 0; i < properties.length; i++) {
456-
final Property property = properties[i];
457-
final Object value = property.get(from, cachedShape);
458-
writeFieldNodes[i].putWithFlags(newObject, property.getKey(), value, property.getFlags());
452+
@Cached(value = "getCopiedProperties(cachedShape)", dimensions = 1) PropertyGetter[] propertyGetters,
453+
@Cached("createWriteFieldNodes(propertyGetters)") DynamicObjectLibrary[] writeFieldNodes) {
454+
for (int i = 0; i < propertyGetters.length; i++) {
455+
final PropertyGetter propertyGetter = propertyGetters[i];
456+
final Object value = propertyGetter.get(from);
457+
writeFieldNodes[i].putWithFlags(newObject, propertyGetter.getKey(), value, propertyGetter.getFlags());
459458
}
460459

461460
return newObject;
@@ -472,21 +471,21 @@ protected RubyDynamicObject copyUncached(RubyDynamicObject newObject, RubyDynami
472471
return newObject;
473472
}
474473

475-
protected Property[] getCopiedProperties(Shape shape) {
476-
final List<Property> copiedProperties = new ArrayList<>();
474+
protected PropertyGetter[] getCopiedProperties(Shape shape) {
475+
final List<PropertyGetter> copiedProperties = new ArrayList<>();
477476

478477
for (Property property : shape.getProperties()) {
479478
if (property.getKey() instanceof String) {
480-
copiedProperties.add(property);
479+
copiedProperties.add(Objects.requireNonNull(shape.makePropertyGetter(property.getKey())));
481480
}
482481
}
483482

484-
return copiedProperties.toArray(EMPTY_PROPERTY_ARRAY);
483+
return copiedProperties.toArray(EMPTY_PROPERTY_GETTER_ARRAY);
485484
}
486485

487-
protected DynamicObjectLibrary[] createWriteFieldNodes(Property[] properties) {
488-
final DynamicObjectLibrary[] nodes = new DynamicObjectLibrary[properties.length];
489-
for (int i = 0; i < properties.length; i++) {
486+
protected DynamicObjectLibrary[] createWriteFieldNodes(PropertyGetter[] propertyGetters) {
487+
final DynamicObjectLibrary[] nodes = new DynamicObjectLibrary[propertyGetters.length];
488+
for (int i = 0; i < propertyGetters.length; i++) {
490489
nodes[i] = DynamicObjectLibrary.getFactory().createDispatched(1);
491490
}
492491
return nodes;
@@ -496,12 +495,13 @@ protected DynamicObjectLibrary[] createWriteFieldNodes(Property[] properties) {
496495
private void copyInstanceVariables(RubyDynamicObject from, RubyDynamicObject to) {
497496
// Concurrency: OK if callers create the object and publish it after copy
498497
// Only copy user-level instance variables, hidden ones are initialized later with #initialize_copy.
499-
for (Property property : getCopiedProperties(from.getShape())) {
498+
Shape shape = from.getShape();
499+
for (PropertyGetter propertyGetter : getCopiedProperties(shape)) {
500500
DynamicObjectLibrary.getUncached().putWithFlags(
501501
to,
502-
property.getKey(),
503-
property.get(from, from.getShape()),
504-
property.getFlags());
502+
propertyGetter.getKey(),
503+
propertyGetter.get(from),
504+
propertyGetter.getFlags());
505505
}
506506
}
507507
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import java.util.Set;
1818

1919
import com.oracle.truffle.api.frame.FrameDescriptor;
20+
import com.oracle.truffle.api.object.DynamicObjectLibrary;
2021
import org.truffleruby.RubyContext;
2122
import org.truffleruby.RubyLanguage;
2223
import org.truffleruby.core.proc.RubyProc;
@@ -138,7 +139,7 @@ public static Set<Object> getAdjacentObjects(RubyDynamicObject object) {
138139
}
139140

140141
for (Property property : object.getShape().getPropertyListInternal(false)) {
141-
final Object value = property.get(object, object.getShape());
142+
final Object value = DynamicObjectLibrary.getUncached().getOrDefault(object, property.getKey(), null);
142143
addProperty(reachable, value);
143144
}
144145

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

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

12-
import com.oracle.truffle.api.object.ObjectType;
13-
14-
public final class RubyObjectType extends ObjectType {
15-
12+
public final class RubyObjectType {
1613
public RubyObjectType() {
1714
}
18-
1915
}

src/main/java/org/truffleruby/language/objects/shared/ReadAndShareFieldNode.java

Lines changed: 0 additions & 41 deletions
This file was deleted.

src/main/java/org/truffleruby/language/objects/shared/ShareObjectNode.java

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@
1111

1212
import java.util.ArrayList;
1313
import java.util.List;
14+
import java.util.Objects;
1415

16+
import com.oracle.truffle.api.object.PropertyGetter;
17+
import org.truffleruby.core.kernel.KernelNodes;
1518
import org.truffleruby.language.RubyBaseNode;
1619
import org.truffleruby.language.RubyDynamicObject;
1720
import org.truffleruby.language.objects.ObjectGraph;
@@ -23,7 +26,6 @@
2326
import com.oracle.truffle.api.library.CachedLibrary;
2427
import com.oracle.truffle.api.nodes.ExplodeLoop;
2528
import com.oracle.truffle.api.object.DynamicObjectLibrary;
26-
import com.oracle.truffle.api.object.ObjectLocation;
2729
import com.oracle.truffle.api.object.Property;
2830
import com.oracle.truffle.api.object.Shape;
2931
import org.truffleruby.utils.RunTwiceBranchProfile;
@@ -44,17 +46,17 @@ public ShareObjectNode(int depth) {
4446

4547
@ExplodeLoop
4648
@Specialization(
47-
guards = { "object.getShape() == cachedShape", "properties.size() <= MAX_EXPLODE_SIZE" },
49+
guards = { "object.getShape() == cachedShape", "propertyGetters.length <= MAX_EXPLODE_SIZE" },
4850
assumptions = { "cachedShape.getValidAssumption()", "sharedShape.getValidAssumption()" },
4951
limit = "CACHE_LIMIT")
5052
protected void shareCached(RubyDynamicObject object,
5153
@Cached("object.getShape()") Shape cachedShape,
54+
@Cached("createSharedShape(cachedShape)") Shape sharedShape,
5255
@CachedLibrary(limit = "1") DynamicObjectLibrary objectLibrary,
5356
@Cached("new()") RunTwiceBranchProfile shareMetaClassProfile,
5457
@Cached("createShareInternalFieldsNode()") ShareInternalFieldsNode shareInternalFieldsNode,
55-
@Cached("getObjectProperties(cachedShape)") List<Property> properties,
56-
@Cached("createReadAndShareFieldNodes(properties)") ReadAndShareFieldNode[] readAndShareFieldNodes,
57-
@Cached("createSharedShape(cachedShape)") Shape sharedShape) {
58+
@Cached(value = "getObjectProperties(sharedShape)", dimensions = 1) PropertyGetter[] propertyGetters,
59+
@Cached("createWriteBarrierNodes(propertyGetters)") WriteBarrierNode[] writeBarrierNodes) {
5860
// Mark the object as shared first to avoid recursion
5961
assert object.getShape() == cachedShape;
6062
objectLibrary.markShared(object);
@@ -71,8 +73,10 @@ protected void shareCached(RubyDynamicObject object,
7173

7274
shareInternalFieldsNode.executeShare(object);
7375

74-
for (ReadAndShareFieldNode readAndShareFieldNode : readAndShareFieldNodes) {
75-
readAndShareFieldNode.executeReadFieldAndShare(object, sharedShape);
76+
for (int i = 0; i < propertyGetters.length; i++) {
77+
final PropertyGetter propertyGetter = propertyGetters[i];
78+
final Object value = propertyGetter.get(object);
79+
writeBarrierNodes[i].executeWriteBarrier(value);
7680
}
7781

7882
assert allFieldsAreShared(object);
@@ -96,26 +100,26 @@ protected void shareUncached(RubyDynamicObject object) {
96100
SharedObjects.writeBarrier(getLanguage(), object);
97101
}
98102

99-
protected static List<Property> getObjectProperties(Shape shape) {
100-
final List<Property> objectProperties = new ArrayList<>();
103+
protected static PropertyGetter[] getObjectProperties(Shape shape) {
104+
final List<PropertyGetter> objectProperties = new ArrayList<>();
101105
for (Property property : shape.getPropertyListInternal(false)) {
102-
if (property.getLocation() instanceof ObjectLocation) {
103-
objectProperties.add(property);
106+
if (!property.getLocation().isPrimitive()) {
107+
objectProperties.add(Objects.requireNonNull(shape.makePropertyGetter(property.getKey())));
104108
}
105109
}
106-
return objectProperties;
110+
return objectProperties.toArray(KernelNodes.CopyInstanceVariablesNode.EMPTY_PROPERTY_GETTER_ARRAY);
107111
}
108112

109113
protected ShareInternalFieldsNode createShareInternalFieldsNode() {
110114
return ShareInternalFieldsNodeGen.create(depth);
111115
}
112116

113-
protected ReadAndShareFieldNode[] createReadAndShareFieldNodes(List<Property> properties) {
114-
ReadAndShareFieldNode[] nodes = properties.size() == 0
115-
? ReadAndShareFieldNode.EMPTY_ARRAY
116-
: new ReadAndShareFieldNode[properties.size()];
117+
protected WriteBarrierNode[] createWriteBarrierNodes(PropertyGetter[] propertyGetters) {
118+
WriteBarrierNode[] nodes = propertyGetters.length == 0
119+
? WriteBarrierNode.EMPTY_ARRAY
120+
: new WriteBarrierNode[propertyGetters.length];
117121
for (int i = 0; i < nodes.length; i++) {
118-
nodes[i] = ReadAndShareFieldNodeGen.create(properties.get(i), depth);
122+
nodes[i] = WriteBarrierNodeGen.create(depth);
119123
}
120124
return nodes;
121125
}

src/main/java/org/truffleruby/language/objects/shared/WriteBarrierNode.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030
@NodeField(name = "depth", type = int.class)
3131
public abstract class WriteBarrierNode extends RubyBaseNode {
3232

33+
public static final WriteBarrierNode[] EMPTY_ARRAY = new WriteBarrierNode[0];
34+
3335
protected static final int MAX_DEPTH = 3;
3436

3537
protected abstract int getDepth();

0 commit comments

Comments
 (0)