Skip to content

Commit 1e6d988

Browse files
committed
[GR-26288] Store the metaClass directly in RubyDynamicObject
PullRequest: truffleruby/2011
2 parents 2a451fa + 9f5f055 commit 1e6d988

File tree

116 files changed

+984
-642
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

116 files changed

+984
-642
lines changed

src/main/java/org/truffleruby/RubyLanguage.java

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,23 +15,62 @@
1515

1616
import com.oracle.truffle.api.CompilerDirectives;
1717
import com.oracle.truffle.api.instrumentation.AllocationReporter;
18+
import com.oracle.truffle.api.object.Shape;
1819
import org.graalvm.options.OptionDescriptors;
20+
import org.truffleruby.core.RubyHandle;
21+
import org.truffleruby.core.array.RubyArray;
22+
import org.truffleruby.core.basicobject.RubyBasicObject;
23+
import org.truffleruby.core.binding.RubyBinding;
24+
import org.truffleruby.core.encoding.RubyEncoding;
25+
import org.truffleruby.core.encoding.RubyEncodingConverter;
26+
import org.truffleruby.core.exception.RubyException;
27+
import org.truffleruby.core.exception.RubyNameError;
28+
import org.truffleruby.core.exception.RubyNoMethodError;
29+
import org.truffleruby.core.exception.RubySystemCallError;
30+
import org.truffleruby.core.fiber.RubyFiber;
31+
import org.truffleruby.core.hash.RubyHash;
1932
import org.truffleruby.core.kernel.TraceManager;
33+
import org.truffleruby.core.klass.RubyClass;
34+
import org.truffleruby.core.method.RubyMethod;
35+
import org.truffleruby.core.method.RubyUnboundMethod;
36+
import org.truffleruby.core.module.RubyModule;
37+
import org.truffleruby.core.mutex.RubyConditionVariable;
38+
import org.truffleruby.core.mutex.RubyMutex;
2039
import org.truffleruby.core.objectspace.ObjectSpaceManager;
40+
import org.truffleruby.core.objectspace.RubyWeakMap;
41+
import org.truffleruby.core.proc.RubyProc;
42+
import org.truffleruby.core.queue.RubyQueue;
43+
import org.truffleruby.core.queue.RubySizedQueue;
44+
import org.truffleruby.core.range.RubyIntRange;
45+
import org.truffleruby.core.range.RubyLongRange;
46+
import org.truffleruby.core.range.RubyObjectRange;
47+
import org.truffleruby.core.regexp.RubyMatchData;
48+
import org.truffleruby.core.regexp.RubyRegexp;
2149
import org.truffleruby.core.rope.Rope;
2250
import org.truffleruby.core.rope.RopeCache;
2351
import org.truffleruby.core.string.CoreStrings;
52+
import org.truffleruby.core.string.RubyString;
2453
import org.truffleruby.core.string.StringUtils;
54+
import org.truffleruby.core.support.RubyByteArray;
55+
import org.truffleruby.core.support.RubyIO;
56+
import org.truffleruby.core.support.RubyRandomizer;
2557
import org.truffleruby.core.symbol.CoreSymbols;
2658
import org.truffleruby.core.symbol.RubySymbol;
2759
import org.truffleruby.core.symbol.SymbolTable;
60+
import org.truffleruby.core.thread.RubyBacktraceLocation;
2861
import org.truffleruby.core.thread.RubyThread;
62+
import org.truffleruby.core.time.RubyTime;
63+
import org.truffleruby.core.tracepoint.RubyTracePoint;
2964
import org.truffleruby.debug.GlobalScope;
3065
import org.truffleruby.debug.LexicalScope;
66+
import org.truffleruby.extra.RubyAtomicReference;
67+
import org.truffleruby.extra.ffi.RubyPointer;
3168
import org.truffleruby.language.NotProvided;
69+
import org.truffleruby.language.RubyDynamicObject;
3270
import org.truffleruby.language.RubyEvalInteractiveRootNode;
3371
import org.truffleruby.language.RubyInlineParsingRequestNode;
3472
import org.truffleruby.language.RubyParsingRequestNode;
73+
import org.truffleruby.language.objects.RubyObjectType;
3574
import org.truffleruby.platform.Platform;
3675
import org.truffleruby.shared.Metrics;
3776
import org.truffleruby.shared.TruffleRuby;
@@ -53,6 +92,8 @@
5392
import com.oracle.truffle.api.nodes.ExecutableNode;
5493
import com.oracle.truffle.api.nodes.Node;
5594
import com.oracle.truffle.api.utilities.CyclicAssumption;
95+
import org.truffleruby.stdlib.bigdecimal.RubyBigDecimal;
96+
import org.truffleruby.stdlib.digest.RubyDigest;
5697

5798
@TruffleLanguage.Registration(
5899
name = "Ruby",
@@ -103,6 +144,54 @@ public class RubyLanguage extends TruffleLanguage<RubyContext> {
103144

104145
private final AtomicLong nextObjectID = new AtomicLong(ObjectSpaceManager.INITIAL_LANGUAGE_OBJECT_ID);
105146

147+
private static final RubyObjectType objectType = new RubyObjectType();
148+
149+
public final Shape basicObjectShape = createShape(RubyBasicObject.class);
150+
public final Shape moduleShape = createShape(RubyModule.class);
151+
public final Shape classShape = createShape(RubyClass.class);
152+
153+
// TODO (eregon, 25 Sep 2020): These Shapes should ideally be stored in the language instance,
154+
// so different Engines/RubyLanguage instances can have different type profiles.
155+
// However that requires passing the language instance around a lot which is inconvenient
156+
// and does not seem worth it currently. Also these builtin types are rather unlikely to have
157+
// instance variables.
158+
public static final Shape arrayShape = createShape(RubyArray.class);
159+
public static final Shape atomicReferenceShape = createShape(RubyAtomicReference.class);
160+
public static final Shape bigDecimalShape = createShape(RubyBigDecimal.class);
161+
public static final Shape bindingShape = createShape(RubyBinding.class);
162+
public static final Shape byteArrayShape = createShape(RubyByteArray.class);
163+
public static final Shape conditionVariableShape = createShape(RubyConditionVariable.class);
164+
public static final Shape digestShape = createShape(RubyDigest.class);
165+
public static final Shape encodingConverterShape = createShape(RubyEncodingConverter.class);
166+
public static final Shape encodingShape = createShape(RubyEncoding.class);
167+
public static final Shape exceptionShape = createShape(RubyException.class);
168+
public static final Shape fiberShape = createShape(RubyFiber.class);
169+
public static final Shape handleShape = createShape(RubyHandle.class);
170+
public static final Shape hashShape = createShape(RubyHash.class);
171+
public static final Shape intRangeShape = createShape(RubyIntRange.class);
172+
public static final Shape ioShape = createShape(RubyIO.class);
173+
public static final Shape longRangeShape = createShape(RubyLongRange.class);
174+
public static final Shape matchDataShape = createShape(RubyMatchData.class);
175+
public static final Shape methodShape = createShape(RubyMethod.class);
176+
public static final Shape mutexShape = createShape(RubyMutex.class);
177+
public static final Shape nameErrorShape = createShape(RubyNameError.class);
178+
public static final Shape noMethodErrorShape = createShape(RubyNoMethodError.class);
179+
public static final Shape objectRangeShape = createShape(RubyObjectRange.class);
180+
public static final Shape procShape = createShape(RubyProc.class);
181+
public static final Shape queueShape = createShape(RubyQueue.class);
182+
public static final Shape randomizerShape = createShape(RubyRandomizer.class);
183+
public static final Shape regexpShape = createShape(RubyRegexp.class);
184+
public static final Shape sizedQueueShape = createShape(RubySizedQueue.class);
185+
public static final Shape stringShape = createShape(RubyString.class);
186+
public static final Shape systemCallErrorShape = createShape(RubySystemCallError.class);
187+
public static final Shape threadBacktraceLocationShape = createShape(RubyBacktraceLocation.class);
188+
public static final Shape threadShape = createShape(RubyThread.class);
189+
public static final Shape timeShape = createShape(RubyTime.class);
190+
public static final Shape tracePointShape = createShape(RubyTracePoint.class);
191+
public static final Shape truffleFFIPointerShape = createShape(RubyPointer.class);
192+
public static final Shape unboundMethodShape = createShape(RubyUnboundMethod.class);
193+
public static final Shape weakMapShape = createShape(RubyWeakMap.class);
194+
106195
public RubyLanguage() {
107196
coreStrings = new CoreStrings(this);
108197
coreSymbols = new CoreSymbols();
@@ -197,6 +286,10 @@ public static RubyContext getCurrentContext() {
197286
return getCurrentContext(RubyLanguage.class);
198287
}
199288

289+
public static RubyLanguage getCurrentLanguage() {
290+
return getCurrentLanguage(RubyLanguage.class);
291+
}
292+
200293
@Override
201294
protected RootCallTarget parse(ParsingRequest request) {
202295
if (request.getSource().isInteractive()) {
@@ -314,4 +407,13 @@ public long getNextObjectID() {
314407
return id;
315408
}
316409

410+
private static Shape createShape(Class<? extends RubyDynamicObject> layoutClass) {
411+
return Shape
412+
.newBuilder()
413+
.allowImplicitCastIntToLong(true)
414+
.layout(layoutClass)
415+
.dynamicType(RubyLanguage.objectType)
416+
.build();
417+
}
418+
317419
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import org.jcodings.specific.UTF8Encoding;
2020
import org.truffleruby.Layouts;
2121
import org.truffleruby.RubyContext;
22+
import org.truffleruby.RubyLanguage;
2223
import org.truffleruby.builtins.CoreMethod;
2324
import org.truffleruby.builtins.CoreMethodArrayArgumentsNode;
2425
import org.truffleruby.builtins.CoreMethodNode;
@@ -1033,7 +1034,8 @@ protected RubyPointer toNative(RubyString string,
10331034
final NativeRope nativeRope = stringToNativeNode.executeToNative(string);
10341035

10351036
final RubyPointer instance = new RubyPointer(
1036-
coreLibrary().truffleFFIPointerShape,
1037+
coreLibrary().truffleFFIPointerClass,
1038+
RubyLanguage.truffleFFIPointerShape,
10371039
nativeRope.getNativePointer());
10381040
allocateNode.trace(instance, this);
10391041
return instance;

0 commit comments

Comments
 (0)