Skip to content

Commit 81fcc24

Browse files
committed
Ensure CoreLibrary#{getMetaClass,getLogicalClass} is never used in PE code
1 parent 154eedc commit 81fcc24

File tree

6 files changed

+20
-12
lines changed

6 files changed

+20
-12
lines changed

src/main/java/org/truffleruby/core/CoreLibrary.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import java.util.concurrent.ConcurrentHashMap;
2424
import java.util.concurrent.ConcurrentMap;
2525

26+
import com.oracle.truffle.api.CompilerAsserts;
2627
import com.oracle.truffle.api.object.Shape;
2728
import org.jcodings.specific.USASCIIEncoding;
2829
import org.jcodings.transcode.EConvFlags;
@@ -866,17 +867,17 @@ private void afterLoadCoreLibrary() {
866867
.getValue();
867868
}
868869

869-
@TruffleBoundary
870870
public RubyClass getMetaClass(Object object) {
871+
CompilerAsserts.neverPartOfCompilation("MetaClassNode should be used instead");
871872
if (object instanceof RubyDynamicObject) {
872873
return ((RubyDynamicObject) object).getMetaClass();
873874
} else {
874875
return getLogicalClass(object);
875876
}
876877
}
877878

878-
@TruffleBoundary
879879
public RubyClass getLogicalClass(Object object) {
880+
CompilerAsserts.neverPartOfCompilation("LogicalClassNode should be used instead");
880881
if (object instanceof RubyDynamicObject) {
881882
return ((RubyDynamicObject) object).getLogicalClass();
882883
} else if (object instanceof Nil) {

src/main/java/org/truffleruby/core/cast/ToFNode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ private double coerceObject(Object object, BranchProfile errorProfile) {
7777
}
7878
}
7979

80-
if (coreLibrary().getLogicalClass(coerced) == coreLibrary().floatClass) {
80+
if (coerced instanceof Double) {
8181
return (double) coerced;
8282
} else {
8383
errorProfile.enter();

src/main/java/org/truffleruby/core/exception/CoreExceptions.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,7 @@ public RubyException argumentErrorInvalidBigDecimal(String string, Node currentN
246246
return argumentError(StringUtils.format("invalid value for BigDecimal(): \"%s\"", string), currentNode);
247247
}
248248

249+
@TruffleBoundary
249250
public RubyException argumentErrorCantUnfreeze(Object self, Node currentNode) {
250251
String className = context.getCoreLibrary().getLogicalClass(self).fields.getName();
251252
return argumentError(StringUtils.format("can't unfreeze %s", className), currentNode);

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1311,7 +1311,8 @@ public GetMethodObjectNode(boolean ignoreVisibility) {
13111311
@Specialization
13121312
protected RubyMethod method(VirtualFrame frame, Object self, Object name,
13131313
@Cached ConditionProfile notFoundProfile,
1314-
@Cached ConditionProfile respondToMissingProfile) {
1314+
@Cached ConditionProfile respondToMissingProfile,
1315+
@Cached LogicalClassNode logicalClassNode) {
13151316
final String normalizedName = nameToJavaStringNode.execute(name);
13161317
InternalMethod method = lookupMethodNode
13171318
.lookup(frame, self, normalizedName, dispatchConfig);
@@ -1328,7 +1329,7 @@ protected RubyMethod method(VirtualFrame frame, Object self, Object name,
13281329
getContext(),
13291330
coreExceptions().nameErrorUndefinedMethod(
13301331
normalizedName,
1331-
coreLibrary().getLogicalClass(self),
1332+
logicalClassNode.executeLogicalClass(self),
13321333
this));
13331334
}
13341335
}

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -307,10 +307,11 @@ public static SubstringNode create() {
307307
protected RubyString substring(Object source, int offset, int byteLength,
308308
@CachedLibrary(limit = "2") RubyStringLibrary libSource,
309309
@CachedLibrary(limit = "2") RubyLibrary library,
310+
@Cached LogicalClassNode logicalClassNode,
310311
@Cached AllocateHelperNode allocateHelperNode) {
311312
final Rope rope = libSource.getRope(source);
312313

313-
final RubyClass logicalClass = coreLibrary().getLogicalClass(source);
314+
final RubyClass logicalClass = logicalClassNode.executeLogicalClass(source);
314315
final Shape shape = allocateHelperNode.getCachedShape(logicalClass);
315316
final RubyString string = new RubyString(
316317
logicalClass,
@@ -386,9 +387,10 @@ protected RubyNode coerceToInteger(RubyNode times) {
386387

387388
@Specialization(guards = "times == 0")
388389
protected RubyString multiplyZero(Object string, int times,
389-
@CachedLibrary(limit = "2") RubyStringLibrary libString) {
390+
@CachedLibrary(limit = "2") RubyStringLibrary libString,
391+
@Cached LogicalClassNode logicalClassNode) {
390392

391-
final RubyClass logicalClass = coreLibrary().getLogicalClass(string);
393+
final RubyClass logicalClass = logicalClassNode.executeLogicalClass(string);
392394
final Shape shape = allocateHelperNode.getCachedShape(logicalClass);
393395
final RubyString instance = new RubyString(
394396
logicalClass,
@@ -5085,6 +5087,7 @@ public static abstract class StringSubstringPrimitiveNode extends CoreMethodArra
50855087
@Child RopeNodes.CharacterLengthNode characterLengthNode = RopeNodes.CharacterLengthNode.create();
50865088
@Child RopeNodes.SingleByteOptimizableNode singleByteOptimizableNode = RopeNodes.SingleByteOptimizableNode
50875089
.create();
5090+
@Child LogicalClassNode logicalClassNode = LogicalClassNode.create();
50885091
@Child private RopeNodes.SubstringNode substringNode;
50895092

50905093
public abstract Object execute(Object string, int index, int length);
@@ -5282,7 +5285,7 @@ private RubyString makeRope(Object string, Rope rope, int beg, int byteLength, b
52825285
substringNode = insert(RopeNodes.SubstringNode.create());
52835286
}
52845287

5285-
final RubyClass logicalClass = coreLibrary().getLogicalClass(string);
5288+
final RubyClass logicalClass = logicalClassNode.executeLogicalClass(string);
52865289
final Shape shape = allocateHelperNode.getCachedShape(logicalClass);
52875290
final RubyString ret = new RubyString(
52885291
logicalClass,

src/main/java/org/truffleruby/interop/InteropNodes.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
import org.truffleruby.language.control.RaiseException;
5555
import org.truffleruby.language.dispatch.DispatchNode;
5656
import org.truffleruby.language.library.RubyStringLibrary;
57+
import org.truffleruby.language.objects.LogicalClassNode;
5758
import org.truffleruby.shared.TruffleRuby;
5859

5960
import com.oracle.truffle.api.CallTarget;
@@ -1911,16 +1912,17 @@ public abstract static class InteropMetaObjectNode extends InteropCoreMethodArra
19111912
@Specialization(limit = "getCacheLimit()")
19121913
protected Object metaObject(Object value,
19131914
@CachedLibrary("value") InteropLibrary interop,
1914-
@Cached BranchProfile errorProfile) {
1915+
@Cached BranchProfile errorProfile,
1916+
@Cached LogicalClassNode logicalClassNode) {
19151917
if (interop.hasMetaObject(value)) {
19161918
try {
19171919
return interop.getMetaObject(value);
19181920
} catch (UnsupportedMessageException e) {
19191921
errorProfile.enter();
1920-
return coreLibrary().getLogicalClass(value);
1922+
return logicalClassNode.executeLogicalClass(value);
19211923
}
19221924
} else {
1923-
return coreLibrary().getLogicalClass(value);
1925+
return logicalClassNode.executeLogicalClass(value);
19241926
}
19251927
}
19261928
}

0 commit comments

Comments
 (0)