public LabelNode getOrCreateGotoLabel(String name) { name = name.toLowerCase(); if (gotoLabels == null) gotoLabels = new HashMap<String, LabelNode>(); LabelNode label = gotoLabels.get(name); if (label == null) gotoLabels.put(name, label = new LabelNode()); return label; }
public LabelNode makeLabel() { LabelNode el; code.add(el = new LabelNode()); return el; }
public void writeUndefineVariables(Collection<VariableExprToken> values) { LabelNode end = new LabelNode(); for (VariableExprToken value : values) writeUndefineVariable(value, end); }
LabelNode getOrCreateLabelAtPos(int pos) { LabelNode ret = null; if (pos < posToLabelMap.size()) { ret = posToLabelMap.get(pos); } if (ret == null) { ret = new LabelNode(); setLabel(pos, ret); } return ret; }
public LabelNode writeLabel(MethodNode mv, int lineNumber){ LabelNode node = new LabelNode(new Label()); mv.instructions.add(node); if (lineNumber != -1) mv.instructions.add(new LineNumberNode(lineNumber, node)); return node; }
void dupBBAndLabels(boolean deepCopy, HashMap<BasicBlock, BasicBlock> bbCopyMap, HashMap<LabelNode, LabelNode> labelCopyMap, BasicBlock returnToBB) throws KilimException { for (BasicBlock orig : getSubBlocks()) { BasicBlock dup = new BasicBlock(flow, orig.startLabel); bbCopyMap.put(orig, dup); if (deepCopy) { // copy labels for each instruction. This copy will be used // in dupCopyContents for (int i = orig.startPos; i <= orig.endPos; i++) { LabelNode origLabel = flow.getLabelAt(i); if (origLabel != null) { LabelNode l = labelCopyMap.put(origLabel, new LabelNode()); assert l == null; } } // dup.startLabel reset later in dupCopyContents } } }
public void writeLineNumber(Token token) { if (token.getMeta().getStartLine() > lastLineNumber) { lastLineNumber = token.getMeta().getStartLine(); code.add(new LineNumberNode(lastLineNumber, new LabelNode())); } }
public CallWeaver(MethodWeaver mw, Detector d, BasicBlock aBB) { detector = d; methodWeaver = mw; bb = aBB; callLabel = bb.startLabel; varUsage = new BitSet(2 * bb.flow.maxLocals); resumeLabel = bb.flow.getLabelAt(bb.startPos + 1); if (resumeLabel == null) resumeLabel = new LabelNode(); assignRegisters(); stateClassName = createStateClass(); methodWeaver.ensureMaxStack(getNumBottom() + 3); // }
@SuppressWarnings("unchecked") void writeFooter(){ LabelNode endL = new LabelNode(); node.instructions.add(endL); for(LocalVariable variable : localVariables.values()){ String description = Type.getDescriptor(variable.getClazz() == null ? Object.class : variable.getClazz()); if (variable.name.equals("~this")) { //if (variable.getClazz() != Memory.class && !clazz.statement.isTrait()) { description = "L" + clazz.entity.getCompiledInternalName() + ";"; //} } node.localVariables.add(new LocalVariableNode( variable.name, description, null, variable.label == null ? labelStart : variable.label, variable.getEndLabel() == null ? endL : variable.getEndLabel(), variable.index )); } //node.maxStack = this.stackMaxSize; !!! we don't need this, see: ClassWriter.COMPUTE_FRAMES //node.maxLocals = this.localVariables.size(); }
loadVar(mv, TOBJECT, methodWeaver.getFiberVar()); mv.visitMethodInsn(INVOKEVIRTUAL, FIBER_CLASS, "up", "()I", false); LabelNode restoreLabel = new LabelNode(); LabelNode saveLabel = new LabelNode(); LabelNode unwindLabel = new LabelNode(); LabelNode[] labels = new LabelNode[] { resumeLabel, restoreLabel, saveLabel, unwindLabel };
LabelNode resumeLabel = new LabelNode(); VMType.loadVar(mv, VMType.TOBJECT, getFiberVar()); mv.visitMethodInsn(INVOKEVIRTUAL, FIBER_CLASS, "upEx", "()I", false); int[] keys = new int[cwList.size()]; for (int i = 0; i < cwList.size(); i++) { labels[i] = new LabelNode(); keys[i] = callWeavers.indexOf(cwList.get(i)) + 1;
private void writeBody(IfStmtToken token) { LabelNode end = new LabelNode(); LabelNode elseL = new LabelNode(); expr.writePopBoolean(); add(new JumpInsnNode(IFEQ, token.getElseBody() != null ? elseL : end)); expr.stackPop(); if (token.getBody() != null) { expr.write(token.getBody()); } if (token.getElseBody() != null){ add(new JumpInsnNode(GOTO, end)); add(elseL); expr.write(token.getElseBody()); } add(end); add(new LineNumberNode(token.getMeta().getEndLine(), end)); }
expr.writeDefineVariables(token.getLocal()); LabelNode l = new LabelNode(); LabelNode end = new LabelNode(); int i = 0; for(CaseStmtToken one : token.getCases()) { jumps[i] = new LabelNode[]{ new LabelNode(), new LabelNode() }; // checkLabel, bodyLabel if (i == jumps.length - 1) jumps[i] = new LabelNode[]{ end, end };
methodCompiler.writeHeader(); LabelNode end = new LabelNode(); LabelNode l0 = writeLabel(destructor, statement.getMeta().getStartLine()); methodCompiler.addLocalVariable("~this", l0);
@Override public void write(WhileStmtToken token) { expr.writeDefineVariables(token.getLocal()); LabelNode start = expr.writeLabel(node, token.getMeta().getStartLine()); LabelNode end = new LabelNode(); expr.writeConditional(token.getCondition(), end); method.pushJump(end, start); expr.write(BodyStmtToken.class, token.getBody()); method.popJump(); add(new JumpInsnNode(GOTO, start)); add(end); add(new LineNumberNode(token.getMeta().getEndLine(), end)); expr.writeUndefineVariables(token.getLocal()); } }
@Override public void write(DoStmtToken token) { expr.writeDefineVariables(token.getLocal()); LabelNode start = expr.writeLabel(node, token.getMeta().getStartLine()); LabelNode end = new LabelNode(); method.pushJump(end, start); expr.write(token.getBody()); method.popJump(); expr.writeConditional(token.getCondition(), end); add(new JumpInsnNode(GOTO, start)); add(end); add(new LineNumberNode(token.getMeta().getEndLine(), end)); expr.writeUndefineVariables(token.getLocal()); } }
assert local != null; LabelNode end = new LabelNode(); boolean isClosure = method.clazz.isClosure();