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: 02df5177ce7e
Choose a base ref
...
head repository: jruby/jruby
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 8991b57bbcd6
Choose a head ref
  • 3 commits
  • 1 file changed
  • 1 contributor

Commits on Dec 15, 2015

  1. Copy the full SHA
    0e4802f View commit details
  2. Copy the full SHA
    2ce3708 View commit details
  3. Copy the full SHA
    8991b57 View commit details
Showing with 27 additions and 56 deletions.
  1. +27 −56 truffle/src/main/java/org/jruby/truffle/translator/BodyTranslator.java
Original file line number Diff line number Diff line change
@@ -1739,41 +1739,42 @@ public RubyNode visitInstVarNode(org.jruby.ast.InstVarNode node) {

@Override
public RubyNode visitIterNode(org.jruby.ast.IterNode node) {
final SourceSection sourceSection = translate(node.getPosition());
return translateBlockLikeNode(node, false);
}

/*
* In a block we do NOT allocate a new return ID - returns will return from the method, not
* the block (in the general case, see Proc and the difference between Proc and Lambda for
* specifics).
*/
@Override
public RubyNode visitLambdaNode(org.jruby.ast.LambdaNode node) {
return translateBlockLikeNode(node, true);
}

private RubyNode translateBlockLikeNode(org.jruby.ast.IterNode node, boolean isLambda) {
final SourceSection sourceSection = translate(node.getPosition());
final org.jruby.ast.ArgsNode argsNode = node.getArgsNode();

final boolean hasOwnScope = !translatingForStatement;
// Unset this flag for any for any blocks within the for statement's body
final boolean hasOwnScope = isLambda || !translatingForStatement;

org.jruby.ast.ArgsNode argsNode;
final String name = isLambda ? "(lambda)" : currentCallMethodName;
final boolean isProc = !isLambda;

if (node.getVarNode() instanceof org.jruby.ast.ArgsNode) {
argsNode = (org.jruby.ast.ArgsNode) node.getVarNode();
} else if (node.getVarNode() instanceof org.jruby.ast.DAsgnNode) {
final org.jruby.ast.ArgumentNode arg = new org.jruby.ast.ArgumentNode(node.getPosition(), ((org.jruby.ast.DAsgnNode) node.getVarNode()).getName());
final org.jruby.ast.ListNode preArgs = new org.jruby.ast.ArrayNode(node.getPosition(), arg);
argsNode = new org.jruby.ast.ArgsNode(node.getPosition(), preArgs, null, null, null, null, null, null);
} else if (node.getVarNode() == null) {
argsNode = null;
} else {
throw new UnsupportedOperationException();
}
final SharedMethodInfo sharedMethodInfo = new SharedMethodInfo(sourceSection, environment.getLexicalScope(), MethodTranslator.getArity(argsNode), name, true,
Helpers.argsNodeToArgumentDescriptors(argsNode), false, false, false);

// Unset this flag for any for any blocks within the for statement's body
final SharedMethodInfo sharedMethodInfo = new SharedMethodInfo(sourceSection, environment.getLexicalScope(), MethodTranslator.getArity(argsNode), currentCallMethodName, true, Helpers.argsNodeToArgumentDescriptors(node.findFirstChild(ArgsNode.class)), false, false, false);
final String namedMethodName = isLambda ? sharedMethodInfo.getName(): environment.getNamedMethodName();

final TranslatorEnvironment newEnvironment = new TranslatorEnvironment(
context, environment, environment.getParseEnvironment(), environment.getReturnID(), hasOwnScope, false,
sharedMethodInfo, environment.getNamedMethodName(), true, environment.getParseEnvironment().allocateBreakID());
final MethodTranslator methodCompiler = new MethodTranslator(currentNode, context, this, newEnvironment, true, source, argsNode);
methodCompiler.translatingForStatement = translatingForStatement;
sharedMethodInfo, namedMethodName, true, environment.getParseEnvironment().allocateBreakID());
final MethodTranslator methodCompiler = new MethodTranslator(currentNode, context, this, newEnvironment, isProc, source, argsNode);

final RubyNode ret = methodCompiler.compileBlockNode(translate(node.getPosition()), sharedMethodInfo.getName(), node.getBodyNode(), sharedMethodInfo, Type.PROC);
return addNewlineIfNeeded(node, ret);
if (isProc) {
methodCompiler.translatingForStatement = translatingForStatement;
}

final Type type = isLambda ? Type.LAMBDA : Type.PROC;
final RubyNode definitionNode = methodCompiler.compileBlockNode(sourceSection, sharedMethodInfo.getName(), node.getBodyNode(), sharedMethodInfo, type);

return addNewlineIfNeeded(node, definitionNode);
}

@Override
@@ -2758,36 +2759,6 @@ public RubyNode visitBackRefNode(org.jruby.ast.BackRefNode node) {
return addNewlineIfNeeded(node, ret);
}

public RubyNode visitLambdaNode(org.jruby.ast.LambdaNode node) {
final SourceSection sourceSection = translate(node.getPosition());

org.jruby.ast.ArgsNode argsNode;

if (node.getVarNode() instanceof org.jruby.ast.ArgsNode) {
argsNode = (org.jruby.ast.ArgsNode) node.getVarNode();
} else if (node.getVarNode() instanceof org.jruby.ast.DAsgnNode) {
final org.jruby.ast.ArgumentNode arg = new org.jruby.ast.ArgumentNode(node.getPosition(), ((org.jruby.ast.DAsgnNode) node.getVarNode()).getName());
final org.jruby.ast.ListNode preArgs = new org.jruby.ast.ArrayNode(node.getPosition(), arg);
argsNode = new org.jruby.ast.ArgsNode(node.getPosition(), preArgs, null, null, null, null, null, null);
} else if (node.getVarNode() == null) {
argsNode = null;
} else {
throw new UnsupportedOperationException();
}

// TODO(cs): code copied and modified from visitIterNode - extract common
final SharedMethodInfo sharedMethodInfo = new SharedMethodInfo(sourceSection, environment.getLexicalScope(), MethodTranslator.getArity(argsNode), "(lambda)", true, Helpers.argsNodeToArgumentDescriptors(node.findFirstChild(ArgsNode.class)), false, false, false);

final TranslatorEnvironment newEnvironment = new TranslatorEnvironment(
context, environment, environment.getParseEnvironment(), environment.getReturnID(), true, false,
sharedMethodInfo, sharedMethodInfo.getName(), true, environment.getParseEnvironment().allocateBreakID());
final MethodTranslator methodCompiler = new MethodTranslator(currentNode, context, this, newEnvironment, false, source, argsNode);

final RubyNode definitionNode = methodCompiler.compileBlockNode(translate(node.getPosition()), sharedMethodInfo.getName(), node.getBodyNode(), sharedMethodInfo, Type.LAMBDA);

return addNewlineIfNeeded(node, definitionNode);
}

protected RubyNode initFlipFlopStates(SourceSection sourceSection) {
final RubyNode[] initNodes = new RubyNode[environment.getFlipFlopStates().size()];