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 { |