Skip to content

Commit

Permalink
Showing 2 changed files with 14 additions and 3 deletions.
Original file line number Diff line number Diff line change
@@ -35,6 +35,7 @@ public final class CachedForeignDispatchNode extends CachedDispatchNode {
@Child private Node nullCheck;
@Child private Node access;
@Child private PrepareArguments prepareArguments;
@CompilerDirectives.CompilationFinal private boolean passReceiver;

public CachedForeignDispatchNode(RubyContext context, DispatchNode next, Object cachedName, int arity) {
super(context, cachedName, next, false, DispatchAction.CALL_METHOD);
@@ -58,8 +59,12 @@ private void initializeNodes(RubyContext context, int arity) {
directArray = Message.WRITE.createNode();
} else if (name.endsWith("=") && arity == 1) {
directField = Message.WRITE.createNode();
} else if (name.endsWith("static_call")) {
directCall = Message.createExecute(arity).createNode();
passReceiver = false;
} else if (name.endsWith("call")) {// arity + 1 for receiver
directCall = Message.createExecute(arity + 1).createNode();
passReceiver = true;
} else if (name.endsWith("nil?")) {
nullCheck = Message.IS_NULL.createNode();
} else if (arity == 0) {
@@ -112,8 +117,14 @@ private Object doDispatch(VirtualFrame frame, TruffleObject receiverObject, Obje
args[0] = nameForMessage;
return ForeignAccess.execute(directField, frame, receiverObject, args);
} else if (directCall != null) {
Object[] args = prepareArguments.convertArguments(frame, arguments, 1);
args[0] = receiverObject;
Object[] args;

if (passReceiver) {
args = prepareArguments.convertArguments(frame, arguments, 1);
args[0] = receiverObject;
} else {
args = prepareArguments.convertArguments(frame, arguments, 0);
}
return ForeignAccess.execute(directCall, frame, receiverObject, args);
} else if (nullCheck != null) {
Object[] args = prepareArguments.convertArguments(frame, arguments, 0);
2 changes: 1 addition & 1 deletion truffle/src/main/ruby/core/rubinius/primitives.rb
Original file line number Diff line number Diff line change
@@ -34,7 +34,7 @@ def self.module_mirror(obj)
Truffle::Primitive.install_rubinius_primitive method(:module_mirror)

def self.vm_gc_start(obj)
Truffle::Interop.execute Truffle::Java::System.gc
Truffle::Java::System.gc.static_call
end

Truffle::Primitive.install_rubinius_primitive method(:vm_gc_start)

0 comments on commit 44be094

Please sign in to comment.