Skip to content

Commit 9570c73

Browse files
committed
[Truffle] Truffle::Primitive::Handle generic opaque Java object container.
Useful for when you are writing most of a library in Ruby, with some primitives in Java and you need to pass objects between those primitives. Users never see those objects, as you wrap them up in higher level classes for the user, so you don't want to create a new Ruby class for each one.
1 parent 5c6de48 commit 9570c73

File tree

5 files changed

+56
-1
lines changed

5 files changed

+56
-1
lines changed

Diff for: truffle/src/main/java/org/jruby/truffle/nodes/RubyGuards.java

+8
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,14 @@ public static boolean isRubyMatchData(DynamicObject object) {
213213
return Layouts.MATCH_DATA.isMatchData(object);
214214
}
215215

216+
public static boolean isHandle(DynamicObject object) {
217+
return Layouts.HANDLE.isHandle(object);
218+
}
219+
220+
public static boolean isHandle(Object object) {
221+
return Layouts.HANDLE.isHandle(object);
222+
}
223+
216224
// Internal types
217225

218226
public static boolean isThreadLocal(Object value) {

Diff for: truffle/src/main/java/org/jruby/truffle/runtime/RubyContext.java

+5
Original file line numberDiff line numberDiff line change
@@ -691,4 +691,9 @@ public Options getOptions() {
691691
public MemoryManager getMemoryManager() {
692692
return memoryManager;
693693
}
694+
695+
public DynamicObject createHandle(Object object) {
696+
return Layouts.HANDLE.createHandle(coreLibrary.getHandleFactory(), object);
697+
}
698+
694699
}

Diff for: truffle/src/main/java/org/jruby/truffle/runtime/core/CoreLibrary.java

+10-1
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,8 @@ public class CoreLibrary {
165165
private final DynamicObject randomizerClass;
166166
private final DynamicObjectFactory randomizerFactory;
167167
private final DynamicObject atomicReferenceClass;
168+
private final DynamicObject handleClass;
169+
private final DynamicObjectFactory handleFactory;
168170

169171
private final DynamicObject argv;
170172
private final DynamicObject globalVariablesObject;
@@ -434,7 +436,7 @@ public CoreLibrary(RubyContext context) {
434436
truffleModule = defineModule("Truffle");
435437
defineModule(truffleModule, "Interop");
436438
defineModule(truffleModule, "Debug");
437-
defineModule(truffleModule, "Primitive");
439+
final DynamicObject primitiveModule = defineModule(truffleModule, "Primitive");
438440
defineModule(truffleModule, "Digest");
439441
defineModule(truffleModule, "Zlib");
440442
defineModule(truffleModule, "ObjSpace");
@@ -445,6 +447,9 @@ public CoreLibrary(RubyContext context) {
445447
final DynamicObject psychHandlerClass = defineClass(psychModule, objectClass, "Handler");
446448
final DynamicObject psychEmitterClass = defineClass(psychModule, psychHandlerClass, "Emitter");
447449
Layouts.CLASS.setInstanceFactoryUnsafe(psychEmitterClass, Layouts.PSYCH_EMITTER.createEmitterShape(psychEmitterClass, psychEmitterClass));
450+
handleClass = defineClass(primitiveModule, objectClass, "Handle");
451+
handleFactory = Layouts.HANDLE.createHandleShape(handleClass, handleClass);
452+
Layouts.CLASS.setInstanceFactoryUnsafe(handleClass, handleFactory);
448453

449454
bigDecimalClass = defineClass(truffleModule, numericClass, "BigDecimal");
450455
Layouts.CLASS.setInstanceFactoryUnsafe(bigDecimalClass, Layouts.BIG_DECIMAL.createBigDecimalShape(bigDecimalClass, bigDecimalClass));
@@ -1599,4 +1604,8 @@ public DynamicObject getSystemExitClass() {
15991604
return systemExitClass;
16001605
}
16011606

1607+
public DynamicObjectFactory getHandleFactory() {
1608+
return handleFactory;
1609+
}
1610+
16021611
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
/*
2+
* Copyright (c) 2015 Oracle and/or its affiliates. All rights reserved. This
3+
* code is released under a tri EPL/GPL/LGPL license. You can use it,
4+
* redistribute it and/or modify it under the terms of the:
5+
*
6+
* Eclipse Public License version 1.0
7+
* GNU General Public License version 2
8+
* GNU Lesser General Public License version 2.1
9+
*/
10+
package org.jruby.truffle.runtime.layouts;
11+
12+
import com.oracle.truffle.api.object.DynamicObject;
13+
import com.oracle.truffle.api.object.DynamicObjectFactory;
14+
import org.jruby.truffle.om.dsl.api.Layout;
15+
16+
import java.math.BigInteger;
17+
18+
@Layout
19+
public interface HandleLayout extends BasicObjectLayout {
20+
21+
DynamicObjectFactory createHandleShape(DynamicObject logicalClass,
22+
DynamicObject metaClass);
23+
24+
DynamicObject createHandle(DynamicObjectFactory factory,
25+
Object object);
26+
27+
boolean isHandle(Object object);
28+
boolean isHandle(DynamicObject object);
29+
30+
Object getObject(DynamicObject object);
31+
32+
}

Diff for: truffle/src/main/java/org/jruby/truffle/runtime/layouts/Layouts.java

+1
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ public abstract class Layouts {
5959
public static final EmitterLayout PSYCH_EMITTER = EmitterLayoutImpl.INSTANCE;
6060
public static final RandomizerLayout RANDOMIZER = RandomizerLayoutImpl.INSTANCE;
6161
public static final AtomicReferenceLayout ATOMIC_REFERENCE = AtomicReferenceLayoutImpl.INSTANCE;
62+
public static final HandleLayout HANDLE = HandleLayoutImpl.INSTANCE;
6263

6364
// Other standard identifiers
6465

0 commit comments

Comments
 (0)