Changeset 283389 in webkit
- Timestamp:
- Oct 1, 2021, 12:06:05 PM (5 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 13 edited
-
CMakeLists.txt (modified) (2 diffs)
-
ChangeLog (modified) (1 diff)
-
assembler/MacroAssemblerARMv7.h (modified) (2 diffs)
-
assembler/MacroAssemblerMIPS.h (modified) (1 diff)
-
bytecode/CallLinkInfo.h (modified) (3 diffs)
-
jit/JIT.h (modified) (2 diffs)
-
jit/JITCall32_64.cpp (modified) (1 diff)
-
jit/JITInlines.h (modified) (6 diffs)
-
jit/JITOpcodes.cpp (modified) (1 diff)
-
jit/JITPropertyAccess.cpp (modified) (2 diffs)
-
jit/JITPropertyAccess32_64.cpp (modified) (12 diffs)
-
llint/LowLevelInterpreter.asm (modified) (1 diff)
-
llint/LowLevelInterpreter32_64.asm (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/CMakeLists.txt
r283139 r283389 840 840 jit/AssemblyHelpersSpoolers.h 841 841 jit/BaselineJITCode.h 842 jit/CallFrameShuffleData.h 842 843 jit/CCallHelpers.h 843 844 jit/ExecutableAllocator.h … … 860 861 jit/RegisterAtOffset.h 861 862 jit/RegisterAtOffsetList.h 863 jit/RegisterMap.h 862 864 jit/RegisterSet.h 863 865 jit/Snippet.h -
trunk/Source/JavaScriptCore/ChangeLog
r283387 r283389 1 2021-10-01 Xan López <xan@igalia.com> 2 3 [JSC][32bit] Fix build after unlinked baseline JIT 4 https://bugs.webkit.org/show_bug.cgi?id=230803 5 6 Reviewed by Saam Barati. 7 8 This is enough to make things build, but pretty much nothing works 9 yet. Will fix in a follow-up, this way we at least give people a 10 chance at not introducing more build regressions. 11 12 (With some code by Mikhail R. Gadelha and Geza Lore) 13 14 * CMakeLists.txt: 15 * assembler/MacroAssemblerARMv7.h: 16 (JSC::MacroAssemblerARMv7::branch32): 17 (JSC::MacroAssemblerARMv7::branchAdd32): 18 * assembler/MacroAssemblerMIPS.h: 19 (JSC::MacroAssemblerMIPS::branchAdd32): 20 * bytecode/CallLinkInfo.h: 21 (JSC::CallLinkInfo::addressOfMaxArgumentCountIncludingThis): 22 * jit/JIT.h: 23 * jit/JITCall32_64.cpp: 24 (JSC::JIT::compileOpCall): 25 * jit/JITInlines.h: 26 (JSC::JIT::emitValueProfilingSite): 27 (JSC::JIT::emitValueProfilingSiteIfProfiledOpcode): 28 (JSC::JIT::emitArrayProfilingSiteWithCell): 29 * jit/JITOpcodes.cpp: 30 (JSC::JIT::emit_op_loop_hint): 31 * jit/JITPropertyAccess.cpp: 32 (JSC::JIT::emitVarInjectionCheck): 33 * jit/JITPropertyAccess32_64.cpp: 34 (JSC::JIT::emitHasPrivateSlow): 35 (JSC::JIT::emitSlow_op_has_private_name): 36 (JSC::JIT::emitSlow_op_has_private_brand): 37 (JSC::JIT::emitResolveClosure): 38 (JSC::JIT::emit_op_resolve_scope): 39 (JSC::JIT::emit_op_get_from_scope): 40 (JSC::JIT::emitPutGlobalVariableIndirect): 41 (JSC::JIT::emit_op_put_to_scope): 42 (JSC::JIT::emitSlow_op_put_to_scope): 43 (JSC::JIT::emitVarInjectionCheck): Deleted. 44 * llint/LowLevelInterpreter.asm: 45 * llint/LowLevelInterpreter32_64.asm: 46 1 47 2021-10-01 Yusuke Suzuki <ysuzuki@apple.com> 2 48 -
trunk/Source/JavaScriptCore/assembler/MacroAssemblerARMv7.h
r281355 r283389 1611 1611 Jump branch32(RelationalCondition cond, RegisterID left, RegisterID right) 1612 1612 { 1613 m_assembler.cmp(left, right); 1613 if (left == ARMRegisters::sp) { 1614 move(left, dataTempRegister); 1615 m_assembler.cmp(dataTempRegister, right); 1616 } else if (right == ARMRegisters::sp) { 1617 move(right, dataTempRegister); 1618 m_assembler.cmp(left, dataTempRegister); 1619 } else 1620 m_assembler.cmp(left, right); 1614 1621 return Jump(makeBranch(cond)); 1615 1622 } … … 1841 1848 Jump branchAdd32(ResultCondition cond, TrustedImm32 imm, AbsoluteAddress dest) 1842 1849 { 1843 // Move the high bits of the address into addressTempRegister, 1844 // and load the value into dataTempRegister. 1845 move(TrustedImmPtr(dest.m_ptr), addressTempRegister); 1846 m_assembler.ldr(dataTempRegister, addressTempRegister, ARMThumbImmediate::makeUInt16(0)); 1847 1848 // Do the add. 1849 ARMThumbImmediate armImm = ARMThumbImmediate::makeEncodedImm(imm.m_value); 1850 if (armImm.isValid()) 1851 m_assembler.add_S(dataTempRegister, dataTempRegister, armImm); 1852 else { 1853 // If the operand does not fit into an immediate then load it temporarily 1854 // into addressTempRegister; since we're overwriting addressTempRegister 1855 // we'll need to reload it with the high bits of the address afterwards. 1856 move(imm, addressTempRegister); 1857 m_assembler.add_S(dataTempRegister, dataTempRegister, addressTempRegister); 1858 move(TrustedImmPtr(dest.m_ptr), addressTempRegister); 1859 } 1860 1861 // Store the result. 1862 m_assembler.str(dataTempRegister, addressTempRegister, ARMThumbImmediate::makeUInt16(0)); 1863 1850 add32(imm, dest); 1851 return Jump(makeBranch(cond)); 1852 } 1853 1854 Jump branchAdd32(ResultCondition cond, TrustedImm32 imm, Address dest) 1855 { 1856 add32(imm, dest); 1864 1857 return Jump(makeBranch(cond)); 1865 1858 } -
trunk/Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h
r281618 r283389 2355 2355 } 2356 2356 2357 Jump branchAdd32(ResultCondition cond, TrustedImm32 imm, Address dest) 2358 { 2359 ASSERT((cond == Overflow) || (cond == Signed) || (cond == PositiveOrZero) || (cond == Zero) || (cond == NonZero)); 2360 if (cond == Overflow) { 2361 if (m_fixedWidth) { 2362 /* 2363 load dest, dataTemp 2364 move imm, immTemp 2365 xor cmpTemp, dataTemp, immTemp 2366 addu dataTemp, dataTemp, immTemp 2367 store dataTemp, dest 2368 bltz cmpTemp, No_overflow # diff sign bit -> no overflow 2369 xor cmpTemp, dataTemp, immTemp 2370 bgez cmpTemp, No_overflow # same sign big -> no overflow 2371 nop 2372 b Overflow 2373 nop 2374 b No_overflow 2375 nop 2376 nop 2377 nop 2378 No_overflow: 2379 */ 2380 load32(dest, dataTempRegister); 2381 move(imm, immTempRegister); 2382 m_assembler.xorInsn(cmpTempRegister, dataTempRegister, immTempRegister); 2383 m_assembler.addu(dataTempRegister, dataTempRegister, immTempRegister); 2384 store32(dataTempRegister, dest); 2385 m_assembler.bltz(cmpTempRegister, 9); 2386 m_assembler.xorInsn(cmpTempRegister, dataTempRegister, immTempRegister); 2387 m_assembler.bgez(cmpTempRegister, 7); 2388 m_assembler.nop(); 2389 } else { 2390 m_assembler.lw(dataTempRegister, dest.base, dest.offset); 2391 if (imm.m_value >= 0 && imm.m_value <= 32767) { 2392 move(dataTempRegister, cmpTempRegister); 2393 m_assembler.addiu(dataTempRegister, dataTempRegister, imm.m_value); 2394 m_assembler.bltz(cmpTempRegister, 9); 2395 m_assembler.sw(dataTempRegister, dest.base, dest.offset); 2396 m_assembler.bgez(dataTempRegister, 7); 2397 m_assembler.nop(); 2398 } else if (imm.m_value >= -32768 && imm.m_value < 0) { 2399 move(dataTempRegister, cmpTempRegister); 2400 m_assembler.addiu(dataTempRegister, dataTempRegister, imm.m_value); 2401 m_assembler.bgez(cmpTempRegister, 9); 2402 m_assembler.sw(dataTempRegister, dest.base, dest.offset); 2403 m_assembler.bltz(cmpTempRegister, 7); 2404 m_assembler.nop(); 2405 } else { 2406 move(imm, immTempRegister); 2407 m_assembler.xorInsn(cmpTempRegister, dataTempRegister, immTempRegister); 2408 m_assembler.addu(dataTempRegister, dataTempRegister, immTempRegister); 2409 m_assembler.bltz(cmpTempRegister, 10); 2410 m_assembler.sw(dataTempRegister, dest.base, dest.offset); 2411 m_assembler.xorInsn(cmpTempRegister, dataTempRegister, immTempRegister); 2412 m_assembler.bgez(cmpTempRegister, 7); 2413 m_assembler.nop(); 2414 } 2415 } 2416 return jump(); 2417 } 2418 if (m_fixedWidth) { 2419 move(imm, immTempRegister); 2420 load32(dest, dataTempRegister); 2421 add32(immTempRegister, dataTempRegister); 2422 store32(dataTempRegister, dest); 2423 } else { 2424 m_assembler.lw(dataTempRegister, dest.base, dest.offset); 2425 add32(imm, dataTempRegister); 2426 m_assembler.sw(dataTempRegister, dest.base, dest.offset); 2427 } 2428 if (cond == Signed) { 2429 // Check if dest is negative. 2430 m_assembler.slt(cmpTempRegister, dataTempRegister, MIPSRegisters::zero); 2431 return branchNotEqual(cmpTempRegister, MIPSRegisters::zero); 2432 } 2433 if (cond == PositiveOrZero) { 2434 // Check if dest is not negative. 2435 m_assembler.slt(cmpTempRegister, dataTempRegister, MIPSRegisters::zero); 2436 return branchEqual(cmpTempRegister, MIPSRegisters::zero); 2437 } 2438 if (cond == Zero) 2439 return branchEqual(dataTempRegister, MIPSRegisters::zero); 2440 if (cond == NonZero) 2441 return branchNotEqual(dataTempRegister, MIPSRegisters::zero); 2442 ASSERT(0); 2443 return Jump(); 2444 } 2445 2357 2446 Jump branchMul32(ResultCondition cond, RegisterID src1, RegisterID src2, RegisterID dest) 2358 2447 { -
trunk/Source/JavaScriptCore/bytecode/CallLinkInfo.h
r283139 r283389 26 26 #pragma once 27 27 28 #include "CallFrameShuffleData.h" 28 29 #include "CallMode.h" 29 30 #include "CodeLocation.h" … … 42 43 class JSFunction; 43 44 enum OpcodeID : unsigned; 44 struct CallFrameShuffleData;45 45 46 46 struct UnlinkedCallLinkInfo; … … 314 314 return OBJECT_OFFSETOF(CallLinkInfo, m_maxArgumentCountIncludingThis); 315 315 } 316 317 #if USE(JSVALUE32_64) 318 uint32_t* addressOfMaxArgumentCountIncludingThis() 319 { 320 return &m_maxArgumentCountIncludingThis; 321 } 322 #endif 316 323 317 324 uint32_t maxArgumentCountIncludingThis() -
trunk/Source/JavaScriptCore/jit/JIT.h
r283229 r283389 346 346 // This assumes that the value to profile is in regT0 and that regT3 is available for 347 347 // scratch. 348 #if USE(JSVALUE64)349 348 template<typename Bytecode> void emitValueProfilingSite(const Bytecode&, GPRReg); 350 349 template<typename Bytecode> void emitValueProfilingSite(const Bytecode&, JSValueRegs); 351 # else350 #if USE(JSVALUE32_64) 352 351 void emitValueProfilingSite(ValueProfile&, JSValueRegs); 353 template<typename Metadata> void emitValueProfilingSite(Metadata&, JSValueRegs); 352 template<typename Metadata> 353 std::enable_if_t<std::is_same<decltype(Metadata::m_profile), ValueProfile>::value, void> 354 emitValueProfilingSite(Metadata&, JSValueRegs); 354 355 #endif 355 356 … … 363 364 template <typename Bytecode> 364 365 void emitArrayProfilingSiteWithCell(const Bytecode&, ptrdiff_t, RegisterID cellGPR, RegisterID scratchGPR); 366 367 #if USE(JSVALUE32_64) 368 void emitArrayProfilingSiteWithCell(RegisterID, ArrayProfile* , RegisterID); 369 void emitArrayProfilingSiteWithCell(RegisterID, RegisterID , RegisterID); 370 #endif 365 371 366 372 template<typename Op> -
trunk/Source/JavaScriptCore/jit/JITCall32_64.cpp
r283139 r283389 311 311 checkStackPointerAlignment(); 312 312 if (opcodeID == op_tail_call || opcodeID == op_tail_call_varargs || opcodeID == op_tail_call_forward_arguments) { 313 auto slowPaths = info->emitTailCall FastPath(*this, regT0, regT2, CallLinkInfo::UseDataIC::Yes, [&] {313 auto slowPaths = info->emitTailCallDataICFastPath(*this, regT0, regT2, [&] { 314 314 emitRestoreCalleeSaves(); 315 315 prepareForTailCallSlow(regT2); -
trunk/Source/JavaScriptCore/jit/JITInlines.h
r283139 r283389 335 335 store32(value.tagGPR(), &descriptor->asBits.tag); 336 336 } 337 338 template<typename Metadata> 339 std::enable_if_t<std::is_same<decltype(Metadata::m_profile), ValueProfile>::value, void> JIT::emitValueProfilingSite(Metadata& metadata, JSValueRegs value) 340 { 341 emitValueProfilingSite(valueProfileFor(metadata, m_bytecodeIndex.checkpoint()), value); 342 } 337 343 #endif 338 344 … … 343 349 emitValueProfilingSite(bytecode, regT0); 344 350 #else 345 emitValueProfilingSite(bytecode .metadata(m_codeBlock), JSValueRegs(regT1, regT0));351 emitValueProfilingSite(bytecode, JSValueRegs(regT1, regT0)); 346 352 #endif 347 353 } … … 349 355 inline void JIT::emitValueProfilingSiteIfProfiledOpcode(...) { } 350 356 351 #if USE(JSVALUE64)352 357 template<typename Bytecode> 353 358 inline void JIT::emitValueProfilingSite(const Bytecode& bytecode, JSValueRegs value) … … 356 361 return; 357 362 363 #if USE(JSVALUE64) 358 364 ptrdiff_t offset = m_unlinkedCodeBlock->metadata().offsetInMetadataTable(bytecode) + valueProfileOffsetFor<Bytecode>(m_bytecodeIndex.checkpoint()) + ValueProfile::offsetOfFirstBucket(); 359 365 store64(value.gpr(), Address(s_metadataGPR, offset)); 366 #else 367 UNUSED_PARAM(value); 368 UNUSED_PARAM(bytecode); 369 // FIXME. 370 #endif 360 371 } 361 372 … … 365 376 emitValueProfilingSite(bytecode, JSValueRegs(resultReg)); 366 377 } 367 #endif368 378 369 379 template <typename Bytecode> … … 381 391 emitArrayProfilingSiteWithCell(bytecode, Bytecode::Metadata::offsetOfArrayProfile() + ArrayProfile::offsetOfLastSeenStructureID(), cellGPR, scratchGPR); 382 392 } 393 394 #if USE(JSVALUE32_64) 395 inline void JIT::emitArrayProfilingSiteWithCell(RegisterID cellGPR, ArrayProfile* arrayProfile, RegisterID scratchGPR) 396 { 397 if (shouldEmitProfiling()) { 398 load32(MacroAssembler::Address(cellGPR, JSCell::structureIDOffset()), scratchGPR); 399 store32(scratchGPR, arrayProfile->addressOfLastSeenStructureID()); 400 } 401 } 402 403 inline void JIT::emitArrayProfilingSiteWithCell(RegisterID cellGPR, RegisterID arrayProfileGPR, RegisterID scratchGPR) 404 { 405 if (shouldEmitProfiling()) { 406 load32(MacroAssembler::Address(cellGPR, JSCell::structureIDOffset()), scratchGPR); 407 store32(scratchGPR, Address(arrayProfileGPR, ArrayProfile::offsetOfLastSeenStructureID())); 408 } 409 } 410 #endif 383 411 384 412 ALWAYS_INLINE int32_t JIT::getOperandConstantInt(VirtualRegister src) -
trunk/Source/JavaScriptCore/jit/JITOpcodes.cpp
r283229 r283389 1467 1467 #if USE(JSVALUE64) 1468 1468 JSValueRegs resultRegs(GPRInfo::returnValueGPR); 1469 loadGlobalObject(resultRegs.gpr()); 1469 1470 #else 1470 1471 JSValueRegs resultRegs(GPRInfo::returnValueGPR2, GPRInfo::returnValueGPR); 1471 #endif 1472 loadGlobalObject(resultRegs.gpr()); 1472 loadGlobalObject(resultRegs.payloadGPR()); 1473 move(TrustedImm32(JSValue::CellTag), resultRegs.tagGPR()); 1474 #endif 1473 1475 checkStackPointerAlignment(); 1474 1476 emitRestoreCalleeSaves(); -
trunk/Source/JavaScriptCore/jit/JITPropertyAccess.cpp
r283229 r283389 1820 1820 auto bytecode = currentInstruction->as<OpHasPrivateBrand>(); 1821 1821 emitHasPrivateSlow(bytecode.m_dst, bytecode.m_base, bytecode.m_brand, AccessType::HasPrivateBrand); 1822 }1823 1824 void JIT::emitVarInjectionCheck(bool needsVarInjectionChecks, GPRReg scratchGPR)1825 {1826 if (!needsVarInjectionChecks)1827 return;1828 1829 loadGlobalObject(scratchGPR);1830 loadPtr(Address(scratchGPR, OBJECT_OFFSETOF(JSGlobalObject, m_varInjectionWatchpoint)), scratchGPR);1831 addSlowCase(branch8(Equal, Address(scratchGPR, WatchpointSet::offsetOfState()), TrustedImm32(IsInvalidated)));1832 1822 } 1833 1823 … … 3192 3182 } 3193 3183 3184 void JIT::emitVarInjectionCheck(bool needsVarInjectionChecks, GPRReg scratchGPR) 3185 { 3186 if (!needsVarInjectionChecks) 3187 return; 3188 3189 loadGlobalObject(scratchGPR); 3190 loadPtr(Address(scratchGPR, OBJECT_OFFSETOF(JSGlobalObject, m_varInjectionWatchpoint)), scratchGPR); 3191 addSlowCase(branch8(Equal, Address(scratchGPR, WatchpointSet::offsetOfState()), TrustedImm32(IsInvalidated))); 3192 } 3193 3194 3194 } // namespace JSC 3195 3195 -
trunk/Source/JavaScriptCore/jit/JITPropertyAccess32_64.cpp
r283139 r283389 847 847 } 848 848 849 void JIT::emitHasPrivateSlow(VirtualRegister dst, AccessType type) 850 { 849 void JIT::emitHasPrivateSlow(VirtualRegister dst, VirtualRegister base, VirtualRegister property, AccessType type) 850 { 851 // FIXME: 64-bit seems to also ignore base/property. 851 852 ASSERT(type == AccessType::HasPrivateName || type == AccessType::HasPrivateBrand); 853 UNUSED_PARAM(base); 854 UNUSED_PARAM(property); 852 855 853 856 JITInByValGenerator& gen = m_inByVals[m_inByValIndex++]; … … 870 873 871 874 auto bytecode = currentInstruction->as<OpHasPrivateName>(); 872 emitHasPrivateSlow(bytecode.m_dst, AccessType::HasPrivateName);875 emitHasPrivateSlow(bytecode.m_dst, bytecode.m_base, bytecode.m_property, AccessType::HasPrivateName); 873 876 } 874 877 … … 884 887 885 888 auto bytecode = currentInstruction->as<OpHasPrivateBrand>(); 886 emitHasPrivateSlow(bytecode.m_dst, AccessType::HasPrivateBrand); 887 } 888 889 void JIT::emitVarInjectionCheck(bool needsVarInjectionChecks) 890 { 891 if (!needsVarInjectionChecks) 892 return; 893 addSlowCase(branch8(Equal, AbsoluteAddress(m_profiledCodeBlock->globalObject()->varInjectionWatchpoint()->addressOfState()), TrustedImm32(IsInvalidated))); 889 emitHasPrivateSlow(bytecode.m_dst, bytecode.m_base, bytecode.m_brand, AccessType::HasPrivateBrand); 894 890 } 895 891 896 892 void JIT::emitResolveClosure(VirtualRegister dst, VirtualRegister scope, bool needsVarInjectionChecks, unsigned depth) 897 893 { 898 emitVarInjectionCheck(needsVarInjectionChecks );894 emitVarInjectionCheck(needsVarInjectionChecks, regT0); 899 895 move(TrustedImm32(JSValue::CellTag), regT1); 900 896 emitLoadPayload(scope, regT0); … … 919 915 JSScope* constantScope = JSScope::constantScopeForCodeBlock(resolveType, m_profiledCodeBlock); 920 916 RELEASE_ASSERT(constantScope); 921 emitVarInjectionCheck(needsVarInjectionChecks(resolveType) );917 emitVarInjectionCheck(needsVarInjectionChecks(resolveType), regT0); 922 918 load32(&metadata.m_globalLexicalBindingEpoch, regT1); 923 919 addSlowCase(branch32(NotEqual, AbsoluteAddress(m_profiledCodeBlock->globalObject()->addressOfGlobalLexicalBindingEpoch()), regT1)); … … 934 930 JSScope* constantScope = JSScope::constantScopeForCodeBlock(resolveType, m_profiledCodeBlock); 935 931 RELEASE_ASSERT(constantScope); 936 emitVarInjectionCheck(needsVarInjectionChecks(resolveType) );932 emitVarInjectionCheck(needsVarInjectionChecks(resolveType), regT0); 937 933 move(TrustedImm32(JSValue::CellTag), regT1); 938 934 move(TrustedImmPtr(constantScope), regT0); … … 1074 1070 case GlobalLexicalVar: 1075 1071 case GlobalLexicalVarWithVarInjectionChecks: 1076 emitVarInjectionCheck(needsVarInjectionChecks(resolveType) );1072 emitVarInjectionCheck(needsVarInjectionChecks(resolveType), regT0); 1077 1073 if (indirectLoadForOperand) 1078 1074 emitGetVarFromIndirectPointer(bitwise_cast<JSValue**>(operandSlot), regT1, regT0); … … 1084 1080 case ClosureVar: 1085 1081 case ClosureVarWithVarInjectionChecks: 1086 emitVarInjectionCheck(needsVarInjectionChecks(resolveType) );1082 emitVarInjectionCheck(needsVarInjectionChecks(resolveType), regT0); 1087 1083 emitGetClosureVar(scope, *operandSlot); 1088 1084 break; … … 1173 1169 emitLoad(value, regT1, regT0); 1174 1170 loadPtr(indirectWatchpointSet, regT2); 1175 emitNotifyWrite( regT2);1171 emitNotifyWrite(*indirectWatchpointSet); // FIXME: ?? 1176 1172 loadPtr(addressOfOperand, regT2); 1177 1173 store32(regT1, Address(regT2, TagOffset)); … … 1194 1190 VirtualRegister scope = bytecode.m_scope; 1195 1191 VirtualRegister value = bytecode.m_value; 1196 GetPutInfo getPutInfo = copiedGetPutInfo(bytecode);1192 GetPutInfo getPutInfo = bytecode.metadata(m_profiledCodeBlock).m_getPutInfo; 1197 1193 ResolveType resolveType = getPutInfo.resolveType(); 1198 1194 Structure** structureSlot = metadata.m_structure.slot(); … … 1221 1217 RELEASE_ASSERT(constantScope); 1222 1218 emitWriteBarrier(constantScope, value, ShouldFilterValue); 1223 emitVarInjectionCheck(needsVarInjectionChecks(resolveType) );1224 emitVarReadOnlyCheck(resolveType );1219 emitVarInjectionCheck(needsVarInjectionChecks(resolveType), regT0); 1220 emitVarReadOnlyCheck(resolveType, regT0); 1225 1221 if (!isInitialization(getPutInfo.initializationMode()) && (resolveType == GlobalLexicalVar || resolveType == GlobalLexicalVarWithVarInjectionChecks)) { 1226 1222 // We need to do a TDZ check here because we can't always prove we need to emit TDZ checks statically. … … 1241 1237 case ClosureVarWithVarInjectionChecks: 1242 1238 emitWriteBarrier(scope, value, ShouldFilterValue); 1243 emitVarInjectionCheck(needsVarInjectionChecks(resolveType) );1239 emitVarInjectionCheck(needsVarInjectionChecks(resolveType), regT0); 1244 1240 emitPutClosureVar(scope, *operandSlot, value, metadata.m_watchpointSet); 1245 1241 break; … … 1314 1310 1315 1311 auto bytecode = currentInstruction->as<OpPutToScope>(); 1316 ResolveType resolveType = copiedGetPutInfo(bytecode).resolveType();1312 ResolveType resolveType = bytecode.metadata(m_profiledCodeBlock).m_getPutInfo.resolveType(); 1317 1313 if (resolveType == ModuleVar) { 1318 1314 JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_throw_strict_mode_readonly_property_write_error); -
trunk/Source/JavaScriptCore/llint/LowLevelInterpreter.asm
r283288 r283389 2505 2505 end 2506 2506 else 2507 macro loadBaselineJITConstantPool() 2508 end 2509 2507 2510 macro setupReturnToBaselineAfterCheckpointExitIfNeeded() 2508 2511 end -
trunk/Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm
r283168 r283389 500 500 btpz r0, .recover 501 501 move r1, sp 502 503 loadBaselineJITConstantPool() 504 502 505 jmp r0 503 506 .recover:
Note:
See TracChangeset
for help on using the changeset viewer.