jdk.nashorn.internal.ir.Block Java Examples
The following examples show how to use
jdk.nashorn.internal.ir.Block.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: Parser.java From openjdk-jdk8u with GNU General Public License v2.0 | 6 votes |
/** * ...IterationStatement : * ... * while ( Expression ) Statement * ... * * See 12.6 * * Parse while statement. */ private void whileStatement() { // Capture WHILE token. final long whileToken = token; // WHILE tested in caller. next(); // Construct WHILE node. WhileNode whileNode = new WhileNode(line, whileToken, Token.descPosition(whileToken), false); lc.push(whileNode); try { expect(LPAREN); final int whileLine = line; final JoinPredecessorExpression test = joinPredecessorExpression(); expect(RPAREN); final Block body = getStatement(); appendStatement(whileNode = new WhileNode(whileLine, whileToken, finish, false). setTest(lc, test). setBody(lc, body)); } finally { lc.pop(whileNode); } }
Example #2
Source File: FindScopeDepths.java From hottub with GNU General Public License v2.0 | 6 votes |
static int findScopesToStart(final LexicalContext lc, final FunctionNode fn, final Block block) { final Block bodyBlock = findBodyBlock(lc, fn, block); final Iterator<Block> iter = lc.getBlocks(block); Block b = iter.next(); int scopesToStart = 0; while (true) { if (b.needsScope()) { scopesToStart++; } if (b == bodyBlock) { break; } b = iter.next(); } return scopesToStart; }
Example #3
Source File: AssignSymbols.java From TencentKona-8 with GNU General Public License v2.0 | 6 votes |
private void initFunctionWideVariables(final FunctionNode functionNode, final Block body) { initCompileConstant(CALLEE, body, IS_PARAM | IS_INTERNAL | HAS_OBJECT_VALUE); initCompileConstant(THIS, body, IS_PARAM | IS_THIS | HAS_OBJECT_VALUE); if (functionNode.isVarArg()) { initCompileConstant(VARARGS, body, IS_PARAM | IS_INTERNAL | HAS_OBJECT_VALUE); if (functionNode.needsArguments()) { initCompileConstant(ARGUMENTS, body, IS_VAR | IS_INTERNAL | HAS_OBJECT_VALUE); defineSymbol(body, ARGUMENTS_VAR.symbolName(), null, IS_VAR | HAS_OBJECT_VALUE); } } initParameters(functionNode, body); initCompileConstant(SCOPE, body, IS_VAR | IS_INTERNAL | HAS_OBJECT_VALUE); initCompileConstant(RETURN, body, IS_VAR | IS_INTERNAL); }
Example #4
Source File: FoldConstants.java From openjdk-jdk9 with GNU General Public License v2.0 | 6 votes |
@Override public Node leaveIfNode(final IfNode ifNode) { final Node test = ifNode.getTest(); if (test instanceof LiteralNode.PrimitiveLiteralNode) { final boolean isTrue = ((LiteralNode.PrimitiveLiteralNode<?>)test).isTrue(); final Block executed = isTrue ? ifNode.getPass() : ifNode.getFail(); final Block dropped = isTrue ? ifNode.getFail() : ifNode.getPass(); final List<Statement> statements = new ArrayList<>(); if (executed != null) { statements.addAll(executed.getStatements()); // Get statements form executed branch } if (dropped != null) { extractVarNodesFromDeadCode(dropped, statements); // Get var-nodes from non-executed branch } if (statements.isEmpty()) { return new EmptyNode(ifNode); } return BlockStatement.createReplacement(ifNode, ifNode.getFinish(), statements); } return ifNode; }
Example #5
Source File: LocalVariableTypesCalculator.java From openjdk-jdk9 with GNU General Public License v2.0 | 6 votes |
@Override public boolean enterBlock(final Block block) { boolean cloned = false; for(final Symbol symbol: block.getSymbols()) { if(symbol.isBytecodeLocal()) { if (getLocalVariableTypeOrNull(symbol) == null) { if (!cloned) { cloneOrNewLocalVariableTypes(); cloned = true; } localVariableTypes.put(symbol, LvarType.UNDEFINED); } // In case we're repeating analysis of a lexical scope (e.g. it's in a loop), // make sure all symbols lexically scoped by the block become valid again. invalidatedSymbols.remove(symbol); } } return true; }
Example #6
Source File: LocalVariableTypesCalculator.java From TencentKona-8 with GNU General Public License v2.0 | 6 votes |
private Map<Symbol, LvarType> getBreakTargetTypes(final LexicalContextNode target) { // Remove symbols defined in the the blocks that are being broken out of. Map<Symbol, LvarType> types = localVariableTypes; for(final Iterator<LexicalContextNode> it = lc.getAllNodes(); it.hasNext();) { final LexicalContextNode node = it.next(); if(node instanceof Block) { for(final Symbol symbol: ((Block)node).getSymbols()) { if(localVariableTypes.containsKey(symbol)) { if(types == localVariableTypes) { types = cloneMap(localVariableTypes); } types.remove(symbol); } } } if(node == target) { break; } } return types; }
Example #7
Source File: LocalVariableTypesCalculator.java From TencentKona-8 with GNU General Public License v2.0 | 6 votes |
@Override public boolean enterBlock(final Block block) { boolean cloned = false; for(final Symbol symbol: block.getSymbols()) { if(symbol.isBytecodeLocal()) { if (getLocalVariableTypeOrNull(symbol) == null) { if (!cloned) { cloneOrNewLocalVariableTypes(); cloned = true; } localVariableTypes.put(symbol, LvarType.UNDEFINED); } // In case we're repeating analysis of a lexical scope (e.g. it's in a loop), // make sure all symbols lexically scoped by the block become valid again. invalidatedSymbols.remove(symbol); } } return true; }
Example #8
Source File: Attr.java From nashorn with GNU General Public License v2.0 | 6 votes |
/** * Initialize parameters for function node. This may require specializing * types if a specialization profile is known * * @param functionNode the function node */ private void initParameters(final FunctionNode functionNode, final Block body) { int pos = 0; for (final IdentNode param : functionNode.getParameters()) { addLocalDef(param.getName()); final Type callSiteParamType = functionNode.getHints().getParameterType(pos); int flags = IS_PARAM; if (callSiteParamType != null) { LOG.info("Param ", param, " has a callsite type ", callSiteParamType, ". Using that."); flags |= Symbol.IS_SPECIALIZED_PARAM; } final Symbol paramSymbol = defineSymbol(body, param.getName(), flags); assert paramSymbol != null; newType(paramSymbol, callSiteParamType == null ? Type.UNKNOWN : callSiteParamType); LOG.info("Initialized param ", pos, "=", paramSymbol); pos++; } }
Example #9
Source File: AssignSymbols.java From TencentKona-8 with GNU General Public License v2.0 | 6 votes |
@Override public boolean enterBlock(final Block block) { start(block); if (lc.isFunctionBody()) { assert !block.hasSymbols(); final FunctionNode fn = lc.getCurrentFunction(); if (isUnparsedFunction(fn)) { // It's a skipped nested function. Just mark the symbols being used by it as being in use. for(final String name: compiler.getScriptFunctionData(fn.getId()).getExternalSymbolNames()) { nameIsUsed(name, null); } // Don't bother descending into it, it must be empty anyway. assert block.getStatements().isEmpty(); return false; } enterFunctionBody(); } return true; }
Example #10
Source File: Parser.java From hottub with GNU General Public License v2.0 | 6 votes |
/** * ...IterationStatement : * ... * while ( Expression ) Statement * ... * * See 12.6 * * Parse while statement. */ private void whileStatement() { // Capture WHILE token. final long whileToken = token; // WHILE tested in caller. next(); // Construct WHILE node. WhileNode whileNode = new WhileNode(line, whileToken, Token.descPosition(whileToken), false); lc.push(whileNode); try { expect(LPAREN); final int whileLine = line; final JoinPredecessorExpression test = joinPredecessorExpression(); expect(RPAREN); final Block body = getStatement(); appendStatement(whileNode = new WhileNode(whileLine, whileToken, finish, false). setTest(lc, test). setBody(lc, body)); } finally { lc.pop(whileNode); } }
Example #11
Source File: Attr.java From openjdk-8-source with GNU General Public License v2.0 | 6 votes |
/** * Initialize parameters for function node. This may require specializing * types if a specialization profile is known * * @param functionNode the function node */ private void initParameters(final FunctionNode functionNode, final Block body) { int pos = 0; for (final IdentNode param : functionNode.getParameters()) { addLocalDef(param.getName()); final Type callSiteParamType = functionNode.getHints().getParameterType(pos); int flags = IS_PARAM; if (callSiteParamType != null) { LOG.info("Param ", param, " has a callsite type ", callSiteParamType, ". Using that."); flags |= Symbol.IS_SPECIALIZED_PARAM; } final Symbol paramSymbol = defineSymbol(body, param.getName(), flags); assert paramSymbol != null; newType(paramSymbol, callSiteParamType == null ? Type.UNKNOWN : callSiteParamType); LOG.info("Initialized param ", pos, "=", paramSymbol); pos++; } }
Example #12
Source File: Splitter.java From openjdk-jdk8u-backup with GNU General Public License v2.0 | 6 votes |
@Override public Node leaveBlock(final Block block) { assert !block.isCatchBlock(); Block newBlock = block; // Block was heavier than SLIT_THRESHOLD in enter, but a sub-block may have // been split already, so weigh again before splitting. long weight = WeighNodes.weigh(block, weightCache); if (weight >= SPLIT_THRESHOLD) { final FunctionNode currentFunction = lc.getCurrentFunction(); newBlock = splitBlock(block, currentFunction); weight = WeighNodes.weigh(newBlock, weightCache); lc.setFlag(currentFunction, FunctionNode.IS_SPLIT); } weightCache.put(newBlock, weight); return newBlock; }
Example #13
Source File: AssignSymbols.java From jdk8u_nashorn with GNU General Public License v2.0 | 6 votes |
@Override public boolean enterCatchNode(final CatchNode catchNode) { final IdentNode exception = catchNode.getException(); final Block block = lc.getCurrentBlock(); start(catchNode); // define block-local exception variable final String exname = exception.getName(); // If the name of the exception starts with ":e", this is a synthetic catch block, likely a catch-all. Its // symbol is naturally internal, and should be treated as such. final boolean isInternal = exname.startsWith(EXCEPTION_PREFIX.symbolName()); // IS_LET flag is required to make sure symbol is not visible outside catch block. However, we need to // clear the IS_LET flag after creation to allow redefinition of symbol inside the catch block. final Symbol symbol = defineSymbol(block, exname, catchNode, IS_VAR | IS_LET | (isInternal ? IS_INTERNAL : 0) | HAS_OBJECT_VALUE); symbol.clearFlag(IS_LET); return true; }
Example #14
Source File: FoldConstants.java From jdk8u60 with GNU General Public License v2.0 | 6 votes |
@Override public Node leaveIfNode(final IfNode ifNode) { final Node test = ifNode.getTest(); if (test instanceof LiteralNode.PrimitiveLiteralNode) { final boolean isTrue = ((LiteralNode.PrimitiveLiteralNode<?>)test).isTrue(); final Block executed = isTrue ? ifNode.getPass() : ifNode.getFail(); final Block dropped = isTrue ? ifNode.getFail() : ifNode.getPass(); final List<Statement> statements = new ArrayList<>(); if (executed != null) { statements.addAll(executed.getStatements()); // Get statements form executed branch } if (dropped != null) { extractVarNodes(dropped, statements); // Get var-nodes from non-executed branch } if (statements.isEmpty()) { return new EmptyNode(ifNode); } return BlockStatement.createReplacement(ifNode, ifNode.getFinish(), statements); } return ifNode; }
Example #15
Source File: AssignSymbols.java From openjdk-jdk8u-backup with GNU General Public License v2.0 | 6 votes |
@Override public boolean enterBlock(final Block block) { start(block); if (lc.isFunctionBody()) { assert !block.hasSymbols(); final FunctionNode fn = lc.getCurrentFunction(); if (isUnparsedFunction(fn)) { // It's a skipped nested function. Just mark the symbols being used by it as being in use. for(final String name: compiler.getScriptFunctionData(fn.getId()).getExternalSymbolNames()) { nameIsUsed(name, null); } // Don't bother descending into it, it must be empty anyway. assert block.getStatements().isEmpty(); return false; } enterFunctionBody(); } return true; }
Example #16
Source File: SplitIntoFunctions.java From openjdk-jdk8u-backup with GNU General Public License v2.0 | 6 votes |
@Override public Node leaveBlock(final Block block) { if (!artificialBlock) { if (lc.isFunctionBody()) { // Prepend declaration-only var statements to the top of the statement list. lc.prependStatements(getCurrentFunctionState().varStatements); } else if (lc.isSplitBody()) { appendSplitReturn(FALLTHROUGH_STATE, NO_LINE_NUMBER); if (getCurrentFunctionState().fn.isProgram()) { // If we're splitting the program, make sure every shard ends with "return :return" and // begins with ":return = :return-in;". lc.prependStatement(new ExpressionStatement(NO_LINE_NUMBER, NO_TOKEN, NO_FINISH, new BinaryNode(Token.toDesc(TokenType.ASSIGN, 0, 0), createReturnIdent(), createReturnParamIdent()))); } } } return block; }
Example #17
Source File: AssignSymbols.java From openjdk-jdk8u with GNU General Public License v2.0 | 6 votes |
private void defineFunctionSelfSymbol(final FunctionNode functionNode, final Block body) { // Function self-symbol is only declared as a local variable for named function expressions. Declared functions // don't need it as they are local variables in their declaring scope. if (!functionNode.isNamedFunctionExpression()) { return; } final String name = functionNode.getIdent().getName(); assert name != null; // As it's a named function expression. if (body.getExistingSymbol(name) != null) { // Body already has a declaration for the name. It's either a parameter "function x(x)" or a // top-level variable "function x() { ... var x; ... }". return; } defineSymbol(body, name, functionNode, IS_VAR | IS_FUNCTION_SELF | HAS_OBJECT_VALUE); if(functionNode.allVarsInScope()) { // basically, has deep eval // We must conservatively presume that eval'd code can dynamically use the function symbol. lc.setFlag(functionNode, FunctionNode.USES_SELF_SYMBOL); } }
Example #18
Source File: LocalVariableTypesCalculator.java From hottub with GNU General Public License v2.0 | 6 votes |
private Map<Symbol, LvarType> getBreakTargetTypes(final LexicalContextNode target) { // Remove symbols defined in the the blocks that are being broken out of. Map<Symbol, LvarType> types = localVariableTypes; for(final Iterator<LexicalContextNode> it = lc.getAllNodes(); it.hasNext();) { final LexicalContextNode node = it.next(); if(node instanceof Block) { for(final Symbol symbol: ((Block)node).getSymbols()) { if(localVariableTypes.containsKey(symbol)) { if(types == localVariableTypes) { types = cloneMap(localVariableTypes); } types.remove(symbol); } } } if(node == target) { break; } } return types; }
Example #19
Source File: Parser.java From jdk8u60 with GNU General Public License v2.0 | 5 votes |
/** * Get all the statements generated by a single statement. * @return Statements. */ private Block getStatement() { if (type == LBRACE) { return getBlock(true); } // Set up new block. Captures first token. Block newBlock = newBlock(); try { statement(false, false, true); } finally { newBlock = restoreBlock(newBlock); } return newBlock; }
Example #20
Source File: Parser.java From nashorn with GNU General Public License v2.0 | 5 votes |
private FunctionNode restoreFunctionNode(final FunctionNode functionNode, final long lastToken) { final Block newBody = restoreBlock(lc.getFunctionBody(functionNode)); return lc.pop(functionNode). setBody(lc, newBody). setLastToken(lc, lastToken). setState(lc, errors.hasErrors() ? CompilationState.PARSE_ERROR : CompilationState.PARSED). snapshot(lc); }
Example #21
Source File: CodeGeneratorLexicalContext.java From openjdk-jdk9 with GNU General Public License v2.0 | 5 votes |
private int assignSlots(final Block block, final int firstSlot) { int fromSlot = firstSlot; final MethodEmitter method = methodEmitters.peek(); for (final Symbol symbol : block.getSymbols()) { if (symbol.hasSlot()) { symbol.setFirstSlot(fromSlot); final int toSlot = fromSlot + symbol.slotCount(); method.defineBlockLocalVariable(fromSlot, toSlot); fromSlot = toSlot; } } return fromSlot; }
Example #22
Source File: FoldConstants.java From openjdk-8-source with GNU General Public License v2.0 | 5 votes |
private static void extractVarNodes(final Block block, final List<Statement> statements) { final LexicalContext lc = new LexicalContext(); block.accept(lc, new NodeVisitor<LexicalContext>(lc) { @Override public boolean enterVarNode(VarNode varNode) { statements.add(varNode.setInit(null)); return false; } }); }
Example #23
Source File: Splitter.java From jdk8u_nashorn with GNU General Public License v2.0 | 5 votes |
/** * Split a block into sub methods. * * @param block Block or function to split. * * @return new weight for the resulting block. */ private Block splitBlock(final Block block, final FunctionNode function) { final List<Statement> splits = new ArrayList<>(); List<Statement> statements = new ArrayList<>(); long statementsWeight = 0; for (final Statement statement : block.getStatements()) { final long weight = WeighNodes.weigh(statement, weightCache); if (statementsWeight + weight >= SPLIT_THRESHOLD || statement.isTerminal()) { if (!statements.isEmpty()) { splits.add(createBlockSplitNode(block, function, statements, statementsWeight)); statements = new ArrayList<>(); statementsWeight = 0; } } if (statement.isTerminal()) { splits.add(statement); } else { statements.add(statement); statementsWeight += weight; } } if (!statements.isEmpty()) { splits.add(createBlockSplitNode(block, function, statements, statementsWeight)); } return block.setStatements(lc, splits); }
Example #24
Source File: Splitter.java From openjdk-jdk8u-backup with GNU General Public License v2.0 | 5 votes |
/** * Create a new split node from statements contained in a parent block. * * @param parent Parent block. * @param statements Statements to include. * * @return New split node. */ private SplitNode createBlockSplitNode(final Block parent, final FunctionNode function, final List<Statement> statements, final long weight) { final long token = parent.getToken(); final int finish = parent.getFinish(); final String name = function.uniqueName(SPLIT_PREFIX.symbolName()); final Block newBlock = new Block(token, finish, statements); return new SplitNode(name, newBlock, compiler.findUnit(weight + WeighNodes.FUNCTION_WEIGHT)); }
Example #25
Source File: CodeGenerator.java From openjdk-8-source with GNU General Public License v2.0 | 5 votes |
@Override public Node leaveBlock(final Block block) { method.label(block.getBreakLabel()); symbolInfo(block); if (block.needsScope() && !block.isTerminal()) { popBlockScope(block); } return block; }
Example #26
Source File: Splitter.java From jdk8u60 with GNU General Public License v2.0 | 5 votes |
/** * Create a new split node from statements contained in a parent block. * * @param parent Parent block. * @param statements Statements to include. * * @return New split node. */ private SplitNode createBlockSplitNode(final Block parent, final FunctionNode function, final List<Statement> statements, final long weight) { final long token = parent.getToken(); final int finish = parent.getFinish(); final String name = function.uniqueName(SPLIT_PREFIX.symbolName()); final Block newBlock = new Block(token, finish, statements); return new SplitNode(name, newBlock, compiler.findUnit(weight + WeighNodes.FUNCTION_WEIGHT)); }
Example #27
Source File: Attr.java From openjdk-8-source with GNU General Public License v2.0 | 5 votes |
private boolean symbolNeedsToBeScope(Symbol symbol) { if (symbol.isThis() || symbol.isInternal()) { return false; } boolean previousWasBlock = false; for (final Iterator<LexicalContextNode> it = lc.getAllNodes(); it.hasNext();) { final LexicalContextNode node = it.next(); if (node instanceof FunctionNode) { // We reached the function boundary without seeing a definition for the symbol - it needs to be in // scope. return true; } else if (node instanceof WithNode) { if (previousWasBlock) { // We reached a WithNode; the symbol must be scoped. Note that if the WithNode was not immediately // preceded by a block, this means we're currently processing its expression, not its body, // therefore it doesn't count. return true; } previousWasBlock = false; } else if (node instanceof Block) { if (((Block)node).getExistingSymbol(symbol.getName()) == symbol) { // We reached the block that defines the symbol without reaching either the function boundary, or a // WithNode. The symbol need not be scoped. return false; } previousWasBlock = true; } else { previousWasBlock = false; } } throw new AssertionError(); }
Example #28
Source File: Lower.java From hottub with GNU General Public License v2.0 | 5 votes |
private TryNode ensureUnconditionalCatch(final TryNode tryNode) { final List<CatchNode> catches = tryNode.getCatches(); if(catches == null || catches.isEmpty() || catches.get(catches.size() - 1).getExceptionCondition() == null) { return tryNode; } // If the last catch block is conditional, add an unconditional rethrow block final List<Block> newCatchBlocks = new ArrayList<>(tryNode.getCatchBlocks()); newCatchBlocks.add(catchAllBlock(tryNode)); return tryNode.setCatchBlocks(lc, newCatchBlocks); }
Example #29
Source File: LocalVariableTypesCalculator.java From hottub with GNU General Public License v2.0 | 5 votes |
private void enterDoWhileLoop(final WhileNode loopNode) { assertTypeStackIsEmpty(); final JoinPredecessorExpression test = loopNode.getTest(); final Block body = loopNode.getBody(); final Label continueLabel = loopNode.getContinueLabel(); final Label breakLabel = loopNode.getBreakLabel(); final Map<Symbol, LvarType> beforeLoopTypes = localVariableTypes; final Label repeatLabel = new Label(""); for(;;) { jumpToLabel(loopNode, repeatLabel, beforeLoopTypes); final Map<Symbol, LvarType> beforeRepeatTypes = localVariableTypes; body.accept(this); if(reachable) { jumpToLabel(body, continueLabel); } joinOnLabel(continueLabel); if(!reachable) { break; } visitExpressionOnEmptyStack(test); jumpToLabel(test, breakLabel); if(isAlwaysFalse(test)) { break; } jumpToLabel(test, repeatLabel); joinOnLabel(repeatLabel); if(localVariableTypes.equals(beforeRepeatTypes)) { break; } resetJoinPoint(continueLabel); resetJoinPoint(breakLabel); resetJoinPoint(repeatLabel); } if(isAlwaysTrue(test)) { doesNotContinueSequentially(); } leaveBreakable(loopNode); }
Example #30
Source File: Lower.java From openjdk-jdk8u with GNU General Public License v2.0 | 5 votes |
private static Block createFinallyBlock(final Block finallyBody) { final List<Statement> newStatements = new ArrayList<>(); for (final Statement statement : finallyBody.getStatements()) { newStatements.add(statement); if (statement.hasTerminalFlags()) { break; } } return finallyBody.setStatements(null, newStatements); }