Skip to content

Commit

Permalink
Showing 10 changed files with 50 additions and 31 deletions.
6 changes: 1 addition & 5 deletions truffle/src/main/java/org/jruby/truffle/nodes/RubyNode.java
Original file line number Diff line number Diff line change
@@ -25,7 +25,6 @@
import jnr.posix.POSIX;
import org.jcodings.specific.UTF8Encoding;
import org.jruby.RubyString;
import org.jruby.truffle.nodes.core.BindingNodes;
import org.jruby.truffle.nodes.dispatch.DispatchNode;
import org.jruby.truffle.nodes.instrument.RubyWrapperNode;
import org.jruby.truffle.runtime.NotProvided;
@@ -226,10 +225,7 @@ protected Object ruby(VirtualFrame frame, String expression, Object... arguments
protected Object rubyWithSelf(VirtualFrame frame, Object self, String expression, Object... arguments) {
final MaterializedFrame evalFrame = setupFrame(RubyArguments.getSelf(frame.getArguments()), arguments);

final DynamicObject binding = BindingNodes.createRubyBinding(
getContext().getCoreLibrary().getBindingClass(),
self,
evalFrame);
final DynamicObject binding = Layouts.BINDING.createBinding(getContext().getCoreLibrary().getBindingFactory(), self, evalFrame);

return getContext().eval(expression, binding, true, "inline-ruby", this);
}
Original file line number Diff line number Diff line change
@@ -20,7 +20,6 @@
import org.jcodings.specific.UTF8Encoding;
import org.jruby.RubyString;
import org.jruby.truffle.nodes.RubyNode;
import org.jruby.truffle.nodes.core.BindingNodes;
import org.jruby.truffle.runtime.RubyArguments;
import org.jruby.truffle.runtime.RubyContext;
import org.jruby.truffle.runtime.layouts.Layouts;
@@ -83,7 +82,7 @@ public void trace(VirtualFrame frame) {
file,
line,
context.getCoreLibrary().getNilObject(),
BindingNodes.createRubyBinding(context.getCoreLibrary().getBindingClass(), RubyArguments.getSelf(frame.getArguments()), frame.materialize()),
Layouts.BINDING.createBinding(getContext().getCoreLibrary().getBindingFactory(), RubyArguments.getSelf(frame.getArguments()), frame.materialize()),
context.getCoreLibrary().getNilObject()
};

Original file line number Diff line number Diff line change
@@ -24,6 +24,8 @@
import org.jruby.truffle.nodes.locals.ReadFrameSlotNodeGen;
import org.jruby.truffle.nodes.locals.WriteFrameSlotNode;
import org.jruby.truffle.nodes.locals.WriteFrameSlotNodeGen;
import org.jruby.truffle.nodes.objects.AllocateObjectNode;
import org.jruby.truffle.nodes.objects.AllocateObjectNodeGen;
import org.jruby.truffle.runtime.RubyArguments;
import org.jruby.truffle.runtime.RubyContext;
import org.jruby.truffle.runtime.ThreadLocalObject;
@@ -35,14 +37,6 @@
@CoreClass(name = "Binding")
public abstract class BindingNodes {

public static DynamicObject createRubyBinding(DynamicObject bindingClass) {
return createRubyBinding(bindingClass, null, null);
}

public static DynamicObject createRubyBinding(DynamicObject bindingClass, Object self, MaterializedFrame frame) {
return Layouts.BINDING.createBinding(Layouts.CLASS.getInstanceFactory(bindingClass), self, frame);
}

@CoreMethod(names = "initialize_copy", required = 1)
public abstract static class InitializeCopyNode extends CoreMethodArrayArgumentsNode {

@@ -281,13 +275,16 @@ public DynamicObject localVariables(DynamicObject binding) {
@CoreMethod(names = "allocate", constructor = true)
public abstract static class AllocateNode extends CoreMethodArrayArgumentsNode {

@Child private AllocateObjectNode allocateObjectNode;

public AllocateNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
allocateObjectNode = AllocateObjectNodeGen.create(context, sourceSection, null, null);
}

@Specialization
public DynamicObject allocate(DynamicObject rubyClass) {
return BindingNodes.createRubyBinding(rubyClass);
return allocateObjectNode.allocate(rubyClass, null, null);
}

}
Original file line number Diff line number Diff line change
@@ -291,10 +291,7 @@ public DynamicObject binding() {
final MaterializedFrame callerFrame = RubyCallStack.getCallerFrame(getContext())
.getFrame(FrameInstance.FrameAccess.MATERIALIZE, false).materialize();

return BindingNodes.createRubyBinding(
getContext().getCoreLibrary().getBindingClass(),
RubyArguments.getSelf(callerFrame.getArguments()),
callerFrame);
return Layouts.BINDING.createBinding(getContext().getCoreLibrary().getBindingFactory(), RubyArguments.getSelf(callerFrame.getArguments()), callerFrame);
}
}

Original file line number Diff line number Diff line change
@@ -199,9 +199,7 @@ public BindingNode(RubyContext context, SourceSection sourceSection) {
public Object binding(DynamicObject proc) {
final MaterializedFrame frame = Layouts.PROC.getDeclarationFrame(proc);

return BindingNodes.createRubyBinding(getContext().getCoreLibrary().getBindingClass(),
RubyArguments.getSelf(frame.getArguments()),
frame);
return Layouts.BINDING.createBinding(getContext().getCoreLibrary().getBindingFactory(), RubyArguments.getSelf(frame.getArguments()), frame);
}

}
Original file line number Diff line number Diff line change
@@ -25,7 +25,7 @@ public SetTopLevelBindingNode(RubyContext context, SourceSection sourceSection)

@Override
public Object execute(VirtualFrame frame) {
final DynamicObject binding = BindingNodes.createRubyBinding(getContext().getCoreLibrary().getBindingClass(), RubyArguments.getSelf(frame.getArguments()), frame.materialize());
final DynamicObject binding = Layouts.BINDING.createBinding(getContext().getCoreLibrary().getBindingFactory(), RubyArguments.getSelf(frame.getArguments()), frame.materialize());
Layouts.MODULE.getFields(getContext().getCoreLibrary().getObjectClass()).setConstant(this, "TOPLEVEL_BINDING", binding);
return nil();
}
Original file line number Diff line number Diff line change
@@ -80,10 +80,7 @@ public MaterializedFrame visitFrame(FrameInstance frameInstance) {

});

return BindingNodes.createRubyBinding(
getContext().getCoreLibrary().getBindingClass(),
RubyArguments.getSelf(frame.getArguments()),
frame);
return Layouts.BINDING.createBinding(getContext().getCoreLibrary().getBindingFactory(), RubyArguments.getSelf(frame.getArguments()), frame);
}

}
Original file line number Diff line number Diff line change
@@ -122,6 +122,35 @@ public Object constructFallback(VirtualFrame frame, DynamicObject hashClass, Obj
return ruby(frame, "_constructor_fallback(*args)", "args", Layouts.ARRAY.createArray(getContext().getCoreLibrary().getArrayFactory(), args, args.length));
}

@TruffleBoundary
public static boolean noiseIsSmallArrayOfPairs(Object[] args) {
System.err.println("??");

if (args.length != 1) {
System.err.println("too many arguments");
}

final Object arg = args[0];

if (!RubyGuards.isRubyArray(arg)) {
System.err.println("not array");
}

final DynamicObject array = (DynamicObject) arg;

if (!(Layouts.ARRAY.getStore(array) instanceof Object[])) {
System.err.println("not Object[]");
}

final Object[] store = (Object[]) Layouts.ARRAY.getStore(array);

if (store.length > PackedArrayStrategy.MAX_ENTRIES) {
System.err.println("too long");
}

return true;
}

public static boolean isSmallArrayOfPairs(Object[] args) {
if (args.length != 1) {
return false;
Original file line number Diff line number Diff line change
@@ -85,6 +85,7 @@ public class CoreLibrary {
private final DynamicObject bignumClass;
private final DynamicObjectFactory bignumFactory;
private final DynamicObject bindingClass;
private final DynamicObjectFactory bindingFactory;
private final DynamicObject classClass;
private final DynamicObject complexClass;
private final DynamicObject dirClass;
@@ -348,7 +349,8 @@ public CoreLibrary(RubyContext context) {
arrayFactory = Layouts.ARRAY.createArrayShape(arrayClass, arrayClass);
Layouts.CLASS.setInstanceFactoryUnsafe(arrayClass, arrayFactory);
bindingClass = defineClass("Binding");
Layouts.CLASS.setInstanceFactoryUnsafe(bindingClass, Layouts.BINDING.createBindingShape(bindingClass, bindingClass));
bindingFactory = Layouts.BINDING.createBindingShape(bindingClass, bindingClass);
Layouts.CLASS.setInstanceFactoryUnsafe(bindingClass, bindingFactory);
dirClass = defineClass("Dir");
Layouts.CLASS.setInstanceFactoryUnsafe(dirClass, Layouts.DIR.createDirShape(dirClass, dirClass));
encodingClass = defineClass("Encoding");
@@ -1321,6 +1323,10 @@ public DynamicObject getBindingClass() {
return bindingClass;
}

public DynamicObjectFactory getBindingFactory() {
return bindingFactory;
}

public DynamicObject getClassClass() {
return classClass;
}
Original file line number Diff line number Diff line change
@@ -21,10 +21,10 @@
import com.oracle.truffle.api.source.Source;
import com.oracle.truffle.api.tools.LineToProbesMap;
import org.jruby.truffle.nodes.RubyGuards;
import org.jruby.truffle.nodes.core.BindingNodes;
import org.jruby.truffle.nodes.core.ProcNodes;
import org.jruby.truffle.runtime.RubyArguments;
import org.jruby.truffle.runtime.RubyContext;
import org.jruby.truffle.runtime.layouts.Layouts;

import java.util.ArrayList;
import java.util.HashMap;
@@ -53,7 +53,7 @@ public synchronized void attach(String file, int line, final DynamicObject block

@Override
public void enter(Probe probe, Node node, VirtualFrame frame) {
final DynamicObject binding = BindingNodes.createRubyBinding(context.getCoreLibrary().getBindingClass(), RubyArguments.getSelf(frame.getArguments()), frame.materialize());
final DynamicObject binding = Layouts.BINDING.createBinding(context.getCoreLibrary().getBindingFactory(), RubyArguments.getSelf(frame.getArguments()), frame.materialize());
ProcNodes.rootCall(block, binding);
}

0 comments on commit 38ac791

Please sign in to comment.