Changeset 34781 in webkit for trunk/JavaScriptCore
- Timestamp:
- Jun 24, 2008, 4:03:11 PM (17 years ago)
- Location:
- trunk/JavaScriptCore
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/ChangeLog
r34778 r34781 23 23 (KJS::ProfileNode::removeChild): Should reset the sibling pointers since 24 24 one of them has been removed. 25 26 2008-06-24 Oliver Hunt <[email protected]>27 28 Reviewed by Cameron.29 30 Add special loop opcodes as groundwork for slow script31 termination. Also added a few assertions to prevent us32 from accidentally coalescing conditional jump operands33 in a way that might bypass the slow script opcodes.34 35 * JavaScriptCore.xcodeproj/project.pbxproj:36 * VM/CodeGenerator.cpp:37 (KJS::CodeGenerator::emitJumpIfTrueMayCombine):38 (KJS::CodeGenerator::emitJumpScopes):39 * VM/LabelID.h:40 * VM/Machine.cpp:41 (KJS::Machine::privateExecute):42 * VM/Machine.h:43 * VM/Opcode.h:44 25 45 26 2008-06-24 Darin Adler <[email protected]> -
trunk/JavaScriptCore/VM/CodeGenerator.cpp
r34777 r34781 421 421 PassRefPtr<LabelID> CodeGenerator::emitJump(LabelID* target) 422 422 { 423 ASSERT(target->isForwardLabel());424 423 emitOpcode(op_jmp); 425 424 instructions().append(target->offsetFrom(instructions().size())); … … 438 437 if (cond->index() == dstIndex) { 439 438 rewindBinaryOp(); 440 emitOpcode( target->isForwardLabel() ? op_jless : op_loop_if_less);439 emitOpcode(op_jless); 441 440 instructions().append(src1Index); 442 441 instructions().append(src2Index); … … 451 450 PassRefPtr<LabelID> CodeGenerator::emitJumpIfTrue(RegisterID* cond, LabelID* target) 452 451 { 453 emitOpcode( target->isForwardLabel() ? op_jtrue : op_loop_if_true);452 emitOpcode(op_jtrue); 454 453 instructions().append(cond->index()); 455 454 instructions().append(target->offsetFrom(instructions().size())); … … 459 458 PassRefPtr<LabelID> CodeGenerator::emitJumpIfFalse(RegisterID* cond, LabelID* target) 460 459 { 461 ASSERT(target->isForwardLabel());462 460 emitOpcode(op_jfalse); 463 461 instructions().append(cond->index()); … … 1034 1032 { 1035 1033 ASSERT(scopeDepth() - targetScopeDepth >= 0); 1036 ASSERT(target->isForwardLabel());1037 1034 1038 1035 size_t scopeDelta = scopeDepth() - targetScopeDepth; -
trunk/JavaScriptCore/VM/LabelID.h
r34777 r34781 99 99 } 100 100 101 bool isForwardLabel() { return m_location == invalidLocation; }102 101 private: 103 102 typedef Vector<int, 8> JumpVector; -
trunk/JavaScriptCore/VM/Machine.cpp
r34777 r34781 896 896 JSValue** k = codeBlock->jsValues.data(); 897 897 Profiler** enabledProfilerReference = Profiler::enabledProfilerReference(); 898 898 899 899 registerFile->setSafeForReentry(false); 900 900 #define VM_CHECK_EXCEPTION() \ … … 909 909 OpcodeStats::resetLastInstruction(); 910 910 #endif 911 912 #define CHECK_FOR_TIMEOUT() 913 911 914 912 #if HAVE(COMPUTED_GOTO) 915 913 #define NEXT_OPCODE goto *vPC->u.opcode … … 1890 1888 NEXT_OPCODE; 1891 1889 } 1892 BEGIN_OPCODE(op_loop_if_true) {1893 /* loop_if_true cond(r) target(offset)1894 1895 Jumps to offset target from the current instruction, if and1896 only if register cond converts to boolean as true.1897 1898 Additionally this loop instruction may terminate JS execution is1899 the JS timeout is reached.1900 */1901 int cond = (++vPC)->u.operand;1902 int target = (++vPC)->u.operand;1903 if (r[cond].u.jsValue->toBoolean(exec)) {1904 vPC += target;1905 CHECK_FOR_TIMEOUT();1906 NEXT_OPCODE;1907 }1908 1909 ++vPC;1910 NEXT_OPCODE;1911 }1912 1890 BEGIN_OPCODE(op_jtrue) { 1913 1891 /* jtrue cond(r) target(offset) … … 1939 1917 } 1940 1918 1941 ++vPC;1942 NEXT_OPCODE;1943 }1944 BEGIN_OPCODE(op_loop_if_less) {1945 /* loop_if_less src1(r) src2(r) target(offset)1946 1947 Checks whether register src1 is less than register src2, as1948 with the ECMAScript '<' operator, and then jumps to offset1949 target from the current instruction, if and only if the1950 result of the comparison is true.1951 1952 Additionally this loop instruction may terminate JS execution is1953 the JS timeout is reached.1954 */1955 JSValue* src1 = r[(++vPC)->u.operand].u.jsValue;1956 JSValue* src2 = r[(++vPC)->u.operand].u.jsValue;1957 int target = (++vPC)->u.operand;1958 1959 bool result = jsLess(exec, src1, src2);1960 VM_CHECK_EXCEPTION();1961 1962 if (result) {1963 vPC += target;1964 CHECK_FOR_TIMEOUT();1965 NEXT_OPCODE;1966 }1967 1968 1919 ++vPC; 1969 1920 NEXT_OPCODE; -
trunk/JavaScriptCore/VM/Machine.h
r34777 r34781 128 128 129 129 int m_reentryDepth; 130 131 130 #if HAVE(COMPUTED_GOTO) 132 131 Opcode m_opcodeTable[numOpcodeIDs]; // Maps OpcodeID => Opcode for compiling -
trunk/JavaScriptCore/VM/Opcode.h
r34777 r34781 98 98 macro(op_jless) \ 99 99 macro(op_jmp_scopes) \ 100 macro(op_loop_if_true) \101 macro(op_loop_if_less) \102 100 \ 103 101 macro(op_new_func) \
Note:
See TracChangeset
for help on using the changeset viewer.