Changeset 38249 in webkit for trunk/JavaScriptCore
- Timestamp:
- Nov 9, 2008, 5:28:10 PM (17 years ago)
- Location:
- trunk/JavaScriptCore
- Files:
-
- 1 deleted
- 15 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/AllInOneFile.cpp
r38225 r38249 77 77 #include "runtime/NumberPrototype.cpp" 78 78 #include "parser/Nodes.cpp" 79 #include "parser/nodes2string.cpp"80 79 #include "runtime/JSObject.cpp" 81 80 #include "runtime/Error.cpp" -
trunk/JavaScriptCore/ChangeLog
r38247 r38249 1 2008-11-09 Darin Adler <[email protected]> 2 3 Reviewed by Tim Hatcher. 4 5 - https://bugs.webkit.org/show_bug.cgi?id=22149 6 remove unused code from the parser 7 8 * AllInOneFile.cpp: Removed nodes2string.cpp. 9 * GNUmakefile.am: Ditto. 10 * JavaScriptCore.exp: Ditto. 11 * JavaScriptCore.pri: Ditto. 12 * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Ditto. 13 * JavaScriptCore.xcodeproj/project.pbxproj: Ditto. 14 * JavaScriptCoreSources.bkl: Ditto. 15 16 * VM/CodeBlock.h: Added include. 17 18 * VM/Machine.cpp: (JSC::Machine::execute): Use the types from 19 DeclarationStacks as DeclarationStacks:: rather than Node:: since 20 "Node" really has little to do with it. 21 * bytecompiler/CodeGenerator.cpp: 22 (JSC::CodeGenerator::CodeGenerator): Ditto. 23 24 * jsc.cpp: 25 (Options::Options): Removed prettyPrint option. 26 (runWithScripts): Ditto. 27 (printUsageStatement): Ditto. 28 (parseArguments): Ditto. 29 (jscmain): Ditto. 30 31 * parser/Grammar.y: Removed use of obsolete ImmediateNumberNode. 32 33 * parser/Nodes.cpp: 34 (JSC::ThrowableExpressionData::emitThrowError): Use inline functions 35 instead of direct member access for ThrowableExpressionData values. 36 (JSC::BracketAccessorNode::emitCode): Ditto. 37 (JSC::DotAccessorNode::emitCode): Ditto. 38 (JSC::NewExprNode::emitCode): Ditto. 39 (JSC::EvalFunctionCallNode::emitCode): Ditto. 40 (JSC::FunctionCallValueNode::emitCode): Ditto. 41 (JSC::FunctionCallResolveNode::emitCode): Ditto. 42 (JSC::FunctionCallBracketNode::emitCode): Ditto. 43 (JSC::FunctionCallDotNode::emitCode): Ditto. 44 (JSC::PostfixResolveNode::emitCode): Ditto. 45 (JSC::PostfixBracketNode::emitCode): Ditto. 46 (JSC::PostfixDotNode::emitCode): Ditto. 47 (JSC::DeleteResolveNode::emitCode): Ditto. 48 (JSC::DeleteBracketNode::emitCode): Ditto. 49 (JSC::DeleteDotNode::emitCode): Ditto. 50 (JSC::PrefixResolveNode::emitCode): Ditto. 51 (JSC::PrefixBracketNode::emitCode): Ditto. 52 (JSC::PrefixDotNode::emitCode): Ditto. 53 (JSC::ThrowableBinaryOpNode::emitCode): Ditto. 54 (JSC::InstanceOfNode::emitCode): Ditto. 55 (JSC::ReadModifyResolveNode::emitCode): Ditto. 56 (JSC::AssignResolveNode::emitCode): Ditto. 57 (JSC::AssignDotNode::emitCode): Ditto. 58 (JSC::ReadModifyDotNode::emitCode): Ditto. 59 (JSC::AssignBracketNode::emitCode): Ditto. 60 (JSC::ReadModifyBracketNode::emitCode): Ditto. 61 (JSC::statementListEmitCode): Take a const StatementVector instead 62 of a non-const one. Also removed unused statementListPushFIFO. 63 (JSC::ForInNode::emitCode): Inline functions instead of member access. 64 (JSC::ThrowNode::emitCode): Ditto. 65 (JSC::EvalNode::emitCode): Ditto. 66 (JSC::FunctionBodyNode::emitCode): Ditto. 67 (JSC::ProgramNode::emitCode): Ditto. 68 69 * parser/Nodes.h: Removed unused includes and forward declarations. 70 Removed Precedence enum. Made many more members private instead of 71 protected or public. Removed unused NodeStack typedef. Moved the 72 VarStack and FunctionStack typedefs from Node to ScopeNode. Made 73 Node::emitCode pure virtual and changed classes that don't emit 74 any code to inherit from ParserRefCounted rather than Node. 75 Moved isReturnNode from Node to StatementNode. Removed the 76 streamTo, precedence, and needsParensIfLeftmost functions from 77 all classes. Removed the ImmediateNumberNode class and make 78 NumberNode::setValue nonvirtual. 79 80 * parser/nodes2string.cpp: Removed. 81 1 82 2008-11-09 Darin Adler <[email protected]> 2 83 -
trunk/JavaScriptCore/GNUmakefile.am
r38228 r38249 334 334 JavaScriptCore/runtime/Lookup.cpp \ 335 335 JavaScriptCore/parser/Nodes.cpp \ 336 JavaScriptCore/parser/nodes2string.cpp \337 336 JavaScriptCore/runtime/Operations.cpp \ 338 337 JavaScriptCore/runtime/RegExp.cpp \ -
trunk/JavaScriptCore/JavaScriptCore.exp
r38101 r38249 315 315 __ZNK3JSC17DebuggerCallFrame4typeEv 316 316 __ZNK3JSC17DebuggerCallFrame8evaluateERKNS_7UStringERPNS_7JSValueE 317 __ZNK3JSC4Node8toStringEv318 317 __ZNK3JSC6JSCell12toThisObjectEPNS_9ExecStateE 319 318 __ZNK3JSC6JSCell12toThisStringEPNS_9ExecStateE -
trunk/JavaScriptCore/JavaScriptCore.pri
r38205 r38249 114 114 runtime/NativeErrorPrototype.cpp \ 115 115 parser/Nodes.cpp \ 116 parser/nodes2string.cpp \117 116 runtime/NumberConstructor.cpp \ 118 117 runtime/NumberObject.cpp \ -
trunk/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj
r38226 r38249 1215 1215 </File> 1216 1216 <File 1217 RelativePath="..\..\parser\nodes2string.cpp"1218 >1219 </File>1220 <File1221 1217 RelativePath="..\..\parser\Parser.cpp" 1222 1218 > -
trunk/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj
r38205 r38249 710 710 F5BB2BC5030F772101FCFE1D /* Completion.h */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = Completion.h; sourceTree = "<group>"; tabWidth = 8; }; 711 711 F5C290E60284F98E018635CA /* JavaScriptCorePrefix.h */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = JavaScriptCorePrefix.h; sourceTree = "<group>"; tabWidth = 8; }; 712 F5FFE656026B47A6018635CA /* nodes2string.cpp */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.cpp.cpp; path = nodes2string.cpp; sourceTree = "<group>"; tabWidth = 8; };713 712 F68EBB8C0255D4C601FF60F7 /* config.h */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = config.h; sourceTree = "<group>"; tabWidth = 8; }; 714 713 F692A84D0255597D01FF60F7 /* ArrayPrototype.cpp */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ArrayPrototype.cpp; sourceTree = "<group>"; tabWidth = 8; }; … … 1109 1108 F692A86D0255597D01FF60F7 /* Nodes.cpp */, 1110 1109 F692A86E0255597D01FF60F7 /* Nodes.h */, 1111 F5FFE656026B47A6018635CA /* nodes2string.cpp */,1112 1110 93F0B3A909BB4DC00068FCE3 /* Parser.cpp */, 1113 1111 93F0B3AA09BB4DC00068FCE3 /* Parser.h */, -
trunk/JavaScriptCore/JavaScriptCoreSources.bkl
r38238 r38249 63 63 parser/Lexer.cpp 64 64 parser/Nodes.cpp 65 parser/nodes2string.cpp66 65 parser/Parser.cpp 67 66 </set> -
trunk/JavaScriptCore/VM/CodeBlock.h
r38229 r38249 35 35 #include "Nodes.h" 36 36 #include "Parser.h" 37 #include "RegExp.h" 37 38 #include "SourceCode.h" 38 39 #include "UString.h" -
trunk/JavaScriptCore/VM/Machine.cpp
r38209 r38249 1043 1043 BatchedTransitionOptimizer optimizer(variableObject); 1044 1044 1045 const Node::VarStack& varStack = codeBlock->ownerNode->varStack();1046 Node::VarStack::const_iterator varStackEnd = varStack.end();1047 for ( Node::VarStack::const_iterator it = varStack.begin(); it != varStackEnd; ++it) {1045 const DeclarationStacks::VarStack& varStack = codeBlock->ownerNode->varStack(); 1046 DeclarationStacks::VarStack::const_iterator varStackEnd = varStack.end(); 1047 for (DeclarationStacks::VarStack::const_iterator it = varStack.begin(); it != varStackEnd; ++it) { 1048 1048 const Identifier& ident = (*it).first; 1049 1049 if (!variableObject->hasProperty(callFrame, ident)) { … … 1053 1053 } 1054 1054 1055 const Node::FunctionStack& functionStack = codeBlock->ownerNode->functionStack();1056 Node::FunctionStack::const_iterator functionStackEnd = functionStack.end();1057 for ( Node::FunctionStack::const_iterator it = functionStack.begin(); it != functionStackEnd; ++it) {1055 const DeclarationStacks::FunctionStack& functionStack = codeBlock->ownerNode->functionStack(); 1056 DeclarationStacks::FunctionStack::const_iterator functionStackEnd = functionStack.end(); 1057 for (DeclarationStacks::FunctionStack::const_iterator it = functionStack.begin(); it != functionStackEnd; ++it) { 1058 1058 PutPropertySlot slot; 1059 1059 variableObject->put(callFrame, (*it)->m_ident, (*it)->makeFunction(callFrame, scopeChain), slot); -
trunk/JavaScriptCore/bytecompiler/CodeGenerator.cpp
r38247 r38249 310 310 emitOpcode(op_create_arguments); 311 311 312 const Node::FunctionStack& functionStack = functionBody->functionStack();312 const DeclarationStacks::FunctionStack& functionStack = functionBody->functionStack(); 313 313 for (size_t i = 0; i < functionStack.size(); ++i) { 314 314 FuncDeclNode* funcDecl = functionStack[i].get(); … … 318 318 } 319 319 320 const Node::VarStack& varStack = functionBody->varStack();320 const DeclarationStacks::VarStack& varStack = functionBody->varStack(); 321 321 for (size_t i = 0; i < varStack.size(); ++i) 322 322 addVar(varStack[i].first, varStack[i].second & DeclarationStacks::IsConstant); -
trunk/JavaScriptCore/jsc.cpp
r38162 r38249 79 79 Options() 80 80 : interactive(false) 81 , prettyPrint(false)82 81 , dump(false) 83 82 { … … 85 84 86 85 bool interactive; 87 bool prettyPrint;88 86 bool dump; 89 87 Vector<UString> fileNames; … … 300 298 } 301 299 302 static bool prettyPrintScript(ExecState* exec, const UString& fileName, const Vector<char>& script) 303 { 304 int errLine = 0; 305 UString errMsg; 306 RefPtr<ProgramNode> programNode = exec->globalData().parser->parse<ProgramNode>(exec, exec->dynamicGlobalObject()->debugger(), makeSource(script.data(), fileName), &errLine, &errMsg); 307 if (!programNode) { 308 fprintf(stderr, "%s:%d: %s.\n", fileName.UTF8String().c_str(), errLine, errMsg.UTF8String().c_str()); 309 return false; 310 } 311 312 printf("%s\n", programNode->toString().UTF8String().c_str()); 313 return true; 314 } 315 316 static bool runWithScripts(GlobalObject* globalObject, const Vector<UString>& fileNames, bool prettyPrint, bool dump) 300 static bool runWithScripts(GlobalObject* globalObject, const Vector<UString>& fileNames, bool dump) 317 301 { 318 302 Vector<char> script; … … 333 317 return false; // fail early so we can catch missing files 334 318 335 if (prettyPrint)336 prettyPrintScript(globalObject->globalExec(), fileName, script);337 else {338 319 #if ENABLE(OPCODE_SAMPLING) 339 340 #endif 341 342 343 344 345 346 347 348 349 350 320 machine->sampler()->start(); 321 #endif 322 Completion completion = Interpreter::evaluate(globalObject->globalExec(), globalObject->globalScopeChain(), makeSource(script.data(), fileName)); 323 success = success && completion.complType() != Throw; 324 if (dump) { 325 if (completion.complType() == Throw) 326 printf("Exception: %s\n", completion.value()->toString(globalObject->globalExec()).ascii()); 327 else 328 printf("End: %s\n", completion.value()->toString(globalObject->globalExec()).ascii()); 329 } 330 331 globalObject->globalExec()->clearException(); 351 332 352 333 #if ENABLE(OPCODE_SAMPLING) 353 machine->sampler()->stop(); 354 #endif 355 } 334 machine->sampler()->stop(); 335 #endif 356 336 } 357 337 … … 404 384 fprintf(stderr, " -h|--help Prints this help message\n"); 405 385 fprintf(stderr, " -i Enables interactive mode (default if no files are specified)\n"); 406 fprintf(stderr, " -p Prints formatted source code\n");407 386 fprintf(stderr, " -s Installs signal handlers that exit on a crash (Unix platforms only)\n"); 408 387 exit(-1); … … 427 406 continue; 428 407 } 429 if (strcmp(arg, "-p") == 0) {430 options.prettyPrint = true;431 continue;432 }433 408 if (strcmp(arg, "-d") == 0) { 434 409 options.dump = true; … … 468 443 469 444 GlobalObject* globalObject = new (globalData) GlobalObject(options.arguments); 470 bool success = runWithScripts(globalObject, options.fileNames, options. prettyPrint, options.dump);445 bool success = runWithScripts(globalObject, options.fileNames, options.dump); 471 446 if (options.interactive && success) 472 447 runInteractive(globalObject); -
trunk/JavaScriptCore/parser/Grammar.y
r38205 r38249 1409 1409 static NumberNode* makeNumberNode(void* globalPtr, double d) 1410 1410 { 1411 JSValue* value = JSImmediate::from(d);1412 if (value)1413 return new ImmediateNumberNode(GLOBAL_DATA, value, d);1414 1411 return new NumberNode(GLOBAL_DATA, d); 1415 1412 } -
trunk/JavaScriptCore/parser/Nodes.cpp
r38247 r38249 233 233 RegisterID* ThrowableExpressionData::emitThrowError(CodeGenerator& generator, ErrorType e, const char* msg) 234 234 { 235 generator.emitExpressionInfo( m_divot, m_startOffset, m_endOffset);235 generator.emitExpressionInfo(divot(), startOffset(), endOffset()); 236 236 RegisterID* exception = generator.emitNewError(generator.newTemporary(), e, jsString(generator.globalData(), msg)); 237 237 generator.emitThrow(exception); … … 243 243 UString message = msg; 244 244 substitute(message, label.ustring()); 245 generator.emitExpressionInfo( m_divot, m_startOffset, m_endOffset);245 generator.emitExpressionInfo(divot(), startOffset(), endOffset()); 246 246 RegisterID* exception = generator.emitNewError(generator.newTemporary(), e, jsString(generator.globalData(), message)); 247 247 generator.emitThrow(exception); … … 499 499 RefPtr<RegisterID> base = generator.emitNodeForLeftHandSide(m_base.get(), m_subscriptHasAssignments, m_subscript->isPure(generator)); 500 500 RegisterID* property = generator.emitNode(m_subscript.get()); 501 generator.emitExpressionInfo( m_divot, m_startOffset, m_endOffset);501 generator.emitExpressionInfo(divot(), startOffset(), endOffset()); 502 502 return generator.emitGetByVal(generator.finalDestination(dst), base.get(), property); 503 503 } … … 518 518 { 519 519 RegisterID* base = generator.emitNode(m_base.get()); 520 generator.emitExpressionInfo( m_divot, m_startOffset, m_endOffset);520 generator.emitExpressionInfo(divot(), startOffset(), endOffset()); 521 521 return generator.emitGetById(generator.finalDestination(dst), base, m_ident); 522 522 } … … 569 569 { 570 570 RefPtr<RegisterID> func = generator.emitNode(m_expr.get()); 571 return generator.emitConstruct(generator.finalDestination(dst), func.get(), m_args.get(), m_divot, m_startOffset, m_endOffset);571 return generator.emitConstruct(generator.finalDestination(dst), func.get(), m_args.get(), divot(), startOffset(), endOffset()); 572 572 } 573 573 … … 589 589 RefPtr<RegisterID> func = generator.newTemporary(); 590 590 generator.emitResolveWithBase(base.get(), func.get(), generator.propertyNames().eval); 591 return generator.emitCallEval(generator.finalDestination(dst, base.get()), func.get(), base.get(), m_args.get(), m_divot, m_startOffset, m_endOffset);591 return generator.emitCallEval(generator.finalDestination(dst, base.get()), func.get(), base.get(), m_args.get(), divot(), startOffset(), endOffset()); 592 592 } 593 593 … … 608 608 { 609 609 RefPtr<RegisterID> func = generator.emitNode(m_expr.get()); 610 return generator.emitCall(generator.finalDestination(dst), func.get(), 0, m_args.get(), m_divot, m_startOffset, m_endOffset);610 return generator.emitCall(generator.finalDestination(dst), func.get(), 0, m_args.get(), divot(), startOffset(), endOffset()); 611 611 } 612 612 … … 626 626 { 627 627 if (RefPtr<RegisterID> local = generator.registerFor(m_ident)) 628 return generator.emitCall(generator.finalDestination(dst), local.get(), 0, m_args.get(), m_divot, m_startOffset, m_endOffset);628 return generator.emitCall(generator.finalDestination(dst), local.get(), 0, m_args.get(), divot(), startOffset(), endOffset()); 629 629 630 630 int index = 0; … … 633 633 if (generator.findScopedProperty(m_ident, index, depth, false, globalObject) && index != missingSymbolMarker()) { 634 634 RefPtr<RegisterID> func = generator.emitGetScopedVar(generator.newTemporary(), depth, index, globalObject); 635 return generator.emitCall(generator.finalDestination(dst), func.get(), 0, m_args.get(), m_divot, m_startOffset, m_endOffset);635 return generator.emitCall(generator.finalDestination(dst), func.get(), 0, m_args.get(), divot(), startOffset(), endOffset()); 636 636 } 637 637 638 638 RefPtr<RegisterID> base = generator.tempDestination(dst); 639 639 RefPtr<RegisterID> func = generator.newTemporary(); 640 int identifierStart = m_divot - m_startOffset;640 int identifierStart = divot() - startOffset(); 641 641 generator.emitExpressionInfo(identifierStart + m_ident.size(), m_ident.size(), 0); 642 642 generator.emitResolveFunction(base.get(), func.get(), m_ident); 643 return generator.emitCall(generator.finalDestination(dst, base.get()), func.get(), base.get(), m_args.get(), m_divot, m_startOffset, m_endOffset);643 return generator.emitCall(generator.finalDestination(dst, base.get()), func.get(), base.get(), m_args.get(), divot(), startOffset(), endOffset()); 644 644 } 645 645 … … 662 662 RefPtr<RegisterID> base = generator.emitNode(m_base.get()); 663 663 RegisterID* property = generator.emitNode(m_subscript.get()); 664 generator.emitExpressionInfo( m_divot - m_subexpressionDivotOffset, m_startOffset- m_subexpressionDivotOffset, m_subexpressionEndOffset);664 generator.emitExpressionInfo(divot() - m_subexpressionDivotOffset, startOffset() - m_subexpressionDivotOffset, m_subexpressionEndOffset); 665 665 RefPtr<RegisterID> function = generator.emitGetByVal(generator.newTemporary(), base.get(), property); 666 return generator.emitCall(generator.finalDestination(dst, base.get()), function.get(), base.get(), m_args.get(), m_divot, m_startOffset, m_endOffset);666 return generator.emitCall(generator.finalDestination(dst, base.get()), function.get(), base.get(), m_args.get(), divot(), startOffset(), endOffset()); 667 667 } 668 668 … … 683 683 { 684 684 RefPtr<RegisterID> base = generator.emitNode(m_base.get()); 685 generator.emitExpressionInfo( m_divot - m_subexpressionDivotOffset, m_startOffset- m_subexpressionDivotOffset, m_subexpressionEndOffset);685 generator.emitExpressionInfo(divot() - m_subexpressionDivotOffset, startOffset() - m_subexpressionDivotOffset, m_subexpressionEndOffset); 686 686 RefPtr<RegisterID> function = generator.emitGetById(generator.newTemporary(), base.get(), m_ident); 687 return generator.emitCall(generator.finalDestination(dst, base.get()), function.get(), base.get(), m_args.get(), m_divot, m_startOffset, m_endOffset);687 return generator.emitCall(generator.finalDestination(dst, base.get()), function.get(), base.get(), m_args.get(), divot(), startOffset(), endOffset()); 688 688 } 689 689 … … 730 730 } 731 731 732 generator.emitExpressionInfo( m_divot, m_startOffset, m_endOffset);732 generator.emitExpressionInfo(divot(), startOffset(), endOffset()); 733 733 RefPtr<RegisterID> value = generator.newTemporary(); 734 734 RefPtr<RegisterID> base = generator.emitResolveWithBase(generator.newTemporary(), value.get(), m_ident); … … 762 762 RefPtr<RegisterID> property = generator.emitNode(m_subscript.get()); 763 763 764 generator.emitExpressionInfo( m_divot - m_subexpressionDivotOffset, m_startOffset- m_subexpressionDivotOffset, m_subexpressionEndOffset);764 generator.emitExpressionInfo(divot() - m_subexpressionDivotOffset, startOffset() - m_subexpressionDivotOffset, m_subexpressionEndOffset); 765 765 RefPtr<RegisterID> value = generator.emitGetByVal(generator.newTemporary(), base.get(), property.get()); 766 766 RegisterID* oldValue; … … 774 774 oldValue = (m_operator == OpPlusPlus) ? generator.emitPostInc(generator.finalDestination(dst), value.get()) : generator.emitPostDec(generator.finalDestination(dst), value.get()); 775 775 } 776 generator.emitExpressionInfo( m_divot, m_startOffset, m_endOffset);776 generator.emitExpressionInfo(divot(), startOffset(), endOffset()); 777 777 generator.emitPutByVal(base.get(), property.get(), value.get()); 778 778 return oldValue; … … 795 795 RefPtr<RegisterID> base = generator.emitNode(m_base.get()); 796 796 797 generator.emitExpressionInfo( m_divot - m_subexpressionDivotOffset, m_startOffset- m_subexpressionDivotOffset, m_subexpressionEndOffset);797 generator.emitExpressionInfo(divot() - m_subexpressionDivotOffset, startOffset() - m_subexpressionDivotOffset, m_subexpressionEndOffset); 798 798 RefPtr<RegisterID> value = generator.emitGetById(generator.newTemporary(), base.get(), m_ident); 799 799 RegisterID* oldValue; … … 807 807 oldValue = (m_operator == OpPlusPlus) ? generator.emitPostInc(generator.finalDestination(dst), value.get()) : generator.emitPostDec(generator.finalDestination(dst), value.get()); 808 808 } 809 generator.emitExpressionInfo( m_divot, m_startOffset, m_endOffset);809 generator.emitExpressionInfo(divot(), startOffset(), endOffset()); 810 810 generator.emitPutById(base.get(), m_ident, value.get()); 811 811 return oldValue; … … 836 836 return generator.emitUnexpectedLoad(generator.finalDestination(dst), false); 837 837 838 generator.emitExpressionInfo( m_divot, m_startOffset, m_endOffset);838 generator.emitExpressionInfo(divot(), startOffset(), endOffset()); 839 839 RegisterID* base = generator.emitResolveBase(generator.tempDestination(dst), m_ident); 840 840 return generator.emitDeleteById(generator.finalDestination(dst, base), base, m_ident); … … 859 859 RegisterID* r1 = generator.emitNode(m_subscript.get()); 860 860 861 generator.emitExpressionInfo( m_divot, m_startOffset, m_endOffset);861 generator.emitExpressionInfo(divot(), startOffset(), endOffset()); 862 862 return generator.emitDeleteByVal(generator.finalDestination(dst), r0.get(), r1); 863 863 } … … 879 879 RegisterID* r0 = generator.emitNode(m_base.get()); 880 880 881 generator.emitExpressionInfo( m_divot, m_startOffset, m_endOffset);881 generator.emitExpressionInfo(divot(), startOffset(), endOffset()); 882 882 return generator.emitDeleteById(generator.finalDestination(dst), r0, m_ident); 883 883 } … … 990 990 } 991 991 992 generator.emitExpressionInfo( m_divot, m_startOffset, m_endOffset);992 generator.emitExpressionInfo(divot(), startOffset(), endOffset()); 993 993 RefPtr<RegisterID> propDst = generator.tempDestination(dst); 994 994 RefPtr<RegisterID> base = generator.emitResolveWithBase(generator.newTemporary(), propDst.get(), m_ident); … … 1017 1017 RefPtr<RegisterID> propDst = generator.tempDestination(dst); 1018 1018 1019 generator.emitExpressionInfo( m_divot + m_subexpressionDivotOffset, m_subexpressionStartOffset, m_endOffset- m_subexpressionDivotOffset);1019 generator.emitExpressionInfo(divot() + m_subexpressionDivotOffset, m_subexpressionStartOffset, endOffset() - m_subexpressionDivotOffset); 1020 1020 RegisterID* value = generator.emitGetByVal(propDst.get(), base.get(), property.get()); 1021 1021 if (m_operator == OpPlusPlus) … … 1023 1023 else 1024 1024 generator.emitPreDec(value); 1025 generator.emitExpressionInfo( m_divot, m_startOffset, m_endOffset);1025 generator.emitExpressionInfo(divot(), startOffset(), endOffset()); 1026 1026 generator.emitPutByVal(base.get(), property.get(), value); 1027 1027 return generator.moveToDestinationIfNeeded(dst, propDst.get()); … … 1045 1045 RefPtr<RegisterID> propDst = generator.tempDestination(dst); 1046 1046 1047 generator.emitExpressionInfo( m_divot + m_subexpressionDivotOffset, m_subexpressionStartOffset, m_endOffset- m_subexpressionDivotOffset);1047 generator.emitExpressionInfo(divot() + m_subexpressionDivotOffset, m_subexpressionStartOffset, endOffset() - m_subexpressionDivotOffset); 1048 1048 RegisterID* value = generator.emitGetById(propDst.get(), base.get(), m_ident); 1049 1049 if (m_operator == OpPlusPlus) … … 1051 1051 else 1052 1052 generator.emitPreDec(value); 1053 generator.emitExpressionInfo( m_divot, m_startOffset, m_endOffset);1053 generator.emitExpressionInfo(divot(), startOffset(), endOffset()); 1054 1054 generator.emitPutById(base.get(), m_ident, value); 1055 1055 return generator.moveToDestinationIfNeeded(dst, propDst.get()); … … 1149 1149 RefPtr<RegisterID> src1 = generator.emitNodeForLeftHandSide(m_expr1.get(), m_rightHasAssignments, m_expr2->isPure(generator)); 1150 1150 RegisterID* src2 = generator.emitNode(m_expr2.get()); 1151 generator.emitExpressionInfo( m_divot, m_startOffset, m_endOffset);1151 generator.emitExpressionInfo(divot(), startOffset(), endOffset()); 1152 1152 return generator.emitBinaryOp(opcode(), generator.finalDestination(dst, src1.get()), src1.get(), src2, OperandTypes(m_expr1->resultDescriptor(), m_expr2->resultDescriptor())); 1153 1153 } … … 1158 1158 RefPtr<RegisterID> src2 = generator.emitNode(m_expr2.get()); 1159 1159 1160 generator.emitExpressionInfo( m_divot, m_startOffset, m_endOffset);1160 generator.emitExpressionInfo(divot(), startOffset(), endOffset()); 1161 1161 RegisterID* src2Prototype = generator.emitGetById(generator.newTemporary(), src2.get(), generator.globalData()->propertyNames->prototype); 1162 1162 1163 generator.emitExpressionInfo( m_divot, m_startOffset, m_endOffset);1163 generator.emitExpressionInfo(divot(), startOffset(), endOffset()); 1164 1164 return generator.emitInstanceOf(generator.finalDestination(dst, src1.get()), src1.get(), src2.get(), src2Prototype); 1165 1165 } … … 1320 1320 1321 1321 RefPtr<RegisterID> src1 = generator.tempDestination(dst); 1322 generator.emitExpressionInfo( m_divot - m_startOffset+ m_ident.size(), m_ident.size(), 0);1322 generator.emitExpressionInfo(divot() - startOffset() + m_ident.size(), m_ident.size(), 0); 1323 1323 RefPtr<RegisterID> base = generator.emitResolveWithBase(generator.newTemporary(), src1.get(), m_ident); 1324 1324 RegisterID* src2 = generator.emitNode(m_right.get()); 1325 generator.emitExpressionInfo( m_divot, m_startOffset, m_endOffset);1325 generator.emitExpressionInfo(divot(), startOffset(), endOffset()); 1326 1326 RegisterID* result = emitReadModifyAssignment(generator, generator.finalDestination(dst, src1.get()), src1.get(), src2, m_operator, OperandTypes(ResultType::unknown(), m_right->resultDescriptor())); 1327 1327 return generator.emitPutById(base.get(), m_ident, result); … … 1365 1365 dst = 0; 1366 1366 RegisterID* value = generator.emitNode(dst, m_right.get()); 1367 generator.emitExpressionInfo( m_divot, m_startOffset, m_endOffset);1367 generator.emitExpressionInfo(divot(), startOffset(), endOffset()); 1368 1368 return generator.emitPutById(base.get(), m_ident, value); 1369 1369 } … … 1387 1387 RefPtr<RegisterID> value = generator.destinationForAssignResult(dst); 1388 1388 RegisterID* result = generator.emitNode(value.get(), m_right.get()); 1389 generator.emitExpressionInfo( m_divot, m_startOffset, m_endOffset);1389 generator.emitExpressionInfo(divot(), startOffset(), endOffset()); 1390 1390 generator.emitPutById(base.get(), m_ident, result); 1391 1391 return generator.moveToDestinationIfNeeded(dst, result); … … 1409 1409 RefPtr<RegisterID> base = generator.emitNodeForLeftHandSide(m_base.get(), m_rightHasAssignments, m_right->isPure(generator)); 1410 1410 1411 generator.emitExpressionInfo( m_divot - m_subexpressionDivotOffset, m_startOffset- m_subexpressionDivotOffset, m_subexpressionEndOffset);1411 generator.emitExpressionInfo(divot() - m_subexpressionDivotOffset, startOffset() - m_subexpressionDivotOffset, m_subexpressionEndOffset); 1412 1412 RefPtr<RegisterID> value = generator.emitGetById(generator.tempDestination(dst), base.get(), m_ident); 1413 1413 RegisterID* change = generator.emitNode(m_right.get()); 1414 1414 RegisterID* updatedValue = emitReadModifyAssignment(generator, generator.finalDestination(dst, value.get()), value.get(), change, m_operator, OperandTypes(ResultType::unknown(), m_right->resultDescriptor())); 1415 1415 1416 generator.emitExpressionInfo( m_divot, m_startOffset, m_endOffset);1416 generator.emitExpressionInfo(divot(), startOffset(), endOffset()); 1417 1417 return generator.emitPutById(base.get(), m_ident, updatedValue); 1418 1418 } … … 1457 1457 RegisterID* result = generator.emitNode(value.get(), m_right.get()); 1458 1458 1459 generator.emitExpressionInfo( m_divot, m_startOffset, m_endOffset);1459 generator.emitExpressionInfo(divot(), startOffset(), endOffset()); 1460 1460 generator.emitPutByVal(base.get(), property.get(), result); 1461 1461 return generator.moveToDestinationIfNeeded(dst, result); … … 1481 1481 RefPtr<RegisterID> property = generator.emitNodeForLeftHandSide(m_subscript.get(), m_rightHasAssignments, m_right->isPure(generator)); 1482 1482 1483 generator.emitExpressionInfo( m_divot - m_subexpressionDivotOffset, m_startOffset- m_subexpressionDivotOffset, m_subexpressionEndOffset);1483 generator.emitExpressionInfo(divot() - m_subexpressionDivotOffset, startOffset() - m_subexpressionDivotOffset, m_subexpressionEndOffset); 1484 1484 RefPtr<RegisterID> value = generator.emitGetByVal(generator.tempDestination(dst), base.get(), property.get()); 1485 1485 RegisterID* change = generator.emitNode(m_right.get()); 1486 1486 RegisterID* updatedValue = emitReadModifyAssignment(generator, generator.finalDestination(dst, value.get()), value.get(), change, m_operator, OperandTypes(ResultType::unknown(), m_right->resultDescriptor())); 1487 1487 1488 generator.emitExpressionInfo( m_divot, m_startOffset, m_endOffset);1488 generator.emitExpressionInfo(divot(), startOffset(), endOffset()); 1489 1489 generator.emitPutByVal(base.get(), property.get(), updatedValue); 1490 1490 … … 1575 1575 // ------------------------------ Helper functions for handling Vectors of StatementNode ------------------------------- 1576 1576 1577 static inline RegisterID* statementListEmitCode( StatementVector& statements, CodeGenerator& generator, RegisterID* dst)1578 { 1579 StatementVector:: iterator end = statements.end();1580 for (StatementVector:: iterator it = statements.begin(); it != end; ++it) {1577 static inline RegisterID* statementListEmitCode(const StatementVector& statements, CodeGenerator& generator, RegisterID* dst) 1578 { 1579 StatementVector::const_iterator end = statements.end(); 1580 for (StatementVector::const_iterator it = statements.begin(); it != end; ++it) { 1581 1581 StatementNode* n = it->get(); 1582 1582 if (!n->isLoop()) … … 1585 1585 } 1586 1586 return 0; 1587 }1588 1589 static inline void statementListPushFIFO(StatementVector& statements, DeclarationStacks::NodeStack& stack)1590 {1591 StatementVector::iterator it = statements.end();1592 StatementVector::iterator begin = statements.begin();1593 while (it != begin) {1594 --it;1595 stack.append((*it).get());1596 }1597 1587 } 1598 1588 … … 1930 1920 RegisterID* base = generator.emitResolveBase(generator.newTemporary(), ident); 1931 1921 1932 generator.emitExpressionInfo( m_divot, m_startOffset, m_endOffset);1922 generator.emitExpressionInfo(divot(), startOffset(), endOffset()); 1933 1923 generator.emitPutById(base, ident, propertyName); 1934 1924 } … … 2293 2283 dst = 0; 2294 2284 RefPtr<RegisterID> expr = generator.emitNode(dst, m_expr.get()); 2295 generator.emitExpressionInfo( m_divot, m_startOffset, m_endOffset);2285 generator.emitExpressionInfo(divot(), startOffset(), endOffset()); 2296 2286 generator.emitThrow(expr.get()); 2297 2287 return dst; … … 2424 2414 RefPtr<RegisterID> dstRegister = generator.newTemporary(); 2425 2415 generator.emitLoad(dstRegister.get(), jsUndefined()); 2426 statementListEmitCode( m_children, generator, dstRegister.get());2416 statementListEmitCode(children(), generator, dstRegister.get()); 2427 2417 2428 2418 generator.emitDebugHook(DidExecuteProgram, firstLine(), lastLine()); … … 2512 2502 { 2513 2503 generator.emitDebugHook(DidEnterCallFrame, firstLine(), lastLine()); 2514 statementListEmitCode( m_children, generator, ignoredResult());2515 if (! m_children.size() || !m_children.last()->isReturnNode()) {2504 statementListEmitCode(children(), generator, ignoredResult()); 2505 if (!children().size() || !children().last()->isReturnNode()) { 2516 2506 RegisterID* r0 = generator.emitLoad(0, jsUndefined()); 2517 2507 generator.emitDebugHook(WillLeaveCallFrame, firstLine(), lastLine()); … … 2527 2517 RefPtr<RegisterID> dstRegister = generator.newTemporary(); 2528 2518 generator.emitLoad(dstRegister.get(), jsUndefined()); 2529 statementListEmitCode( m_children, generator, dstRegister.get());2519 statementListEmitCode(children(), generator, dstRegister.get()); 2530 2520 2531 2521 generator.emitDebugHook(DidExecuteProgram, firstLine(), lastLine()); -
trunk/JavaScriptCore/parser/Nodes.h
r38247 r38249 28 28 29 29 #include "Error.h" 30 #include "JSString.h"31 #include "JSType.h"32 30 #include "Opcode.h" 33 #include "RegisterID.h"34 31 #include "ResultType.h" 35 32 #include "SourceCode.h" 36 33 #include "SymbolTable.h" 37 #include "RegExp.h"38 34 #include <wtf/MathExtras.h> 39 35 #include <wtf/OwnPtr.h> 40 #include <wtf/UnusedParam.h>41 36 #include <wtf/Vector.h> 42 37 … … 52 47 class CodeGenerator; 53 48 class FuncDeclNode; 54 class Node;55 49 class EvalCodeBlock; 56 50 class JSFunction; … … 58 52 class ProgramCodeBlock; 59 53 class PropertyListNode; 60 class SourceStream; 61 62 typedef unsigned int CodeFeatures; 54 class RegisterID; 55 class ScopeChainNode; 56 57 typedef unsigned CodeFeatures; 63 58 64 59 const CodeFeatures NoFeatures = 0; … … 94 89 }; 95 90 96 enum Precedence {97 PrecPrimary,98 PrecMember,99 PrecCall,100 PrecLeftHandSide,101 PrecPostfix,102 PrecUnary,103 PrecMultiplicative,104 PrecAdditive,105 PrecShift,106 PrecRelational,107 PrecEquality,108 PrecBitwiseAnd,109 PrecBitwiseXor,110 PrecBitwiseOr,111 PrecLogicalAnd,112 PrecLogicalOr,113 PrecConditional,114 PrecAssignment,115 PrecExpression116 };117 118 91 namespace DeclarationStacks { 119 typedef Vector<Node*, 16> NodeStack;120 92 enum VarAttrs { IsConstant = 1, HasInitializer = 2 }; 121 93 typedef Vector<std::pair<Identifier, unsigned>, 16> VarStack; … … 133 105 ParserRefCounted(JSGlobalData*) JSC_FAST_CALL; 134 106 135 JSGlobalData* m_globalData;136 137 public: 107 public: 108 virtual ~ParserRefCounted(); 109 138 110 // Nonrecursive destruction. 139 111 virtual void releaseNodes(NodeReleaser&); … … 145 117 static void deleteNewObjects(JSGlobalData*) JSC_FAST_CALL; 146 118 147 virtual ~ParserRefCounted(); 119 private: 120 JSGlobalData* m_globalData; 148 121 }; 149 122 150 123 class Node : public ParserRefCounted { 151 124 public: 152 typedef DeclarationStacks::NodeStack NodeStack;153 typedef DeclarationStacks::VarStack VarStack;154 typedef DeclarationStacks::FunctionStack FunctionStack;155 156 125 Node(JSGlobalData*) JSC_FAST_CALL; 157 126 … … 178 147 node, "1". 179 148 */ 180 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* dst = 0) JSC_FAST_CALL 181 { 182 ASSERT_WITH_MESSAGE(0, "Don't know how to generate code for:\n%s\n", toString().ascii()); 183 UNUSED_PARAM(dst); 184 return 0; 185 } // FIXME: Make this pure virtual. 186 187 UString toString() const JSC_FAST_CALL; 149 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* dst = 0) JSC_FAST_CALL = 0; 150 188 151 int lineNo() const { return m_line; } 189 190 virtual bool isReturnNode() const JSC_FAST_CALL { return false; }191 192 // Serialization.193 virtual void streamTo(SourceStream&) const JSC_FAST_CALL = 0;194 virtual Precedence precedence() const = 0;195 virtual bool needsParensIfLeftmost() const { return false; }196 152 197 153 protected: … … 234 190 int lastLine() const JSC_FAST_CALL { return m_lastLine; } 235 191 236 virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }237 192 virtual bool isEmptyStatement() const JSC_FAST_CALL { return false; } 193 virtual bool isReturnNode() const JSC_FAST_CALL { return false; } 238 194 239 195 virtual bool isBlock() const JSC_FAST_CALL { return false; } … … 254 210 255 211 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 256 257 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;258 virtual Precedence precedence() const { return PrecPrimary; }259 212 }; 260 213 … … 270 223 271 224 virtual bool isPure(CodeGenerator&) const JSC_FAST_CALL { return true; } 272 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; 273 virtual Precedence precedence() const { return PrecPrimary; } 274 275 protected: 225 226 private: 276 227 bool m_value; 277 228 }; … … 287 238 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 288 239 289 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;290 virtual Precedence precedence() const { return signbit(m_double) ? PrecUnary : PrecPrimary; }291 292 240 virtual bool isNumber() const JSC_FAST_CALL { return true; } 293 241 virtual bool isPure(CodeGenerator&) const JSC_FAST_CALL { return true; } 294 242 double value() const JSC_FAST_CALL { return m_double; } 295 v irtual void setValue(double d) JSC_FAST_CALL { m_double = d; }296 297 pr otected:243 void setValue(double d) JSC_FAST_CALL { m_double = d; } 244 245 private: 298 246 double m_double; 299 };300 301 class ImmediateNumberNode : public NumberNode {302 public:303 ImmediateNumberNode(JSGlobalData* globalData, JSValue* v, double d) JSC_FAST_CALL304 : NumberNode(globalData, d)305 , m_value(v)306 {307 ASSERT(v == JSImmediate::from(d));308 }309 310 virtual void setValue(double d) JSC_FAST_CALL { m_double = d; m_value = JSImmediate::from(d); ASSERT(m_value); }311 312 private:313 JSValue* m_value; // This is never a JSCell, only JSImmediate, thus no ProtectedPtr314 247 }; 315 248 … … 327 260 const Identifier& value() { return m_value; } 328 261 virtual bool isPure(CodeGenerator&) const JSC_FAST_CALL { return true; } 329 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;330 virtual Precedence precedence() const { return PrecPrimary; }331 262 332 263 private: … … 364 295 RegisterID* emitThrowError(CodeGenerator&, ErrorType, const char* msg); 365 296 RegisterID* emitThrowError(CodeGenerator&, ErrorType, const char* msg, const Identifier&); 297 298 private: 366 299 uint32_t m_divot; 367 300 uint16_t m_startOffset; … … 385 318 } 386 319 387 void setSubexpressionInfo(uint32_t subexpressionDivot, uint16_t subexpressionOffset) { 388 ASSERT(subexpressionDivot <= m_divot); 389 if ((m_divot - subexpressionDivot) & ~0xFFFF) // Overflow means we can't do this safely, so just point at the primary divot 320 void setSubexpressionInfo(uint32_t subexpressionDivot, uint16_t subexpressionOffset) 321 { 322 ASSERT(subexpressionDivot <= divot()); 323 if ((divot() - subexpressionDivot) & ~0xFFFF) // Overflow means we can't do this safely, so just point at the primary divot 390 324 return; 391 m_subexpressionDivotOffset = m_divot- subexpressionDivot;325 m_subexpressionDivotOffset = divot() - subexpressionDivot; 392 326 m_subexpressionEndOffset = subexpressionOffset; 393 327 } … … 414 348 } 415 349 416 void setSubexpressionInfo(uint32_t subexpressionDivot, uint16_t subexpressionOffset) { 417 ASSERT(subexpressionDivot >= m_divot); 418 if ((subexpressionDivot - m_divot) & ~0xFFFF) // Overflow means we can't do this safely, so just point at the primary divot 350 void setSubexpressionInfo(uint32_t subexpressionDivot, uint16_t subexpressionOffset) 351 { 352 ASSERT(subexpressionDivot >= divot()); 353 if ((subexpressionDivot - divot()) & ~0xFFFF) // Overflow means we can't do this safely, so just point at the primary divot 419 354 return; 420 m_subexpressionDivotOffset = subexpressionDivot - m_divot;355 m_subexpressionDivotOffset = subexpressionDivot - divot(); 421 356 m_subexpressionStartOffset = subexpressionOffset; 422 357 } … … 438 373 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 439 374 440 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;441 virtual Precedence precedence() const { return PrecPrimary; }442 443 375 private: 444 376 UString m_pattern; … … 454 386 455 387 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 456 457 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;458 virtual Precedence precedence() const { return PrecPrimary; }459 388 }; 460 389 … … 469 398 470 399 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 471 472 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;473 virtual Precedence precedence() const { return PrecPrimary; }474 400 475 401 virtual bool isPure(CodeGenerator&) const JSC_FAST_CALL; … … 478 404 const Identifier& identifier() const JSC_FAST_CALL { return m_ident; } 479 405 480 pr otected:406 private: 481 407 Identifier m_ident; 482 408 int32_t m_startOffset; 483 409 }; 484 410 485 class ElementNode : public Node{411 class ElementNode : public ParserRefCounted { 486 412 public: 487 413 ElementNode(JSGlobalData* globalData, int elision, ExpressionNode* node) JSC_FAST_CALL 488 : Node(globalData)414 : ParserRefCounted(globalData) 489 415 , m_elision(elision) 490 416 , m_node(node) … … 493 419 494 420 ElementNode(JSGlobalData* globalData, ElementNode* l, int elision, ExpressionNode* node) JSC_FAST_CALL 495 : Node(globalData)421 : ParserRefCounted(globalData) 496 422 , m_elision(elision) 497 423 , m_node(node) … … 502 428 virtual ~ElementNode(); 503 429 virtual void releaseNodes(NodeReleaser&); 504 505 virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }506 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;507 430 508 431 int elision() const { return m_elision; } … … 547 470 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 548 471 549 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;550 virtual Precedence precedence() const { return PrecPrimary; }551 552 472 private: 553 473 RefPtr<ElementNode> m_element; … … 556 476 }; 557 477 558 class PropertyNode : public Node{478 class PropertyNode : public ParserRefCounted { 559 479 public: 560 480 enum Type { Constant, Getter, Setter }; 561 481 562 482 PropertyNode(JSGlobalData* globalData, const Identifier& name, ExpressionNode* assign, Type type) JSC_FAST_CALL 563 : Node(globalData)483 : ParserRefCounted(globalData) 564 484 , m_name(name) 565 485 , m_assign(assign) … … 570 490 virtual ~PropertyNode(); 571 491 virtual void releaseNodes(NodeReleaser&); 572 573 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;574 virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }575 492 576 493 const Identifier& name() const { return m_name; } … … 602 519 603 520 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 604 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; 605 virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; } 606 607 private: 608 friend class ObjectLiteralNode; 521 522 private: 609 523 RefPtr<PropertyNode> m_node; 610 524 RefPtr<PropertyListNode> m_next; … … 628 542 629 543 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 630 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;631 virtual Precedence precedence() const { return PrecPrimary; }632 virtual bool needsParensIfLeftmost() const { return true; }633 544 634 545 private: … … 650 561 651 562 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 652 653 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;654 virtual Precedence precedence() const { return PrecMember; }655 563 656 564 virtual bool isLocation() const JSC_FAST_CALL { return true; } … … 678 586 679 587 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 680 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;681 virtual Precedence precedence() const { return PrecMember; }682 588 683 589 virtual bool isLocation() const JSC_FAST_CALL { return true; } … … 710 616 711 617 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 712 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;713 virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }714 618 715 619 RefPtr<ArgumentListNode> m_next; … … 717 621 }; 718 622 719 class ArgumentsNode : public Node{623 class ArgumentsNode : public ParserRefCounted { 720 624 public: 721 625 ArgumentsNode(JSGlobalData* globalData) JSC_FAST_CALL 722 : Node(globalData)626 : ParserRefCounted(globalData) 723 627 { 724 628 } 725 629 726 630 ArgumentsNode(JSGlobalData* globalData, ArgumentListNode* listNode) JSC_FAST_CALL 727 : Node(globalData)631 : ParserRefCounted(globalData) 728 632 , m_listNode(listNode) 729 633 { … … 732 636 virtual ~ArgumentsNode(); 733 637 virtual void releaseNodes(NodeReleaser&); 734 735 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;736 virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }737 638 738 639 RefPtr<ArgumentListNode> m_listNode; … … 759 660 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 760 661 761 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;762 virtual Precedence precedence() const { return PrecLeftHandSide; }763 764 662 private: 765 663 RefPtr<ExpressionNode> m_expr; … … 780 678 781 679 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 782 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;783 virtual Precedence precedence() const { return PrecCall; }784 680 785 681 private: … … 801 697 802 698 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 803 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;804 virtual Precedence precedence() const { return PrecCall; }805 699 806 700 private: … … 824 718 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 825 719 826 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; 827 virtual Precedence precedence() const { return PrecCall; } 828 829 protected: 720 private: 830 721 Identifier m_ident; 831 722 RefPtr<ArgumentsNode> m_args; … … 849 740 850 741 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 851 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; 852 virtual Precedence precedence() const { return PrecCall; } 853 854 protected: 742 743 private: 855 744 RefPtr<ExpressionNode> m_base; 856 745 RefPtr<ExpressionNode> m_subscript; … … 873 762 874 763 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 875 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;876 virtual Precedence precedence() const { return PrecCall; }877 764 878 765 private: … … 904 791 905 792 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 906 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; 907 virtual Precedence precedence() const { return PrecPostfix; } 908 909 protected: 793 794 private: 910 795 Operator m_operator; 911 796 }; … … 926 811 927 812 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 928 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; 929 virtual Precedence precedence() const { return PrecPostfix; } 930 931 protected: 813 814 private: 932 815 RefPtr<ExpressionNode> m_base; 933 816 RefPtr<ExpressionNode> m_subscript; … … 950 833 951 834 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 952 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; 953 virtual Precedence precedence() const { return PrecPostfix; } 954 955 protected: 835 836 private: 956 837 RefPtr<ExpressionNode> m_base; 957 838 Identifier m_ident; … … 973 854 974 855 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 975 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;976 virtual Precedence precedence() const { return PrecPostfix; }977 856 978 857 private: … … 991 870 992 871 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 993 994 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;995 virtual Precedence precedence() const { return PrecUnary; }996 872 997 873 private: … … 1014 890 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 1015 891 1016 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;1017 virtual Precedence precedence() const { return PrecUnary; }1018 1019 892 private: 1020 893 RefPtr<ExpressionNode> m_base; … … 1037 910 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 1038 911 1039 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;1040 virtual Precedence precedence() const { return PrecUnary; }1041 1042 912 private: 1043 913 RefPtr<ExpressionNode> m_base; … … 1058 928 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 1059 929 1060 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;1061 virtual Precedence precedence() const { return PrecUnary; }1062 1063 930 private: 1064 931 RefPtr<ExpressionNode> m_expr; … … 1077 944 1078 945 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 1079 1080 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;1081 virtual Precedence precedence() const { return PrecUnary; }1082 946 1083 947 private: … … 1095 959 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 1096 960 1097 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;1098 virtual Precedence precedence() const { return PrecUnary; }1099 1100 961 const Identifier& identifier() const JSC_FAST_CALL { return m_ident; } 1101 962 1102 pr otected:963 private: 1103 964 Identifier m_ident; 1104 size_t m_index; // Used by LocalTypeOfNode.1105 965 }; 1106 966 … … 1118 978 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 1119 979 1120 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;1121 virtual Precedence precedence() const { return PrecUnary; }1122 1123 980 private: 1124 981 RefPtr<ExpressionNode> m_expr; … … 1135 992 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 1136 993 1137 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; 1138 virtual Precedence precedence() const { return PrecUnary; } 1139 1140 protected: 994 private: 1141 995 Operator m_operator; 1142 996 }; … … 1157 1011 1158 1012 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 1159 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; 1160 virtual Precedence precedence() const { return PrecUnary; } 1161 1162 protected: 1013 1014 private: 1163 1015 RefPtr<ExpressionNode> m_base; 1164 1016 RefPtr<ExpressionNode> m_subscript; … … 1181 1033 1182 1034 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 1183 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; 1184 virtual Precedence precedence() const { return PrecPostfix; } 1185 1186 protected: 1035 1036 private: 1187 1037 RefPtr<ExpressionNode> m_base; 1188 1038 Identifier m_ident; … … 1204 1054 1205 1055 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 1206 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;1207 virtual Precedence precedence() const { return PrecUnary; }1208 1056 1209 1057 private: … … 1246 1094 1247 1095 virtual OpcodeID opcode() const JSC_FAST_CALL { return op_to_jsnumber; } 1248 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;1249 virtual Precedence precedence() const { return PrecUnary; }1250 1096 }; 1251 1097 … … 1258 1104 1259 1105 virtual OpcodeID opcode() const JSC_FAST_CALL { return op_negate; } 1260 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;1261 virtual Precedence precedence() const { return PrecUnary; }1262 1106 }; 1263 1107 … … 1270 1114 1271 1115 virtual OpcodeID opcode() const JSC_FAST_CALL { return op_bitnot; } 1272 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;1273 virtual Precedence precedence() const { return PrecUnary; }1274 1116 }; 1275 1117 … … 1282 1124 1283 1125 virtual OpcodeID opcode() const JSC_FAST_CALL { return op_not; } 1284 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;1285 virtual Precedence precedence() const { return PrecUnary; }1286 1126 }; 1287 1127 … … 1339 1179 1340 1180 virtual OpcodeID opcode() const JSC_FAST_CALL { return op_mul; } 1341 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;1342 virtual Precedence precedence() const { return PrecMultiplicative; }1343 1181 }; 1344 1182 … … 1351 1189 1352 1190 virtual OpcodeID opcode() const JSC_FAST_CALL { return op_div; } 1353 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;1354 virtual Precedence precedence() const { return PrecMultiplicative; }1355 1191 }; 1356 1192 … … 1363 1199 1364 1200 virtual OpcodeID opcode() const JSC_FAST_CALL { return op_mod; } 1365 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;1366 virtual Precedence precedence() const { return PrecMultiplicative; }1367 1201 }; 1368 1202 … … 1375 1209 1376 1210 virtual OpcodeID opcode() const JSC_FAST_CALL { return op_add; } 1377 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;1378 virtual Precedence precedence() const { return PrecAdditive; }1379 1211 }; 1380 1212 … … 1387 1219 1388 1220 virtual OpcodeID opcode() const JSC_FAST_CALL { return op_sub; } 1389 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;1390 virtual Precedence precedence() const { return PrecAdditive; }1391 1221 }; 1392 1222 … … 1399 1229 1400 1230 virtual OpcodeID opcode() const JSC_FAST_CALL { return op_lshift; } 1401 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;1402 virtual Precedence precedence() const { return PrecShift; }1403 1231 }; 1404 1232 … … 1411 1239 1412 1240 virtual OpcodeID opcode() const JSC_FAST_CALL { return op_rshift; } 1413 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;1414 virtual Precedence precedence() const { return PrecShift; }1415 1241 }; 1416 1242 … … 1423 1249 1424 1250 virtual OpcodeID opcode() const JSC_FAST_CALL { return op_urshift; } 1425 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;1426 virtual Precedence precedence() const { return PrecShift; }1427 1251 }; 1428 1252 … … 1435 1259 1436 1260 virtual OpcodeID opcode() const JSC_FAST_CALL { return op_less; } 1437 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;1438 virtual Precedence precedence() const { return PrecRelational; }1439 1261 }; 1440 1262 … … 1447 1269 1448 1270 virtual OpcodeID opcode() const JSC_FAST_CALL { return op_less; } 1449 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;1450 virtual Precedence precedence() const { return PrecRelational; }1451 1271 }; 1452 1272 … … 1459 1279 1460 1280 virtual OpcodeID opcode() const JSC_FAST_CALL { return op_lesseq; } 1461 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;1462 virtual Precedence precedence() const { return PrecRelational; }1463 1281 }; 1464 1282 … … 1471 1289 1472 1290 virtual OpcodeID opcode() const JSC_FAST_CALL { return op_lesseq; } 1473 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;1474 virtual Precedence precedence() const { return PrecRelational; }1475 1291 }; 1476 1292 … … 1496 1312 1497 1313 virtual OpcodeID opcode() const JSC_FAST_CALL { return op_instanceof; } 1498 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;1499 virtual Precedence precedence() const { return PrecRelational; }1500 1314 1501 1315 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; … … 1510 1324 1511 1325 virtual OpcodeID opcode() const JSC_FAST_CALL { return op_in; } 1512 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;1513 virtual Precedence precedence() const { return PrecRelational; }1514 1326 }; 1515 1327 … … 1523 1335 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 1524 1336 virtual OpcodeID opcode() const JSC_FAST_CALL { return op_eq; } 1525 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;1526 virtual Precedence precedence() const { return PrecEquality; }1527 1337 }; 1528 1338 … … 1535 1345 1536 1346 virtual OpcodeID opcode() const JSC_FAST_CALL { return op_neq; } 1537 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;1538 virtual Precedence precedence() const { return PrecEquality; }1539 1347 }; 1540 1348 … … 1548 1356 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 1549 1357 virtual OpcodeID opcode() const JSC_FAST_CALL { return op_stricteq; } 1550 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;1551 virtual Precedence precedence() const { return PrecEquality; }1552 1358 }; 1553 1359 … … 1560 1366 1561 1367 virtual OpcodeID opcode() const JSC_FAST_CALL { return op_nstricteq; } 1562 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;1563 virtual Precedence precedence() const { return PrecEquality; }1564 1368 }; 1565 1369 … … 1572 1376 1573 1377 virtual OpcodeID opcode() const JSC_FAST_CALL { return op_bitand; } 1574 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;1575 virtual Precedence precedence() const { return PrecBitwiseAnd; }1576 1378 }; 1577 1379 … … 1584 1386 1585 1387 virtual OpcodeID opcode() const JSC_FAST_CALL { return op_bitor; } 1586 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;1587 virtual Precedence precedence() const { return PrecBitwiseOr; }1588 1388 }; 1589 1389 … … 1596 1396 1597 1397 virtual OpcodeID opcode() const JSC_FAST_CALL { return op_bitxor; } 1598 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;1599 virtual Precedence precedence() const { return PrecBitwiseXor; }1600 1398 }; 1601 1399 … … 1617 1415 1618 1416 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 1619 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;1620 virtual Precedence precedence() const { return (m_operator == OpLogicalAnd) ? PrecLogicalAnd : PrecLogicalOr; }1621 1417 1622 1418 private: … … 1643 1439 1644 1440 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 1645 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;1646 virtual Precedence precedence() const { return PrecConditional; }1647 1441 1648 1442 private: … … 1669 1463 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 1670 1464 1671 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; 1672 virtual Precedence precedence() const { return PrecAssignment; } 1673 1674 protected: 1465 private: 1675 1466 Identifier m_ident; 1676 1467 RefPtr<ExpressionNode> m_right; … … 1695 1486 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 1696 1487 1697 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; 1698 virtual Precedence precedence() const { return PrecAssignment; } 1699 1700 protected: 1488 private: 1701 1489 Identifier m_ident; 1702 1490 RefPtr<ExpressionNode> m_right; … … 1724 1512 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 1725 1513 1726 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; 1727 virtual Precedence precedence() const { return PrecAssignment; } 1728 1729 protected: 1514 private: 1730 1515 RefPtr<ExpressionNode> m_base; 1731 1516 RefPtr<ExpressionNode> m_subscript; … … 1754 1539 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 1755 1540 1756 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; 1757 virtual Precedence precedence() const { return PrecAssignment; } 1758 1759 protected: 1541 private: 1760 1542 RefPtr<ExpressionNode> m_base; 1761 1543 RefPtr<ExpressionNode> m_subscript; … … 1781 1563 1782 1564 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 1783 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; 1784 virtual Precedence precedence() const { return PrecAssignment; } 1785 1786 protected: 1565 1566 private: 1787 1567 RefPtr<ExpressionNode> m_base; 1788 1568 Identifier m_ident; … … 1809 1589 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 1810 1590 1811 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; 1812 virtual Precedence precedence() const { return PrecAssignment; } 1813 1814 protected: 1591 private: 1815 1592 RefPtr<ExpressionNode> m_base; 1816 1593 Identifier m_ident; … … 1835 1612 1836 1613 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 1837 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; 1838 virtual Precedence precedence() const { return PrecAssignment; } 1839 1840 protected: 1614 1615 private: 1841 1616 RefPtr<ExpressionNode> m_left; 1842 1617 Operator m_operator; … … 1857 1632 1858 1633 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 1859 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;1860 virtual Precedence precedence() const { return PrecExpression; }1861 1634 1862 1635 private: … … 1871 1644 { 1872 1645 } 1873 virtual Precedence precedence() const { return PrecAssignment; }1874 1646 }; 1875 1647 … … 1880 1652 virtual ~ConstDeclNode(); 1881 1653 virtual void releaseNodes(NodeReleaser&); 1882 1883 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;1884 virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }1885 1654 1886 1655 Identifier m_ident; … … 1903 1672 virtual void releaseNodes(NodeReleaser&); 1904 1673 1905 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;1906 1907 1674 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 1908 1675 … … 1936 1703 1937 1704 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 1938 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;1939 1705 1940 1706 StatementVector& children() { return m_children; } … … 1942 1708 virtual bool isBlock() const JSC_FAST_CALL { return true; } 1943 1709 1944 pr otected:1710 private: 1945 1711 StatementVector m_children; 1946 1712 }; … … 1955 1721 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 1956 1722 1957 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;1958 1723 virtual bool isEmptyStatement() const JSC_FAST_CALL { return true; } 1959 1724 }; … … 1967 1732 1968 1733 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 1969 1970 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;1971 1734 }; 1972 1735 … … 1980 1743 1981 1744 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 1982 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;1983 1745 1984 1746 private: … … 1998 1760 1999 1761 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 2000 2001 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;2002 1762 2003 1763 private: … … 2018 1778 2019 1779 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 2020 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;2021 1780 2022 1781 protected: … … 2037 1796 2038 1797 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 2039 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;2040 1798 2041 1799 private: … … 2056 1814 2057 1815 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 2058 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;2059 1816 2060 1817 virtual bool isLoop() const JSC_FAST_CALL { return true; } … … 2078 1835 2079 1836 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 2080 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;2081 1837 2082 1838 virtual bool isLoop() const JSC_FAST_CALL { return true; } … … 2104 1860 2105 1861 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 2106 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;2107 1862 2108 1863 virtual bool isLoop() const JSC_FAST_CALL { return true; } … … 2125 1880 2126 1881 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 2127 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;2128 1882 2129 1883 virtual bool isLoop() const JSC_FAST_CALL { return true; } … … 2152 1906 2153 1907 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 2154 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;2155 1908 2156 1909 private: … … 2172 1925 2173 1926 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 2174 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;2175 1927 2176 1928 private: … … 2190 1942 2191 1943 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 2192 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;2193 1944 virtual bool isReturnNode() const JSC_FAST_CALL { return true; } 2194 1945 … … 2212 1963 2213 1964 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 2214 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;2215 1965 2216 1966 private: … … 2234 1984 2235 1985 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 2236 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;2237 1986 2238 1987 private: … … 2253 2002 2254 2003 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 2255 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;2256 2004 2257 2005 private: … … 2273 2021 virtual void releaseNodes(NodeReleaser&); 2274 2022 2275 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;2276 2277 2023 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* dst = 0) JSC_FAST_CALL; 2278 2024 … … 2284 2030 }; 2285 2031 2286 class ParameterNode : public Node{2032 class ParameterNode : public ParserRefCounted { 2287 2033 public: 2288 2034 ParameterNode(JSGlobalData* globalData, const Identifier& ident) JSC_FAST_CALL 2289 : Node(globalData)2035 : ParserRefCounted(globalData) 2290 2036 , m_ident(ident) 2291 2037 { … … 2293 2039 2294 2040 ParameterNode(JSGlobalData* globalData, ParameterNode* l, const Identifier& ident) JSC_FAST_CALL 2295 : Node(globalData)2041 : ParserRefCounted(globalData) 2296 2042 , m_ident(ident) 2297 2043 { … … 2302 2048 virtual void releaseNodes(NodeReleaser&); 2303 2049 2304 Identifier ident() JSC_FAST_CALL { return m_ident; } 2305 ParameterNode *nextParam() JSC_FAST_CALL { return m_next.get(); } 2306 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; 2307 virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; } 2308 2309 private: 2310 friend class FuncDeclNode; 2311 friend class FuncExprNode; 2050 const Identifier& ident() const JSC_FAST_CALL { return m_ident; } 2051 ParameterNode* nextParam() const JSC_FAST_CALL { return m_next.get(); } 2052 2053 private: 2312 2054 Identifier m_ident; 2313 2055 RefPtr<ParameterNode> m_next; … … 2316 2058 class ScopeNode : public BlockNode { 2317 2059 public: 2060 typedef DeclarationStacks::VarStack VarStack; 2061 typedef DeclarationStacks::FunctionStack FunctionStack; 2062 2318 2063 ScopeNode(JSGlobalData*, const SourceCode&, SourceElements*, VarStack*, FunctionStack*, CodeFeatures, int numConstants) JSC_FAST_CALL; 2319 2064 2320 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;2321 2322 2065 const SourceCode& source() const { return m_source; } 2323 2066 const UString& sourceURL() const JSC_FAST_CALL { return m_source.provider()->url(); } … … 2451 2194 } 2452 2195 2453 pr otected:2196 private: 2454 2197 FunctionBodyNode(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, const SourceCode&, CodeFeatures, int numConstants) JSC_FAST_CALL; 2455 2198 2456 private:2457 2199 void generateCode(ScopeChainNode*) JSC_FAST_CALL; 2458 2200 … … 2480 2222 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 2481 2223 JSFunction* makeFunction(ExecState*, ScopeChainNode*) JSC_FAST_CALL; 2482 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;2483 virtual Precedence precedence() const { return PrecMember; }2484 virtual bool needsParensIfLeftmost() const { return true; }2485 2224 2486 2225 FunctionBodyNode* body() { return m_body.get(); } 2487 2226 2488 2227 private: 2489 // Used for streamTo2490 friend class PropertyNode;2491 2228 Identifier m_ident; 2492 2229 RefPtr<ParameterNode> m_parameter; … … 2510 2247 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 2511 2248 2512 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;2513 2249 JSFunction* makeFunction(ExecState*, ScopeChainNode*) JSC_FAST_CALL; 2514 2250 … … 2522 2258 }; 2523 2259 2524 class CaseClauseNode : public Node{2260 class CaseClauseNode : public ParserRefCounted { 2525 2261 public: 2526 2262 CaseClauseNode(JSGlobalData* globalData, ExpressionNode* expr) JSC_FAST_CALL 2527 : Node(globalData)2263 : ParserRefCounted(globalData) 2528 2264 , m_expr(expr) 2529 2265 { … … 2531 2267 2532 2268 CaseClauseNode(JSGlobalData* globalData, ExpressionNode* expr, SourceElements* children) JSC_FAST_CALL 2533 : Node(globalData)2269 : ParserRefCounted(globalData) 2534 2270 , m_expr(expr) 2535 2271 { … … 2541 2277 virtual void releaseNodes(NodeReleaser&); 2542 2278 2543 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;2544 virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }2545 2546 2279 ExpressionNode* expr() const { return m_expr.get(); } 2547 2280 StatementVector& children() { return m_children; } … … 2552 2285 }; 2553 2286 2554 class ClauseListNode : public Node{2287 class ClauseListNode : public ParserRefCounted { 2555 2288 public: 2556 2289 ClauseListNode(JSGlobalData* globalData, CaseClauseNode* clause) JSC_FAST_CALL 2557 : Node(globalData)2290 : ParserRefCounted(globalData) 2558 2291 , m_clause(clause) 2559 2292 { … … 2561 2294 2562 2295 ClauseListNode(JSGlobalData* globalData, ClauseListNode* clauseList, CaseClauseNode* clause) JSC_FAST_CALL 2563 : Node(globalData)2296 : ParserRefCounted(globalData) 2564 2297 , m_clause(clause) 2565 2298 { … … 2572 2305 CaseClauseNode* getClause() const JSC_FAST_CALL { return m_clause.get(); } 2573 2306 ClauseListNode* getNext() const JSC_FAST_CALL { return m_next.get(); } 2574 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; 2575 virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; } 2576 2577 private: 2578 friend class CaseBlockNode; 2307 2308 private: 2579 2309 RefPtr<CaseClauseNode> m_clause; 2580 2310 RefPtr<ClauseListNode> m_next; 2581 2311 }; 2582 2312 2583 class CaseBlockNode : public Node{2313 class CaseBlockNode : public ParserRefCounted { 2584 2314 public: 2585 2315 CaseBlockNode(JSGlobalData* globalData, ClauseListNode* list1, CaseClauseNode* defaultClause, ClauseListNode* list2) JSC_FAST_CALL 2586 : Node(globalData)2316 : ParserRefCounted(globalData) 2587 2317 , m_list1(list1) 2588 2318 , m_defaultClause(defaultClause) … … 2595 2325 2596 2326 RegisterID* emitCodeForBlock(CodeGenerator&, RegisterID* input, RegisterID* dst = 0) JSC_FAST_CALL; 2597 2598 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;2599 virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }2600 2327 2601 2328 private: … … 2620 2347 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 2621 2348 2622 virtual void streamTo(SourceStream&) const JSC_FAST_CALL;2623 2624 2349 private: 2625 2350 RefPtr<ExpressionNode> m_expr;
Note:
See TracChangeset
for help on using the changeset viewer.