Changeset 181891 in webkit
- Timestamp:
- Mar 24, 2015, 3:05:21 AM (11 years ago)
- Location:
- trunk
- Files:
-
- 3 added
- 39 edited
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/http/tests/security/cross-frame-access-enumeration-expected.txt (modified) (1 diff)
-
LayoutTests/js/for-in-modify-in-loop-expected.txt (added)
-
LayoutTests/js/for-in-modify-in-loop.html (added)
-
LayoutTests/js/script-tests/for-in-modify-in-loop.js (added)
-
Source/JavaScriptCore/ChangeLog (modified) (1 diff)
-
Source/JavaScriptCore/bytecode/BytecodeList.json (modified) (1 diff)
-
Source/JavaScriptCore/bytecode/BytecodeUseDef.h (modified) (5 diffs)
-
Source/JavaScriptCore/bytecode/CodeBlock.cpp (modified) (1 diff)
-
Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp (modified) (1 diff)
-
Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h (modified) (1 diff)
-
Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp (modified) (8 diffs)
-
Source/JavaScriptCore/dfg/DFGAbstractInterpreterInlines.h (modified) (1 diff)
-
Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp (modified) (1 diff)
-
Source/JavaScriptCore/dfg/DFGCapabilities.cpp (modified) (1 diff)
-
Source/JavaScriptCore/dfg/DFGClobberize.h (modified) (2 diffs)
-
Source/JavaScriptCore/dfg/DFGDoesGC.cpp (modified) (1 diff)
-
Source/JavaScriptCore/dfg/DFGFixupPhase.cpp (modified) (2 diffs)
-
Source/JavaScriptCore/dfg/DFGNodeType.h (modified) (1 diff)
-
Source/JavaScriptCore/dfg/DFGPredictionPropagationPhase.cpp (modified) (1 diff)
-
Source/JavaScriptCore/dfg/DFGSafeToExecute.h (modified) (1 diff)
-
Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp (modified) (3 diffs)
-
Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp (modified) (3 diffs)
-
Source/JavaScriptCore/ftl/FTLAbstractHeapRepository.h (modified) (1 diff)
-
Source/JavaScriptCore/ftl/FTLCapabilities.cpp (modified) (1 diff)
-
Source/JavaScriptCore/ftl/FTLLowerDFGToLLVM.cpp (modified) (3 diffs)
-
Source/JavaScriptCore/jit/JIT.cpp (modified) (1 diff)
-
Source/JavaScriptCore/jit/JIT.h (modified) (1 diff)
-
Source/JavaScriptCore/jit/JITOpcodes.cpp (modified) (4 diffs)
-
Source/JavaScriptCore/jit/JITOpcodes32_64.cpp (modified) (3 diffs)
-
Source/JavaScriptCore/jit/JITOperations.cpp (modified) (2 diffs)
-
Source/JavaScriptCore/jit/JITOperations.h (modified) (1 diff)
-
Source/JavaScriptCore/llint/LowLevelInterpreter.asm (modified) (1 diff)
-
Source/JavaScriptCore/runtime/CommonSlowPaths.cpp (modified) (3 diffs)
-
Source/JavaScriptCore/runtime/CommonSlowPaths.h (modified) (1 diff)
-
Source/JavaScriptCore/runtime/JSPropertyNameEnumerator.cpp (modified) (4 diffs)
-
Source/JavaScriptCore/runtime/JSPropertyNameEnumerator.h (modified) (4 diffs)
-
Source/JavaScriptCore/runtime/Structure.cpp (modified) (2 diffs)
-
Source/JavaScriptCore/runtime/Structure.h (modified) (1 diff)
-
Source/JavaScriptCore/runtime/StructureRareData.cpp (modified) (1 diff)
-
Source/JavaScriptCore/runtime/StructureRareData.h (modified) (2 diffs)
-
Source/JavaScriptCore/tests/stress/for-in-delete-during-iteration.js (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r181889 r181891 1 2015-03-24 Michael Saboff <msaboff@apple.com> 2 3 REGRESSION (172175-172177): Change in for...in processing causes properties added in loop to be enumerated 4 https://bugs.webkit.org/show_bug.cgi?id=142856 5 6 Reviewed by Filip Pizlo. 7 8 New tests and rebased one test. 9 10 * js/for-in-modify-in-loop-expected.txt: Added. 11 * js/for-in-modify-in-loop.html: Added. 12 * js/script-tests/for-in-modify-in-loop.js: Added. 13 (haveSameProperties): 14 (each): 15 (testAdd): 16 (testAddDelete): 17 * http/tests/security/cross-frame-access-enumeration-expected.txt: Rebased. 18 1 19 2015-03-24 Saam Barati <saambarati1@gmail.com> 2 20 -
trunk/LayoutTests/http/tests/security/cross-frame-access-enumeration-expected.txt
r178527 r181891 8 8 CONSOLE MESSAGE: line 75: Blocked a frame with origin "http://127.0.0.1:8000" from accessing a frame with origin "http://localhost:8000". Protocols, domains, and ports must match. 9 9 CONSOLE MESSAGE: line 82: Blocked a frame with origin "http://127.0.0.1:8000" from accessing a frame with origin "http://localhost:8000". Protocols, domains, and ports must match. 10 CONSOLE MESSAGE: line 29: Blocked a frame with origin "http://127.0.0.1:8000" from accessing a frame with origin "http://localhost:8000". Protocols, domains, and ports must match. 10 11 CONSOLE MESSAGE: line 29: Blocked a frame with origin "http://127.0.0.1:8000" from accessing a frame with origin "http://localhost:8000". Protocols, domains, and ports must match. 11 12 CONSOLE MESSAGE: line 29: Blocked a frame with origin "http://127.0.0.1:8000" from accessing a frame with origin "http://localhost:8000". Protocols, domains, and ports must match. -
trunk/Source/JavaScriptCore/ChangeLog
r181890 r181891 1 2015-03-24 Michael Saboff <msaboff@apple.com> 2 3 REGRESSION (172175-172177): Change in for...in processing causes properties added in loop to be enumerated 4 https://bugs.webkit.org/show_bug.cgi?id=142856 5 6 Reviewed by Filip Pizlo. 7 8 Refactored the way the for .. in enumeration over objects is done. We used to make three C++ calls to 9 get info for three loops to iterate over indexed properties, structure properties and other properties, 10 respectively. We still have the three loops, but now we make one C++ call to get all the info needed 11 for all loops before we exectue any enumeration. 12 13 The JSPropertyEnumerator has a count of the indexed properties and a list of named properties. 14 The named properties are one list, with structured properties in the range [0,m_endStructurePropertyIndex) 15 and the generic properties in the range [m_endStructurePropertyIndex, m_endGenericPropertyIndex); 16 17 Eliminated the bytecodes op_get_structure_property_enumerator, op_get_generic_property_enumerator and 18 op_next_enumerator_pname. 19 Added the bytecodes op_get_property_enumerator, op_enumerator_structure_pname and op_enumerator_generic_pname. 20 The bytecodes op_enumerator_structure_pname and op_enumerator_generic_pname are similar except for what 21 end value we stop iterating on. 22 23 Made corresponding node changes to the DFG and FTL for the bytecode changes. 24 25 * bytecode/BytecodeList.json: 26 * bytecode/BytecodeUseDef.h: 27 (JSC::computeUsesForBytecodeOffset): 28 (JSC::computeDefsForBytecodeOffset): 29 * bytecode/CodeBlock.cpp: 30 (JSC::CodeBlock::dumpBytecode): 31 * bytecompiler/BytecodeGenerator.cpp: 32 (JSC::BytecodeGenerator::emitGetPropertyEnumerator): 33 (JSC::BytecodeGenerator::emitEnumeratorStructurePropertyName): 34 (JSC::BytecodeGenerator::emitEnumeratorGenericPropertyName): 35 (JSC::BytecodeGenerator::emitGetStructurePropertyEnumerator): Deleted. 36 (JSC::BytecodeGenerator::emitGetGenericPropertyEnumerator): Deleted. 37 (JSC::BytecodeGenerator::emitNextEnumeratorPropertyName): Deleted. 38 * bytecompiler/BytecodeGenerator.h: 39 * bytecompiler/NodesCodegen.cpp: 40 (JSC::ForInNode::emitMultiLoopBytecode): 41 * dfg/DFGAbstractInterpreterInlines.h: 42 (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): 43 * dfg/DFGByteCodeParser.cpp: 44 (JSC::DFG::ByteCodeParser::parseBlock): 45 * dfg/DFGCapabilities.cpp: 46 (JSC::DFG::capabilityLevel): 47 * dfg/DFGClobberize.h: 48 (JSC::DFG::clobberize): 49 * dfg/DFGDoesGC.cpp: 50 (JSC::DFG::doesGC): 51 * dfg/DFGFixupPhase.cpp: 52 (JSC::DFG::FixupPhase::fixupNode): 53 * dfg/DFGNodeType.h: 54 * dfg/DFGPredictionPropagationPhase.cpp: 55 (JSC::DFG::PredictionPropagationPhase::propagate): 56 * dfg/DFGSafeToExecute.h: 57 (JSC::DFG::safeToExecute): 58 * dfg/DFGSpeculativeJIT32_64.cpp: 59 (JSC::DFG::SpeculativeJIT::compile): 60 * dfg/DFGSpeculativeJIT64.cpp: 61 (JSC::DFG::SpeculativeJIT::compile): 62 * ftl/FTLAbstractHeapRepository.h: 63 * ftl/FTLCapabilities.cpp: 64 (JSC::FTL::canCompile): 65 * ftl/FTLLowerDFGToLLVM.cpp: 66 (JSC::FTL::LowerDFGToLLVM::compileNode): 67 (JSC::FTL::LowerDFGToLLVM::compileGetEnumerableLength): 68 (JSC::FTL::LowerDFGToLLVM::compileGetPropertyEnumerator): 69 (JSC::FTL::LowerDFGToLLVM::compileGetEnumeratorStructurePname): 70 (JSC::FTL::LowerDFGToLLVM::compileGetEnumeratorGenericPname): 71 (JSC::FTL::LowerDFGToLLVM::compileGetStructurePropertyEnumerator): Deleted. 72 (JSC::FTL::LowerDFGToLLVM::compileGetGenericPropertyEnumerator): Deleted. 73 (JSC::FTL::LowerDFGToLLVM::compileGetEnumeratorPname): Deleted. 74 * jit/JIT.cpp: 75 (JSC::JIT::privateCompileMainPass): 76 * jit/JIT.h: 77 * jit/JITOpcodes.cpp: 78 (JSC::JIT::emit_op_enumerator_structure_pname): 79 (JSC::JIT::emit_op_enumerator_generic_pname): 80 (JSC::JIT::emit_op_get_property_enumerator): 81 (JSC::JIT::emit_op_next_enumerator_pname): Deleted. 82 (JSC::JIT::emit_op_get_structure_property_enumerator): Deleted. 83 (JSC::JIT::emit_op_get_generic_property_enumerator): Deleted. 84 * jit/JITOpcodes32_64.cpp: 85 (JSC::JIT::emit_op_enumerator_structure_pname): 86 (JSC::JIT::emit_op_enumerator_generic_pname): 87 (JSC::JIT::emit_op_next_enumerator_pname): Deleted. 88 * jit/JITOperations.cpp: 89 * jit/JITOperations.h: 90 * llint/LowLevelInterpreter.asm: 91 * runtime/CommonSlowPaths.cpp: 92 (JSC::SLOW_PATH_DECL): 93 * runtime/CommonSlowPaths.h: 94 * runtime/JSPropertyNameEnumerator.cpp: 95 (JSC::JSPropertyNameEnumerator::create): 96 (JSC::JSPropertyNameEnumerator::finishCreation): 97 * runtime/JSPropertyNameEnumerator.h: 98 (JSC::JSPropertyNameEnumerator::indexedLength): 99 (JSC::JSPropertyNameEnumerator::endStructurePropertyIndex): 100 (JSC::JSPropertyNameEnumerator::endGenericPropertyIndex): 101 (JSC::JSPropertyNameEnumerator::indexedLengthOffset): 102 (JSC::JSPropertyNameEnumerator::endStructurePropertyIndexOffset): 103 (JSC::JSPropertyNameEnumerator::endGenericPropertyIndexOffset): 104 (JSC::JSPropertyNameEnumerator::cachedInlineCapacityOffset): 105 (JSC::propertyNameEnumerator): 106 (JSC::JSPropertyNameEnumerator::cachedPropertyNamesLengthOffset): Deleted. 107 (JSC::structurePropertyNameEnumerator): Deleted. 108 (JSC::genericPropertyNameEnumerator): Deleted. 109 * runtime/Structure.cpp: 110 (JSC::Structure::setCachedPropertyNameEnumerator): 111 (JSC::Structure::cachedPropertyNameEnumerator): 112 (JSC::Structure::canCachePropertyNameEnumerator): 113 (JSC::Structure::setCachedStructurePropertyNameEnumerator): Deleted. 114 (JSC::Structure::cachedStructurePropertyNameEnumerator): Deleted. 115 (JSC::Structure::setCachedGenericPropertyNameEnumerator): Deleted. 116 (JSC::Structure::cachedGenericPropertyNameEnumerator): Deleted. 117 (JSC::Structure::canCacheStructurePropertyNameEnumerator): Deleted. 118 (JSC::Structure::canCacheGenericPropertyNameEnumerator): Deleted. 119 * runtime/Structure.h: 120 * runtime/StructureRareData.cpp: 121 (JSC::StructureRareData::visitChildren): 122 (JSC::StructureRareData::cachedPropertyNameEnumerator): 123 (JSC::StructureRareData::setCachedPropertyNameEnumerator): 124 (JSC::StructureRareData::cachedStructurePropertyNameEnumerator): Deleted. 125 (JSC::StructureRareData::setCachedStructurePropertyNameEnumerator): Deleted. 126 (JSC::StructureRareData::cachedGenericPropertyNameEnumerator): Deleted. 127 (JSC::StructureRareData::setCachedGenericPropertyNameEnumerator): Deleted. 128 * runtime/StructureRareData.h: 129 * tests/stress/for-in-delete-during-iteration.js: 130 1 131 2015-03-24 Michael Saboff <msaboff@apple.com> 2 132 -
trunk/Source/JavaScriptCore/bytecode/BytecodeList.json
r181466 r181891 126 126 { "name" : "op_has_generic_property", "length" : 4 }, 127 127 { "name" : "op_get_direct_pname", "length" : 7 }, 128 { "name" : "op_get_ structure_property_enumerator", "length" : 4},129 { "name" : "op_ get_generic_property_enumerator", "length" : 5},130 { "name" : "op_ next_enumerator_pname", "length" : 4 },128 { "name" : "op_get_property_enumerator", "length" : 3 }, 129 { "name" : "op_enumerator_structure_pname", "length" : 4 }, 130 { "name" : "op_enumerator_generic_pname", "length" : 4 }, 131 131 { "name" : "op_to_index_string", "length" : 3 } 132 132 ] -
trunk/Source/JavaScriptCore/bytecode/BytecodeUseDef.h
r181467 r181891 114 114 } 115 115 case op_create_lexical_environment: 116 case op_get_property_enumerator: 116 117 case op_get_enumerable_length: 117 118 case op_new_func_exp: … … 150 151 } 151 152 case op_has_generic_property: 152 case op_get_structure_property_enumerator:153 153 case op_has_indexed_property: 154 case op_next_enumerator_pname: 154 case op_enumerator_structure_pname: 155 case op_enumerator_generic_pname: 155 156 case op_get_by_val: 156 157 case op_in: … … 183 184 case op_has_structure_property: 184 185 case op_get_argument_by_val: 185 case op_get_generic_property_enumerator:186 186 case op_construct_varargs: 187 187 case op_call_varargs: { … … 292 292 // These all have a single destination for the first argument. 293 293 case op_to_index_string: 294 case op_get_generic_property_enumerator:295 294 case op_get_enumerable_length: 296 295 case op_has_indexed_property: … … 298 297 case op_has_generic_property: 299 298 case op_get_direct_pname: 300 case op_get_structure_property_enumerator: 301 case op_next_enumerator_pname: 299 case op_get_property_enumerator: 300 case op_enumerator_structure_pname: 301 case op_enumerator_generic_pname: 302 302 case op_pop_scope: 303 303 case op_push_name_scope: -
trunk/Source/JavaScriptCore/bytecode/CodeBlock.cpp
r181673 r181891 1409 1409 1410 1410 } 1411 case op_get_ structure_property_enumerator: {1411 case op_get_property_enumerator: { 1412 1412 int dst = it[1].u.operand; 1413 1413 int base = it[2].u.operand; 1414 printLocationAndOp(out, exec, location, it, "op_get_ structure_property_enumerator");1414 printLocationAndOp(out, exec, location, it, "op_get_property_enumerator"); 1415 1415 out.printf("%s, %s", registerName(dst).data(), registerName(base).data()); 1416 it += OPCODE_LENGTH(op_get_structure_property_enumerator) - 1; 1417 break; 1418 } 1419 case op_get_generic_property_enumerator: { 1420 int dst = it[1].u.operand; 1421 int base = it[2].u.operand; 1422 int length = it[3].u.operand; 1423 int structureEnumerator = it[4].u.operand; 1424 printLocationAndOp(out, exec, location, it, "op_get_generic_property_enumerator"); 1425 out.printf("%s, %s, %s, %s", registerName(dst).data(), registerName(base).data(), registerName(length).data(), registerName(structureEnumerator).data()); 1426 it += OPCODE_LENGTH(op_get_generic_property_enumerator) - 1; 1427 break; 1428 } 1429 case op_next_enumerator_pname: { 1416 it += OPCODE_LENGTH(op_get_property_enumerator) - 1; 1417 break; 1418 } 1419 case op_enumerator_structure_pname: { 1430 1420 int dst = it[1].u.operand; 1431 1421 int enumerator = it[2].u.operand; 1432 1422 int index = it[3].u.operand; 1433 printLocationAndOp(out, exec, location, it, "op_ next_enumerator_pname");1423 printLocationAndOp(out, exec, location, it, "op_enumerator_structure_pname"); 1434 1424 out.printf("%s, %s, %s", registerName(dst).data(), registerName(enumerator).data(), registerName(index).data()); 1435 it += OPCODE_LENGTH(op_next_enumerator_pname) - 1; 1425 it += OPCODE_LENGTH(op_enumerator_structure_pname) - 1; 1426 break; 1427 } 1428 case op_enumerator_generic_pname: { 1429 int dst = it[1].u.operand; 1430 int enumerator = it[2].u.operand; 1431 int index = it[3].u.operand; 1432 printLocationAndOp(out, exec, location, it, "op_enumerator_generic_pname"); 1433 out.printf("%s, %s, %s", registerName(dst).data(), registerName(enumerator).data(), registerName(index).data()); 1434 it += OPCODE_LENGTH(op_enumerator_generic_pname) - 1; 1436 1435 break; 1437 1436 } -
trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp
r181611 r181891 2702 2702 } 2703 2703 2704 RegisterID* BytecodeGenerator::emitGet StructurePropertyEnumerator(RegisterID* dst, RegisterID* base, RegisterID* length)2705 { 2706 emitOpcode(op_get_ structure_property_enumerator);2704 RegisterID* BytecodeGenerator::emitGetPropertyEnumerator(RegisterID* dst, RegisterID* base) 2705 { 2706 emitOpcode(op_get_property_enumerator); 2707 2707 instructions().append(dst->index()); 2708 2708 instructions().append(base->index()); 2709 instructions().append(length->index()); 2710 return dst; 2711 } 2712 2713 RegisterID* BytecodeGenerator::emitGetGenericPropertyEnumerator(RegisterID* dst, RegisterID* base, RegisterID* length, RegisterID* structureEnumerator) 2714 { 2715 emitOpcode(op_get_generic_property_enumerator); 2716 instructions().append(dst->index()); 2717 instructions().append(base->index()); 2718 instructions().append(length->index()); 2719 instructions().append(structureEnumerator->index()); 2720 return dst; 2721 } 2722 2723 RegisterID* BytecodeGenerator::emitNextEnumeratorPropertyName(RegisterID* dst, RegisterID* enumerator, RegisterID* index) 2724 { 2725 emitOpcode(op_next_enumerator_pname); 2709 return dst; 2710 } 2711 2712 RegisterID* BytecodeGenerator::emitEnumeratorStructurePropertyName(RegisterID* dst, RegisterID* enumerator, RegisterID* index) 2713 { 2714 emitOpcode(op_enumerator_structure_pname); 2715 instructions().append(dst->index()); 2716 instructions().append(enumerator->index()); 2717 instructions().append(index->index()); 2718 return dst; 2719 } 2720 2721 RegisterID* BytecodeGenerator::emitEnumeratorGenericPropertyName(RegisterID* dst, RegisterID* enumerator, RegisterID* index) 2722 { 2723 emitOpcode(op_enumerator_generic_pname); 2726 2724 instructions().append(dst->index()); 2727 2725 instructions().append(enumerator->index()); -
trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h
r181611 r181891 532 532 RegisterID* emitHasStructureProperty(RegisterID* dst, RegisterID* base, RegisterID* propertyName, RegisterID* enumerator); 533 533 RegisterID* emitHasGenericProperty(RegisterID* dst, RegisterID* base, RegisterID* propertyName); 534 RegisterID* emitGetPropertyEnumerator(RegisterID* dst, RegisterID* base); 534 535 RegisterID* emitGetEnumerableLength(RegisterID* dst, RegisterID* base); 535 536 RegisterID* emitGetStructurePropertyEnumerator(RegisterID* dst, RegisterID* base, RegisterID* length); 536 537 RegisterID* emitGetGenericPropertyEnumerator(RegisterID* dst, RegisterID* base, RegisterID* length, RegisterID* structureEnumerator); 537 RegisterID* emitNextEnumeratorPropertyName(RegisterID* dst, RegisterID* enumerator, RegisterID* index); 538 RegisterID* emitEnumeratorStructurePropertyName(RegisterID* dst, RegisterID* enumerator, RegisterID* index); 539 RegisterID* emitEnumeratorGenericPropertyName(RegisterID* dst, RegisterID* enumerator, RegisterID* index); 538 540 RegisterID* emitToIndexString(RegisterID* dst, RegisterID* index); 539 541 -
trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
r181810 r181891 2184 2184 RefPtr<RegisterID> base = generator.newTemporary(); 2185 2185 RefPtr<RegisterID> length; 2186 RefPtr<RegisterID> structureEnumerator;2186 RefPtr<RegisterID> enumerator; 2187 2187 generator.emitNode(base.get(), m_expr); 2188 2188 RefPtr<RegisterID> local = this->tryGetBoundLocal(generator); 2189 RefPtr<RegisterID> enumeratorIndex; 2189 2190 2190 2191 int profilerStartOffset = m_statement->startOffset(); 2191 2192 int profilerEndOffset = m_statement->endOffset() + (m_statement->isBlock() ? 1 : 0); 2193 2194 enumerator = generator.emitGetPropertyEnumerator(generator.newTemporary(), base.get()); 2195 2192 2196 // Indexed property loop. 2193 2197 { … … 2196 2200 RefPtr<Label> loopEnd = generator.newLabel(); 2197 2201 2198 length = generator.emitGetEnumerableLength(generator.newTemporary(), base.get());2202 length = generator.emitGetEnumerableLength(generator.newTemporary(), enumerator.get()); 2199 2203 RefPtr<RegisterID> i = generator.emitLoad(generator.newTemporary(), jsNumber(0)); 2200 2204 RefPtr<RegisterID> propertyName = generator.newTemporary(); … … 2234 2238 RefPtr<Label> loopEnd = generator.newLabel(); 2235 2239 2236 structureEnumerator = generator.emitGetStructurePropertyEnumerator(generator.newTemporary(), base.get(), length.get()); 2237 RefPtr<RegisterID> i = generator.emitLoad(generator.newTemporary(), jsNumber(0)); 2240 enumeratorIndex = generator.emitLoad(generator.newTemporary(), jsNumber(0)); 2238 2241 RefPtr<RegisterID> propertyName = generator.newTemporary(); 2239 generator.emit NextEnumeratorPropertyName(propertyName.get(), structureEnumerator.get(), i.get());2242 generator.emitEnumeratorStructurePropertyName(propertyName.get(), enumerator.get(), enumeratorIndex.get()); 2240 2243 2241 2244 generator.emitLabel(loopStart.get()); … … 2244 2247 RefPtr<RegisterID> result = generator.emitUnaryOp(op_eq_null, generator.newTemporary(), propertyName.get()); 2245 2248 generator.emitJumpIfTrue(result.get(), loopEnd.get()); 2246 generator.emitHasStructureProperty(result.get(), base.get(), propertyName.get(), structureEnumerator.get());2249 generator.emitHasStructureProperty(result.get(), base.get(), propertyName.get(), enumerator.get()); 2247 2250 generator.emitJumpIfFalse(result.get(), scope->continueTarget()); 2248 2251 … … 2251 2254 generator.emitProfileControlFlow(profilerStartOffset); 2252 2255 2253 generator.pushStructureForInScope(local.get(), i.get(), propertyName.get(), structureEnumerator.get());2256 generator.pushStructureForInScope(local.get(), enumeratorIndex.get(), propertyName.get(), enumerator.get()); 2254 2257 generator.emitNode(dst, m_statement); 2255 2258 generator.popStructureForInScope(local.get()); … … 2258 2261 2259 2262 generator.emitLabel(scope->continueTarget()); 2260 generator.emitInc( i.get());2261 generator.emit NextEnumeratorPropertyName(propertyName.get(), structureEnumerator.get(), i.get());2263 generator.emitInc(enumeratorIndex.get()); 2264 generator.emitEnumeratorStructurePropertyName(propertyName.get(), enumerator.get(), enumeratorIndex.get()); 2262 2265 generator.emitJump(loopStart.get()); 2263 2266 … … 2273 2276 RefPtr<Label> loopEnd = generator.newLabel(); 2274 2277 2275 RefPtr<RegisterID> genericEnumerator = generator.emitGetGenericPropertyEnumerator(generator.newTemporary(), base.get(), length.get(), structureEnumerator.get());2276 RefPtr<RegisterID> i = generator.emitLoad(generator.newTemporary(), jsNumber(0));2277 2278 RefPtr<RegisterID> propertyName = generator.newTemporary(); 2278 2279 2279 generator.emitNextEnumeratorPropertyName(propertyName.get(), genericEnumerator.get(), i.get()); 2280 generator.emitEnumeratorGenericPropertyName(propertyName.get(), enumerator.get(), enumeratorIndex.get()); 2281 2282 generator.emitLabel(loopStart.get()); 2283 generator.emitLoopHint(); 2284 2280 2285 RefPtr<RegisterID> result = generator.emitUnaryOp(op_eq_null, generator.newTemporary(), propertyName.get()); 2281 2286 generator.emitJumpIfTrue(result.get(), loopEnd.get()); 2282 2287 2283 generator.emit Label(loopStart.get());2284 generator.emit LoopHint();2288 generator.emitHasGenericProperty(result.get(), base.get(), propertyName.get()); 2289 generator.emitJumpIfFalse(result.get(), scope->continueTarget()); 2285 2290 2286 2291 this->emitLoopHeader(generator, propertyName.get()); … … 2291 2296 2292 2297 generator.emitLabel(scope->continueTarget()); 2293 generator.emitInc(i.get()); 2294 generator.emitNextEnumeratorPropertyName(propertyName.get(), genericEnumerator.get(), i.get()); 2295 generator.emitUnaryOp(op_eq_null, result.get(), propertyName.get()); 2296 generator.emitJumpIfTrue(result.get(), loopEnd.get()); 2297 2298 generator.emitHasGenericProperty(result.get(), base.get(), propertyName.get()); 2299 generator.emitJumpIfTrue(result.get(), loopStart.get()); 2300 generator.emitJump(scope->continueTarget()); 2301 2298 generator.emitInc(enumeratorIndex.get()); 2299 generator.emitEnumeratorGenericPropertyName(propertyName.get(), enumerator.get(), enumeratorIndex.get()); 2300 generator.emitJump(loopStart.get()); 2301 2302 2302 generator.emitLabel(scope->breakTarget()); 2303 2303 generator.emitJump(end.get()); -
trunk/Source/JavaScriptCore/dfg/DFGAbstractInterpreterInlines.h
r181650 r181891 1967 1967 break; 1968 1968 } 1969 case Get StructurePropertyEnumerator: {1969 case GetPropertyEnumerator: { 1970 1970 forNode(node).setType(SpecCell); 1971 1971 break; 1972 1972 } 1973 case Get GenericPropertyEnumerator: {1974 forNode(node).setType(Spec Cell);1975 break; 1976 } 1977 case GetEnumerator Pname: {1973 case GetEnumeratorStructurePname: { 1974 forNode(node).setType(SpecString | SpecOther); 1975 break; 1976 } 1977 case GetEnumeratorGenericPname: { 1978 1978 forNode(node).setType(SpecString | SpecOther); 1979 1979 break; -
trunk/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp
r181817 r181891 3771 3771 } 3772 3772 3773 case op_get_structure_property_enumerator: { 3774 set(VirtualRegister(currentInstruction[1].u.operand), addToGraph(GetStructurePropertyEnumerator, 3773 case op_get_property_enumerator: { 3774 set(VirtualRegister(currentInstruction[1].u.operand), addToGraph(GetPropertyEnumerator, 3775 get(VirtualRegister(currentInstruction[2].u.operand)))); 3776 NEXT_OPCODE(op_get_property_enumerator); 3777 } 3778 3779 case op_enumerator_structure_pname: { 3780 set(VirtualRegister(currentInstruction[1].u.operand), addToGraph(GetEnumeratorStructurePname, 3775 3781 get(VirtualRegister(currentInstruction[2].u.operand)), 3776 3782 get(VirtualRegister(currentInstruction[3].u.operand)))); 3777 NEXT_OPCODE(op_get_structure_property_enumerator); 3778 } 3779 3780 case op_get_generic_property_enumerator: { 3781 set(VirtualRegister(currentInstruction[1].u.operand), addToGraph(GetGenericPropertyEnumerator, 3782 get(VirtualRegister(currentInstruction[2].u.operand)), 3783 get(VirtualRegister(currentInstruction[3].u.operand)), 3784 get(VirtualRegister(currentInstruction[4].u.operand)))); 3785 NEXT_OPCODE(op_get_generic_property_enumerator); 3786 } 3787 3788 case op_next_enumerator_pname: { 3789 set(VirtualRegister(currentInstruction[1].u.operand), addToGraph(GetEnumeratorPname, 3783 NEXT_OPCODE(op_enumerator_structure_pname); 3784 } 3785 3786 case op_enumerator_generic_pname: { 3787 set(VirtualRegister(currentInstruction[1].u.operand), addToGraph(GetEnumeratorGenericPname, 3790 3788 get(VirtualRegister(currentInstruction[2].u.operand)), 3791 3789 get(VirtualRegister(currentInstruction[3].u.operand)))); 3792 NEXT_OPCODE(op_ next_enumerator_pname);3793 } 3794 3790 NEXT_OPCODE(op_enumerator_generic_pname); 3791 } 3792 3795 3793 case op_to_index_string: { 3796 3794 set(VirtualRegister(currentInstruction[1].u.operand), addToGraph(ToIndexString, -
trunk/Source/JavaScriptCore/dfg/DFGCapabilities.cpp
r181466 r181891 203 203 case op_has_indexed_property: 204 204 case op_get_direct_pname: 205 case op_get_ structure_property_enumerator:206 case op_ get_generic_property_enumerator:207 case op_ next_enumerator_pname:205 case op_get_property_enumerator: 206 case op_enumerator_structure_pname: 207 case op_enumerator_generic_pname: 208 208 case op_to_index_string: 209 209 case op_new_func: -
trunk/Source/JavaScriptCore/dfg/DFGClobberize.h
r181650 r181891 163 163 case HasStructureProperty: 164 164 case GetEnumerableLength: 165 case GetStructurePropertyEnumerator: 166 case GetGenericPropertyEnumerator: { 165 case GetPropertyEnumerator: { 167 166 read(Heap); 168 167 write(SideState); … … 179 178 180 179 case ToIndexString: 181 case GetEnumeratorPname: { 180 case GetEnumeratorStructurePname: 181 case GetEnumeratorGenericPname: { 182 182 def(PureValue(node)); 183 183 return; -
trunk/Source/JavaScriptCore/dfg/DFGDoesGC.cpp
r181650 r181891 232 232 case NewTypedArray: 233 233 case ThrowReferenceError: 234 case Get StructurePropertyEnumerator:235 case Get GenericPropertyEnumerator:236 case GetEnumerator Pname:234 case GetPropertyEnumerator: 235 case GetEnumeratorStructurePname: 236 case GetEnumeratorGenericPname: 237 237 case ToIndexString: 238 238 case MaterializeNewObject: -
trunk/Source/JavaScriptCore/dfg/DFGFixupPhase.cpp
r181817 r181891 1092 1092 } 1093 1093 case HasGenericProperty: { 1094 fixEdge< StringUse>(node->child2());1094 fixEdge<CellUse>(node->child2()); 1095 1095 break; 1096 1096 } … … 1124 1124 break; 1125 1125 } 1126 case Get StructurePropertyEnumerator: {1126 case GetPropertyEnumerator: { 1127 1127 fixEdge<CellUse>(node->child1()); 1128 break; 1129 } 1130 case GetEnumeratorStructurePname: { 1131 fixEdge<KnownCellUse>(node->child1()); 1128 1132 fixEdge<KnownInt32Use>(node->child2()); 1129 1133 break; 1130 1134 } 1131 case GetGenericPropertyEnumerator: { 1132 fixEdge<CellUse>(node->child1()); 1133 fixEdge<KnownInt32Use>(node->child2()); 1134 fixEdge<KnownCellUse>(node->child3()); 1135 break; 1136 } 1137 case GetEnumeratorPname: { 1135 case GetEnumeratorGenericPname: { 1138 1136 fixEdge<KnownCellUse>(node->child1()); 1139 1137 fixEdge<KnownInt32Use>(node->child2()); -
trunk/Source/JavaScriptCore/dfg/DFGNodeType.h
r181650 r181891 323 323 macro(HasGenericProperty, NodeResultBoolean) \ 324 324 macro(GetDirectPname, NodeMustGenerate | NodeHasVarArgs | NodeResultJS) \ 325 macro(Get StructurePropertyEnumerator, NodeMustGenerate | NodeResultJS) \326 macro(Get GenericPropertyEnumerator, NodeMustGenerate | NodeResultJS) \327 macro(GetEnumerator Pname, NodeMustGenerate | NodeResultJS) \325 macro(GetPropertyEnumerator, NodeMustGenerate | NodeResultJS) \ 326 macro(GetEnumeratorStructurePname, NodeMustGenerate | NodeResultJS) \ 327 macro(GetEnumeratorGenericPname, NodeMustGenerate | NodeResultJS) \ 328 328 macro(ToIndexString, NodeResultJS) 329 329 -
trunk/Source/JavaScriptCore/dfg/DFGPredictionPropagationPhase.cpp
r181650 r181891 584 584 break; 585 585 } 586 case GetStructurePropertyEnumerator: 587 case GetGenericPropertyEnumerator: { 586 case GetPropertyEnumerator: { 588 587 changed |= setPrediction(SpecCell); 589 588 break; 590 589 } 591 case GetEnumeratorPname: { 590 case GetEnumeratorStructurePname: { 591 changed |= setPrediction(SpecCell | SpecOther); 592 break; 593 } 594 case GetEnumeratorGenericPname: { 592 595 changed |= setPrediction(SpecCell | SpecOther); 593 596 break; -
trunk/Source/JavaScriptCore/dfg/DFGSafeToExecute.h
r181650 r181891 273 273 case HasIndexedProperty: 274 274 case GetDirectPname: 275 case Get StructurePropertyEnumerator:276 case Get GenericPropertyEnumerator:277 case GetEnumerator Pname:275 case GetPropertyEnumerator: 276 case GetEnumeratorStructurePname: 277 case GetEnumeratorGenericPname: 278 278 case ToIndexString: 279 279 case PhantomNewObject: -
trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp
r181650 r181891 4716 4716 4717 4717 case GetEnumerableLength: { 4718 SpeculateCellOperand base(this, node->child1());4718 SpeculateCellOperand enumerator(this, node->child1()); 4719 4719 GPRFlushedCallResult result(this); 4720 4720 GPRReg resultGPR = result.gpr(); 4721 4721 4722 flushRegisters(); 4723 callOperation(operationGetEnumerableLength, resultGPR, base.gpr()); 4722 m_jit.load32(MacroAssembler::Address(enumerator.gpr(), JSPropertyNameEnumerator::indexedLengthOffset()), resultGPR); 4724 4723 int32Result(resultGPR, node); 4725 4724 break; … … 4913 4912 break; 4914 4913 } 4915 case Get StructurePropertyEnumerator: {4914 case GetPropertyEnumerator: { 4916 4915 SpeculateCellOperand base(this, node->child1()); 4917 SpeculateInt32Operand length(this, node->child2());4918 4916 GPRFlushedCallResult result(this); 4919 4917 GPRReg resultGPR = result.gpr(); 4920 4918 4921 4919 flushRegisters(); 4922 callOperation(operationGet StructurePropertyEnumerator, resultGPR, base.gpr(), length.gpr());4920 callOperation(operationGetPropertyEnumerator, resultGPR, base.gpr()); 4923 4921 cellResult(resultGPR, node); 4924 4922 break; 4925 4923 } 4926 case GetGenericPropertyEnumerator: { 4927 SpeculateCellOperand base(this, node->child1()); 4928 SpeculateInt32Operand length(this, node->child2()); 4929 SpeculateCellOperand enumerator(this, node->child3()); 4930 GPRFlushedCallResult result(this); 4931 GPRReg resultGPR = result.gpr(); 4932 4933 flushRegisters(); 4934 callOperation(operationGetGenericPropertyEnumerator, resultGPR, base.gpr(), length.gpr(), enumerator.gpr()); 4935 cellResult(resultGPR, node); 4936 break; 4937 } 4938 case GetEnumeratorPname: { 4924 case GetEnumeratorStructurePname: 4925 case GetEnumeratorGenericPname: { 4939 4926 SpeculateCellOperand enumerator(this, node->child1()); 4940 4927 SpeculateInt32Operand index(this, node->child2()); … … 4949 4936 GPRReg resultPayloadGPR = resultPayload.gpr(); 4950 4937 4951 MacroAssembler::Jump inBounds = m_jit.branch32(MacroAssembler::Below, 4952 indexGPR, MacroAssembler::Address(enumeratorGPR, JSPropertyNameEnumerator::cachedPropertyNamesLengthOffset())); 4938 MacroAssembler::Jump inBounds = m_jit.branch32(MacroAssembler::Below, indexGPR, 4939 MacroAssembler::Address(enumeratorGPR, (op == GetEnumeratorStructurePname) 4940 ? JSPropertyNameEnumerator::endStructurePropertyIndexOffset() 4941 : JSPropertyNameEnumerator::endGenericPropertyIndexOffset())); 4953 4942 4954 4943 m_jit.move(MacroAssembler::TrustedImm32(JSValue::NullTag), resultTagGPR); -
trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp
r181650 r181891 4773 4773 4774 4774 case GetEnumerableLength: { 4775 SpeculateCellOperand base(this, node->child1());4775 SpeculateCellOperand enumerator(this, node->child1()); 4776 4776 GPRFlushedCallResult result(this); 4777 4777 GPRReg resultGPR = result.gpr(); 4778 4778 4779 flushRegisters(); 4780 callOperation(operationGetEnumerableLength, resultGPR, base.gpr()); 4779 m_jit.load32(MacroAssembler::Address(enumerator.gpr(), JSPropertyNameEnumerator::indexedLengthOffset()), resultGPR); 4781 4780 int32Result(resultGPR, node); 4782 4781 break; … … 4949 4948 break; 4950 4949 } 4951 case Get StructurePropertyEnumerator: {4950 case GetPropertyEnumerator: { 4952 4951 SpeculateCellOperand base(this, node->child1()); 4953 SpeculateInt32Operand length(this, node->child2());4954 4952 GPRFlushedCallResult result(this); 4955 4953 GPRReg resultGPR = result.gpr(); 4956 4954 4957 4955 flushRegisters(); 4958 callOperation(operationGet StructurePropertyEnumerator, resultGPR, base.gpr(), length.gpr());4956 callOperation(operationGetPropertyEnumerator, resultGPR, base.gpr()); 4959 4957 cellResult(resultGPR, node); 4960 4958 break; 4961 4959 } 4962 case GetGenericPropertyEnumerator: { 4963 SpeculateCellOperand base(this, node->child1()); 4964 SpeculateInt32Operand length(this, node->child2()); 4965 SpeculateCellOperand enumerator(this, node->child3()); 4966 GPRFlushedCallResult result(this); 4967 GPRReg resultGPR = result.gpr(); 4968 4969 flushRegisters(); 4970 callOperation(operationGetGenericPropertyEnumerator, resultGPR, base.gpr(), length.gpr(), enumerator.gpr()); 4971 cellResult(resultGPR, node); 4972 break; 4973 } 4974 case GetEnumeratorPname: { 4960 case GetEnumeratorStructurePname: 4961 case GetEnumeratorGenericPname: { 4975 4962 SpeculateCellOperand enumerator(this, node->child1()); 4976 4963 SpeculateStrictInt32Operand index(this, node->child2()); … … 4983 4970 GPRReg resultGPR = result.gpr(); 4984 4971 4985 MacroAssembler::Jump inBounds = m_jit.branch32(MacroAssembler::Below, 4986 indexGPR, MacroAssembler::Address(enumeratorGPR, JSPropertyNameEnumerator::cachedPropertyNamesLengthOffset())); 4972 MacroAssembler::Jump inBounds = m_jit.branch32(MacroAssembler::Below, indexGPR, 4973 MacroAssembler::Address(enumeratorGPR, (op == GetEnumeratorStructurePname) 4974 ? JSPropertyNameEnumerator::endStructurePropertyIndexOffset() 4975 : JSPropertyNameEnumerator::endGenericPropertyIndexOffset())); 4987 4976 4988 4977 m_jit.move(MacroAssembler::TrustedImm64(JSValue::encode(jsNull())), resultGPR); -
trunk/Source/JavaScriptCore/ftl/FTLAbstractHeapRepository.h
r173837 r181891 62 62 macro(JSObject_butterfly, JSObject::butterflyOffset()) \ 63 63 macro(JSPropertyNameEnumerator_cachedInlineCapacity, JSPropertyNameEnumerator::cachedInlineCapacityOffset()) \ 64 macro(JSPropertyNameEnumerator_cachedPropertyNamesLength, JSPropertyNameEnumerator::cachedPropertyNamesLengthOffset()) \65 64 macro(JSPropertyNameEnumerator_cachedPropertyNamesVector, JSPropertyNameEnumerator::cachedPropertyNamesVectorOffset()) \ 66 65 macro(JSPropertyNameEnumerator_cachedStructureID, JSPropertyNameEnumerator::cachedStructureIDOffset()) \ 66 macro(JSPropertyNameEnumerator_endGenericPropertyIndex, JSPropertyNameEnumerator::endGenericPropertyIndexOffset()) \ 67 macro(JSPropertyNameEnumerator_endStructurePropertyIndex, JSPropertyNameEnumerator::endStructurePropertyIndexOffset()) \ 68 macro(JSPropertyNameEnumerator_indexLength, JSPropertyNameEnumerator::indexedLengthOffset()) \ 67 69 macro(JSScope_next, JSScope::offsetOfNext()) \ 68 70 macro(JSString_flags, JSString::offsetOfFlags()) \ -
trunk/Source/JavaScriptCore/ftl/FTLCapabilities.cpp
r181650 r181891 172 172 case GetDirectPname: 173 173 case GetEnumerableLength: 174 case Get StructurePropertyEnumerator:175 case Get GenericPropertyEnumerator:176 case GetEnumerator Pname:174 case GetPropertyEnumerator: 175 case GetEnumeratorStructurePname: 176 case GetEnumeratorGenericPname: 177 177 case ToIndexString: 178 178 case BottomValue: -
trunk/Source/JavaScriptCore/ftl/FTLLowerDFGToLLVM.cpp
r181650 r181891 804 804 compileGetEnumerableLength(); 805 805 break; 806 case Get StructurePropertyEnumerator:807 compileGet StructurePropertyEnumerator();808 break; 809 case Get GenericPropertyEnumerator:810 compileGet GenericPropertyEnumerator();811 break; 812 case GetEnumerator Pname:813 compileGetEnumerator Pname();806 case GetPropertyEnumerator: 807 compileGetPropertyEnumerator(); 808 break; 809 case GetEnumeratorStructurePname: 810 compileGetEnumeratorStructurePname(); 811 break; 812 case GetEnumeratorGenericPname: 813 compileGetEnumeratorGenericPname(); 814 814 break; 815 815 case ToIndexString: … … 4527 4527 void compileGetEnumerableLength() 4528 4528 { 4529 LValue enumerator = lowCell(m_node->child1()); 4530 setInt32(m_out.load32(enumerator, m_heaps.JSPropertyNameEnumerator_indexLength)); 4531 } 4532 4533 void compileGetPropertyEnumerator() 4534 { 4529 4535 LValue base = lowCell(m_node->child1()); 4530 setInt32(vmCall(m_out.operation(operationGetEnumerableLength), m_callFrame, base)); 4531 } 4532 4533 void compileGetStructurePropertyEnumerator() 4534 { 4535 LValue base = lowCell(m_node->child1()); 4536 LValue length = lowInt32(m_node->child2()); 4537 setJSValue(vmCall(m_out.operation(operationGetStructurePropertyEnumerator), m_callFrame, base, length)); 4538 } 4539 4540 void compileGetGenericPropertyEnumerator() 4541 { 4542 LValue base = lowCell(m_node->child1()); 4543 LValue length = lowInt32(m_node->child2()); 4544 LValue enumerator = lowCell(m_node->child3()); 4545 setJSValue(vmCall(m_out.operation(operationGetGenericPropertyEnumerator), m_callFrame, base, length, enumerator)); 4546 } 4547 4548 void compileGetEnumeratorPname() 4536 setJSValue(vmCall(m_out.operation(operationGetPropertyEnumerator), m_callFrame, base)); 4537 } 4538 4539 void compileGetEnumeratorStructurePname() 4549 4540 { 4550 4541 LValue enumerator = lowCell(m_node->child1()); 4551 4542 LValue index = lowInt32(m_node->child2()); 4552 4543 4553 LBasicBlock inBounds = FTL_NEW_BLOCK(m_out, ("GetEnumerator Pname in bounds"));4554 LBasicBlock outOfBounds = FTL_NEW_BLOCK(m_out, ("GetEnumerator Pname out of bounds"));4555 LBasicBlock continuation = FTL_NEW_BLOCK(m_out, ("GetEnumerator Pname continuation"));4556 4557 m_out.branch(m_out.below(index, m_out.load32(enumerator, m_heaps.JSPropertyNameEnumerator_ cachedPropertyNamesLength)),4544 LBasicBlock inBounds = FTL_NEW_BLOCK(m_out, ("GetEnumeratorStructurePname in bounds")); 4545 LBasicBlock outOfBounds = FTL_NEW_BLOCK(m_out, ("GetEnumeratorStructurePname out of bounds")); 4546 LBasicBlock continuation = FTL_NEW_BLOCK(m_out, ("GetEnumeratorStructurePname continuation")); 4547 4548 m_out.branch(m_out.below(index, m_out.load32(enumerator, m_heaps.JSPropertyNameEnumerator_endStructurePropertyIndex)), 4558 4549 usually(inBounds), rarely(outOfBounds)); 4559 4550 … … 4573 4564 } 4574 4565 4566 void compileGetEnumeratorGenericPname() 4567 { 4568 LValue enumerator = lowCell(m_node->child1()); 4569 LValue index = lowInt32(m_node->child2()); 4570 4571 LBasicBlock inBounds = FTL_NEW_BLOCK(m_out, ("GetEnumeratorGenericPname in bounds")); 4572 LBasicBlock outOfBounds = FTL_NEW_BLOCK(m_out, ("GetEnumeratorGenericPname out of bounds")); 4573 LBasicBlock continuation = FTL_NEW_BLOCK(m_out, ("GetEnumeratorGenericPname continuation")); 4574 4575 m_out.branch(m_out.below(index, m_out.load32(enumerator, m_heaps.JSPropertyNameEnumerator_endGenericPropertyIndex)), 4576 usually(inBounds), rarely(outOfBounds)); 4577 4578 LBasicBlock lastNext = m_out.appendTo(inBounds, outOfBounds); 4579 LValue storage = m_out.loadPtr(enumerator, m_heaps.JSPropertyNameEnumerator_cachedPropertyNamesVector); 4580 ValueFromBlock inBoundsResult = m_out.anchor( 4581 m_out.load64(m_out.baseIndex(m_heaps.JSPropertyNameEnumerator_cachedPropertyNamesVector, 4582 storage, m_out.signExt(index, m_out.int64), ScaleEight))); 4583 m_out.jump(continuation); 4584 4585 m_out.appendTo(outOfBounds, continuation); 4586 ValueFromBlock outOfBoundsResult = m_out.anchor(m_out.constInt64(ValueNull)); 4587 m_out.jump(continuation); 4588 4589 m_out.appendTo(continuation, lastNext); 4590 setJSValue(m_out.phi(m_out.int64, inBoundsResult, outOfBoundsResult)); 4591 } 4592 4575 4593 void compileToIndexString() 4576 4594 { -
trunk/Source/JavaScriptCore/jit/JIT.cpp
r181887 r181891 307 307 DEFINE_OP(op_has_indexed_property) 308 308 DEFINE_OP(op_get_direct_pname) 309 DEFINE_OP(op_get_ structure_property_enumerator)310 DEFINE_OP(op_ get_generic_property_enumerator)311 DEFINE_OP(op_ next_enumerator_pname)309 DEFINE_OP(op_get_property_enumerator) 310 DEFINE_OP(op_enumerator_structure_pname) 311 DEFINE_OP(op_enumerator_generic_pname) 312 312 DEFINE_OP(op_to_index_string) 313 313 default: -
trunk/Source/JavaScriptCore/jit/JIT.h
r181466 r181891 558 558 void emit_op_has_indexed_property(Instruction*); 559 559 void emit_op_get_direct_pname(Instruction*); 560 void emit_op_get_ structure_property_enumerator(Instruction*);561 void emit_op_ get_generic_property_enumerator(Instruction*);562 void emit_op_ next_enumerator_pname(Instruction*);560 void emit_op_get_property_enumerator(Instruction*); 561 void emit_op_enumerator_structure_pname(Instruction*); 562 void emit_op_enumerator_generic_pname(Instruction*); 563 563 void emit_op_to_index_string(Instruction*); 564 564 -
trunk/Source/JavaScriptCore/jit/JITOpcodes.cpp
r181466 r181891 1285 1285 } 1286 1286 1287 void JIT::emit_op_ next_enumerator_pname(Instruction* currentInstruction)1287 void JIT::emit_op_enumerator_structure_pname(Instruction* currentInstruction) 1288 1288 { 1289 1289 int dst = currentInstruction[1].u.operand; … … 1293 1293 emitGetVirtualRegister(index, regT0); 1294 1294 emitGetVirtualRegister(enumerator, regT1); 1295 Jump inBounds = branch32(Below, regT0, Address(regT1, JSPropertyNameEnumerator:: cachedPropertyNamesLengthOffset()));1295 Jump inBounds = branch32(Below, regT0, Address(regT1, JSPropertyNameEnumerator::endStructurePropertyIndexOffset())); 1296 1296 1297 1297 move(TrustedImm64(JSValue::encode(jsNull())), regT0); … … 1304 1304 load64(BaseIndex(regT1, regT0, TimesEight), regT0); 1305 1305 1306 done.link(this); 1307 emitPutVirtualRegister(dst); 1308 } 1309 1310 void JIT::emit_op_enumerator_generic_pname(Instruction* currentInstruction) 1311 { 1312 int dst = currentInstruction[1].u.operand; 1313 int enumerator = currentInstruction[2].u.operand; 1314 int index = currentInstruction[3].u.operand; 1315 1316 emitGetVirtualRegister(index, regT0); 1317 emitGetVirtualRegister(enumerator, regT1); 1318 Jump inBounds = branch32(Below, regT0, Address(regT1, JSPropertyNameEnumerator::endGenericPropertyIndexOffset())); 1319 1320 move(TrustedImm64(JSValue::encode(jsNull())), regT0); 1321 1322 Jump done = jump(); 1323 inBounds.link(this); 1324 1325 loadPtr(Address(regT1, JSPropertyNameEnumerator::cachedPropertyNamesVectorOffset()), regT1); 1326 signExtend32ToPtr(regT0, regT0); 1327 load64(BaseIndex(regT1, regT0, TimesEight), regT0); 1328 1306 1329 done.link(this); 1307 1330 emitPutVirtualRegister(dst); … … 1393 1416 } 1394 1417 1395 void JIT::emit_op_get_structure_property_enumerator(Instruction* currentInstruction) 1396 { 1397 JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_get_structure_property_enumerator); 1398 slowPathCall.call(); 1399 } 1400 1401 void JIT::emit_op_get_generic_property_enumerator(Instruction* currentInstruction) 1402 { 1403 JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_get_generic_property_enumerator); 1418 void JIT::emit_op_get_property_enumerator(Instruction* currentInstruction) 1419 { 1420 JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_get_property_enumerator); 1404 1421 slowPathCall.call(); 1405 1422 } -
trunk/Source/JavaScriptCore/jit/JITOpcodes32_64.cpp
r181466 r181891 1260 1260 } 1261 1261 1262 void JIT::emit_op_ next_enumerator_pname(Instruction* currentInstruction)1262 void JIT::emit_op_enumerator_structure_pname(Instruction* currentInstruction) 1263 1263 { 1264 1264 int dst = currentInstruction[1].u.operand; … … 1268 1268 emitLoadPayload(index, regT0); 1269 1269 emitLoadPayload(enumerator, regT1); 1270 Jump inBounds = branch32(Below, regT0, Address(regT1, JSPropertyNameEnumerator:: cachedPropertyNamesLengthOffset()));1270 Jump inBounds = branch32(Below, regT0, Address(regT1, JSPropertyNameEnumerator::endStructurePropertyIndexOffset())); 1271 1271 1272 1272 move(TrustedImm32(JSValue::NullTag), regT2); … … 1280 1280 move(TrustedImm32(JSValue::CellTag), regT2); 1281 1281 1282 done.link(this); 1283 emitStore(dst, regT2, regT0); 1284 } 1285 1286 void JIT::emit_op_enumerator_generic_pname(Instruction* currentInstruction) 1287 { 1288 int dst = currentInstruction[1].u.operand; 1289 int enumerator = currentInstruction[2].u.operand; 1290 int index = currentInstruction[3].u.operand; 1291 1292 emitLoadPayload(index, regT0); 1293 emitLoadPayload(enumerator, regT1); 1294 Jump inBounds = branch32(Below, regT0, Address(regT1, JSPropertyNameEnumerator::endGenericPropertyIndexOffset())); 1295 1296 move(TrustedImm32(JSValue::NullTag), regT2); 1297 move(TrustedImm32(0), regT0); 1298 1299 Jump done = jump(); 1300 inBounds.link(this); 1301 1302 loadPtr(Address(regT1, JSPropertyNameEnumerator::cachedPropertyNamesVectorOffset()), regT1); 1303 loadPtr(BaseIndex(regT1, regT0, timesPtr()), regT0); 1304 move(TrustedImm32(JSValue::CellTag), regT2); 1305 1282 1306 done.link(this); 1283 1307 emitStore(dst, regT2, regT0); -
trunk/Source/JavaScriptCore/jit/JITOperations.cpp
r181889 r181891 1848 1848 } 1849 1849 1850 int32_t JIT_OPERATION operationGetEnumerableLength(ExecState* exec, JSCell* baseCell)1851 {1852 VM& vm = exec->vm();1853 NativeCallFrameTracer tracer(&vm, exec);1854 JSObject* base = baseCell->toObject(exec, exec->lexicalGlobalObject());1855 return base->methodTable(vm)->getEnumerableLength(exec, base);1856 }1857 1858 1850 EncodedJSValue JIT_OPERATION operationHasGenericProperty(ExecState* exec, EncodedJSValue encodedBaseValue, JSCell* propertyName) 1859 1851 { … … 1876 1868 } 1877 1869 1878 JSCell* JIT_OPERATION operationGet StructurePropertyEnumerator(ExecState* exec, JSCell* cell, int32_t length)1879 { 1880 VM& vm = exec->vm(); 1881 NativeCallFrameTracer tracer(&vm, exec); 1882 1870 JSCell* JIT_OPERATION operationGetPropertyEnumerator(ExecState* exec, JSCell* cell) 1871 { 1872 VM& vm = exec->vm(); 1873 NativeCallFrameTracer tracer(&vm, exec); 1874 1883 1875 JSObject* base = cell->toObject(exec, exec->lexicalGlobalObject()); 1884 ASSERT(length >= 0); 1885 1886 return structurePropertyNameEnumerator(exec, base, static_cast<uint32_t>(length)); 1887 } 1888 1889 JSCell* JIT_OPERATION operationGetGenericPropertyEnumerator(ExecState* exec, JSCell* baseCell, int32_t length, JSCell* structureEnumeratorCell) 1890 { 1891 VM& vm = exec->vm(); 1892 NativeCallFrameTracer tracer(&vm, exec); 1893 1894 JSObject* base = baseCell->toObject(exec, exec->lexicalGlobalObject()); 1895 ASSERT(length >= 0); 1896 1897 return genericPropertyNameEnumerator(exec, base, length, jsCast<JSPropertyNameEnumerator*>(structureEnumeratorCell)); 1876 1877 return propertyNameEnumerator(exec, base); 1898 1878 } 1899 1879 -
trunk/Source/JavaScriptCore/jit/JITOperations.h
r180514 r181891 328 328 void JIT_OPERATION operationExceptionFuzz(); 329 329 330 int32_t JIT_OPERATION operationGetEnumerableLength(ExecState*, JSCell*);331 330 EncodedJSValue JIT_OPERATION operationHasGenericProperty(ExecState*, EncodedJSValue, JSCell*); 332 331 EncodedJSValue JIT_OPERATION operationHasIndexedProperty(ExecState*, JSCell*, int32_t); 333 JSCell* JIT_OPERATION operationGetStructurePropertyEnumerator(ExecState*, JSCell*, int32_t); 334 JSCell* JIT_OPERATION operationGetGenericPropertyEnumerator(ExecState*, JSCell*, int32_t, JSCell*); 332 JSCell* JIT_OPERATION operationGetPropertyEnumerator(ExecState*, JSCell*); 335 333 EncodedJSValue JIT_OPERATION operationNextEnumeratorPname(ExecState*, JSCell*, int32_t); 336 334 JSCell* JIT_OPERATION operationToIndexString(ExecState*, int32_t); -
trunk/Source/JavaScriptCore/llint/LowLevelInterpreter.asm
r180587 r181891 1335 1335 dispatch(7) 1336 1336 1337 _llint_op_get_ structure_property_enumerator:1338 traceExecution() 1339 callSlowPath(_slow_path_get_ structure_property_enumerator)1340 dispatch( 4)1341 1342 _llint_op_ get_generic_property_enumerator:1343 traceExecution() 1344 callSlowPath(_slow_path_ get_generic_property_enumerator)1345 dispatch( 5)1346 1347 _llint_op_ next_enumerator_pname:1348 traceExecution() 1349 callSlowPath(_slow_path_next_ enumerator_pname)1337 _llint_op_get_property_enumerator: 1338 traceExecution() 1339 callSlowPath(_slow_path_get_property_enumerator) 1340 dispatch(3) 1341 1342 _llint_op_enumerator_structure_pname: 1343 traceExecution() 1344 callSlowPath(_slow_path_next_structure_enumerator_pname) 1345 dispatch(4) 1346 1347 _llint_op_enumerator_generic_pname: 1348 traceExecution() 1349 callSlowPath(_slow_path_next_generic_enumerator_pname) 1350 1350 dispatch(4) 1351 1351 -
trunk/Source/JavaScriptCore/runtime/CommonSlowPaths.cpp
r181814 r181891 521 521 { 522 522 BEGIN(); 523 JSValue baseValue = OP(2).jsValue();524 if ( baseValue.isUndefinedOrNull())523 JSValue enumeratorValue = OP(2).jsValue(); 524 if (enumeratorValue.isUndefinedOrNull()) 525 525 RETURN(jsNumber(0)); 526 526 527 JSObject* base = baseValue.toObject(exec); 528 RETURN(jsNumber(base->methodTable(vm)->getEnumerableLength(exec, base))); 527 JSPropertyNameEnumerator* enumerator = jsCast<JSPropertyNameEnumerator*>(enumeratorValue.asCell()); 528 529 RETURN(jsNumber(enumerator->indexedLength())); 529 530 } 530 531 … … 575 576 } 576 577 577 SLOW_PATH_DECL(slow_path_get_ structure_property_enumerator)578 SLOW_PATH_DECL(slow_path_get_property_enumerator) 578 579 { 579 580 BEGIN(); … … 581 582 if (baseValue.isUndefinedOrNull()) 582 583 RETURN(JSPropertyNameEnumerator::create(vm)); 583 584 584 585 JSObject* base = baseValue.toObject(exec); 585 uint32_t length = OP(3).jsValue().asUInt32(); 586 587 RETURN(structurePropertyNameEnumerator(exec, base, length)); 588 } 589 590 SLOW_PATH_DECL(slow_path_get_generic_property_enumerator) 591 { 592 BEGIN(); 593 JSValue baseValue = OP(2).jsValue(); 594 if (baseValue.isUndefinedOrNull()) 595 RETURN(JSPropertyNameEnumerator::create(vm)); 596 597 JSObject* base = baseValue.toObject(exec); 598 uint32_t length = OP(3).jsValue().asUInt32(); 599 JSPropertyNameEnumerator* structureEnumerator = jsCast<JSPropertyNameEnumerator*>(OP(4).jsValue().asCell()); 600 601 RETURN(genericPropertyNameEnumerator(exec, base, length, structureEnumerator)); 602 } 603 604 SLOW_PATH_DECL(slow_path_next_enumerator_pname) 586 587 RETURN(propertyNameEnumerator(exec, base)); 588 } 589 590 SLOW_PATH_DECL(slow_path_next_structure_enumerator_pname) 605 591 { 606 592 BEGIN(); 607 593 JSPropertyNameEnumerator* enumerator = jsCast<JSPropertyNameEnumerator*>(OP(2).jsValue().asCell()); 608 594 uint32_t index = OP(3).jsValue().asUInt32(); 609 JSString* propertyName = enumerator->propertyNameAtIndex(index); 595 596 JSString* propertyName = nullptr; 597 if (index < enumerator->endStructurePropertyIndex()) 598 propertyName = enumerator->propertyNameAtIndex(index); 599 RETURN(propertyName ? propertyName : jsNull()); 600 } 601 602 SLOW_PATH_DECL(slow_path_next_generic_enumerator_pname) 603 { 604 BEGIN(); 605 JSPropertyNameEnumerator* enumerator = jsCast<JSPropertyNameEnumerator*>(OP(2).jsValue().asCell()); 606 uint32_t index = OP(3).jsValue().asUInt32(); 607 608 JSString* propertyName = nullptr; 609 if (enumerator->endStructurePropertyIndex() <= index && index < enumerator->endGenericPropertyIndex()) 610 propertyName = enumerator->propertyNameAtIndex(index); 610 611 RETURN(propertyName ? propertyName : jsNull()); 611 612 } -
trunk/Source/JavaScriptCore/runtime/CommonSlowPaths.h
r181889 r181891 227 227 SLOW_PATH_HIDDEN_DECL(slow_path_has_indexed_property); 228 228 SLOW_PATH_HIDDEN_DECL(slow_path_get_direct_pname); 229 SLOW_PATH_HIDDEN_DECL(slow_path_get_ structure_property_enumerator);230 SLOW_PATH_HIDDEN_DECL(slow_path_ get_generic_property_enumerator);231 SLOW_PATH_HIDDEN_DECL(slow_path_next_ enumerator_pname);229 SLOW_PATH_HIDDEN_DECL(slow_path_get_property_enumerator); 230 SLOW_PATH_HIDDEN_DECL(slow_path_next_structure_enumerator_pname); 231 SLOW_PATH_HIDDEN_DECL(slow_path_next_generic_enumerator_pname); 232 232 SLOW_PATH_HIDDEN_DECL(slow_path_to_index_string); 233 233 SLOW_PATH_HIDDEN_DECL(slow_path_profile_type_clear_log); -
trunk/Source/JavaScriptCore/runtime/JSPropertyNameEnumerator.cpp
r172176 r181891 38 38 if (!vm.emptyPropertyNameEnumerator.get()) { 39 39 PropertyNameArray propertyNames(&vm); 40 vm.emptyPropertyNameEnumerator = Strong<JSCell>(vm, create(vm, 0, propertyNames));40 vm.emptyPropertyNameEnumerator = Strong<JSCell>(vm, create(vm, 0, 0, 0, propertyNames)); 41 41 } 42 42 return jsCast<JSPropertyNameEnumerator*>(vm.emptyPropertyNameEnumerator.get()); 43 43 } 44 44 45 JSPropertyNameEnumerator* JSPropertyNameEnumerator::create(VM& vm, Structure* structure, PropertyNameArray& propertyNames)45 JSPropertyNameEnumerator* JSPropertyNameEnumerator::create(VM& vm, Structure* structure, uint32_t indexedLength, uint32_t numberStructureProperties, PropertyNameArray& propertyNames) 46 46 { 47 47 StructureID structureID = structure ? structure->id() : 0; … … 49 49 JSPropertyNameEnumerator* enumerator = new (NotNull, 50 50 allocateCell<JSPropertyNameEnumerator>(vm.heap)) JSPropertyNameEnumerator(vm, structureID, inlineCapacity, propertyNames.identifierSet()); 51 enumerator->finishCreation(vm, propertyNames.data());51 enumerator->finishCreation(vm, indexedLength, numberStructureProperties, propertyNames.data()); 52 52 return enumerator; 53 53 } … … 61 61 } 62 62 63 void JSPropertyNameEnumerator::finishCreation(VM& vm, PassRefPtr<PropertyNameArrayData> idents)63 void JSPropertyNameEnumerator::finishCreation(VM& vm, uint32_t indexedLength, uint32_t endStructurePropertyIndex, PassRefPtr<PropertyNameArrayData> idents) 64 64 { 65 65 Base::finishCreation(vm); … … 67 67 RefPtr<PropertyNameArrayData> identifiers = idents; 68 68 PropertyNameArrayData::PropertyNameVector& vector = identifiers->propertyNameVector(); 69 70 m_indexedLength = indexedLength; 71 m_endStructurePropertyIndex = endStructurePropertyIndex; 72 m_endGenericPropertyIndex = vector.size(); 73 69 74 m_propertyNames.resize(vector.size()); 70 75 for (unsigned i = 0; i < vector.size(); ++i) { -
trunk/Source/JavaScriptCore/runtime/JSPropertyNameEnumerator.h
r178441 r181891 41 41 42 42 static JSPropertyNameEnumerator* create(VM&); 43 static JSPropertyNameEnumerator* create(VM&, Structure*, PropertyNameArray&);43 static JSPropertyNameEnumerator* create(VM&, Structure*, uint32_t, uint32_t, PropertyNameArray&); 44 44 45 45 static const bool needsDestruction = true; … … 76 76 } 77 77 StructureID cachedStructureID() const { return m_cachedStructureID; } 78 uint32_t indexedLength() const { return m_indexedLength; } 79 uint32_t endStructurePropertyIndex() const { return m_endStructurePropertyIndex; } 80 uint32_t endGenericPropertyIndex() const { return m_endGenericPropertyIndex; } 78 81 uint32_t cachedInlineCapacity() const { return m_cachedInlineCapacity; } 79 82 static ptrdiff_t cachedStructureIDOffset() { return OBJECT_OFFSETOF(JSPropertyNameEnumerator, m_cachedStructureID); } 83 static ptrdiff_t indexedLengthOffset() { return OBJECT_OFFSETOF(JSPropertyNameEnumerator, m_indexedLength); } 84 static ptrdiff_t endStructurePropertyIndexOffset() { return OBJECT_OFFSETOF(JSPropertyNameEnumerator, m_endStructurePropertyIndex); } 85 static ptrdiff_t endGenericPropertyIndexOffset() { return OBJECT_OFFSETOF(JSPropertyNameEnumerator, m_endGenericPropertyIndex); } 80 86 static ptrdiff_t cachedInlineCapacityOffset() { return OBJECT_OFFSETOF(JSPropertyNameEnumerator, m_cachedInlineCapacity); } 81 static ptrdiff_t cachedPropertyNamesLengthOffset()82 {83 return OBJECT_OFFSETOF(JSPropertyNameEnumerator, m_propertyNames) + Vector<WriteBarrier<JSString>>::sizeMemoryOffset();84 }85 87 static ptrdiff_t cachedPropertyNamesVectorOffset() 86 88 { … … 94 96 95 97 JSPropertyNameEnumerator(VM&, StructureID, uint32_t, RefCountedIdentifierSet*); 96 void finishCreation(VM&, PassRefPtr<PropertyNameArrayData>);98 void finishCreation(VM&, uint32_t, uint32_t, PassRefPtr<PropertyNameArrayData>); 97 99 98 100 Vector<WriteBarrier<JSString>> m_propertyNames; … … 100 102 StructureID m_cachedStructureID; 101 103 WriteBarrier<StructureChain> m_prototypeChain; 104 uint32_t m_indexedLength; 105 uint32_t m_endStructurePropertyIndex; 106 uint32_t m_endGenericPropertyIndex; 102 107 uint32_t m_cachedInlineCapacity; 103 108 }; 104 109 105 inline JSPropertyNameEnumerator* structurePropertyNameEnumerator(ExecState* exec, JSObject* base, uint32_t length)110 inline JSPropertyNameEnumerator* propertyNameEnumerator(ExecState* exec, JSObject* base) 106 111 { 107 112 VM& vm = exec->vm(); 113 114 uint32_t indexedLength = base->methodTable(vm)->getEnumerableLength(exec, base); 115 116 JSPropertyNameEnumerator* enumerator = nullptr; 117 108 118 Structure* structure = base->structure(vm); 109 if (JSPropertyNameEnumerator* enumerator = structure->cachedStructurePropertyNameEnumerator()) 119 if (!indexedLength 120 && (enumerator = structure->cachedPropertyNameEnumerator()) 121 && enumerator->cachedPrototypeChain() == structure->prototypeChain(exec)) 110 122 return enumerator; 111 123 112 if (!structure->canAccessPropertiesQuickly() || length != base->getArrayLength()) 113 return JSPropertyNameEnumerator::create(vm); 124 uint32_t numberStructureProperties = 0; 114 125 115 126 PropertyNameArray propertyNames(exec); 116 base->methodTable(vm)->getStructurePropertyNames(base, exec, propertyNames, ExcludeDontEnumProperties);117 127 118 JSPropertyNameEnumerator* enumerator = JSPropertyNameEnumerator::create(vm, structure, propertyNames); 119 if (structure->canCacheStructurePropertyNameEnumerator()) 120 structure->setCachedStructurePropertyNameEnumerator(vm, enumerator); 121 return enumerator; 122 } 128 if (structure->canAccessPropertiesQuickly() && indexedLength == base->getArrayLength()) { 129 base->methodTable(vm)->getStructurePropertyNames(base, exec, propertyNames, ExcludeDontEnumProperties); 123 130 124 inline JSPropertyNameEnumerator* genericPropertyNameEnumerator(ExecState* exec, JSObject* base, uint32_t length, JSPropertyNameEnumerator* structureEnumerator) 125 { 126 VM& vm = exec->vm(); 127 Structure* structure = base->structure(vm); 128 if (JSPropertyNameEnumerator* enumerator = structure->cachedGenericPropertyNameEnumerator()) { 129 if (!length && enumerator->cachedPrototypeChain() == structure->prototypeChain(exec)) 130 return enumerator; 131 } 131 numberStructureProperties = propertyNames.size(); 132 132 133 PropertyNameArray propertyNames(exec);134 propertyNames.setPreviouslyEnumeratedLength(length);135 propertyNames.setPreviouslyEnumeratedProperties(structureEnumerator);133 base->methodTable(vm)->getGenericPropertyNames(base, exec, propertyNames, ExcludeDontEnumProperties); 134 } else 135 base->methodTable(vm)->getPropertyNames(base, exec, propertyNames, ExcludeDontEnumProperties); 136 136 137 // If we still have the same Structure that we started with, our Structure allows us to access its properties 138 // quickly (i.e. the Structure property loop was able to do things), and we iterated the full length of the 139 // object (i.e. there are no more own indexed properties that need to be enumerated), then the generic property 140 // iteration can skip any properties it would get from the JSObject base class. This turns out to be important 141 // for hot loops because most of our time is then dominated by trying to add the own Structure properties to 142 // the new generic PropertyNameArray and failing because we've already visited them. 143 Structure* cachedStructure = structureEnumerator->cachedStructure(vm); 144 if (structure == cachedStructure && structure->canAccessPropertiesQuickly() && static_cast<uint32_t>(length) == base->getArrayLength()) 145 base->methodTable(vm)->getGenericPropertyNames(base, exec, propertyNames, ExcludeDontEnumProperties); 146 else 147 base->methodTable(vm)->getPropertyNames(base, exec, propertyNames, ExcludeDontEnumProperties); 148 137 ASSERT(propertyNames.size() < UINT32_MAX); 138 149 139 normalizePrototypeChain(exec, structure); 150 140 151 JSPropertyNameEnumerator* enumerator = JSPropertyNameEnumerator::create(vm, base->structure(vm), propertyNames);141 enumerator = JSPropertyNameEnumerator::create(vm, structure, indexedLength, numberStructureProperties, propertyNames); 152 142 enumerator->setCachedPrototypeChain(vm, structure->prototypeChain(exec)); 153 if (! length && structure->canCacheGenericPropertyNameEnumerator())154 structure->setCached GenericPropertyNameEnumerator(vm, enumerator);143 if (!indexedLength && structure->canCachePropertyNameEnumerator()) 144 structure->setCachedPropertyNameEnumerator(vm, enumerator); 155 145 return enumerator; 156 146 } -
trunk/Source/JavaScriptCore/runtime/Structure.cpp
r181867 r181891 1217 1217 } 1218 1218 1219 void Structure::setCached StructurePropertyNameEnumerator(VM& vm, JSPropertyNameEnumerator* enumerator)1219 void Structure::setCachedPropertyNameEnumerator(VM& vm, JSPropertyNameEnumerator* enumerator) 1220 1220 { 1221 1221 ASSERT(!isDictionary()); 1222 1222 if (!hasRareData()) 1223 1223 allocateRareData(vm); 1224 rareData()->setCached StructurePropertyNameEnumerator(vm, enumerator);1225 } 1226 1227 JSPropertyNameEnumerator* Structure::cached StructurePropertyNameEnumerator() const1224 rareData()->setCachedPropertyNameEnumerator(vm, enumerator); 1225 } 1226 1227 JSPropertyNameEnumerator* Structure::cachedPropertyNameEnumerator() const 1228 1228 { 1229 1229 if (!hasRareData()) 1230 1230 return nullptr; 1231 return rareData()->cachedStructurePropertyNameEnumerator(); 1232 } 1233 1234 void Structure::setCachedGenericPropertyNameEnumerator(VM& vm, JSPropertyNameEnumerator* enumerator) 1235 { 1236 ASSERT(!isDictionary()); 1237 if (!hasRareData()) 1238 allocateRareData(vm); 1239 rareData()->setCachedGenericPropertyNameEnumerator(vm, enumerator); 1240 } 1241 1242 JSPropertyNameEnumerator* Structure::cachedGenericPropertyNameEnumerator() const 1243 { 1244 if (!hasRareData()) 1245 return nullptr; 1246 return rareData()->cachedGenericPropertyNameEnumerator(); 1247 } 1248 1249 bool Structure::canCacheStructurePropertyNameEnumerator() const 1231 return rareData()->cachedPropertyNameEnumerator(); 1232 } 1233 1234 bool Structure::canCachePropertyNameEnumerator() const 1250 1235 { 1251 1236 if (isDictionary()) 1252 return false;1253 return true;1254 }1255 1256 bool Structure::canCacheGenericPropertyNameEnumerator() const1257 {1258 if (!canCacheStructurePropertyNameEnumerator())1259 1237 return false; 1260 1238 … … 1275 1253 structure++; 1276 1254 } 1277 1255 1278 1256 return true; 1279 1257 } 1280 1258 1281 1259 bool Structure::canAccessPropertiesQuickly() const 1282 1260 { -
trunk/Source/JavaScriptCore/runtime/Structure.h
r176583 r181891 316 316 } 317 317 318 void setCachedStructurePropertyNameEnumerator(VM&, JSPropertyNameEnumerator*); 319 void setCachedGenericPropertyNameEnumerator(VM&, JSPropertyNameEnumerator*); 320 JSPropertyNameEnumerator* cachedStructurePropertyNameEnumerator() const; 321 JSPropertyNameEnumerator* cachedGenericPropertyNameEnumerator() const; 322 bool canCacheStructurePropertyNameEnumerator() const; 323 bool canCacheGenericPropertyNameEnumerator() const; 318 void setCachedPropertyNameEnumerator(VM&, JSPropertyNameEnumerator*); 319 JSPropertyNameEnumerator* cachedPropertyNameEnumerator() const; 320 bool canCachePropertyNameEnumerator() const; 324 321 bool canAccessPropertiesQuickly() const; 325 322 -
trunk/Source/JavaScriptCore/runtime/StructureRareData.cpp
r172176 r181891 67 67 visitor.append(&thisObject->m_previous); 68 68 visitor.append(&thisObject->m_objectToStringValue); 69 visitor.append(&thisObject->m_cached StructurePropertyNameEnumerator);69 visitor.append(&thisObject->m_cachedPropertyNameEnumerator); 70 70 visitor.append(&thisObject->m_cachedGenericPropertyNameEnumerator); 71 71 } 72 72 73 JSPropertyNameEnumerator* StructureRareData::cached StructurePropertyNameEnumerator() const73 JSPropertyNameEnumerator* StructureRareData::cachedPropertyNameEnumerator() const 74 74 { 75 return m_cached StructurePropertyNameEnumerator.get();75 return m_cachedPropertyNameEnumerator.get(); 76 76 } 77 77 78 void StructureRareData::setCached StructurePropertyNameEnumerator(VM& vm, JSPropertyNameEnumerator* enumerator)78 void StructureRareData::setCachedPropertyNameEnumerator(VM& vm, JSPropertyNameEnumerator* enumerator) 79 79 { 80 m_cachedStructurePropertyNameEnumerator.set(vm, this, enumerator); 81 } 82 83 JSPropertyNameEnumerator* StructureRareData::cachedGenericPropertyNameEnumerator() const 84 { 85 return m_cachedGenericPropertyNameEnumerator.get(); 86 } 87 88 void StructureRareData::setCachedGenericPropertyNameEnumerator(VM& vm, JSPropertyNameEnumerator* enumerator) 89 { 90 m_cachedGenericPropertyNameEnumerator.set(vm, this, enumerator); 80 m_cachedPropertyNameEnumerator.set(vm, this, enumerator); 91 81 } 92 82 -
trunk/Source/JavaScriptCore/runtime/StructureRareData.h
r172176 r181891 56 56 void setObjectToStringValue(VM&, JSString* value); 57 57 58 JSPropertyNameEnumerator* cachedStructurePropertyNameEnumerator() const; 59 JSPropertyNameEnumerator* cachedGenericPropertyNameEnumerator() const; 60 void setCachedStructurePropertyNameEnumerator(VM&, JSPropertyNameEnumerator*); 61 void setCachedGenericPropertyNameEnumerator(VM&, JSPropertyNameEnumerator*); 58 JSPropertyNameEnumerator* cachedPropertyNameEnumerator() const; 59 void setCachedPropertyNameEnumerator(VM&, JSPropertyNameEnumerator*); 62 60 63 61 DECLARE_EXPORT_INFO; … … 72 70 WriteBarrier<Structure> m_previous; 73 71 WriteBarrier<JSString> m_objectToStringValue; 74 WriteBarrier<JSPropertyNameEnumerator> m_cached StructurePropertyNameEnumerator;72 WriteBarrier<JSPropertyNameEnumerator> m_cachedPropertyNameEnumerator; 75 73 WriteBarrier<JSPropertyNameEnumerator> m_cachedGenericPropertyNameEnumerator; 76 74 -
trunk/Source/JavaScriptCore/tests/stress/for-in-delete-during-iteration.js
r172176 r181891 37 37 noInline(foo); 38 38 for (var i = 0; i < 10000; ++i) { 39 // Note: it's undefined whether we visit o.a or not. Currently we do. 40 if (foo() !== "xza") 39 if (foo() !== "xz") 41 40 throw new Error("bad result"); 42 41 }
Note:
See TracChangeset
for help on using the changeset viewer.