Changeset 38930 in webkit for trunk/JavaScriptCore
- Timestamp:
- Dec 2, 2008, 10:13:58 PM (16 years ago)
- Location:
- trunk/JavaScriptCore
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/ChangeLog
r38929 r38930 1 2008-12-02 Cameron Zwarich <[email protected]> 2 3 Reviewed by Geoff Garen. 4 5 Bug 22504: Crashes during code generation occur due to refing of ignoredResult() 6 <https://bugs.webkit.org/show_bug.cgi?id=22504> 7 8 Since ignoredResult() was implemented by casting 1 to a RegisterID*, any 9 attempt to ref ignoredResult() results in a crash. This will occur in 10 code generation of a function body where a node emits another node with 11 the dst that was passed to it, and then refs the returned RegisterID*. 12 13 To fix this problem, make ignoredResult() a member function of 14 BytecodeGenerator that simply returns a pointe to a fixed RegisterID 15 member of BytecodeGenerator. 16 17 * bytecompiler/BytecodeGenerator.h: 18 (JSC::BytecodeGenerator::ignoredResult): 19 * bytecompiler/RegisterID.h: 20 * parser/Nodes.cpp: 21 (JSC::NullNode::emitBytecode): 22 (JSC::BooleanNode::emitBytecode): 23 (JSC::NumberNode::emitBytecode): 24 (JSC::StringNode::emitBytecode): 25 (JSC::RegExpNode::emitBytecode): 26 (JSC::ThisNode::emitBytecode): 27 (JSC::ResolveNode::emitBytecode): 28 (JSC::ObjectLiteralNode::emitBytecode): 29 (JSC::PostfixResolveNode::emitBytecode): 30 (JSC::PostfixBracketNode::emitBytecode): 31 (JSC::PostfixDotNode::emitBytecode): 32 (JSC::DeleteValueNode::emitBytecode): 33 (JSC::VoidNode::emitBytecode): 34 (JSC::TypeOfResolveNode::emitBytecode): 35 (JSC::TypeOfValueNode::emitBytecode): 36 (JSC::PrefixResolveNode::emitBytecode): 37 (JSC::AssignResolveNode::emitBytecode): 38 (JSC::CommaNode::emitBytecode): 39 (JSC::ForNode::emitBytecode): 40 (JSC::ForInNode::emitBytecode): 41 (JSC::ReturnNode::emitBytecode): 42 (JSC::ThrowNode::emitBytecode): 43 (JSC::FunctionBodyNode::emitBytecode): 44 (JSC::FuncDeclNode::emitBytecode): 45 1 46 2008-12-02 Geoffrey Garen <[email protected]> 2 47 -
trunk/JavaScriptCore/bytecompiler/BytecodeGenerator.h
r38917 r38930 119 119 // Functions for handling of dst register 120 120 121 RegisterID* ignoredResult() { return &m_ignoredResultRegister; } 122 121 123 // Returns a place to write intermediate values of an operation 122 124 // which reuses dst if it is safe to do so. … … 416 418 417 419 HashSet<RefPtr<UString::Rep>, IdentifierRepHash> m_functions; 420 RegisterID m_ignoredResultRegister; 418 421 RegisterID m_thisRegister; 419 422 RegisterID m_argumentsRegister; -
trunk/JavaScriptCore/bytecompiler/RegisterID.h
r38494 r38930 108 108 }; 109 109 110 inline RegisterID* ignoredResult() { return reinterpret_cast<RegisterID*>(1); }111 112 110 } // namespace JSC 113 111 -
trunk/JavaScriptCore/parser/Nodes.cpp
r38917 r38930 277 277 RegisterID* NullNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) 278 278 { 279 if (dst == ignoredResult())279 if (dst == generator.ignoredResult()) 280 280 return 0; 281 281 return generator.emitLoad(dst, jsNull()); … … 286 286 RegisterID* BooleanNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) 287 287 { 288 if (dst == ignoredResult())288 if (dst == generator.ignoredResult()) 289 289 return 0; 290 290 return generator.emitLoad(dst, m_value); … … 295 295 RegisterID* NumberNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) 296 296 { 297 if (dst == ignoredResult())297 if (dst == generator.ignoredResult()) 298 298 return 0; 299 299 return generator.emitLoad(dst, m_double); … … 304 304 RegisterID* StringNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) 305 305 { 306 if (dst == ignoredResult())306 if (dst == generator.ignoredResult()) 307 307 return 0; 308 308 return generator.emitLoad(dst, m_value); … … 316 316 if (!regExp->isValid()) 317 317 return emitThrowError(generator, SyntaxError, ("Invalid regular expression: " + UString(regExp->errorMessage())).UTF8String().c_str()); 318 if (dst == ignoredResult())318 if (dst == generator.ignoredResult()) 319 319 return 0; 320 320 return generator.emitNewRegExp(generator.finalDestination(dst), regExp.get()); … … 325 325 RegisterID* ThisNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) 326 326 { 327 if (dst == ignoredResult())327 if (dst == generator.ignoredResult()) 328 328 return 0; 329 329 return generator.moveToDestinationIfNeeded(dst, generator.thisRegister()); … … 340 340 { 341 341 if (RegisterID* local = generator.registerFor(m_ident)) { 342 if (dst == ignoredResult())342 if (dst == generator.ignoredResult()) 343 343 return 0; 344 344 return generator.moveToDestinationIfNeeded(dst, local); … … 432 432 { 433 433 if (!m_list) { 434 if (dst == ignoredResult())434 if (dst == generator.ignoredResult()) 435 435 return 0; 436 436 return generator.emitNewObject(generator.finalDestination(dst)); … … 710 710 if (RegisterID* local = generator.registerFor(m_ident)) { 711 711 if (generator.isLocalConstant(m_ident)) { 712 if (dst == ignoredResult())712 if (dst == generator.ignoredResult()) 713 713 return 0; 714 714 return generator.emitToJSNumber(generator.finalDestination(dst), local); 715 715 } 716 716 717 if (dst == ignoredResult())717 if (dst == generator.ignoredResult()) 718 718 return emitPreIncOrDec(generator, local, m_operator); 719 719 return emitPostIncOrDec(generator, generator.finalDestination(dst), local, m_operator); … … 726 726 RefPtr<RegisterID> value = generator.emitGetScopedVar(generator.newTemporary(), depth, index, globalObject); 727 727 RegisterID* oldValue; 728 if (dst == ignoredResult()) {728 if (dst == generator.ignoredResult()) { 729 729 oldValue = 0; 730 730 emitPreIncOrDec(generator, value.get(), m_operator); … … 740 740 RefPtr<RegisterID> base = generator.emitResolveWithBase(generator.newTemporary(), value.get(), m_ident); 741 741 RegisterID* oldValue; 742 if (dst == ignoredResult()) {742 if (dst == generator.ignoredResult()) { 743 743 oldValue = 0; 744 744 emitPreIncOrDec(generator, value.get(), m_operator); … … 771 771 RefPtr<RegisterID> value = generator.emitGetByVal(generator.newTemporary(), base.get(), property.get()); 772 772 RegisterID* oldValue; 773 if (dst == ignoredResult()) {773 if (dst == generator.ignoredResult()) { 774 774 oldValue = 0; 775 775 if (m_operator == OpPlusPlus) … … 804 804 RefPtr<RegisterID> value = generator.emitGetById(generator.newTemporary(), base.get(), m_ident); 805 805 RegisterID* oldValue; 806 if (dst == ignoredResult()) {806 if (dst == generator.ignoredResult()) { 807 807 oldValue = 0; 808 808 if (m_operator == OpPlusPlus) … … 903 903 RegisterID* DeleteValueNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) 904 904 { 905 generator.emitNode( ignoredResult(), m_expr.get());905 generator.emitNode(generator.ignoredResult(), m_expr.get()); 906 906 907 907 // delete on a non-location expression ignores the value and returns true … … 923 923 RegisterID* VoidNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) 924 924 { 925 if (dst == ignoredResult()) {926 generator.emitNode( ignoredResult(), m_expr.get());925 if (dst == generator.ignoredResult()) { 926 generator.emitNode(generator.ignoredResult(), m_expr.get()); 927 927 return 0; 928 928 } … … 936 936 { 937 937 if (RegisterID* local = generator.registerFor(m_ident)) { 938 if (dst == ignoredResult())938 if (dst == generator.ignoredResult()) 939 939 return 0; 940 940 return generator.emitTypeOf(generator.finalDestination(dst), local); … … 943 943 RefPtr<RegisterID> scratch = generator.emitResolveBase(generator.tempDestination(dst), m_ident); 944 944 generator.emitGetById(scratch.get(), scratch.get(), m_ident); 945 if (dst == ignoredResult())945 if (dst == generator.ignoredResult()) 946 946 return 0; 947 947 return generator.emitTypeOf(generator.finalDestination(dst, scratch.get()), scratch.get()); … … 962 962 RegisterID* TypeOfValueNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) 963 963 { 964 if (dst == ignoredResult()) {965 generator.emitNode( ignoredResult(), m_expr.get());964 if (dst == generator.ignoredResult()) { 965 generator.emitNode(generator.ignoredResult(), m_expr.get()); 966 966 return 0; 967 967 } … … 976 976 if (RegisterID* local = generator.registerFor(m_ident)) { 977 977 if (generator.isLocalConstant(m_ident)) { 978 if (dst == ignoredResult())978 if (dst == generator.ignoredResult()) 979 979 return 0; 980 980 RefPtr<RegisterID> r0 = generator.emitUnexpectedLoad(generator.finalDestination(dst), (m_operator == OpPlusPlus) ? 1.0 : -1.0); … … 1360 1360 JSObject* globalObject = 0; 1361 1361 if (generator.findScopedProperty(m_ident, index, depth, true, globalObject) && index != missingSymbolMarker()) { 1362 if (dst == ignoredResult())1362 if (dst == generator.ignoredResult()) 1363 1363 dst = 0; 1364 1364 RegisterID* value = generator.emitNode(dst, m_right.get()); … … 1368 1368 1369 1369 RefPtr<RegisterID> base = generator.emitResolveBase(generator.newTemporary(), m_ident); 1370 if (dst == ignoredResult())1370 if (dst == generator.ignoredResult()) 1371 1371 dst = 0; 1372 1372 RegisterID* value = generator.emitNode(dst, m_right.get()); … … 1513 1513 RegisterID* CommaNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) 1514 1514 { 1515 generator.emitNode( ignoredResult(), m_expr1.get());1515 generator.emitNode(generator.ignoredResult(), m_expr1.get()); 1516 1516 return generator.emitNode(dst, m_expr2.get()); 1517 1517 } … … 1821 1821 RegisterID* ForNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) 1822 1822 { 1823 if (dst == ignoredResult())1823 if (dst == generator.ignoredResult()) 1824 1824 dst = 0; 1825 1825 … … 1829 1829 1830 1830 if (m_expr1) 1831 generator.emitNode( ignoredResult(), m_expr1.get());1831 generator.emitNode(generator.ignoredResult(), m_expr1.get()); 1832 1832 1833 1833 RefPtr<Label> condition = generator.newLabel(); … … 1843 1843 generator.emitLabel(scope->continueTarget()); 1844 1844 if (m_expr3) 1845 generator.emitNode( ignoredResult(), m_expr3.get());1845 generator.emitNode(generator.ignoredResult(), m_expr3.get()); 1846 1846 1847 1847 generator.emitLabel(condition.get()); … … 1909 1909 1910 1910 if (m_init) 1911 generator.emitNode( ignoredResult(), m_init.get());1911 generator.emitNode(generator.ignoredResult(), m_init.get()); 1912 1912 RegisterID* forInBase = generator.emitNode(m_expr.get()); 1913 1913 RefPtr<RegisterID> iter = generator.emitGetPropertyNames(generator.newTemporary(), forInBase); … … 2009 2009 return emitThrowError(generator, SyntaxError, "Invalid return statement."); 2010 2010 2011 if (dst == ignoredResult())2011 if (dst == generator.ignoredResult()) 2012 2012 dst = 0; 2013 2013 RegisterID* r0 = m_value ? generator.emitNode(dst, m_value.get()) : generator.emitLoad(dst, jsUndefined()); … … 2286 2286 RegisterID* ThrowNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) 2287 2287 { 2288 if (dst == ignoredResult())2288 if (dst == generator.ignoredResult()) 2289 2289 dst = 0; 2290 2290 RefPtr<RegisterID> expr = generator.emitNode(dst, m_expr.get()); … … 2559 2559 { 2560 2560 generator.emitDebugHook(DidEnterCallFrame, firstLine(), lastLine()); 2561 statementListEmitCode(children(), generator, ignoredResult());2561 statementListEmitCode(children(), generator, generator.ignoredResult()); 2562 2562 if (!children().size() || !children().last()->isReturnNode()) { 2563 2563 RegisterID* r0 = generator.emitLoad(0, jsUndefined()); … … 2631 2631 } 2632 2632 2633 RegisterID* FuncDeclNode::emitBytecode(BytecodeGenerator& , RegisterID* dst)2634 { 2635 if (dst == ignoredResult())2633 RegisterID* FuncDeclNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) 2634 { 2635 if (dst == generator.ignoredResult()) 2636 2636 dst = 0; 2637 2637 return dst;
Note:
See TracChangeset
for help on using the changeset viewer.