Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: jruby/jruby
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 52f4787d7b96
Choose a base ref
...
head repository: jruby/jruby
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: c6d3d41c743e
Choose a head ref
  • 2 commits
  • 12 files changed
  • 1 contributor

Commits on Jul 10, 2015

  1. Copy the full SHA
    f55e3cc View commit details
  2. Copy the full SHA
    c6d3d41 View commit details
3 changes: 2 additions & 1 deletion truffle/src/main/java/org/jruby/truffle/nodes/RubyNode.java
Original file line number Diff line number Diff line change
@@ -22,6 +22,7 @@
import jnr.ffi.provider.MemoryManager;
import jnr.posix.POSIX;
import org.jcodings.Encoding;
import org.jruby.truffle.nodes.core.BindingNodes;
import org.jruby.truffle.nodes.core.StringNodes;
import org.jruby.truffle.nodes.core.array.ArrayNodes;
import org.jruby.truffle.nodes.dispatch.DispatchNode;
@@ -339,7 +340,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 RubyBinding binding = new RubyBinding(
final RubyBasicObject binding = BindingNodes.createRubyBinding(
getContext().getCoreLibrary().getBindingClass(),
self,
evalFrame);
Original file line number Diff line number Diff line change
@@ -17,10 +17,10 @@
import com.oracle.truffle.api.nodes.InvalidAssumptionException;
import com.oracle.truffle.api.source.SourceSection;
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.core.RubyBasicObject;
import org.jruby.truffle.runtime.core.RubyBinding;
import org.jruby.truffle.runtime.core.RubyProc;

public class TraceNode extends RubyNode {
@@ -80,7 +80,7 @@ public void trace(VirtualFrame frame) {
file,
line,
context.getCoreLibrary().getNilObject(),
new RubyBinding(context.getCoreLibrary().getBindingClass(), RubyArguments.getSelf(frame.getArguments()), frame.materialize()),
BindingNodes.createRubyBinding(context.getCoreLibrary().getBindingClass(), RubyArguments.getSelf(frame.getArguments()), frame.materialize()),
context.getCoreLibrary().getNilObject()
};

Original file line number Diff line number Diff line change
@@ -30,35 +30,57 @@
import org.jruby.truffle.runtime.control.RaiseException;
import org.jruby.truffle.runtime.core.RubyBasicObject;
import org.jruby.truffle.runtime.core.RubyBinding;
import org.jruby.truffle.runtime.core.RubyClass;
import org.jruby.truffle.runtime.core.RubyProc;
import org.jruby.truffle.runtime.methods.InternalMethod;

@CoreClass(name = "Binding")
public abstract class BindingNodes {

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

public static RubyBasicObject createRubyBinding(RubyClass bindingClass, Object self, MaterializedFrame frame) {
return new RubyBinding(bindingClass, self, frame);
}

public static void setSelfAndFrame(RubyBasicObject binding, Object self, MaterializedFrame frame) {
((RubyBinding) binding).self = self;
((RubyBinding) binding).frame = frame;
}

public static Object getSelf(RubyBasicObject binding) {
return ((RubyBinding) binding).self;
}

public static MaterializedFrame getFrame(RubyBasicObject binding) {
return ((RubyBinding) binding).frame;
}

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

public InitializeCopyNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

@Specialization
public Object initializeCopy(RubyBinding self, RubyBinding from) {
@Specialization(guards = "isRubyBinding(from)")
public Object initializeCopy(RubyBasicObject self, RubyBasicObject from) {
if (self == from) {
return self;
}

final Object[] arguments = from.getFrame().getArguments();
final Object[] arguments = getFrame(from).getArguments();
final InternalMethod method = RubyArguments.getMethod(arguments);
final Object boundSelf = RubyArguments.getSelf(arguments);
final RubyProc boundBlock = RubyArguments.getBlock(arguments);
final Object[] userArguments = RubyArguments.extractUserArguments(arguments);

final Object[] copiedArguments = RubyArguments.pack(method, from.getFrame(), boundSelf, boundBlock, userArguments);
final Object[] copiedArguments = RubyArguments.pack(method, getFrame(from), boundSelf, boundBlock, userArguments);
final MaterializedFrame copiedFrame = Truffle.getRuntime().createMaterializedFrame(copiedArguments);

self.initialize(from.getSelf(), copiedFrame);
setSelfAndFrame(self, getSelf(from), copiedFrame);

return self;
}
@@ -82,7 +104,7 @@ public LocalVariableGetNode(RubyContext context, SourceSection sourceSection) {
"getFrameDescriptor(binding) == cachedFrameDescriptor"

})
public Object localVariableGetCached(RubyBinding binding, RubyBasicObject symbol,
public Object localVariableGetCached(RubyBasicObject binding, RubyBasicObject symbol,
@Cached("symbol") RubyBasicObject cachedSymbol,
@Cached("getFrameDescriptor(binding)") FrameDescriptor cachedFrameDescriptor,
@Cached("findFrameSlot(binding, symbol)") FrameSlot cachedFrameSlot,
@@ -91,14 +113,14 @@ public Object localVariableGetCached(RubyBinding binding, RubyBasicObject symbol
CompilerDirectives.transferToInterpreter();
throw new RaiseException(getContext().getCoreLibrary().nameErrorLocalVariableNotDefined(SymbolNodes.getString(symbol), binding, this));
} else {
return readLocalVariableNode.executeRead(binding.getFrame());
return readLocalVariableNode.executeRead(getFrame(binding));
}
}

@TruffleBoundary
@Specialization(guards = {"isRubySymbol(symbol)", "!isLastLine(symbol)"})
public Object localVariableGetUncached(RubyBinding binding, RubyBasicObject symbol) {
final MaterializedFrame frame = binding.getFrame();
public Object localVariableGetUncached(RubyBasicObject binding, RubyBasicObject symbol) {
final MaterializedFrame frame = getFrame(binding);
final FrameSlot frameSlot = frame.getFrameDescriptor().findFrameSlot(SymbolNodes.getString(symbol));

if (frameSlot == null) {
@@ -110,8 +132,8 @@ public Object localVariableGetUncached(RubyBinding binding, RubyBasicObject symb

@TruffleBoundary
@Specialization(guards = {"isRubySymbol(symbol)", "isLastLine(symbol)"})
public Object localVariableGetLastLine(RubyBinding binding, RubyBasicObject symbol) {
final MaterializedFrame frame = binding.getFrame();
public Object localVariableGetLastLine(RubyBasicObject binding, RubyBasicObject symbol) {
final MaterializedFrame frame = getFrame(binding);
final FrameSlot frameSlot = frame.getFrameDescriptor().findFrameSlot(SymbolNodes.getString(symbol));

if (frameSlot == null) {
@@ -126,16 +148,18 @@ public Object localVariableGetLastLine(RubyBinding binding, RubyBasicObject symb
}
}

protected FrameDescriptor getFrameDescriptor(RubyBinding binding) {
return binding.getFrame().getFrameDescriptor();
protected FrameDescriptor getFrameDescriptor(RubyBasicObject binding) {
assert RubyGuards.isRubyBinding(binding);
return getFrame(binding).getFrameDescriptor();
}

protected FrameSlot findFrameSlot(RubyBinding binding, RubyBasicObject symbol) {
protected FrameSlot findFrameSlot(RubyBasicObject binding, RubyBasicObject symbol) {
assert RubyGuards.isRubyBinding(binding);
assert RubyGuards.isRubySymbol(symbol);

final String symbolString = SymbolNodes.getString(symbol);

MaterializedFrame frame = binding.getFrame();
MaterializedFrame frame = getFrame(binding);

while (frame != null) {
final FrameSlot frameSlot = frame.getFrameDescriptor().findFrameSlot(symbolString);
@@ -180,41 +204,43 @@ public LocalVariableSetNode(RubyContext context, SourceSection sourceSection) {
"getFrameDescriptor(binding) == cachedFrameDescriptor",
"symbol == cachedSymbol"
})
public Object localVariableSetCached(RubyBinding binding, RubyBasicObject symbol, Object value,
public Object localVariableSetCached(RubyBasicObject binding, RubyBasicObject symbol, Object value,
@Cached("symbol") RubyBasicObject cachedSymbol,
@Cached("getFrameDescriptor(binding)") FrameDescriptor cachedFrameDescriptor,
@Cached("createWriteNode(findFrameSlot(binding, symbol))") WriteFrameSlotNode writeLocalVariableNode) {
return writeLocalVariableNode.executeWrite(binding.getFrame(), value);
return writeLocalVariableNode.executeWrite(getFrame(binding), value);
}

@TruffleBoundary
@Specialization(guards = {"isRubySymbol(symbol)", "!isLastLine(symbol)"})
public Object localVariableSetUncached(RubyBinding binding, RubyBasicObject symbol, Object value) {
final MaterializedFrame frame = binding.getFrame();
public Object localVariableSetUncached(RubyBasicObject binding, RubyBasicObject symbol, Object value) {
final MaterializedFrame frame = getFrame(binding);
final FrameSlot frameSlot = frame.getFrameDescriptor().findFrameSlot(SymbolNodes.getString(symbol));
frame.setObject(frameSlot, value);
return value;
}

@TruffleBoundary
@Specialization(guards = {"isRubySymbol(symbol)", "isLastLine(symbol)"})
public Object localVariableSetLastLine(RubyBinding binding, RubyBasicObject symbol, Object value) {
final MaterializedFrame frame = binding.getFrame();
public Object localVariableSetLastLine(RubyBasicObject binding, RubyBasicObject symbol, Object value) {
final MaterializedFrame frame = getFrame(binding);
final FrameSlot frameSlot = frame.getFrameDescriptor().findFrameSlot(SymbolNodes.getString(symbol));
frame.setObject(frameSlot, ThreadLocalObject.wrap(getContext(), value));
return value;
}

protected FrameDescriptor getFrameDescriptor(RubyBinding binding) {
return binding.getFrame().getFrameDescriptor();
protected FrameDescriptor getFrameDescriptor(RubyBasicObject binding) {
assert RubyGuards.isRubyBinding(binding);
return getFrame(binding).getFrameDescriptor();
}

protected FrameSlot findFrameSlot(RubyBinding binding, RubyBasicObject symbol) {
protected FrameSlot findFrameSlot(RubyBasicObject binding, RubyBasicObject symbol) {
assert RubyGuards.isRubyBinding(binding);
assert RubyGuards.isRubySymbol(symbol);

final String symbolString = SymbolNodes.getString(symbol);

MaterializedFrame frame = binding.getFrame();
MaterializedFrame frame = getFrame(binding);

while (frame != null) {
final FrameSlot frameSlot = frame.getFrameDescriptor().findFrameSlot(symbolString);
@@ -226,7 +252,7 @@ protected FrameSlot findFrameSlot(RubyBinding binding, RubyBasicObject symbol) {
frame = RubyArguments.getDeclarationFrame(frame.getArguments());
}

return binding.getFrame().getFrameDescriptor().addFrameSlot(symbolString);
return getFrame(binding).getFrameDescriptor().addFrameSlot(symbolString);
}

protected WriteFrameSlotNode createWriteNode(FrameSlot frameSlot) {
@@ -247,10 +273,10 @@ public LocalVariablesNode(RubyContext context, SourceSection sourceSection) {

@TruffleBoundary
@Specialization
public RubyBasicObject localVariables(RubyBinding binding) {
public RubyBasicObject localVariables(RubyBasicObject binding) {
final RubyBasicObject array = createEmptyArray();

MaterializedFrame frame = binding.getFrame();
MaterializedFrame frame = getFrame(binding);

while (frame != null) {
for (Object name : frame.getFrameDescriptor().getIdentifiers()) {
36 changes: 18 additions & 18 deletions truffle/src/main/java/org/jruby/truffle/nodes/core/KernelNodes.java
Original file line number Diff line number Diff line change
@@ -18,6 +18,7 @@
import com.oracle.truffle.api.frame.FrameInstance.FrameAccess;
import com.oracle.truffle.api.nodes.DirectCallNode;
import com.oracle.truffle.api.nodes.IndirectCallNode;
import com.oracle.truffle.api.nodes.UnexpectedResultException;
import com.oracle.truffle.api.source.Source;
import com.oracle.truffle.api.source.SourceSection;
import com.oracle.truffle.api.utilities.ConditionProfile;
@@ -268,20 +269,14 @@ public BindingNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public abstract RubyBinding executeRubyBinding(VirtualFrame frame);

public Object execute(VirtualFrame frame) {
return executeRubyBinding(frame);
}

@Specialization
public RubyBinding binding() {
public RubyBasicObject binding() {
// Materialize the caller's frame - false means don't use a slow path to get it - we want to optimize it

final MaterializedFrame callerFrame = RubyCallStack.getCallerFrame(getContext())
.getFrame(FrameInstance.FrameAccess.MATERIALIZE, false).materialize();

return new RubyBinding(
return BindingNodes.createRubyBinding(
getContext().getCoreLibrary().getBindingClass(),
RubyArguments.getSelf(callerFrame.getArguments()),
callerFrame);
@@ -482,12 +477,17 @@ public EvalNode(RubyContext context, SourceSection sourceSection) {
return ToStrNodeGen.create(getContext(), getSourceSection(), source);
}

protected RubyBinding getCallerBinding(VirtualFrame frame) {
protected RubyBasicObject getCallerBinding(VirtualFrame frame) {
if (bindingNode == null) {
CompilerDirectives.transferToInterpreterAndInvalidate();
bindingNode = insert(KernelNodesFactory.BindingNodeFactory.create(getContext(), getSourceSection(), new RubyNode[]{}));
}
return bindingNode.executeRubyBinding(frame);

try {
return bindingNode.executeRubyBasicObject(frame);
} catch (UnexpectedResultException e) {
throw new UnsupportedOperationException(e);
}
}

@Specialization
@@ -498,36 +498,36 @@ public Object eval(VirtualFrame frame, RubyString source, NotProvided binding, N
}

@Specialization(guards = "isNil(noBinding)")
public Object eval(VirtualFrame frame, RubyString source, Object noBinding, RubyString filename, int lineNumber) {
public Object evalNoBinding(VirtualFrame frame, RubyString source, Object noBinding, RubyString filename, int lineNumber) {
CompilerDirectives.transferToInterpreter();

// TODO (nirvdrum Dec. 29, 2014) Do something with the supplied filename.
return eval(frame, source, NotProvided.INSTANCE, NotProvided.INSTANCE, NotProvided.INSTANCE);
}

@Specialization
public Object eval(RubyString source, RubyBinding binding, NotProvided filename, NotProvided lineNumber) {
@Specialization(guards = "isRubyBinding(binding)")
public Object eval(RubyString source, RubyBasicObject binding, NotProvided filename, NotProvided lineNumber) {
CompilerDirectives.transferToInterpreter();

return getContext().eval(StringNodes.getByteList(source), binding, false, this);
}

@Specialization
public Object eval(RubyString source, RubyBinding binding, RubyString filename, NotProvided lineNumber) {
@Specialization(guards = "isRubyBinding(binding)")
public Object eval(RubyString source, RubyBasicObject binding, RubyString filename, NotProvided lineNumber) {
CompilerDirectives.transferToInterpreter();

return getContext().eval(StringNodes.getByteList(source), binding, false, filename.toString(), this);
}

@Specialization
public Object eval(RubyString source, RubyBinding binding, RubyString filename, int lineNumber) {
@Specialization(guards = "isRubyBinding(binding)")
public Object eval(RubyString source, RubyBasicObject binding, RubyString filename, int lineNumber) {
CompilerDirectives.transferToInterpreter();

return getContext().eval(StringNodes.getByteList(source), binding, false, filename.toString(), this);
}

@Specialization(guards = "!isRubyBinding(badBinding)")
public Object eval(RubyString source, RubyBasicObject badBinding, NotProvided filename, NotProvided lineNumber) {
public Object evalBadBinding(RubyString source, RubyBasicObject badBinding, NotProvided filename, NotProvided lineNumber) {
throw new RaiseException(getContext().getCoreLibrary().typeErrorWrongArgumentType(badBinding, "binding", this));
}
}
Original file line number Diff line number Diff line change
@@ -29,7 +29,6 @@
import org.jruby.truffle.runtime.RubyContext;
import org.jruby.truffle.runtime.control.RaiseException;
import org.jruby.truffle.runtime.core.RubyBasicObject;
import org.jruby.truffle.runtime.core.RubyBinding;
import org.jruby.truffle.runtime.core.RubyProc;
import org.jruby.util.Memo;

@@ -61,7 +60,7 @@ public BindingNode(RubyContext context, SourceSection sourceSection) {
public Object binding(RubyProc proc) {
final MaterializedFrame frame = proc.getDeclarationFrame();

return new RubyBinding(getContext().getCoreLibrary().getBindingClass(),
return BindingNodes.createRubyBinding(getContext().getCoreLibrary().getBindingClass(),
RubyArguments.getSelf(frame.getArguments()),
frame);
}
Original file line number Diff line number Diff line change
@@ -14,7 +14,7 @@
import org.jruby.truffle.nodes.RubyNode;
import org.jruby.truffle.runtime.RubyArguments;
import org.jruby.truffle.runtime.RubyContext;
import org.jruby.truffle.runtime.core.RubyBinding;
import org.jruby.truffle.runtime.core.RubyBasicObject;

public class SetTopLevelBindingNode extends RubyNode {

@@ -24,7 +24,7 @@ public SetTopLevelBindingNode(RubyContext context, SourceSection sourceSection)

@Override
public Object execute(VirtualFrame frame) {
final RubyBinding binding = new RubyBinding(getContext().getCoreLibrary().getBindingClass(), RubyArguments.getSelf(frame.getArguments()), frame.materialize());
final RubyBasicObject binding = BindingNodes.createRubyBinding(getContext().getCoreLibrary().getBindingClass(), RubyArguments.getSelf(frame.getArguments()), frame.materialize());
getContext().getCoreLibrary().getObjectClass().setConstant(this, "TOPLEVEL_BINDING", binding);
return nil();
}
Loading