Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
BEGIN LICENSE BLOCK ***** Version: CPL 1.0/GPL 2.0/LGPL 2.1 The contents of this file are subject to the Common Public License Version 1.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.eclipse.org/legal/cpl-v10.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. Copyright (C) 2008 Thomas E Enebo <enebo@acm.org> Alternatively, the contents of this file may be used under the terms of either of the GNU General Public License Version 2 or later (the "GPL"), or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), in which case the provisions of the GPL or the LGPL are applicable instead of those above. If you wish to allow use of your version of this file only under the terms of either the GPL or the LGPL, and not to allow others to use your version of this file under the terms of the CPL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the GPL or the LGPL. If you do not delete the provisions above, a recipient may use your version of this file under the terms of any one of the CPL, the GPL or the LGPL. END LICENSE BLOCK ***
 
 package org.jruby.runtime;
 
 import org.jruby.Ruby;

Author(s):
enebo
 
 public class Interpreted19Block  extends ContextAwareBlockBody {
     private static final boolean ALREADY_ARRAY = true;

    
The position for the block
 
     private final ISourcePosition position;

    
Filename from position
 
     private final String file;

    
Line from position
 
     private final int line;

    
The argument list, pulled out of iterNode
 
     private final ArgsNode args;

    
Whether the arguments "need splat".

 
     private final boolean needsSplat;

    
The parameter names, for Proc#parameters
 
     private final String[] parameterList;

    
The body of the block, pulled out of bodyNode
 
     private final Node body;
 
     public static Block newInterpretedClosure(ThreadContext contextBlockBody bodyIRubyObject self) {
         Binding binding = context.currentBinding(self);
         return new Block(bodybinding);
     }
 
     // ENEBO: Some of this logic should be put back into the Nodes themselves, but the more
     // esoteric features of 1.9 make this difficult to know how to do this yet.
     public static BlockBody newBlockBody(IterNode iter) {
         if (iter instanceof LambdaNode) {
             return new Interpreted19Block((LambdaNodeiter);
         } else {
             return new Interpreted19Block(iter);
         }
 
     }
 
     public Interpreted19Block(IterNode iterNode) {
         super(iterNode.getScope(), ((ArgsNode)iterNode.getVarNode()).getArity(), -1); // We override that the logic which uses this
 
         this. = (ArgsNode)iterNode.getVarNode();
         this. = RuntimeHelpers.needsSplat19(.getRequiredArgsCount(), .getRestArg() != -1);
         this. = RuntimeHelpers.encodeParameterList().split(";");
         this. = iterNode.getBodyNode() == null ? . : iterNode.getBodyNode();
         this. = iterNode.getPosition();
 
        // precache these
        this. = .getFile();
        this. = .getLine();
    }
    public Interpreted19Block(LambdaNode lambdaNode) {
        super(lambdaNode.getScope(), lambdaNode.getArgs().getArity(), -1); // We override that the logic which uses this
        this. = lambdaNode.getArgs();
        this. = RuntimeHelpers.needsSplat19(.getRequiredArgsCount(), .getRestArg() != -1);
        this. = RuntimeHelpers.encodeParameterList().split(";");
        this. = lambdaNode.getBody() == null ? . : lambdaNode.getBody();
        this. = lambdaNode.getPosition();
        // precache these
        this. = .getFile();
        this. = .getLine();
    }
    @Override
    public IRubyObject call(ThreadContext contextIRubyObject[] argsBinding bindingBlock.Type type) {
        IRubyObject value = args.length == 1 ? args[0] : context.runtime.newArrayNoCopy(args);
        return yield(contextvaluenullnullbindingtype.);
    }
    @Override
    public IRubyObject call(ThreadContext contextIRubyObject[] argsBinding bindingBlock.Type typeBlock block) {
        return yield(contextcontext.runtime.newArrayNoCopy(args), nullnullbindingtypeblock);
    }
    @Override
    public IRubyObject yieldSpecific(ThreadContext contextBinding bindingBlock.Type type) {
        return yield(contextnullbindingtype);
    }
    @Override
    public IRubyObject yieldSpecific(ThreadContext contextIRubyObject arg0Binding bindingBlock.Type type) {
        return yield(contextarg0bindingtype);
    }
    @Override
    public IRubyObject yieldSpecific(ThreadContext contextIRubyObject arg0IRubyObject arg1Binding bindingBlock.Type type) {
        return yield(contextcontext.runtime.newArrayNoCopyLight(arg0arg1), nullnullbindingtype);
    }
    @Override
    public IRubyObject yieldSpecific(ThreadContext contextIRubyObject arg0IRubyObject arg1IRubyObject arg2Binding bindingBlock.Type type) {
        return yield(contextcontext.runtime.newArrayNoCopyLight(arg0arg1arg2), nullnullbindingtype);
    }
    public IRubyObject yield(ThreadContext contextIRubyObject valueBinding bindingBlock.Type type) {
        IRubyObject self = prepareSelf(binding);
        Visibility oldVis = binding.getFrame().getVisibility();
        Frame lastFrame = pre(contextnullbinding);
        try {
            setupBlockArg(contextvalueself.type);
            return evalBlockBody(contextbindingself);
        } catch (JumpException.NextJump nj) {
            return handleNextJump(contextnjtype);
        } finally {
            post(contextbindingoldVislastFrame);
        }
    }

    
Yield to this block, usually passed to the current call.

Parameters:
context represents the current thread-specific data
value The value to yield, either a single value or an array of values
self The current self
klass
aValue Should value be arrayified or not?
Returns:
    public IRubyObject yield(ThreadContext contextIRubyObject valueIRubyObject self,
            RubyModule klassboolean aValueBinding bindingBlock.Type type) {
        return yield(contextvalueselfklassaValuebindingtype.);
    }
    @Override
    public IRubyObject yield(ThreadContext contextIRubyObject valueIRubyObject self,
            RubyModule klassboolean aValueBinding bindingBlock.Type typeBlock block) {
        if (klass == null) {
            self = prepareSelf(binding);
        }
        Visibility oldVis = binding.getFrame().getVisibility();
        Frame lastFrame = pre(contextklassbinding);
        try {
            setupBlockArgs(contextvalueselfblocktypeaValue);
            // This while loop is for restarting the block call in case a 'redo' fires.
            return evalBlockBody(contextbindingself);
        } catch (JumpException.NextJump nj) {
            return handleNextJump(contextnjtype);
        } finally {
            post(contextbindingoldVislastFrame);
        }
    }
    private IRubyObject evalBlockBody(ThreadContext contextBinding bindingIRubyObject self) {
        // This while loop is for restarting the block call in case a 'redo' fires.
        while (true) {
            try {
                return ASTInterpreter.INTERPRET_BLOCK(context.runtimecontextbinding.getMethod(), self.);
            } catch (JumpException.RedoJump rj) {
                context.pollThreadEvents();
                // do nothing, allow loop to redo
            } catch (StackOverflowError soe) {
                throw context.runtime.newSystemStackError("stack level too deep"soe);
            }
        }
    }
    private IRubyObject prepareSelf(Binding binding) {
        IRubyObject self = binding.getSelf();
        binding.getFrame().setSelf(self);
        return self;
    }
    private IRubyObject handleNextJump(ThreadContext contextJumpException.NextJump njBlock.Type type) {
        return nj.getValue() == null ? context.runtime.getNil() : (IRubyObject)nj.getValue();
    }
    private void setupBlockArg(ThreadContext contextIRubyObject valueIRubyObject selfBlock blockBlock.Type type) {
        setupBlockArgs(contextvalueselfblocktypefalse);
    }

    
    private void setupBlockArgs(ThreadContext contextIRubyObject valueIRubyObject selfBlock blockBlock.Type typeboolean alreadyArray) {
        IRubyObject[] parameters = RuntimeHelpers.restructureBlockArgs19(valuealreadyArray);
        Ruby runtime = context.runtime;
        if (type == ...checkArgCount(runtimeparameters.length);        
        if (!( instanceof ArgsNoArgNode)) .prepare(contextruntimeselfparametersblock);
    }
    public ArgsNode getArgs() {
        return ;
    }
    
    public Node getBody() {
        return ;
    }
    public String getFile() {
        return .getFile();
    }
    public int getLine() {
        return .getLine();
    }
    @Override
    public String[] getParameterList() {
        return ;
    }
New to GrepCode? Check out our FAQ X