Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  package org.jruby.ir.transformations.inlining;
  
  import java.util.HashMap;
  import java.util.List;
  import java.util.Map;
 
 public class InlinerInfo {
     private static Integer globalInlineCount = 0;
 
     private CFG callerCFG;
     private CallBase call;
 
     private Operand[] callArgs;
     private boolean canMapArgsStatically;
     private Variable argsArray;
     private Map<LabelLabellblRenameMap;
     private Map<VariableVariablevarRenameMap;
     private Map<BasicBlockBasicBlockbbRenameMap;
     private List yieldSites;
     private Operand callReceiver;
     private String inlineVarPrefix;
 
     // SSS FIXME: Ugly?
     // For inlining closures
     private Operand yieldArg;
     private Variable yieldResult;
     private boolean inClosureInlineMode;
 
     // SSS FIXME: Ugly?
     // For cloning closure
     private boolean inClosureCloneMode;
     private IRClosure clonedClosure;
 
     // SSS FIXME: This is a copy of a method in instructions/calladapter/CallAdapter.java
     // Maybe move this is to a util/Helpers class?
     private static boolean containsSplat(Operand args[]) {
         for (int i = 0; i < args.lengthi++) {
             if (args[iinstanceof Splatreturn true;
         }
 
         return false;
     }
 
     public InlinerInfo() { }
 
     public InlinerInfo(CallBase callCFG c) {
         this. = new HashMap<VariableVariable>();
         this. = new HashMap<LabelLabel>();
         this. = new HashMap<BasicBlockBasicBlock>();
         this. = new ArrayList();
         this. = call;
         this. = call.getCallArgs();
         this. = c;
         this. = call.getReceiver();
         this. = false;
         this. = false;
         this. = !containsSplat();
         this. = this. ?  null : getInlineHostScope().getNewTemporaryVariable();
         synchronized() { 
             this. = "%in" +  + "_"
             ++;
         }
     }
 
     public InlinerInfo cloneForInliningClosure() {
         InlinerInfo clone = new InlinerInfo();
         clone.varRenameMap = new HashMap<VariableVariable>();
         clone.lblRenameMap = new HashMap<LabelLabel>();
         clone.bbRenameMap = new HashMap<BasicBlockBasicBlock>();
         clone.call = this.;
         clone.callArgs = this.;
         clone.callerCFG = this.;
         clone.callReceiver = this.;
         clone.inClosureCloneMode = false;
         clone.inClosureInlineMode = true;
         clone.canMapArgsStatically = false;
         return clone;
     }
 
    public InlinerInfo cloneForCloningClosure(IRClosure clonedClosure) {
        InlinerInfo clone = new InlinerInfo();
        clone.varRenameMap = new HashMap<VariableVariable>();
        for (Variable v.keySet()) {
            clone.varRenameMap.put(v.get(v));
        }
        clone.lblRenameMap = new HashMap<LabelLabel>();
        clone.clonedClosure = clonedClosure;
        clone.inClosureCloneMode = true;
        clone.inClosureInlineMode = false;
        clone.canMapArgsStatically = false;
        return clone;
    }

    
Returns the scope into which code is being inlined.
    public IRScope getInlineHostScope() {
        return .getScope();
    }
        return  ?  : getInlineHostScope();
    }
    public Label getRenamedLabel(Label l) {
        Label newLbl = this..get(l);
        if (newLbl == null) {
           newLbl =  ? l.clone() : getInlineHostScope().getNewLabel();
           this..put(lnewLbl);
        }
        return newLbl;
    }
    public void setupYieldArgsAndYieldResult(YieldInstr yiBasicBlock yieldBBArity blockArity) {
        int     blockArityValue = blockArity.getValue();
        Operand yieldInstrArg = yi.getYieldArg();
        if ((yieldInstrArg == .) || (blockArityValue == 0)) {
            this. = new Array(); // Zero-elt array
        } else if (yieldInstrArg instanceof Array) {
            this. = yieldInstrArg;
            // 1:1 arg match
            if (((Array)yieldInstrArg).size() == blockArityValue = true;
        } else {
            // SSS FIXME: The code below is not entirely correct.  We have to process 'yi.getYieldArg()' similar
            // to how InterpretedIRBlockBody (1.8 and 1.9 modes) processes it.  We may need a special instruction
            // that takes care of aligning the stars and bringing good fortune to arg yielder and arg receiver.
            IRScope callerScope   = getInlineHostScope();
            boolean needSpecialProcessing = (blockArityValue != -1) && (blockArityValue != 1);
            Variable yieldArgArray = callerScope.getNewTemporaryVariable(); 
            yieldBB.addInstr(new ToAryInstr(yieldArgArrayyieldInstrArgcallerScope.getManager().getTrue()));
            this. = yieldArgArray;
        }
        this. = yi.getResult();
    }
    public Variable getRenamedVariable(Variable v) {
        Variable newVar = this..get(v);
        if (newVar == null) {
            if () {
                // when cloning a closure, local vars and temps are not renamed
                newVar = v.cloneForCloningClosure(this);
            } else if () {
                // when inlining a closure, 
                // - local var depths are reduced by 1 (to move them to the host scope)
                // - tmp vars are reallocated in the host scope
                if (v instanceof LocalVariable) {
                    LocalVariable lv = (LocalVariable)v;
                    int depth = lv.getScopeDepth();
                    newVar = getInlineHostScope().getLocalVariable(lv.getName(), depth > 1 ? depth - 1 : 0);
                } else {
                    newVar = getInlineHostScope().getNewTemporaryVariable();
                }
            } else {
                // when inlining a method, local vars and temps have to be renamed
                newVar = getInlineHostScope().getNewInlineVariable(v);
            }
            this..put(vnewVar);
        } else if ( && (v instanceof LocalVariable)) {
            LocalVariable l_v = (LocalVariable)v;
            LocalVariable l_newVar = (LocalVariable)newVar;
            if (l_v.getScopeDepth() != l_newVar.getScopeDepth()) newVar = l_newVar.cloneForDepth(l_v.getScopeDepth());
        }
        return newVar;
    }
    public BasicBlock getRenamedBB(BasicBlock bb) {
        return .get(bb);
    }
        BasicBlock renamedBB = getRenamedBB(bb);
        if (renamedBB == null) {
            renamedBB =  new BasicBlock(this.getRenamedLabel(bb.getLabel()));
            if (bb.isRescueEntry()) renamedBB.markRescueEntryBB();
            .put(bbrenamedBB);
        }
        return renamedBB;
    }
    public boolean canMapArgsStatically() {
        return this.;
    }
    public Operand getArgs() {
        return  ?  : ;
    }
    public int getArgsCount() {
        return  ? ( ? ((Array)).size() : .) : -1;
    }
    public Operand getArg(int index) {
        int n = getArgsCount();
        return index < n ? ( ? ((Array)).get(index) : [index]) : null;
    }
    public Operand getArg(int argIndexboolean restOfArgArray) {
        if (restOfArgArray == false) {
            return getArg(argIndex);
        } else if () {
            throw new RuntimeException("Cannot get rest yield arg at inline time!");
        } else {
            if(argIndex >= .) {
               return new Array();
           }
           else {
               Operand[] tmp = new Operand[. - argIndex];
               for (int j = argIndexj < .j++)
                   tmp[j-argIndex] = [j];
               return new Array(tmp);
           }
        }
    }
    public Operand getSelfValue(Self self) {
        return  ? self : ;
    }
    public Operand getCallClosure() {
        return .getClosureArg(.getScope().getManager().getNil());
    }
    // SSS FIXME: Ugly?
    public IRClosure getClonedClosure() {
        return ;
    }
    public Variable getCallResultVariable() {
        return ( instanceof ResultInstr) ? ((ResultInstr)).getResult() : null;
    }
    public void recordYieldSite(BasicBlock bbYieldInstr i) {
        .add(new Tuple<BasicBlockYieldInstr>(bbi));
    }
    public List getYieldSites() {
        return ;
    }
    public Variable getYieldResult() {
        return ;
    }
New to GrepCode? Check out our FAQ X