Skip to content

Commit 7dde61f

Browse files
committed
Extract the reading of the context and CoreLibrary in MetaClassNode
* 1800 -> 874 for org.truffleruby.language.objects.MetaClassNodeGen.execute * In PE compilation the potentially unnecessary coreLibrary() is removed if unused.
1 parent 0f4aebb commit 7dde61f

File tree

1 file changed

+33
-28
lines changed

1 file changed

+33
-28
lines changed

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

Lines changed: 33 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff;
1313
import com.oracle.truffle.api.dsl.NeverDefault;
1414
import com.oracle.truffle.api.dsl.TypeSystemReference;
15+
import org.truffleruby.core.CoreLibrary;
1516
import org.truffleruby.core.encoding.RubyEncoding;
1617
import org.truffleruby.core.klass.RubyClass;
1718
import org.truffleruby.core.numeric.RubyBignum;
@@ -41,90 +42,94 @@ public static MetaClassNode getUncached() {
4142
return MetaClassNodeGen.getUncached();
4243
}
4344

44-
public abstract RubyClass execute(Object value);
45+
public final RubyClass execute(Object value) {
46+
return execute(value, coreLibrary());
47+
}
48+
49+
protected abstract RubyClass execute(Object value, CoreLibrary coreLibrary);
4550

4651
// Cover all primitives, nil and symbols
4752

4853
@Specialization(guards = "value")
49-
protected RubyClass metaClassTrue(boolean value) {
50-
return coreLibrary().trueClass;
54+
protected RubyClass metaClassTrue(boolean value, CoreLibrary coreLibrary) {
55+
return coreLibrary.trueClass;
5156
}
5257

5358
@Specialization(guards = "!value")
54-
protected RubyClass metaClassFalse(boolean value) {
55-
return coreLibrary().falseClass;
59+
protected RubyClass metaClassFalse(boolean value, CoreLibrary coreLibrary) {
60+
return coreLibrary.falseClass;
5661
}
5762

5863
@Specialization
59-
protected RubyClass metaClassInt(int value) {
60-
return coreLibrary().integerClass;
64+
protected RubyClass metaClassInt(int value, CoreLibrary coreLibrary) {
65+
return coreLibrary.integerClass;
6166
}
6267

6368
@Specialization
64-
protected RubyClass metaClassLong(long value) {
65-
return coreLibrary().integerClass;
69+
protected RubyClass metaClassLong(long value, CoreLibrary coreLibrary) {
70+
return coreLibrary.integerClass;
6671
}
6772

6873
@Specialization
69-
protected RubyClass metaClassBignum(RubyBignum value) {
70-
return coreLibrary().integerClass;
74+
protected RubyClass metaClassBignum(RubyBignum value, CoreLibrary coreLibrary) {
75+
return coreLibrary.integerClass;
7176
}
7277

7378
@Specialization
74-
protected RubyClass metaClassDouble(double value) {
75-
return coreLibrary().floatClass;
79+
protected RubyClass metaClassDouble(double value, CoreLibrary coreLibrary) {
80+
return coreLibrary.floatClass;
7681
}
7782

7883
@Specialization
79-
protected RubyClass metaClassNil(Nil value) {
80-
return coreLibrary().nilClass;
84+
protected RubyClass metaClassNil(Nil value, CoreLibrary coreLibrary) {
85+
return coreLibrary.nilClass;
8186
}
8287

8388
@Specialization
84-
protected RubyClass metaClassSymbol(RubySymbol value) {
85-
return coreLibrary().symbolClass;
89+
protected RubyClass metaClassSymbol(RubySymbol value, CoreLibrary coreLibrary) {
90+
return coreLibrary.symbolClass;
8691
}
8792

8893
@Specialization
89-
protected RubyClass metaClassEncoding(RubyEncoding value) {
90-
return coreLibrary().encodingClass;
94+
protected RubyClass metaClassEncoding(RubyEncoding value, CoreLibrary coreLibrary) {
95+
return coreLibrary.encodingClass;
9196
}
9297

9398
@Specialization
94-
protected RubyClass metaClassImmutableString(ImmutableRubyString value) {
95-
return coreLibrary().stringClass;
99+
protected RubyClass metaClassImmutableString(ImmutableRubyString value, CoreLibrary coreLibrary) {
100+
return coreLibrary.stringClass;
96101
}
97102

98103
@Specialization
99-
protected RubyClass metaClassRegexp(RubyRegexp value) {
100-
return coreLibrary().regexpClass;
104+
protected RubyClass metaClassRegexp(RubyRegexp value, CoreLibrary coreLibrary) {
105+
return coreLibrary.regexpClass;
101106
}
102107

103108
@Specialization
104-
protected RubyClass metaClassIntRange(RubyIntOrLongRange value) {
105-
return coreLibrary().rangeClass;
109+
protected RubyClass metaClassIntRange(RubyIntOrLongRange value, CoreLibrary coreLibrary) {
110+
return coreLibrary.rangeClass;
106111
}
107112

108113
// Cover all RubyDynamicObject cases with cached and uncached
109114

110115
@Specialization(
111116
guards = { "object == cachedObject", "metaClass.isSingleton" },
112117
limit = "getIdentityCacheContextLimit()")
113-
protected RubyClass singletonClassCached(RubyDynamicObject object,
118+
protected RubyClass singletonClassCached(RubyDynamicObject object, CoreLibrary coreLibrary,
114119
@Cached("object") RubyDynamicObject cachedObject,
115120
@Cached("object.getMetaClass()") RubyClass metaClass) {
116121
return metaClass;
117122
}
118123

119124
@Specialization(replaces = "singletonClassCached")
120-
protected RubyClass metaClassObject(RubyDynamicObject object) {
125+
protected RubyClass metaClassObject(RubyDynamicObject object, CoreLibrary coreLibrary) {
121126
return object.getMetaClass();
122127
}
123128

124129
// Foreign object
125130
@InliningCutoff
126131
@Specialization(guards = "isForeignObject(object)")
127-
protected RubyClass metaClassForeign(Object object,
132+
protected RubyClass metaClassForeign(Object object, CoreLibrary coreLibrary,
128133
@Cached ForeignClassNode foreignClassNode) {
129134
return foreignClassNode.execute(object);
130135
}

0 commit comments

Comments
 (0)