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: 05a8efa9736d
Choose a base ref
...
head repository: jruby/jruby
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 6e2110ffa74f
Choose a head ref
  • 11 commits
  • 20 files changed
  • 1 contributor

Commits on Feb 25, 2016

  1. Copy the full SHA
    75d2230 View commit details
  2. Copy the full SHA
    ed998fc View commit details
  3. Copy the full SHA
    497c858 View commit details
  4. [Truffle] Formatting.

    chrisseaton committed Feb 25, 2016
    Copy the full SHA
    0b79bf1 View commit details
  5. Copy the full SHA
    777b2d5 View commit details
  6. Copy the full SHA
    4b2d77a View commit details
  7. Copy the full SHA
    1a0c048 View commit details

Commits on Feb 26, 2016

  1. Copy the full SHA
    34c1750 View commit details
  2. Copy the full SHA
    182fec8 View commit details
  3. Copy the full SHA
    c148b54 View commit details
  4. Copy the full SHA
    6e2110f View commit details
Showing with 149 additions and 100 deletions.
  1. +0 −1 truffle/src/main/java/org/jruby/truffle/core/YieldingCoreMethodNode.java
  2. +1 −0 truffle/src/main/java/org/jruby/truffle/core/rubinius/ThreadPrimitiveNodes.java
  3. +1 −0 truffle/src/main/java/org/jruby/truffle/core/thread/ThreadManager.java
  4. +1 −0 truffle/src/main/java/org/jruby/truffle/core/thread/ThreadNodes.java
  5. +1 −0 truffle/src/main/java/org/jruby/truffle/language/SafepointManager.java
  6. +0 −4 truffle/src/main/java/org/jruby/truffle/language/defined/DefinedNode.java
  7. +7 −7 truffle/src/main/java/org/jruby/truffle/language/defined/DefinedWrapperNode.java
  8. +1 −1 truffle/src/main/java/org/jruby/truffle/language/exceptions/DisablingBacktracesNode.java
  9. +15 −17 truffle/src/main/java/org/jruby/truffle/language/exceptions/EnsureNode.java
  10. +1 −9 truffle/src/main/java/org/jruby/truffle/language/exceptions/RescueAnyNode.java
  11. +6 −14 truffle/src/main/java/org/jruby/truffle/language/exceptions/RescueClassesNode.java
  12. +14 −4 truffle/src/main/java/org/jruby/truffle/language/exceptions/RescueNode.java
  13. +2 −14 truffle/src/main/java/org/jruby/truffle/language/exceptions/RescueSplatNode.java
  14. +79 −0 truffle/src/main/java/org/jruby/truffle/language/exceptions/SetExceptionVariableNode.java
  15. +10 −17 truffle/src/main/java/org/jruby/truffle/language/exceptions/TryNode.java
  16. +1 −0 truffle/src/main/java/org/jruby/truffle/language/objects/ObjectGraph.java
  17. +6 −8 truffle/src/main/java/org/jruby/truffle/language/translator/BodyTranslator.java
  18. +0 −1 truffle/src/main/java/org/jruby/truffle/language/yield/YieldExpressionNode.java
  19. +2 −3 truffle/src/main/java/org/jruby/truffle/language/yield/YieldNode.java
  20. +1 −0 truffle/src/main/java/org/jruby/truffle/tools/InstrumentationServerManager.java
Original file line number Diff line number Diff line change
@@ -16,7 +16,6 @@
import org.jruby.truffle.RubyContext;
import org.jruby.truffle.core.cast.BooleanCastNode;
import org.jruby.truffle.core.cast.BooleanCastNodeGen;
import org.jruby.truffle.language.methods.DeclarationContext;
import org.jruby.truffle.language.yield.YieldNode;

public abstract class YieldingCoreMethodNode extends CoreMethodArrayArgumentsNode {
Original file line number Diff line number Diff line change
@@ -19,6 +19,7 @@
import org.jruby.truffle.language.SafepointAction;
import org.jruby.truffle.language.backtrace.Backtrace;
import org.jruby.truffle.language.control.RaiseException;

import static org.jruby.RubyThread.RUBY_MAX_THREAD_PRIORITY;
import static org.jruby.RubyThread.RUBY_MIN_THREAD_PRIORITY;
import static org.jruby.RubyThread.javaPriorityToRubyPriority;
Original file line number Diff line number Diff line change
@@ -23,6 +23,7 @@
import org.jruby.truffle.language.SafepointManager;
import org.jruby.truffle.language.backtrace.BacktraceFormatter;
import org.jruby.truffle.language.control.RaiseException;

import java.util.Collections;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
Original file line number Diff line number Diff line change
@@ -39,6 +39,7 @@
import org.jruby.truffle.language.control.RaiseException;
import org.jruby.truffle.language.control.ReturnException;
import org.jruby.truffle.language.control.ThreadExitException;

import java.util.ArrayList;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
Original file line number Diff line number Diff line change
@@ -21,6 +21,7 @@
import org.jruby.truffle.RubyContext;
import org.jruby.truffle.core.InterruptMode;
import org.jruby.truffle.core.Layouts;

import java.util.Collections;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
Original file line number Diff line number Diff line change
@@ -14,10 +14,6 @@
import org.jruby.truffle.RubyContext;
import org.jruby.truffle.language.RubyNode;

/**
* Switches execution to the parallel {@link RubyNode#isDefined} semantic path. Represents the
* {@code defined?} keyword in Ruby.
*/
public class DefinedNode extends RubyNode {

@Child private RubyNode child;
Original file line number Diff line number Diff line change
@@ -11,21 +11,21 @@

import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.source.SourceSection;
import org.jcodings.specific.UTF8Encoding;
import org.jruby.truffle.RubyContext;
import org.jruby.truffle.core.string.StringOperations;
import org.jruby.truffle.core.string.CoreString;
import org.jruby.truffle.language.RubyNode;

public class DefinedWrapperNode extends RubyNode {

@Child private RubyNode child;
private final CoreString definition;

private final String definition;
@Child private RubyNode child;

public DefinedWrapperNode(RubyContext context, SourceSection sourceSection, RubyNode child, String definition) {
public DefinedWrapperNode(RubyContext context, SourceSection sourceSection,
CoreString definition, RubyNode child) {
super(context, sourceSection);
this.child = child;
this.definition = definition;
this.child = child;
}

@Override
@@ -35,7 +35,7 @@ public Object execute(VirtualFrame frame) {

@Override
public Object isDefined(VirtualFrame frame) {
return createString(StringOperations.encodeRope(definition, UTF8Encoding.INSTANCE));
return definition.createInstance();
}

}
Original file line number Diff line number Diff line change
@@ -24,6 +24,7 @@ public class DisablingBacktracesNode extends RubyNode {
protected Boolean initialValue() {
return false;
}

};

public DisablingBacktracesNode(RubyContext context, SourceSection sourceSection, RubyNode child) {
@@ -37,7 +38,6 @@ public Object execute(VirtualFrame frame) {

try {
areBacktracesDisabledThreadLocal.set(true);

return child.execute(frame);
} finally {
areBacktracesDisabledThreadLocal.set(backtracesPreviouslyDisabled);
Original file line number Diff line number Diff line change
@@ -9,23 +9,21 @@
*/
package org.jruby.truffle.language.exceptions;

import com.oracle.truffle.api.CompilerDirectives;
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.object.DynamicObject;
import com.oracle.truffle.api.profiles.BranchProfile;
import com.oracle.truffle.api.source.SourceSection;
import org.jruby.truffle.RubyContext;
import org.jruby.truffle.core.Layouts;
import org.jruby.truffle.language.RubyNode;
import org.jruby.truffle.language.control.RaiseException;

/**
* Represents an ensure clause in exception handling. Represented separately to the try part.
*/
public class EnsureNode extends RubyNode {

@Child private RubyNode tryPart;
@Child private RubyNode ensurePart;

@Child private SetExceptionVariableNode setExceptionVariableNode;

private final BranchProfile rubyExceptionPath = BranchProfile.create();
private final BranchProfile javaExceptionPath = BranchProfile.create();

@@ -38,18 +36,21 @@ public EnsureNode(RubyContext context, SourceSection sourceSection, RubyNode try
@Override
public Object execute(VirtualFrame frame) {
final Object value;

try {
value = tryPart.execute(frame);
} catch (RaiseException exception) {
rubyExceptionPath.enter();
throw setLastExceptionAndRunEnsure(frame, exception);
setLastExceptionAndRunEnsure(frame, exception);
throw exception;
} catch (Throwable throwable) {
javaExceptionPath.enter();
ensurePart.executeVoid(frame);
throw throwable;
}

ensurePart.executeVoid(frame);

return value;
}

@@ -59,7 +60,8 @@ public void executeVoid(VirtualFrame frame) {
tryPart.executeVoid(frame);
} catch (RaiseException exception) {
rubyExceptionPath.enter();
throw setLastExceptionAndRunEnsure(frame, exception);
setLastExceptionAndRunEnsure(frame, exception);
throw exception;
} catch (Throwable throwable) {
javaExceptionPath.enter();
ensurePart.executeVoid(frame);
@@ -69,17 +71,13 @@ public void executeVoid(VirtualFrame frame) {
ensurePart.executeVoid(frame);
}

private RaiseException setLastExceptionAndRunEnsure(VirtualFrame frame, RaiseException exception) {
final DynamicObject threadLocals = Layouts.THREAD.getThreadLocals(getContext().getThreadManager().getCurrentThread());

final Object lastException = threadLocals.get("$!", nil());
threadLocals.set("$!", exception.getException());
try {
ensurePart.executeVoid(frame);
return exception;
} finally {
threadLocals.set("$!", lastException);
private void setLastExceptionAndRunEnsure(VirtualFrame frame, RaiseException exception) {
if (setExceptionVariableNode == null) {
CompilerDirectives.transferToInterpreter();
setExceptionVariableNode = insert(new SetExceptionVariableNode(getContext()));
}

setExceptionVariableNode.setLastExceptionAndRun(frame, exception, ensurePart);
}

}
Original file line number Diff line number Diff line change
@@ -14,24 +14,16 @@
import com.oracle.truffle.api.source.SourceSection;
import org.jruby.truffle.RubyContext;
import org.jruby.truffle.language.RubyNode;
import org.jruby.truffle.language.objects.IsANode;
import org.jruby.truffle.language.objects.IsANodeGen;

/**
* Rescues any exception where {@code $!.is_a?(StandardError)}.
*/
public class RescueAnyNode extends RescueNode {

@Child private IsANode isANode;

public RescueAnyNode(RubyContext context, SourceSection sourceSection, RubyNode body) {
super(context, sourceSection, body);
isANode = IsANodeGen.create(context, sourceSection, null, null);
}

@Override
public boolean canHandle(VirtualFrame frame, DynamicObject exception) {
return isANode.executeIsA(exception, coreLibrary().getStandardErrorClass());
return getIsANode().executeIsA(exception, coreLibrary().getStandardErrorClass());
}

}
Original file line number Diff line number Diff line change
@@ -9,43 +9,35 @@
*/
package org.jruby.truffle.language.exceptions;

import com.oracle.truffle.api.CompilerDirectives;
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.nodes.ExplodeLoop;
import com.oracle.truffle.api.object.DynamicObject;
import com.oracle.truffle.api.source.SourceSection;
import org.jruby.truffle.RubyContext;
import org.jruby.truffle.core.Layouts;
import org.jruby.truffle.core.module.ModuleOperations;
import org.jruby.truffle.language.RubyNode;

/**
* Rescues any of a set of classes.
*/
public class RescueClassesNode extends RescueNode {

@Children final RubyNode[] handlingClassNodes;

public RescueClassesNode(RubyContext context, SourceSection sourceSection, RubyNode[] handlingClassNodes, RubyNode body) {
public RescueClassesNode(RubyContext context, SourceSection sourceSection,
RubyNode[] handlingClassNodes, RubyNode body) {
super(context, sourceSection, body);
this.handlingClassNodes = handlingClassNodes;
}

@ExplodeLoop
@Override
public boolean canHandle(VirtualFrame frame, DynamicObject exception) {
CompilerDirectives.transferToInterpreter();

final DynamicObject exceptionRubyClass = Layouts.BASIC_OBJECT.getLogicalClass(exception);

for (RubyNode handlingClassNode : handlingClassNodes) {
// TODO(CS): what if we don't get a class?

final DynamicObject handlingClass = (DynamicObject) handlingClassNode.execute(frame);

if (ModuleOperations.assignableTo(exceptionRubyClass, handlingClass)) {
if (getIsANode().executeIsA(exception, handlingClass)) {
return true;
}
}

return false;
}

}
Original file line number Diff line number Diff line change
@@ -9,20 +9,21 @@
*/
package org.jruby.truffle.language.exceptions;

import com.oracle.truffle.api.CompilerDirectives;
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.object.DynamicObject;
import com.oracle.truffle.api.source.SourceSection;
import org.jruby.truffle.RubyContext;
import org.jruby.truffle.language.RubyNode;
import org.jruby.truffle.language.objects.IsANode;
import org.jruby.truffle.language.objects.IsANodeGen;

/**
* Base node for all nodes which may be able to rescue an exception. They have a test method
* {@link #canHandle} and a body to execute if that test passes.
*/
public abstract class RescueNode extends RubyNode {

@Child private RubyNode body;

@Child private IsANode isANode;

public RescueNode(RubyContext context, SourceSection sourceSection, RubyNode body) {
super(context, sourceSection);
this.body = body;
@@ -40,4 +41,13 @@ public void executeVoid(VirtualFrame frame) {
body.executeVoid(frame);
}

protected IsANode getIsANode() {
if (isANode == null) {
CompilerDirectives.transferToInterpreter();
isANode = insert(IsANodeGen.create(getContext(), getSourceSection(), null, null));
}

return isANode;
}

}
Original file line number Diff line number Diff line change
@@ -9,24 +9,16 @@
*/
package org.jruby.truffle.language.exceptions;

import com.oracle.truffle.api.CompilerDirectives;
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.object.DynamicObject;
import com.oracle.truffle.api.source.SourceSection;
import org.jruby.truffle.RubyContext;
import org.jruby.truffle.core.Layouts;
import org.jruby.truffle.core.array.ArrayOperations;
import org.jruby.truffle.core.module.ModuleOperations;
import org.jruby.truffle.language.RubyNode;

/**
* Rescue any of several classes, that we get from an expression that evaluates to an array of
* classes.
*
*/
public class RescueSplatNode extends RescueNode {

@Child RubyNode handlingClassesArray;
@Child private RubyNode handlingClassesArray;

public RescueSplatNode(RubyContext context, SourceSection sourceSection, RubyNode handlingClassesArray, RubyNode body) {
super(context, sourceSection, body);
@@ -35,14 +27,10 @@ public RescueSplatNode(RubyContext context, SourceSection sourceSection, RubyNod

@Override
public boolean canHandle(VirtualFrame frame, DynamicObject exception) {
CompilerDirectives.transferToInterpreter();

final DynamicObject handlingClasses = (DynamicObject) handlingClassesArray.execute(frame);

final DynamicObject exceptionRubyClass = Layouts.BASIC_OBJECT.getLogicalClass(exception);

for (Object handlingClass : ArrayOperations.toIterable(handlingClasses)) {
if (ModuleOperations.assignableTo(exceptionRubyClass, (DynamicObject) handlingClass)) {
if (getIsANode().executeIsA(exception, (DynamicObject) handlingClass)) {
return true;
}
}
Loading