Changeset 174226 in webkit for trunk/Source/JavaScriptCore/bytecompiler
- Timestamp:
- Oct 2, 2014, 1:35:58 PM (11 years ago)
- Location:
- trunk/Source/JavaScriptCore/bytecompiler
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp
r174216 r174226 247 247 if (m_codeBlock->needsFullScopeChain() || m_shouldEmitDebugHooks) { 248 248 m_lexicalEnvironmentRegister = addVar(); 249 emitInitLazyRegister(m_lexicalEnvironmentRegister);250 249 m_codeBlock->setActivationRegister(m_lexicalEnvironmentRegister->virtualRegister()); 251 250 emitOpcode(op_create_lexical_environment); … … 268 267 emitInitLazyRegister(unmodifiedArgumentsRegister); 269 268 270 if (should TearOffArgumentsEagerly()) {269 if (shouldCreateArgumentsEagerly() || shouldTearOffArgumentsEagerly()) { 271 270 emitOpcode(op_create_arguments); 272 271 instructions().append(argumentsRegister->index()); 272 if (m_codeBlock->hasActivationRegister()) { 273 RegisterID* argumentsRegister = ®isterFor(m_codeBlock->argumentsRegister().offset()); 274 initializeCapturedVariable(argumentsRegister, propertyNames().arguments, argumentsRegister); 275 RegisterID* uncheckedArgumentsRegister = ®isterFor(JSC::unmodifiedArgumentsRegister(m_codeBlock->argumentsRegister()).offset()); 276 initializeCapturedVariable(uncheckedArgumentsRegister, propertyNames().arguments, uncheckedArgumentsRegister); 277 } 273 278 } 274 279 } … … 317 322 // Captured variables and functions go first so that activations don't have 318 323 // to step over the non-captured locals to mark them. 319 if (functionBody->hasCapturedVariables() ) {324 if (functionBody->hasCapturedVariables() || shouldCaptureAllTheThings) { 320 325 for (size_t i = 0; i < boundParameterProperties.size(); i++) { 321 326 const Identifier& ident = boundParameterProperties[i]; 322 if (functionBody->captures(ident) )327 if (functionBody->captures(ident) || shouldCaptureAllTheThings) 323 328 addVar(ident, IsVariable, IsWatchable); 324 329 } … … 326 331 FunctionBodyNode* function = functionStack[i]; 327 332 const Identifier& ident = function->ident(); 328 if (functionBody->captures(ident) ) {333 if (functionBody->captures(ident) || shouldCaptureAllTheThings) { 329 334 m_functions.add(ident.impl()); 330 emitNewFunction(addVar(ident, IsVariable, IsWatchable), IsCaptured, function); 335 // We rely on still allocating stack space for captured variables 336 // here. 337 RegisterID* newFunction = emitNewFunction(addVar(ident, IsVariable, IsWatchable), IsCaptured, function); 338 initializeCapturedVariable(newFunction, ident, newFunction); 331 339 } 332 340 } 333 341 for (size_t i = 0; i < varStack.size(); ++i) { 334 342 const Identifier& ident = varStack[i].first; 335 if (functionBody->captures(ident) )343 if (functionBody->captures(ident) || shouldCaptureAllTheThings) 336 344 addVar(ident, (varStack[i].second & DeclarationStacks::IsConstant) ? IsConstant : IsVariable, IsWatchable); 337 345 } … … 342 350 bool canLazilyCreateFunctions = !functionBody->needsActivationForMoreThanVariables() && !m_shouldEmitDebugHooks && !m_vm->typeProfiler(); 343 351 m_firstLazyFunction = codeBlock->m_numVars; 344 for (size_t i = 0; i < functionStack.size(); ++i) { 345 FunctionBodyNode* function = functionStack[i]; 346 const Identifier& ident = function->ident(); 347 if (!functionBody->captures(ident)) { 348 m_functions.add(ident.impl()); 349 RefPtr<RegisterID> reg = addVar(ident, IsVariable, NotWatchable); 350 // Don't lazily create functions that override the name 'arguments' 351 // as this would complicate lazy instantiation of actual arguments. 352 if (!canLazilyCreateFunctions || ident == propertyNames().arguments) 353 emitNewFunction(reg.get(), NotCaptured, function); 354 else { 355 emitInitLazyRegister(reg.get()); 356 m_lazyFunctions.set(reg->virtualRegister().toLocal(), function); 352 if (!shouldCaptureAllTheThings) { 353 for (size_t i = 0; i < functionStack.size(); ++i) { 354 FunctionBodyNode* function = functionStack[i]; 355 const Identifier& ident = function->ident(); 356 if (!functionBody->captures(ident)) { 357 m_functions.add(ident.impl()); 358 RefPtr<RegisterID> reg = addVar(ident, IsVariable, NotWatchable); 359 // Don't lazily create functions that override the name 'arguments' 360 // as this would complicate lazy instantiation of actual arguments. 361 if (!canLazilyCreateFunctions || ident == propertyNames().arguments) 362 emitNewFunction(reg.get(), NotCaptured, function); 363 else { 364 emitInitLazyRegister(reg.get()); 365 m_lazyFunctions.set(reg->virtualRegister().toLocal(), function); 366 } 357 367 } 358 368 } 359 } 360 m_lastLazyFunction = canLazilyCreateFunctions ? codeBlock->m_numVars : m_firstLazyFunction; 361 for (size_t i = 0; i < boundParameterProperties.size(); i++) { 362 const Identifier& ident = boundParameterProperties[i]; 363 if (!functionBody->captures(ident)) 364 addVar(ident, IsVariable, IsWatchable); 365 } 366 for (size_t i = 0; i < varStack.size(); ++i) { 367 const Identifier& ident = varStack[i].first; 368 if (!functionBody->captures(ident)) 369 addVar(ident, (varStack[i].second & DeclarationStacks::IsConstant) ? IsConstant : IsVariable, NotWatchable); 370 } 371 372 if (shouldCaptureAllTheThings) 373 m_symbolTable->setCaptureEnd(virtualRegisterForLocal(codeBlock->m_numVars).offset()); 369 m_lastLazyFunction = canLazilyCreateFunctions ? codeBlock->m_numVars : m_firstLazyFunction; 370 for (size_t i = 0; i < boundParameterProperties.size(); i++) { 371 const Identifier& ident = boundParameterProperties[i]; 372 if (!functionBody->captures(ident)) 373 addVar(ident, IsVariable, IsWatchable); 374 } 375 for (size_t i = 0; i < varStack.size(); ++i) { 376 const Identifier& ident = varStack[i].first; 377 if (!functionBody->captures(ident)) 378 addVar(ident, (varStack[i].second & DeclarationStacks::IsConstant) ? IsConstant : IsVariable, NotWatchable); 379 } 380 } 374 381 375 382 if (m_symbolTable->captureCount()) … … 397 404 index = capturedArguments[i]->index(); 398 405 RegisterID original(nextParameterIndex); 399 emitMove(capturedArguments[i], &original);406 initializeCapturedVariable(capturedArguments[i], simpleParameter->boundProperty(), &original); 400 407 } 401 408 addParameter(simpleParameter->boundProperty(), index); … … 477 484 } 478 485 486 RegisterID* BytecodeGenerator::initializeCapturedVariable(RegisterID* dst, const Identifier& propertyName, RegisterID* value) 487 { 488 489 m_codeBlock->addPropertyAccessInstruction(instructions().size()); 490 emitOpcode(op_put_to_scope); 491 instructions().append(m_lexicalEnvironmentRegister->index()); 492 instructions().append(addConstant(propertyName)); 493 instructions().append(value->index()); 494 instructions().append(ResolveModeAndType(ThrowIfNotFound, LocalClosureVar).operand()); 495 instructions().append(0); 496 instructions().append(dst->index()); 497 return dst; 498 } 499 479 500 RegisterID* BytecodeGenerator::resolveCallee(FunctionBodyNode* functionBodyNode) 480 501 { … … 487 508 m_calleeRegister.setIndex(JSStack::Callee); 488 509 if (functionBodyNode->captures(functionBodyNode->ident())) 489 return emitMove(addVar(), IsCaptured, &m_calleeRegister);510 return initializeCapturedVariable(addVar(), functionBodyNode->ident(), &m_calleeRegister); 490 511 491 512 return &m_calleeRegister; … … 997 1018 } 998 1019 999 RegisterID* BytecodeGenerator::emitMove(RegisterID* dst, CaptureMode captureMode,RegisterID* src)1020 RegisterID* BytecodeGenerator::emitMove(RegisterID* dst, RegisterID* src) 1000 1021 { 1001 1022 m_staticPropertyAnalyzer.mov(dst->index(), src->index()); 1002 1003 emitOpcode( captureMode == IsCaptured ? op_captured_mov :op_mov);1023 ASSERT(dst->virtualRegister() == m_codeBlock->argumentsRegister() || !isCaptured(dst->index())); 1024 emitOpcode(op_mov); 1004 1025 instructions().append(dst->index()); 1005 1026 instructions().append(src->index()); 1006 if (captureMode == IsCaptured)1007 instructions().append(watchableVariable(dst->index()));1008 1027 1009 1028 if (!dst->isTemporary() && vm()->typeProfiler()) … … 1011 1030 1012 1031 return dst; 1013 }1014 1015 RegisterID* BytecodeGenerator::emitMove(RegisterID* dst, RegisterID* src)1016 {1017 return emitMove(dst, captureMode(dst->index()), src);1018 1032 } 1019 1033 … … 1198 1212 { 1199 1213 if (property == propertyNames().thisIdentifier) 1200 return Local(thisRegister(), ReadOnly, NotCaptured);1201 1202 if ( property == propertyNames().arguments)1214 return Local(thisRegister(), ReadOnly, Local::SpecialLocal); 1215 bool isArguments = property == propertyNames().arguments; 1216 if (isArguments) 1203 1217 createArgumentsIfNecessary(); 1204 1218 … … 1210 1224 return Local(); 1211 1225 1226 1212 1227 RegisterID* local = createLazyRegisterIfNecessary(®isterFor(entry.getIndex())); 1213 return Local(local, entry.getAttributes(), captureMode(local->index())); 1228 1229 if (isCaptured(local->index()) && m_lexicalEnvironmentRegister) 1230 return Local(); 1231 1232 return Local(local, entry.getAttributes(), isArguments ? Local::SpecialLocal : Local::NormalLocal); 1214 1233 } 1215 1234 … … 1224 1243 1225 1244 RegisterID* local = createLazyRegisterIfNecessary(®isterFor(entry.getIndex())); 1226 return Local(local, entry.getAttributes(), captureMode(local->index())); 1245 1246 bool isArguments = property == propertyNames().arguments; 1247 if (isCaptured(local->index()) && m_lexicalEnvironmentRegister) 1248 return Local(); 1249 1250 return Local(local, entry.getAttributes(), isArguments ? Local::SpecialLocal : Local::NormalLocal); 1227 1251 } 1228 1252 … … 1248 1272 } 1249 1273 1250 RegisterID* BytecodeGenerator::emitResolveScope(RegisterID* dst, const Identifier& identifier )1274 RegisterID* BytecodeGenerator::emitResolveScope(RegisterID* dst, const Identifier& identifier, ResolveScopeInfo& info) 1251 1275 { 1252 1276 m_codeBlock->addPropertyAccessInstruction(instructions().size()); 1277 1278 if (m_symbolTable && m_codeType == FunctionCode && !m_localScopeDepth) { 1279 SymbolTableEntry entry = m_symbolTable->get(identifier.impl()); 1280 if (!entry.isNull()) { 1281 emitOpcode(op_resolve_scope); 1282 instructions().append(kill(dst)); 1283 instructions().append(addConstant(identifier)); 1284 instructions().append(LocalClosureVar); 1285 instructions().append(0); 1286 instructions().append(0); 1287 info = ResolveScopeInfo(entry.getIndex()); 1288 return dst; 1289 } 1290 } 1253 1291 1254 1292 ASSERT(!m_symbolTable || !m_symbolTable->contains(identifier.impl()) || resolveType() == Dynamic); … … 1264 1302 } 1265 1303 1266 RegisterID* BytecodeGenerator::emitGetFromScope(RegisterID* dst, RegisterID* scope, const Identifier& identifier, ResolveMode resolveMode) 1304 RegisterID* BytecodeGenerator::emitResolveConstantLocal(RegisterID* dst, const Identifier& identifier, ResolveScopeInfo& info) 1305 { 1306 if (!m_symbolTable || m_codeType != FunctionCode) 1307 return nullptr; 1308 1309 SymbolTableEntry entry = m_symbolTable->get(identifier.impl()); 1310 if (entry.isNull()) 1311 return nullptr; 1312 info = ResolveScopeInfo(entry.getIndex()); 1313 return emitMove(dst, m_lexicalEnvironmentRegister); 1314 1315 } 1316 1317 RegisterID* BytecodeGenerator::emitGetFromScope(RegisterID* dst, RegisterID* scope, const Identifier& identifier, ResolveMode resolveMode, const ResolveScopeInfo& info) 1267 1318 { 1268 1319 m_codeBlock->addPropertyAccessInstruction(instructions().size()); … … 1273 1324 instructions().append(scope->index()); 1274 1325 instructions().append(addConstant(identifier)); 1275 instructions().append(ResolveModeAndType(resolveMode, resolveType()).operand());1326 instructions().append(ResolveModeAndType(resolveMode, info.isLocal() ? LocalClosureVar : resolveType()).operand()); 1276 1327 instructions().append(0); 1277 instructions().append( 0);1328 instructions().append(info.localIndex()); 1278 1329 instructions().append(profile); 1279 1330 return dst; 1280 1331 } 1281 1332 1282 RegisterID* BytecodeGenerator::emitPutToScope(RegisterID* scope, const Identifier& identifier, RegisterID* value, ResolveMode resolveMode )1333 RegisterID* BytecodeGenerator::emitPutToScope(RegisterID* scope, const Identifier& identifier, RegisterID* value, ResolveMode resolveMode, const ResolveScopeInfo& info) 1283 1334 { 1284 1335 m_codeBlock->addPropertyAccessInstruction(instructions().size()); … … 1289 1340 instructions().append(addConstant(identifier)); 1290 1341 instructions().append(value->index()); 1291 instructions().append(ResolveModeAndType(resolveMode, resolveType()).operand()); 1292 instructions().append(0); 1293 instructions().append(0); 1342 if (info.isLocal()) { 1343 instructions().append(ResolveModeAndType(resolveMode, LocalClosureVar).operand()); 1344 instructions().append(watchableVariable(registerFor(info.localIndex()).index())); 1345 } else { 1346 instructions().append(ResolveModeAndType(resolveMode, resolveType()).operand()); 1347 instructions().append(0); 1348 } 1349 instructions().append(info.localIndex()); 1294 1350 return value; 1295 1351 } … … 1660 1716 return; 1661 1717 1662 if (shouldTearOffArgumentsEagerly() )1718 if (shouldTearOffArgumentsEagerly() || shouldCreateArgumentsEagerly()) 1663 1719 return; 1664 1720 … … 1856 1912 RegisterID* BytecodeGenerator::emitReturn(RegisterID* src) 1857 1913 { 1858 if (m_lexicalEnvironmentRegister) {1859 emitOpcode(op_tear_off_lexical_environment);1860 instructions().append(m_lexicalEnvironmentRegister->index());1861 }1862 1863 1914 if (m_codeBlock->usesArguments() && m_codeBlock->numParameters() != 1 && !isStrictMode()) { 1864 1915 emitOpcode(op_tear_off_arguments); -
trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h
r173517 r174226 190 190 : m_local(0) 191 191 , m_attributes(0) 192 { 193 } 194 195 Local(RegisterID* local, unsigned attributes, CaptureMode captureMode) 192 , m_kind(NormalLocal) 193 { 194 } 195 196 enum LocalKind { NormalLocal, SpecialLocal }; 197 198 Local(RegisterID* local, unsigned attributes, LocalKind kind) 196 199 : m_local(local) 197 200 , m_attributes(attributes) 198 , m_isCaptured(captureMode == IsCaptured) 199 { 200 } 201 202 operator bool() { return m_local; } 203 204 RegisterID* get() { return m_local; } 205 206 bool isReadOnly() { return m_attributes & ReadOnly; } 207 208 bool isCaptured() { return m_isCaptured; } 209 CaptureMode captureMode() { return isCaptured() ? IsCaptured : NotCaptured; } 201 , m_kind(kind) 202 { 203 } 204 205 operator bool() const { return m_local; } 206 207 RegisterID* get() const { return m_local; } 208 209 bool isReadOnly() const { return m_attributes & ReadOnly; } 210 bool isSpecial() const { return m_kind != NormalLocal; } 210 211 211 212 private: 212 213 RegisterID* m_local; 213 214 unsigned m_attributes; 214 bool m_isCaptured; 215 LocalKind m_kind; 216 }; 217 218 struct ResolveScopeInfo { 219 ResolveScopeInfo() 220 : m_localIndex(0) 221 , m_resolveScopeKind(NonLocalScope) 222 { 223 } 224 225 ResolveScopeInfo(int index) 226 : m_localIndex(index) 227 , m_resolveScopeKind(LocalScope) 228 { 229 } 230 231 bool isLocal() const { return m_resolveScopeKind == LocalScope; } 232 int localIndex() const { return m_localIndex; } 233 234 private: 235 int m_localIndex; 236 enum { LocalScope, NonLocalScope } m_resolveScopeKind; 215 237 }; 216 238 … … 224 246 ProfileTypeBytecodePutToScope, 225 247 ProfileTypeBytecodeGetFromScope, 248 ProfileTypeBytecodePutToLocalScope, 249 ProfileTypeBytecodeGetFromLocalScope, 226 250 ProfileTypeBytecodeHasGlobalID, 227 251 ProfileTypeBytecodeDoesNotHaveGlobalID, … … 432 456 RegisterID* emitNewRegExp(RegisterID* dst, RegExp*); 433 457 434 RegisterID* emitMove(RegisterID* dst, CaptureMode, RegisterID* src);435 458 RegisterID* emitMove(RegisterID* dst, RegisterID* src); 436 459 … … 474 497 475 498 ResolveType resolveType(); 476 RegisterID* emitResolveScope(RegisterID* dst, const Identifier&); 477 RegisterID* emitGetFromScope(RegisterID* dst, RegisterID* scope, const Identifier&, ResolveMode); 478 RegisterID* emitPutToScope(RegisterID* scope, const Identifier&, RegisterID* value, ResolveMode); 499 RegisterID* emitResolveConstantLocal(RegisterID* dst, const Identifier&, ResolveScopeInfo&); 500 RegisterID* emitResolveScope(RegisterID* dst, const Identifier&, ResolveScopeInfo&); 501 RegisterID* emitGetFromScope(RegisterID* dst, RegisterID* scope, const Identifier&, ResolveMode, const ResolveScopeInfo&); 502 RegisterID* emitPutToScope(RegisterID* scope, const Identifier&, RegisterID* value, ResolveMode, const ResolveScopeInfo&); 479 503 480 504 PassRefPtr<Label> emitLabel(Label*); … … 634 658 RegisterID* emitConstructVarargs(RegisterID* dst, RegisterID* func, RegisterID* arguments, RegisterID* firstFreeRegister, int32_t firstVarArgOffset, RegisterID* profileHookRegister, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd); 635 659 RegisterID* emitCallVarargs(OpcodeID, RegisterID* dst, RegisterID* func, RegisterID* thisRegister, RegisterID* arguments, RegisterID* firstFreeRegister, int32_t firstVarArgOffset, RegisterID* profileHookRegister, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd); 636 660 RegisterID* initializeCapturedVariable(RegisterID* dst, const Identifier&, RegisterID*); 661 637 662 public: 638 663 JSString* addStringConstant(const Identifier&); … … 670 695 { 671 696 return m_codeType == FunctionCode && isStrictMode() && m_scopeNode->modifiesParameter(); 697 } 698 699 bool shouldCreateArgumentsEagerly() 700 { 701 if (m_codeType != FunctionCode) 702 return false; 703 return m_lexicalEnvironmentRegister && m_codeBlock->usesArguments(); 672 704 } 673 705 -
trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
r173125 r174226 169 169 JSTextPosition divot = m_start + m_ident.length(); 170 170 generator.emitExpressionInfo(divot, m_start, divot); 171 RefPtr<RegisterID> scope = generator.emitResolveScope(generator.tempDestination(dst), m_ident); 171 ResolveScopeInfo resolveScopeInfo; 172 RefPtr<RegisterID> scope = generator.emitResolveScope(generator.tempDestination(dst), m_ident, resolveScopeInfo); 172 173 RegisterID* finalDest = generator.finalDestination(dst); 173 RegisterID* result = generator.emitGetFromScope(finalDest, scope.get(), m_ident, ThrowIfNotFound );174 RegisterID* result = generator.emitGetFromScope(finalDest, scope.get(), m_ident, ThrowIfNotFound, resolveScopeInfo); 174 175 if (generator.vm()->typeProfiler()) { 175 generator.emitProfileType(finalDest, ProfileTypeBytecodeGetFromScope, &m_ident);176 generator.emitProfileType(finalDest, resolveScopeInfo.isLocal() ? ProfileTypeBytecodeGetFromLocalScope : ProfileTypeBytecodeGetFromScope, &m_ident); 176 177 generator.emitTypeProfilerExpressionInfo(m_position, JSTextPosition(-1, m_position.offset + m_ident.length(), -1)); 177 178 } … … 490 491 JSTextPosition newDivot = divotStart() + 4; 491 492 generator.emitExpressionInfo(newDivot, divotStart(), newDivot); 492 generator.emitResolveScope(callArguments.thisRegister(), generator.propertyNames().eval); 493 generator.emitGetFromScope(func.get(), callArguments.thisRegister(), generator.propertyNames().eval, ThrowIfNotFound); 493 ResolveScopeInfo resolveScopeInfo; 494 generator.emitResolveScope(callArguments.thisRegister(), generator.propertyNames().eval, resolveScopeInfo); 495 generator.emitGetFromScope(func.get(), callArguments.thisRegister(), generator.propertyNames().eval, ThrowIfNotFound, resolveScopeInfo); 494 496 return generator.emitCallEval(generator.finalDestination(dst, func.get()), func.get(), callArguments, divot(), divotStart(), divotEnd()); 495 497 } … … 538 540 JSTextPosition newDivot = divotStart() + m_ident.length(); 539 541 generator.emitExpressionInfo(newDivot, divotStart(), newDivot); 540 generator.emitResolveScope(callArguments.thisRegister(), m_ident); 541 generator.emitGetFromScope(func.get(), callArguments.thisRegister(), m_ident, ThrowIfNotFound); 542 ResolveScopeInfo resolveScopeInfo; 543 generator.emitResolveScope(callArguments.thisRegister(), m_ident, resolveScopeInfo); 544 generator.emitGetFromScope(func.get(), callArguments.thisRegister(), m_ident, ThrowIfNotFound, resolveScopeInfo); 542 545 RegisterID* ret = generator.emitCall(returnValue.get(), func.get(), expectedFunction, callArguments, divot(), divotStart(), divotEnd()); 543 546 if (generator.vm()->typeProfiler()) { … … 803 806 generator.emitReadOnlyExceptionIfNeeded(); 804 807 localReg = generator.emitMove(generator.tempDestination(dst), localReg); 805 } else if ( local.isCaptured() ||generator.vm()->typeProfiler()) {808 } else if (generator.vm()->typeProfiler()) { 806 809 RefPtr<RegisterID> tempDst = generator.finalDestination(dst); 807 810 ASSERT(dst != localReg); … … 819 822 820 823 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 821 RefPtr<RegisterID> scope = generator.emitResolveScope(generator.newTemporary(), ident); 822 RefPtr<RegisterID> value = generator.emitGetFromScope(generator.newTemporary(), scope.get(), ident, ThrowIfNotFound); 824 ResolveScopeInfo resolveScopeInfo; 825 RefPtr<RegisterID> scope = generator.emitResolveScope(generator.newTemporary(), ident, resolveScopeInfo); 826 RefPtr<RegisterID> value = generator.emitGetFromScope(generator.newTemporary(), scope.get(), ident, ThrowIfNotFound, resolveScopeInfo); 823 827 RefPtr<RegisterID> oldValue = emitPostIncOrDec(generator, generator.finalDestination(dst), value.get(), m_operator); 824 generator.emitPutToScope(scope.get(), ident, value.get(), ThrowIfNotFound );828 generator.emitPutToScope(scope.get(), ident, value.get(), ThrowIfNotFound, resolveScopeInfo); 825 829 if (generator.vm()->typeProfiler()) { 826 generator.emitProfileType(value.get(), ProfileTypeBytecodePutToScope, &ident);830 generator.emitProfileType(value.get(), resolveScopeInfo.isLocal() ? ProfileTypeBytecodePutToLocalScope : ProfileTypeBytecodePutToScope, &ident); 827 831 generator.emitTypeProfilerExpressionInfo(divotStart(), divotEnd()); 828 832 } … … 904 908 905 909 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 906 RefPtr<RegisterID> base = generator.emitResolveScope(generator.tempDestination(dst), m_ident); 910 ResolveScopeInfo resolveScopeInfo; 911 RefPtr<RegisterID> base = generator.emitResolveScope(generator.tempDestination(dst), m_ident, resolveScopeInfo); 907 912 return generator.emitDeleteById(generator.finalDestination(dst, base.get()), base.get(), m_ident); 908 913 } … … 961 966 } 962 967 963 RefPtr<RegisterID> scope = generator.emitResolveScope(generator.tempDestination(dst), m_ident); 964 RefPtr<RegisterID> value = generator.emitGetFromScope(generator.newTemporary(), scope.get(), m_ident, DoNotThrowIfNotFound); 968 ResolveScopeInfo resolveScopeInfo; 969 RefPtr<RegisterID> scope = generator.emitResolveScope(generator.tempDestination(dst), m_ident, resolveScopeInfo); 970 RefPtr<RegisterID> value = generator.emitGetFromScope(generator.newTemporary(), scope.get(), m_ident, DoNotThrowIfNotFound, resolveScopeInfo); 965 971 if (dst == generator.ignoredResult()) 966 972 return 0; … … 993 999 generator.emitReadOnlyExceptionIfNeeded(); 994 1000 localReg = generator.emitMove(generator.tempDestination(dst), localReg); 995 } else if ( local.isCaptured() ||generator.vm()->typeProfiler()) {1001 } else if (generator.vm()->typeProfiler()) { 996 1002 RefPtr<RegisterID> tempDst = generator.tempDestination(dst); 997 1003 generator.emitMove(tempDst.get(), localReg); … … 1007 1013 1008 1014 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 1009 RefPtr<RegisterID> scope = generator.emitResolveScope(generator.tempDestination(dst), ident); 1010 RefPtr<RegisterID> value = generator.emitGetFromScope(generator.newTemporary(), scope.get(), ident, ThrowIfNotFound); 1015 ResolveScopeInfo resolveScopeInfo; 1016 RefPtr<RegisterID> scope = generator.emitResolveScope(generator.tempDestination(dst), ident, resolveScopeInfo); 1017 RefPtr<RegisterID> value = generator.emitGetFromScope(generator.newTemporary(), scope.get(), ident, ThrowIfNotFound, resolveScopeInfo); 1011 1018 emitIncOrDec(generator, value.get(), m_operator); 1012 generator.emitPutToScope(scope.get(), ident, value.get(), ThrowIfNotFound );1019 generator.emitPutToScope(scope.get(), ident, value.get(), ThrowIfNotFound, resolveScopeInfo); 1013 1020 if (generator.vm()->typeProfiler()) { 1014 generator.emitProfileType(value.get(), ProfileTypeBytecodePutToScope, &ident);1021 generator.emitProfileType(value.get(), resolveScopeInfo.isLocal() ? ProfileTypeBytecodePutToLocalScope : ProfileTypeBytecodePutToScope, &ident); 1015 1022 generator.emitTypeProfilerExpressionInfo(divotStart(), divotEnd()); 1016 1023 } … … 1506 1513 } 1507 1514 1508 if (local.isCaptured() 1509 || generator.vm()->typeProfiler() 1515 if (generator.vm()->typeProfiler() 1510 1516 || generator.leftHandSideNeedsCopy(m_rightHasAssignments, m_right->isPure(generator))) { 1511 1517 RefPtr<RegisterID> result = generator.newTemporary(); … … 1525 1531 1526 1532 generator.emitExpressionInfo(newDivot, divotStart(), newDivot); 1527 RefPtr<RegisterID> scope = generator.emitResolveScope(generator.newTemporary(), m_ident); 1528 RefPtr<RegisterID> value = generator.emitGetFromScope(generator.newTemporary(), scope.get(), m_ident, ThrowIfNotFound); 1533 ResolveScopeInfo resolveScopeInfo; 1534 RefPtr<RegisterID> scope = generator.emitResolveScope(generator.newTemporary(), m_ident, resolveScopeInfo); 1535 RefPtr<RegisterID> value = generator.emitGetFromScope(generator.newTemporary(), scope.get(), m_ident, ThrowIfNotFound, resolveScopeInfo); 1529 1536 RefPtr<RegisterID> result = emitReadModifyAssignment(generator, generator.finalDestination(dst, value.get()), value.get(), m_right, m_operator, OperandTypes(ResultType::unknownType(), m_right->resultDescriptor()), this); 1530 RegisterID* returnResult = generator.emitPutToScope(scope.get(), m_ident, result.get(), ThrowIfNotFound );1537 RegisterID* returnResult = generator.emitPutToScope(scope.get(), m_ident, result.get(), ThrowIfNotFound, resolveScopeInfo); 1531 1538 if (generator.vm()->typeProfiler()) { 1532 generator.emitProfileType(result.get(), ProfileTypeBytecodePutToScope, &m_ident);1539 generator.emitProfileType(result.get(), resolveScopeInfo.isLocal() ? ProfileTypeBytecodePutToLocalScope : ProfileTypeBytecodePutToScope, &m_ident); 1533 1540 generator.emitTypeProfilerExpressionInfo(divotStart(), divotEnd()); 1534 1541 } … … 1545 1552 return generator.emitNode(dst, m_right); 1546 1553 } 1547 if (local.is Captured() || generator.vm()->typeProfiler()) {1554 if (local.isSpecial() || generator.vm()->typeProfiler()) { 1548 1555 RefPtr<RegisterID> tempDst = generator.tempDestination(dst); 1549 1556 generator.emitNode(tempDst.get(), m_right); … … 1561 1568 if (generator.isStrictMode()) 1562 1569 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 1563 RefPtr<RegisterID> scope = generator.emitResolveScope(generator.newTemporary(), m_ident); 1570 ResolveScopeInfo resolveScopeInfo; 1571 RefPtr<RegisterID> scope = generator.emitResolveScope(generator.newTemporary(), m_ident, resolveScopeInfo); 1564 1572 if (dst == generator.ignoredResult()) 1565 1573 dst = 0; 1566 1574 RefPtr<RegisterID> result = generator.emitNode(dst, m_right); 1567 1575 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 1568 RegisterID* returnResult = generator.emitPutToScope(scope.get(), m_ident, result.get(), generator.isStrictMode() ? ThrowIfNotFound : DoNotThrowIfNotFound );1576 RegisterID* returnResult = generator.emitPutToScope(scope.get(), m_ident, result.get(), generator.isStrictMode() ? ThrowIfNotFound : DoNotThrowIfNotFound, resolveScopeInfo); 1569 1577 if (generator.vm()->typeProfiler()) { 1570 generator.emitProfileType(result.get(), ProfileTypeBytecodePutToScope, &m_ident);1578 generator.emitProfileType(result.get(), resolveScopeInfo.isLocal() ? ProfileTypeBytecodePutToLocalScope : ProfileTypeBytecodePutToScope, &m_ident); 1571 1579 generator.emitTypeProfilerExpressionInfo(divotStart(), divotEnd()); 1572 1580 } … … 1677 1685 1678 1686 // FIXME: Maybe call emitExpressionInfo here. 1679 if (local.is Captured() || generator.vm()->typeProfiler()) {1687 if (local.isSpecial() || generator.vm()->typeProfiler()) { 1680 1688 RefPtr<RegisterID> tempDst = generator.newTemporary(); 1681 1689 generator.emitNode(tempDst.get(), m_init); … … 1691 1699 return generator.emitInitGlobalConst(m_ident, value.get()); 1692 1700 1693 if (generator.codeType() != EvalCode) 1701 if (generator.codeType() != EvalCode) { 1702 1703 ResolveScopeInfo resolveScopeInfo; 1704 if (RefPtr<RegisterID> scope = generator.emitResolveConstantLocal(generator.newTemporary(), m_ident, resolveScopeInfo)) 1705 return generator.emitPutToScope(scope.get(), m_ident, value.get(), DoNotThrowIfNotFound, resolveScopeInfo); 1706 1694 1707 return value.get(); 1708 } 1695 1709 1696 1710 // FIXME: This will result in incorrect assignment if m_ident exists in an intervening with scope. 1697 RefPtr<RegisterID> scope = generator.emitResolveScope(generator.newTemporary(), m_ident); 1698 return generator.emitPutToScope(scope.get(), m_ident, value.get(), DoNotThrowIfNotFound); 1711 ResolveScopeInfo resolveScopeInfo; 1712 RefPtr<RegisterID> scope = generator.emitResolveScope(generator.newTemporary(), m_ident, resolveScopeInfo); 1713 return generator.emitPutToScope(scope.get(), m_ident, value.get(), DoNotThrowIfNotFound, resolveScopeInfo); 1699 1714 } 1700 1715 … … 1793 1808 generator.emitProfileType(local.get(), ProfileTypeBytecodeHasGlobalID, nullptr); 1794 1809 else { 1795 RefPtr<RegisterID> scope = generator.emitResolveScope(generator.newTemporary(), m_ident); 1796 RefPtr<RegisterID> value = generator.emitGetFromScope(generator.newTemporary(), scope.get(), m_ident, DoNotThrowIfNotFound); 1797 generator.emitProfileType(value.get(), ProfileTypeBytecodeGetFromScope, &m_ident); 1810 ResolveScopeInfo resolveScopeInfo; 1811 RefPtr<RegisterID> scope = generator.emitResolveScope(generator.newTemporary(), m_ident, resolveScopeInfo); 1812 RefPtr<RegisterID> value = generator.emitGetFromScope(generator.newTemporary(), scope.get(), m_ident, DoNotThrowIfNotFound, resolveScopeInfo); 1813 generator.emitProfileType(value.get(), resolveScopeInfo.isLocal() ? ProfileTypeBytecodeGetFromLocalScope : ProfileTypeBytecodeGetFromScope, &m_ident); 1798 1814 } 1799 1815 … … 1956 1972 const Identifier& ident = static_cast<ResolveNode*>(m_lexpr)->identifier(); 1957 1973 Local local = generator.local(ident); 1958 if (local.isCaptured())1959 return nullptr;1960 1974 return local.get(); 1961 1975 } … … 1970 1984 const Identifier& ident = simpleBinding->boundProperty(); 1971 1985 Local local = generator.local(ident); 1972 if (local.is Captured())1986 if (local.isSpecial()) 1973 1987 return nullptr; 1974 1988 return local.get(); … … 1988 2002 if (generator.isStrictMode()) 1989 2003 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 1990 RegisterID* scope = generator.emitResolveScope(generator.newTemporary(), ident); 2004 ResolveScopeInfo resolveScopeInfo; 2005 RegisterID* scope = generator.emitResolveScope(generator.newTemporary(), ident, resolveScopeInfo); 1991 2006 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 1992 generator.emitPutToScope(scope, ident, propertyName, generator.isStrictMode() ? ThrowIfNotFound : DoNotThrowIfNotFound );2007 generator.emitPutToScope(scope, ident, propertyName, generator.isStrictMode() ? ThrowIfNotFound : DoNotThrowIfNotFound, resolveScopeInfo); 1993 2008 } 1994 2009 return; … … 2022 2037 const Identifier& ident = simpleBinding->boundProperty(); 2023 2038 Local local = generator.local(ident); 2024 if (!local.get() || local.is Captured()) {2039 if (!local.get() || local.isSpecial()) { 2025 2040 assignNode->bindings()->bindValue(generator, propertyName); 2026 2041 return; … … 2184 2199 if (generator.isStrictMode()) 2185 2200 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 2186 RegisterID* scope = generator.emitResolveScope(generator.newTemporary(), ident); 2201 ResolveScopeInfo resolveScopeInfo; 2202 RegisterID* scope = generator.emitResolveScope(generator.newTemporary(), ident, resolveScopeInfo); 2187 2203 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 2188 generator.emitPutToScope(scope, ident, value, generator.isStrictMode() ? ThrowIfNotFound : DoNotThrowIfNotFound );2204 generator.emitPutToScope(scope, ident, value, generator.isStrictMode() ? ThrowIfNotFound : DoNotThrowIfNotFound, resolveScopeInfo); 2189 2205 } 2190 2206 } else if (m_lexpr->isDotAccessorNode()) { … … 2823 2839 if (generator.isStrictMode()) 2824 2840 generator.emitExpressionInfo(divotEnd(), divotStart(), divotEnd()); 2825 RegisterID* scope = generator.emitResolveScope(generator.newTemporary(), m_boundProperty); 2841 ResolveScopeInfo resolveScopeInfo; 2842 RegisterID* scope = generator.emitResolveScope(generator.newTemporary(), m_boundProperty, resolveScopeInfo); 2826 2843 generator.emitExpressionInfo(divotEnd(), divotStart(), divotEnd()); 2827 generator.emitPutToScope(scope, m_boundProperty, value, generator.isStrictMode() ? ThrowIfNotFound : DoNotThrowIfNotFound );2844 generator.emitPutToScope(scope, m_boundProperty, value, generator.isStrictMode() ? ThrowIfNotFound : DoNotThrowIfNotFound, resolveScopeInfo); 2828 2845 if (generator.vm()->typeProfiler()) { 2829 generator.emitProfileType(value, ProfileTypeBytecodePutToScope, &m_boundProperty);2846 generator.emitProfileType(value, resolveScopeInfo.isLocal() ? ProfileTypeBytecodePutToLocalScope : ProfileTypeBytecodePutToScope, &m_boundProperty); 2830 2847 generator.emitTypeProfilerExpressionInfo(divotStart(), divotEnd()); 2831 2848 }
Note:
See TracChangeset
for help on using the changeset viewer.