11
11
12
12
import java .util .ArrayList ;
13
13
import java .util .List ;
14
+ import java .util .Objects ;
14
15
16
+ import com .oracle .truffle .api .object .PropertyGetter ;
17
+ import org .truffleruby .core .kernel .KernelNodes ;
15
18
import org .truffleruby .language .RubyBaseNode ;
16
19
import org .truffleruby .language .RubyDynamicObject ;
17
20
import org .truffleruby .language .objects .ObjectGraph ;
23
26
import com .oracle .truffle .api .library .CachedLibrary ;
24
27
import com .oracle .truffle .api .nodes .ExplodeLoop ;
25
28
import com .oracle .truffle .api .object .DynamicObjectLibrary ;
26
- import com .oracle .truffle .api .object .ObjectLocation ;
27
29
import com .oracle .truffle .api .object .Property ;
28
30
import com .oracle .truffle .api .object .Shape ;
29
31
import org .truffleruby .utils .RunTwiceBranchProfile ;
@@ -44,17 +46,17 @@ public ShareObjectNode(int depth) {
44
46
45
47
@ ExplodeLoop
46
48
@ Specialization (
47
- guards = { "object.getShape() == cachedShape" , "properties.size() <= MAX_EXPLODE_SIZE" },
49
+ guards = { "object.getShape() == cachedShape" , "propertyGetters.length <= MAX_EXPLODE_SIZE" },
48
50
assumptions = { "cachedShape.getValidAssumption()" , "sharedShape.getValidAssumption()" },
49
51
limit = "CACHE_LIMIT" )
50
52
protected void shareCached (RubyDynamicObject object ,
51
53
@ Cached ("object.getShape()" ) Shape cachedShape ,
54
+ @ Cached ("createSharedShape(cachedShape)" ) Shape sharedShape ,
52
55
@ CachedLibrary (limit = "1" ) DynamicObjectLibrary objectLibrary ,
53
56
@ Cached ("new()" ) RunTwiceBranchProfile shareMetaClassProfile ,
54
57
@ 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 ) {
58
60
// Mark the object as shared first to avoid recursion
59
61
assert object .getShape () == cachedShape ;
60
62
objectLibrary .markShared (object );
@@ -71,8 +73,10 @@ protected void shareCached(RubyDynamicObject object,
71
73
72
74
shareInternalFieldsNode .executeShare (object );
73
75
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 );
76
80
}
77
81
78
82
assert allFieldsAreShared (object );
@@ -96,26 +100,26 @@ protected void shareUncached(RubyDynamicObject object) {
96
100
SharedObjects .writeBarrier (getLanguage (), object );
97
101
}
98
102
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 <>();
101
105
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 ())) );
104
108
}
105
109
}
106
- return objectProperties ;
110
+ return objectProperties . toArray ( KernelNodes . CopyInstanceVariablesNode . EMPTY_PROPERTY_GETTER_ARRAY ) ;
107
111
}
108
112
109
113
protected ShareInternalFieldsNode createShareInternalFieldsNode () {
110
114
return ShareInternalFieldsNodeGen .create (depth );
111
115
}
112
116
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 ];
117
121
for (int i = 0 ; i < nodes .length ; i ++) {
118
- nodes [i ] = ReadAndShareFieldNodeGen .create (properties . get ( i ), depth );
122
+ nodes [i ] = WriteBarrierNodeGen .create (depth );
119
123
}
120
124
return nodes ;
121
125
}
0 commit comments