< prev index next >

src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/CodeGenerator.java

Print this page




3303         method.label(skip);
3304 
3305         // Finally body is always inlined elsewhere so it doesn't need to be emitted
3306         assert tryNode.getFinallyBody() == null;
3307 
3308         return false;
3309     }
3310 
3311     @Override
3312     public boolean enterVarNode(final VarNode varNode) {
3313         if(!method.isReachable()) {
3314             return false;
3315         }
3316         final Expression init = varNode.getInit();
3317         final IdentNode identNode = varNode.getName();
3318         final Symbol identSymbol = identNode.getSymbol();
3319         assert identSymbol != null : "variable node " + varNode + " requires a name with a symbol";
3320         final boolean needsScope = identSymbol.isScope();
3321 
3322         if (init == null) {
3323             if (needsScope && varNode.isBlockScoped()) {
3324                 // block scoped variables need a DECLARE flag to signal end of temporal dead zone (TDZ)


3325                 method.loadCompilerConstant(SCOPE);
3326                 method.loadUndefined(Type.OBJECT);
3327                 final int flags = getScopeCallSiteFlags(identSymbol) | (varNode.isBlockScoped() ? CALLSITE_DECLARE : 0);
3328                 assert isFastScope(identSymbol);
3329                 storeFastScopeVar(identSymbol, flags);
3330             }
3331             return false;
3332         }
3333 
3334         enterStatement(varNode);
3335         assert method != null;
3336 
3337         if (needsScope) {
3338             method.loadCompilerConstant(SCOPE);
3339             loadExpressionUnbounded(init);
3340             // block scoped variables need a DECLARE flag to signal end of temporal dead zone (TDZ)
3341             final int flags = getScopeCallSiteFlags(identSymbol) | (varNode.isBlockScoped() ? CALLSITE_DECLARE : 0);
3342             if (isFastScope(identSymbol)) {
3343                 storeFastScopeVar(identSymbol, flags);
3344             } else {




3303         method.label(skip);
3304 
3305         // Finally body is always inlined elsewhere so it doesn't need to be emitted
3306         assert tryNode.getFinallyBody() == null;
3307 
3308         return false;
3309     }
3310 
3311     @Override
3312     public boolean enterVarNode(final VarNode varNode) {
3313         if(!method.isReachable()) {
3314             return false;
3315         }
3316         final Expression init = varNode.getInit();
3317         final IdentNode identNode = varNode.getName();
3318         final Symbol identSymbol = identNode.getSymbol();
3319         assert identSymbol != null : "variable node " + varNode + " requires a name with a symbol";
3320         final boolean needsScope = identSymbol.isScope();
3321 
3322         if (init == null) {
3323             // Block-scoped variables need a DECLARE flag to signal end of temporal dead zone (TDZ).
3324             // However, don't do this for CONST which always has an initializer except in the special case of
3325             // for-in/of loops, in which it is initialized in the loop header and should be left untouched here.
3326             if (needsScope && varNode.isLet()) {
3327                 method.loadCompilerConstant(SCOPE);
3328                 method.loadUndefined(Type.OBJECT);
3329                 final int flags = getScopeCallSiteFlags(identSymbol) | (varNode.isBlockScoped() ? CALLSITE_DECLARE : 0);
3330                 assert isFastScope(identSymbol);
3331                 storeFastScopeVar(identSymbol, flags);
3332             }
3333             return false;
3334         }
3335 
3336         enterStatement(varNode);
3337         assert method != null;
3338 
3339         if (needsScope) {
3340             method.loadCompilerConstant(SCOPE);
3341             loadExpressionUnbounded(init);
3342             // block scoped variables need a DECLARE flag to signal end of temporal dead zone (TDZ)
3343             final int flags = getScopeCallSiteFlags(identSymbol) | (varNode.isBlockScoped() ? CALLSITE_DECLARE : 0);
3344             if (isFastScope(identSymbol)) {
3345                 storeFastScopeVar(identSymbol, flags);
3346             } else {


< prev index next >