Changeset 35245 in webkit
- Timestamp:
- Jul 18, 2008, 6:44:24 PM (17 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 37 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/ChangeLog
r35242 r35245 1 2008-07-18 Oliver Hunt <oliver@apple.com> 2 3 Reviewed by Cameron Zwarich. 4 5 Bug 18774: SQUIRRELFISH: print meaningful error messages <https://bugs.webkit.org/show_bug.cgi?id=18774> 6 <rdar://problem/5769353> SQUIRRELFISH: JavaScript error messages are missing informative text 7 8 Add support for decent error messages in JavaScript. This patch achieves this by providing 9 ensuring the common errors and exceptions have messages that provide the text of expression 10 that trigger the exception. In addition it attaches a number of properties to the exception 11 object detailing where in the source the expression came from. 12 13 * JavaScriptCore.exp: 14 * VM/CodeBlock.cpp: 15 (KJS::CodeBlock::lineNumberForVPC): 16 (KJS::CodeBlock::expressionRangeForVPC): 17 Function to recover the expression range for an instruction 18 that triggered an exception. 19 * VM/CodeBlock.h: 20 (KJS::ExpressionRangeInfo::): 21 (KJS::CodeBlock::CodeBlock): 22 * VM/CodeGenerator.cpp: 23 (KJS::CodeGenerator::emitCall): 24 (KJS::CodeGenerator::emitCallEval): 25 Emit call needed to be modified so to place the expression range info internally, 26 as the CodeGenerator emits the arguments nodes itself, rather than the various call 27 nodes. 28 * VM/CodeGenerator.h: 29 (KJS::CodeGenerator::emitExpressionInfo): 30 Record the expression range info. 31 * VM/ExceptionHelpers.cpp: 32 (KJS::createErrorMessage): 33 (KJS::createInvalidParamError): 34 (KJS::createUndefinedVariableError): 35 (KJS::createNotAConstructorError): 36 (KJS::createNotAFunctionError): 37 (KJS::createNotAnObjectErrorStub): 38 (KJS::createNotAnObjectError): 39 Rewrite all the code for the error messages so that they make use of the newly available 40 information. 41 * VM/ExceptionHelpers.h: 42 * VM/Machine.cpp: 43 (KJS::isNotObject): Now needs vPC and codeBlock 44 (KJS::Machine::throwException): 45 New logic to handle the NotAnObjectErrorStub and to handle the absurd "no default value" edge case 46 (KJS::Machine::privateExecute): 47 * VM/Machine.h: 48 * kjs/DebuggerCallFrame.cpp: 49 (KJS::DebuggerCallFrame::evaluate): 50 * kjs/Error.cpp: 51 (KJS::Error::create): 52 * kjs/Error.h: 53 * kjs/JSGlobalObjectFunctions.cpp: 54 * kjs/JSImmediate.cpp: 55 (KJS::JSImmediate::toObject): 56 (KJS::JSImmediate::prototype): 57 My changes to the JSNotAnObject constructor needed to be handled here. 58 * kjs/JSNotAnObject.h: 59 (KJS::JSNotAnObjectErrorStub::JSNotAnObjectErrorStub): 60 (KJS::JSNotAnObjectErrorStub::isNull): 61 (KJS::JSNotAnObjectErrorStub::isNotAnObjectErrorStub): 62 Added a JSNotAnObjectErrorStub class to ease the handling of toObject failure exceptions, 63 and potentially allow even more detailed error messages in future. 64 * kjs/JSObject.h: 65 * kjs/Parser.h: 66 (KJS::Parser::parse): 67 * kjs/SourceRange.h: 68 * kjs/grammar.y: 69 Large amounts of position propagation. 70 * kjs/lexer.cpp: 71 (KJS::Lexer::Lexer): 72 (KJS::Lexer::shift): 73 (KJS::Lexer::lex): 74 The lexer needed a few changes to be able to correctly track token character positions. 75 * kjs/lexer.h: 76 * kjs/nodes.cpp: 77 (KJS::ThrowableExpressionData::emitThrowError): 78 (KJS::StatementNode::StatementNode): 79 (KJS::ResolveNode::emitCode): 80 (KJS::BracketAccessorNode::emitCode): 81 (KJS::DotAccessorNode::emitCode): 82 (KJS::NewExprNode::emitCode): 83 (KJS::EvalFunctionCallNode::emitCode): 84 (KJS::FunctionCallValueNode::emitCode): 85 (KJS::FunctionCallResolveNode::emitCode): 86 (KJS::FunctionCallBracketNode::emitCode): 87 (KJS::FunctionCallDotNode::emitCode): 88 (KJS::PostfixResolveNode::emitCode): 89 (KJS::PostfixBracketNode::emitCode): 90 (KJS::PostfixDotNode::emitCode): 91 (KJS::DeleteResolveNode::emitCode): 92 (KJS::DeleteBracketNode::emitCode): 93 (KJS::DeleteDotNode::emitCode): 94 (KJS::PrefixResolveNode::emitCode): 95 (KJS::PrefixBracketNode::emitCode): 96 (KJS::PrefixDotNode::emitCode): 97 (KJS::ThrowableBinaryOpNode::emitCode): 98 (KJS::ReadModifyResolveNode::emitCode): 99 (KJS::AssignResolveNode::emitCode): 100 (KJS::AssignDotNode::emitCode): 101 (KJS::ReadModifyDotNode::emitCode): 102 (KJS::AssignBracketNode::emitCode): 103 (KJS::ReadModifyBracketNode::emitCode): 104 (KJS::ForInNode::ForInNode): 105 (KJS::ForInNode::emitCode): 106 (KJS::WithNode::emitCode): 107 (KJS::LabelNode::emitCode): 108 (KJS::ThrowNode::emitCode): 109 (KJS::ProgramNode::ProgramNode): 110 (KJS::ProgramNode::create): 111 (KJS::EvalNode::generateCode): 112 (KJS::FunctionBodyNode::create): 113 (KJS::FunctionBodyNode::generateCode): 114 (KJS::ProgramNode::generateCode): 115 All of these methods were handling the position information. 116 Constructors and create methods were modified to store the information. 117 All the emitCall implementations listed needed to be updated to actually 118 record the position information we have so carefully collected. 119 * kjs/nodes.h: 120 (KJS::ThrowableExpressionData::ThrowableExpressionData): 121 (KJS::ThrowableExpressionData::setExceptionSourceRange): 122 (KJS::ThrowableExpressionData::divot): 123 (KJS::ThrowableExpressionData::startOffset): 124 (KJS::ThrowableExpressionData::endOffset): 125 (KJS::ThrowableSubExpressionData::ThrowableSubExpressionData): 126 (KJS::ThrowableSubExpressionData::setSubexpressionInfo): 127 (KJS::ThrowablePrefixedSubExpressionData::ThrowablePrefixedSubExpressionData): 128 (KJS::ThrowablePrefixedSubExpressionData::setSubexpressionInfo): 129 ThrowableExpressionData is just a uniform mechanism for storing the position 130 information. 131 (KJS::ResolveNode::): 132 (KJS::PrePostResolveNode::): 133 (KJS::ThrowableBinaryOpNode::): 134 (KJS::WithNode::): 135 1 136 2008-07-18 Geoffrey Garen <ggaren@apple.com> 2 137 -
trunk/JavaScriptCore/JavaScriptCore.exp
r35228 r35245 93 93 __ZN3KJS11JSImmediate9prototypeEPKNS_7JSValueEPNS_9ExecStateE 94 94 __ZN3KJS11ProfileNode4sortEPFbRKN3WTF6RefPtrIS0_EES5_E 95 __ZN3KJS11ProgramNode6createEPNS_12JSGlobalDataEPNS_14SourceElementsEPN3WTF6VectorISt4pairINS_10IdentifierEjELm16EEEPNS6_INS5_6RefPtrINS_12FuncDeclNodeEEELm16EEE bb95 __ZN3KJS11ProgramNode6createEPNS_12JSGlobalDataEPNS_14SourceElementsEPN3WTF6VectorISt4pairINS_10IdentifierEjELm16EEEPNS6_INS5_6RefPtrINS_12FuncDeclNodeEEELm16EEEPNS_14SourceProviderEbb 96 96 __ZN3KJS11PropertyMap11getLocationERKNS_10IdentifierE 97 97 __ZN3KJS11PropertyMap11getLocationERKNS_10IdentifierERb -
trunk/JavaScriptCore/VM/CodeBlock.cpp
r35231 r35245 655 655 int CodeBlock::lineNumberForVPC(const Instruction* vPC) 656 656 { 657 ASSERT(lineInfo.size()); 657 658 unsigned instructionOffset = vPC - instructions.begin(); 658 659 ASSERT(instructionOffset < instructions.size()); … … 670 671 high = mid; 671 672 } 672 673 673 return lineInfo[low - 1].lineNumber; 674 674 } 675 675 676 int CodeBlock::expressionRangeForVPC(const Instruction* vPC, int& divot, int& startOffset, int& endOffset) 677 { 678 unsigned instructionOffset = vPC - instructions.begin(); 679 ASSERT(instructionOffset < instructions.size()); 680 681 if (!expressionInfo.size()) { 682 // We didn't think anything could throw. Apparently we were wrong. 683 startOffset = 0; 684 endOffset = 0; 685 divot = 0; 686 return lineNumberForVPC(vPC); 687 } 688 689 int low = 0; 690 int high = expressionInfo.size(); 691 while (low < high) { 692 int mid = low + (high - low) / 2; 693 if (expressionInfo[mid].instructionOffset <= instructionOffset) 694 low = mid + 1; 695 else 696 high = mid; 697 } 698 699 ASSERT(low); 700 if (!low) { 701 startOffset = 0; 702 endOffset = 0; 703 divot = 0; 704 return lineNumberForVPC(vPC); 705 } 706 707 startOffset = expressionInfo[low - 1].startOffset; 708 endOffset = expressionInfo[low - 1].endOffset; 709 divot = expressionInfo[low - 1].divotPoint + sourceOffset; 710 return lineNumberForVPC(vPC); 711 } 712 676 713 } // namespace KJS -
trunk/JavaScriptCore/VM/CodeBlock.h
r35231 r35245 34 34 #include "JSGlobalObject.h" 35 35 #include "nodes.h" 36 #include "SourceRange.h" 36 37 #include "ustring.h" 37 38 #include <wtf/RefPtr.h> … … 45 46 46 47 struct HandlerInfo { 47 unsigned start; 48 unsigned end; 49 unsigned target; 50 unsigned scopeDepth; 48 uint32_t start; 49 uint32_t end; 50 uint32_t target; 51 uint32_t scopeDepth; 52 }; 53 54 struct ExpressionRangeInfo { 55 enum { MaxOffset = (1 << 7) - 1, 56 MaxDivot = (1 << 25) - 1 57 }; 58 uint32_t instructionOffset : 25; 59 uint32_t divotPoint : 25; 60 uint32_t startOffset : 7; 61 uint32_t endOffset : 7; 51 62 }; 52 63 53 64 struct LineInfo { 54 u nsignedinstructionOffset;55 int lineNumber;65 uint32_t instructionOffset; 66 int32_t lineNumber; 56 67 }; 57 68 58 69 struct CodeBlock { 59 CodeBlock(ScopeNode* ownerNode_, CodeType codeType_ )70 CodeBlock(ScopeNode* ownerNode_, CodeType codeType_, PassRefPtr<SourceProvider> source_, unsigned sourceOffset_) 60 71 : ownerNode(ownerNode_) 61 72 , numTemporaries(0) … … 66 77 , usesEval(ownerNode_->usesEval()) 67 78 , codeType(codeType_) 79 , source(source_) 80 , sourceOffset(sourceOffset_) 68 81 { 69 82 } 70 83 71 84 void dump(ExecState*) const; 72 int lineNumberForVPC(const Instruction*); 85 int expressionRangeForVPC(const Instruction*, int& divot, int& startOffset, int& endOffset); 86 int lineNumberForVPC(const Instruction* vPC); 73 87 bool getHandlerForVPC(const Instruction* vPC, Instruction*& target, int& scopeDepth); 74 88 void mark(); … … 84 98 bool usesEval; 85 99 CodeType codeType; 100 RefPtr<SourceProvider> source; 101 unsigned sourceOffset; 86 102 87 103 Vector<Instruction> instructions; … … 94 110 Vector<RefPtr<RegExp> > regexps; 95 111 Vector<HandlerInfo> exceptionHandlers; 112 Vector<ExpressionRangeInfo> expressionInfo; 96 113 Vector<LineInfo> lineInfo; 97 114 … … 104 121 105 122 struct ProgramCodeBlock : public CodeBlock { 106 ProgramCodeBlock(ScopeNode* ownerNode_, CodeType codeType_, JSGlobalObject* globalObject_ )107 : CodeBlock(ownerNode_, codeType_ )123 ProgramCodeBlock(ScopeNode* ownerNode_, CodeType codeType_, JSGlobalObject* globalObject_, PassRefPtr<SourceProvider> source_) 124 : CodeBlock(ownerNode_, codeType_, source_, 0) 108 125 , globalObject(globalObject_) 109 126 { … … 121 138 122 139 struct EvalCodeBlock : public ProgramCodeBlock { 123 EvalCodeBlock(ScopeNode* ownerNode_, JSGlobalObject* globalObject_ )124 : ProgramCodeBlock(ownerNode_, EvalCode, globalObject_ )140 EvalCodeBlock(ScopeNode* ownerNode_, JSGlobalObject* globalObject_, PassRefPtr<SourceProvider> source_) 141 : ProgramCodeBlock(ownerNode_, EvalCode, globalObject_, source_) 125 142 { 126 143 } -
trunk/JavaScriptCore/VM/CodeGenerator.cpp
r35231 r35245 850 850 } 851 851 852 RegisterID* CodeGenerator::emitCall(RegisterID* dst, RegisterID* func, RegisterID* base, ArgumentsNode* argumentsNode )853 { 854 return emitCall(op_call, dst, func, base, argumentsNode );855 } 856 857 RegisterID* CodeGenerator::emitCallEval(RegisterID* dst, RegisterID* func, RegisterID* base, ArgumentsNode* argumentsNode )858 { 859 return emitCall(op_call_eval, dst, func, base, argumentsNode );860 } 861 862 RegisterID* CodeGenerator::emitCall(OpcodeID opcodeID, RegisterID* dst, RegisterID* func, RegisterID* base, ArgumentsNode* argumentsNode )852 RegisterID* CodeGenerator::emitCall(RegisterID* dst, RegisterID* func, RegisterID* base, ArgumentsNode* argumentsNode, unsigned divot, unsigned startOffset, unsigned endOffset) 853 { 854 return emitCall(op_call, dst, func, base, argumentsNode, divot, startOffset, endOffset); 855 } 856 857 RegisterID* CodeGenerator::emitCallEval(RegisterID* dst, RegisterID* func, RegisterID* base, ArgumentsNode* argumentsNode, unsigned divot, unsigned startOffset, unsigned endOffset) 858 { 859 return emitCall(op_call_eval, dst, func, base, argumentsNode, divot, startOffset, endOffset); 860 } 861 862 RegisterID* CodeGenerator::emitCall(OpcodeID opcodeID, RegisterID* dst, RegisterID* func, RegisterID* base, ArgumentsNode* argumentsNode, unsigned divot, unsigned startOffset, unsigned endOffset) 863 863 { 864 864 ASSERT(opcodeID == op_call || opcodeID == op_call_eval); … … 883 883 } 884 884 885 emitExpressionInfo(divot, startOffset, endOffset); 885 886 emitOpcode(opcodeID); 886 887 instructions().append(dst->index()); -
trunk/JavaScriptCore/VM/CodeGenerator.h
r35037 r35245 183 183 } 184 184 185 void emitExpressionInfo(unsigned divot, unsigned startOffset, unsigned endOffset) 186 { 187 divot -= m_codeBlock->sourceOffset; 188 if (divot > ExpressionRangeInfo::MaxDivot) { 189 // Overflow has occurred, we can only give line number info for errors for this region 190 divot = 0; 191 startOffset = 0; 192 endOffset = 0; 193 } else if (startOffset > ExpressionRangeInfo::MaxOffset) { 194 // If the start offset is out of bounds we clear both offsets 195 // so we only get the divot marker. Error message will have to be reduced 196 // to line and column number. 197 startOffset = 0; 198 endOffset = 0; 199 } else if (endOffset > ExpressionRangeInfo::MaxOffset) { 200 // The end offset is only used for additional context, and is much more likely 201 // to overflow (eg. function call arguments) so we are willing to drop it without 202 // dropping the rest of the range. 203 endOffset = 0; 204 } 205 206 ExpressionRangeInfo info; 207 info.instructionOffset = instructions().size(); 208 info.divotPoint = divot; 209 info.startOffset = startOffset; 210 info.endOffset = endOffset; 211 m_codeBlock->expressionInfo.append(info); 212 } 213 185 214 ALWAYS_INLINE bool leftHandSideNeedsCopy(bool rightHasAssignments, bool rightIsPure) 186 215 { … … 245 274 RegisterID* emitPutSetter(RegisterID* base, const Identifier& property, RegisterID* value); 246 275 247 RegisterID* emitCall(RegisterID* dst, RegisterID* func, RegisterID* base, ArgumentsNode* );248 RegisterID* emitCallEval(RegisterID* dst, RegisterID* func, RegisterID* base, ArgumentsNode* );276 RegisterID* emitCall(RegisterID* dst, RegisterID* func, RegisterID* base, ArgumentsNode*, unsigned divot, unsigned startOffset, unsigned endOffset); 277 RegisterID* emitCallEval(RegisterID* dst, RegisterID* func, RegisterID* base, ArgumentsNode*, unsigned divot, unsigned startOffset, unsigned endOffset); 249 278 250 279 RegisterID* emitReturn(RegisterID* src) { return emitUnaryNoDstOp(op_ret, src); } … … 313 342 typedef HashMap<RefPtr<UString::Rep>, int, IdentifierRepHash, HashTraits<RefPtr<UString::Rep> >, IdentifierMapIndexHashTraits> IdentifierMap; 314 343 315 RegisterID* emitCall(OpcodeID, RegisterID*, RegisterID*, RegisterID*, ArgumentsNode* );344 RegisterID* emitCall(OpcodeID, RegisterID*, RegisterID*, RegisterID*, ArgumentsNode*, unsigned divot, unsigned startOffset, unsigned endOffset); 316 345 317 346 // Maps a register index in the symbol table to a RegisterID index in m_locals. -
trunk/JavaScriptCore/VM/ExceptionHelpers.cpp
r34842 r35245 30 30 #include "ExceptionHelpers.h" 31 31 32 #include "CodeBlock.h" 32 33 #include "ExecState.h" 33 34 #include "nodes.h" 34 35 #include "JSObject.h" 36 #include "JSNotAnObject.h" 35 37 36 38 namespace KJS { … … 68 70 } 69 71 70 JSValue* createError(ExecState* exec, ErrorType e, const char* msg, JSValue* v, Node* expr)71 {72 UString message = msg;73 substitute(message, v->toString(exec));74 if (expr)75 substitute(message, expr->toString());76 return Error::create(exec, e, message, -1, -1, 0);77 }78 79 72 JSValue* createError(ExecState* exec, ErrorType e, const char* msg, JSValue* v) 80 73 { … … 89 82 } 90 83 91 JSValue* createUndefinedVariableError(ExecState* exec, const Identifier& ident) 92 { 93 return createError(exec, ReferenceError, "Can't find variable: %s", ident); 94 } 95 96 JSValue* createInvalidParamError(ExecState* exec, const char* op, JSValue* v) 97 { 98 UString message = "'%s' is not a valid argument for '%s'"; 99 substitute(message, v->toString(exec)); 100 substitute(message, op); 101 return Error::create(exec, TypeError, message, -1, -1, 0); 102 } 103 104 JSValue* createNotAConstructorError(ExecState* exec, JSValue* value, Node* expr) 105 { 106 if (expr) 107 return createError(exec, TypeError, "Value %s (result of expression %s) is not a constructor. Cannot be used with new.", value, expr); 108 return createError(exec, TypeError, "Value %s is not a constructor. Cannot be used with new.", value); 109 } 110 111 JSValue* createNotAFunctionError(ExecState* exec, JSValue* value, Node* expr) 112 { 113 if (expr) 114 return createError(exec, TypeError, "Value %s (result of expression %s) does not allow function calls.", value, expr); 115 return createError(exec, TypeError, "Value %s does not allow function calls.", value); 84 JSValue* createUndefinedVariableError(ExecState* exec, const Identifier& ident, const Instruction* vPC, CodeBlock* codeBlock) 85 { 86 int startOffset = 0; 87 int endOffset = 0; 88 int divotPoint = 0; 89 int line = codeBlock->expressionRangeForVPC(vPC, divotPoint, startOffset, endOffset); 90 UString message = "Can't find variable: "; 91 message.append(ident.ustring()); 92 JSObject* exception = Error::create(exec, ReferenceError, message, line, codeBlock->ownerNode->sourceId(), codeBlock->ownerNode->sourceURL()); 93 exception->putWithAttributes(exec, Identifier(exec, expressionBeginOffsetPropertyName), jsNumber(exec, divotPoint - startOffset), ReadOnly | DontDelete); 94 exception->putWithAttributes(exec, Identifier(exec, expressionCaretOffsetPropertyName), jsNumber(exec, divotPoint), ReadOnly | DontDelete); 95 exception->putWithAttributes(exec, Identifier(exec, expressionEndOffsetPropertyName), jsNumber(exec, divotPoint + endOffset), ReadOnly | DontDelete); 96 return exception; 97 } 98 99 bool isStrWhiteSpace(UChar c); 100 101 static UString createErrorMessage(ExecState* exec, CodeBlock* codeBlock, int, int expressionStart, int expressionStop, JSValue* value, UString error) 102 { 103 if (!expressionStop || expressionStart > codeBlock->source->length()) { 104 UString errorText = value->toString(exec); 105 errorText.append(" is "); 106 errorText.append(error); 107 return errorText; 108 } 109 110 UString errorText = "Result of expression "; 111 112 if (expressionStart < expressionStop) { 113 errorText.append('\''); 114 errorText.append(codeBlock->source->getRange(expressionStart, expressionStop)); 115 errorText.append("' ["); 116 errorText.append(value->toString(exec)); 117 errorText.append("] is "); 118 } else { 119 // No range information, so give a few characters of context 120 const UChar* data = codeBlock->source->data(); 121 int dataLength = codeBlock->source->length(); 122 int start = expressionStart; 123 int stop = expressionStart; 124 // Get up to 20 characters of context to the left and right of the divot, clamping to the line. 125 // then strip whitespace. 126 while (start > 0 && (expressionStart - start < 20) && data[start - 1] != '\n') 127 start--; 128 while (start < (expressionStart - 1) && isStrWhiteSpace(data[start])) 129 start++; 130 while (stop < dataLength && (stop - expressionStart < 20) && data[stop] != '\n') 131 stop++; 132 while (stop > expressionStart && isStrWhiteSpace(data[stop])) 133 stop--; 134 errorText.append("near '..."); 135 errorText.append(codeBlock->source->getRange(start, stop)); 136 errorText.append("...' ["); 137 errorText.append(value->toString(exec)); 138 errorText.append("] is "); 139 } 140 errorText.append(error); 141 errorText.append("."); 142 return errorText; 143 } 144 145 JSValue* createInvalidParamError(ExecState* exec, const char* op, JSValue* value, const Instruction* vPC, CodeBlock* codeBlock) 146 { 147 UString message = "not a valid argument for '"; 148 message.append(op); 149 message.append("'"); 150 151 int startOffset = 0; 152 int endOffset = 0; 153 int divotPoint = 0; 154 int line = codeBlock->expressionRangeForVPC(vPC, divotPoint, startOffset, endOffset); 155 UString errorMessage = createErrorMessage(exec, codeBlock, line, divotPoint, divotPoint + endOffset, value, message); 156 JSObject* exception = Error::create(exec, TypeError, errorMessage, line, codeBlock->ownerNode->sourceId(), codeBlock->ownerNode->sourceURL()); 157 exception->putWithAttributes(exec, Identifier(exec, expressionBeginOffsetPropertyName), jsNumber(exec, divotPoint - startOffset), ReadOnly | DontDelete); 158 exception->putWithAttributes(exec, Identifier(exec, expressionCaretOffsetPropertyName), jsNumber(exec, divotPoint), ReadOnly | DontDelete); 159 exception->putWithAttributes(exec, Identifier(exec, expressionEndOffsetPropertyName), jsNumber(exec, divotPoint + endOffset), ReadOnly | DontDelete); 160 return exception; 161 } 162 163 JSValue* createNotAConstructorError(ExecState* exec, JSValue* value, const Instruction* vPC, CodeBlock* codeBlock) 164 { 165 int startOffset = 0; 166 int endOffset = 0; 167 int divotPoint = 0; 168 int line = codeBlock->expressionRangeForVPC(vPC, divotPoint, startOffset, endOffset); 169 170 // We're in a "new" expression, so we need to skip over the "new.." part 171 int startPoint = divotPoint - (startOffset ? startOffset - 4 : 0); // -4 for "new " 172 const UChar* data = codeBlock->source->data(); 173 while (startPoint < divotPoint && isStrWhiteSpace(data[startPoint])) 174 startPoint++; 175 176 UString errorMessage = createErrorMessage(exec, codeBlock, line, startPoint, divotPoint, value, "not a constructor"); 177 JSObject* exception = Error::create(exec, TypeError, errorMessage, line, codeBlock->ownerNode->sourceId(), codeBlock->ownerNode->sourceURL()); 178 exception->putWithAttributes(exec, Identifier(exec, expressionBeginOffsetPropertyName), jsNumber(exec, divotPoint - startOffset), ReadOnly | DontDelete); 179 exception->putWithAttributes(exec, Identifier(exec, expressionCaretOffsetPropertyName), jsNumber(exec, divotPoint), ReadOnly | DontDelete); 180 exception->putWithAttributes(exec, Identifier(exec, expressionEndOffsetPropertyName), jsNumber(exec, divotPoint + endOffset), ReadOnly | DontDelete); 181 return exception; 182 } 183 184 JSValue* createNotAFunctionError(ExecState* exec, JSValue* value, const Instruction* vPC, CodeBlock* codeBlock) 185 { 186 int startOffset = 0; 187 int endOffset = 0; 188 int divotPoint = 0; 189 int line = codeBlock->expressionRangeForVPC(vPC, divotPoint, startOffset, endOffset); 190 UString errorMessage = createErrorMessage(exec, codeBlock, line, divotPoint - startOffset, divotPoint, value, "not a function"); 191 JSObject* exception = Error::create(exec, TypeError, errorMessage, line, codeBlock->ownerNode->sourceId(), codeBlock->ownerNode->sourceURL()); 192 exception->putWithAttributes(exec, Identifier(exec, expressionBeginOffsetPropertyName), jsNumber(exec, divotPoint - startOffset), ReadOnly | DontDelete); 193 exception->putWithAttributes(exec, Identifier(exec, expressionCaretOffsetPropertyName), jsNumber(exec, divotPoint), ReadOnly | DontDelete); 194 exception->putWithAttributes(exec, Identifier(exec, expressionEndOffsetPropertyName), jsNumber(exec, divotPoint + endOffset), ReadOnly | DontDelete); 195 return exception; 196 } 197 198 JSNotAnObjectErrorStub* createNotAnObjectErrorStub(ExecState* exec, bool isNull) 199 { 200 return new (exec) JSNotAnObjectErrorStub(isNull); 201 } 202 203 JSObject* createNotAnObjectError(ExecState* exec, JSNotAnObjectErrorStub* error, const Instruction* vPC, CodeBlock* codeBlock) 204 { 205 int startOffset = 0; 206 int endOffset = 0; 207 int divotPoint = 0; 208 int line = codeBlock->expressionRangeForVPC(vPC, divotPoint, startOffset, endOffset); 209 UString errorMessage = createErrorMessage(exec, codeBlock, line, divotPoint - startOffset, divotPoint, error->isNull() ? jsNull() : jsUndefined(), "not an object"); 210 JSObject* exception = Error::create(exec, TypeError, errorMessage, line, codeBlock->ownerNode->sourceId(), codeBlock->ownerNode->sourceURL()); 211 exception->putWithAttributes(exec, Identifier(exec, expressionBeginOffsetPropertyName), jsNumber(exec, divotPoint - startOffset), ReadOnly | DontDelete); 212 exception->putWithAttributes(exec, Identifier(exec, expressionCaretOffsetPropertyName), jsNumber(exec, divotPoint), ReadOnly | DontDelete); 213 exception->putWithAttributes(exec, Identifier(exec, expressionEndOffsetPropertyName), jsNumber(exec, divotPoint + endOffset), ReadOnly | DontDelete); 214 return exception; 116 215 } 117 216 -
trunk/JavaScriptCore/VM/ExceptionHelpers.h
r34842 r35245 35 35 36 36 class Node; 37 class CodeBlock; 38 class Instruction; 39 class JSNotAnObjectErrorStub; 37 40 38 41 JSValue* createInterruptedExecutionException(ExecState* exec); 39 42 JSValue* createStackOverflowError(ExecState*); 40 JSValue* createUndefinedVariableError(ExecState*, const Identifier&); 41 JSValue* createInvalidParamError(ExecState*, const char* op, JSValue*); 42 JSValue* createNotAConstructorError(ExecState*, JSValue*, Node* expr); 43 JSValue* createNotAFunctionError(ExecState*, JSValue*, Node* expr); 43 JSValue* createUndefinedVariableError(ExecState*, const Identifier&, const Instruction*, CodeBlock*); 44 JSNotAnObjectErrorStub* createNotAnObjectErrorStub(ExecState*, bool isNull); 45 JSValue* createInvalidParamError(ExecState*, const char* op, JSValue*, const Instruction*, CodeBlock*); 46 JSValue* createNotAConstructorError(ExecState*, JSValue*, const Instruction*, CodeBlock*); 47 JSValue* createNotAFunctionError(ExecState*, JSValue*, const Instruction*, CodeBlock*); 48 JSObject* createNotAnObjectError(ExecState*, JSNotAnObjectErrorStub*, const Instruction*, CodeBlock*); 44 49 45 50 } // namespace KJS -
trunk/JavaScriptCore/VM/Machine.cpp
r35242 r35245 39 39 #include "JSArray.h" 40 40 #include "JSFunction.h" 41 #include "JSNotAnObject.h" 41 42 #include "JSPropertyNameIterator.h" 42 43 #include "JSString.h" … … 222 223 } 223 224 } while (++iter != end); 224 exceptionValue = createUndefinedVariableError(exec, ident );225 exceptionValue = createUndefinedVariableError(exec, ident, vPC, codeBlock); 225 226 return false; 226 227 } … … 252 253 } 253 254 } while (++iter != end); 254 exceptionValue = createUndefinedVariableError(exec, ident );255 exceptionValue = createUndefinedVariableError(exec, ident, vPC, codeBlock); 255 256 return false; 256 257 } … … 311 312 } while (iter != end); 312 313 313 exceptionValue = createUndefinedVariableError(exec, ident );314 exceptionValue = createUndefinedVariableError(exec, ident, vPC, codeBlock); 314 315 return false; 315 316 } … … 354 355 } while (iter != end); 355 356 356 exceptionValue = createUndefinedVariableError(exec, ident );357 exceptionValue = createUndefinedVariableError(exec, ident, vPC, codeBlock); 357 358 return false; 358 359 } … … 430 431 } 431 432 432 static NEVER_INLINE bool isNotObject(ExecState* exec, bool forInstanceOf, CodeBlock* , JSValue* value, JSValue*& exceptionData)433 static NEVER_INLINE bool isNotObject(ExecState* exec, bool forInstanceOf, CodeBlock* codeBlock, const Instruction* vPC, JSValue* value, JSValue*& exceptionData) 433 434 { 434 435 if (value->isObject()) 435 436 return false; 436 exceptionData = createInvalidParamError(exec, forInstanceOf ? "instanceof" : "in" , value );437 exceptionData = createInvalidParamError(exec, forInstanceOf ? "instanceof" : "in" , value, vPC, codeBlock); 437 438 return true; 438 439 } … … 620 621 } 621 622 622 NEVER_INLINE Instruction* Machine::throwException(ExecState* exec, JSValue* exceptionValue, const Instruction* vPC, CodeBlock*& codeBlock, Register*& k, ScopeChainNode*& scopeChain, Register*& r)623 NEVER_INLINE Instruction* Machine::throwException(ExecState* exec, JSValue*& exceptionValue, const Instruction* vPC, CodeBlock*& codeBlock, Register*& k, ScopeChainNode*& scopeChain, Register*& r, bool explicitThrow) 623 624 { 624 625 // Set up the exception object … … 626 627 if (exceptionValue->isObject()) { 627 628 JSObject* exception = static_cast<JSObject*>(exceptionValue); 628 if (!exception->hasProperty(exec, Identifier(exec, "line")) && !exception->hasProperty(exec, Identifier(exec, "sourceURL"))) { 629 exception->put(exec, Identifier(exec, "line"), jsNumber(exec, codeBlock->lineNumberForVPC(vPC))); 630 exception->put(exec, Identifier(exec, "sourceURL"), jsOwnedString(exec, codeBlock->ownerNode->sourceURL())); 631 } 632 633 if (exception->isWatchdogException()) { 634 while (unwindCallFrame(exec, exceptionValue, vPC, codeBlock, k, scopeChain, r)) { 635 // Don't need handler checks or anything, we just want to unroll all the JS callframes possible. 629 if (exception->isNotAnObjectErrorStub()) { 630 exception = createNotAnObjectError(exec, static_cast<JSNotAnObjectErrorStub*>(exception), vPC, codeBlock); 631 exceptionValue = exception; 632 } else { 633 if (!exception->hasProperty(exec, Identifier(exec, "line")) && 634 !exception->hasProperty(exec, Identifier(exec, "sourceId")) && 635 !exception->hasProperty(exec, Identifier(exec, "sourceURL")) && 636 !exception->hasProperty(exec, Identifier(exec, expressionBeginOffsetPropertyName)) && 637 !exception->hasProperty(exec, Identifier(exec, expressionCaretOffsetPropertyName)) && 638 !exception->hasProperty(exec, Identifier(exec, expressionEndOffsetPropertyName))) { 639 if (explicitThrow) { 640 int startOffset = 0; 641 int endOffset = 0; 642 int divotPoint = 0; 643 int line = codeBlock->expressionRangeForVPC(vPC, divotPoint, startOffset, endOffset); 644 exception->putWithAttributes(exec, Identifier(exec, "line"), jsNumber(exec, line), ReadOnly | DontDelete); 645 646 // We only hit this path for error messages and throw statements, which don't have a specific failure position 647 // So we just give the full range of the error/throw statement. 648 exception->putWithAttributes(exec, Identifier(exec, expressionBeginOffsetPropertyName), jsNumber(exec, divotPoint - startOffset), ReadOnly | DontDelete); 649 exception->putWithAttributes(exec, Identifier(exec, expressionEndOffsetPropertyName), jsNumber(exec, divotPoint + endOffset), ReadOnly | DontDelete); 650 } else 651 exception->putWithAttributes(exec, Identifier(exec, "line"), jsNumber(exec, codeBlock->lineNumberForVPC(vPC)), ReadOnly | DontDelete); 652 exception->putWithAttributes(exec, Identifier(exec, "sourceId"), jsNumber(exec, codeBlock->ownerNode->sourceId()), ReadOnly | DontDelete); 653 exception->putWithAttributes(exec, Identifier(exec, "sourceURL"), jsOwnedString(exec, codeBlock->ownerNode->sourceURL()), ReadOnly | DontDelete); 636 654 } 637 return 0; 655 656 if (exception->isWatchdogException()) { 657 while (unwindCallFrame(exec, exceptionValue, vPC, codeBlock, k, scopeChain, r)) { 658 // Don't need handler checks or anything, we just want to unroll all the JS callframes possible. 659 } 660 return 0; 661 } 638 662 } 639 663 } … … 1577 1601 JSValue* baseVal = r[base].jsValue(); 1578 1602 1579 if (isNotObject(exec, vPC, codeBlock, baseVal, exceptionValue))1603 if (isNotObject(exec, true, codeBlock, vPC, baseVal, exceptionValue)) 1580 1604 goto vm_throw; 1581 1605 … … 1613 1637 1614 1638 JSValue* baseVal = r[base].jsValue(); 1615 if (isNotObject(exec, vPC, codeBlock, baseVal, exceptionValue))1639 if (isNotObject(exec, false, codeBlock, vPC, baseVal, exceptionValue)) 1616 1640 goto vm_throw; 1617 1641 … … 2282 2306 ASSERT(callType == CallTypeNone); 2283 2307 2284 exceptionValue = createNotAFunctionError(exec, v, 0);2308 exceptionValue = createNotAFunctionError(exec, v, vPC, codeBlock); 2285 2309 goto vm_throw; 2286 2310 } … … 2407 2431 ASSERT(constructType == ConstructTypeNone); 2408 2432 2409 exceptionValue = createNotAConstructorError(exec, constrVal, 0);2433 exceptionValue = createNotAConstructorError(exec, constrVal, vPC, codeBlock); 2410 2434 goto vm_throw; 2411 2435 } … … 2523 2547 int ex = (++vPC)->u.operand; 2524 2548 exceptionValue = r[ex].jsValue(); 2525 handlerVPC = throwException(exec, exceptionValue, vPC, codeBlock, k, scopeChain, r); 2549 2550 handlerVPC = throwException(exec, exceptionValue, vPC, codeBlock, k, scopeChain, r, true); 2526 2551 if (!handlerVPC) { 2527 2552 *exception = exceptionValue; … … 2663 2688 exceptionValue = createInterruptedExecutionException(exec); 2664 2689 } 2665 handlerVPC = throwException(exec, exceptionValue, vPC, codeBlock, k, scopeChain, r );2690 handlerVPC = throwException(exec, exceptionValue, vPC, codeBlock, k, scopeChain, r, false); 2666 2691 if (!handlerVPC) { 2667 2692 *exception = exceptionValue; -
trunk/JavaScriptCore/VM/Machine.h
r35231 r35245 133 133 134 134 NEVER_INLINE bool unwindCallFrame(ExecState*, JSValue*, const Instruction*&, CodeBlock*&, Register*&, ScopeChainNode*&, Register*&); 135 NEVER_INLINE Instruction* throwException(ExecState*, JSValue* , const Instruction*, CodeBlock*&, Register*&, ScopeChainNode*&, Register*&);135 NEVER_INLINE Instruction* throwException(ExecState*, JSValue*&, const Instruction*, CodeBlock*&, Register*&, ScopeChainNode*&, Register*&, bool); 136 136 137 137 Register* callFrame(ExecState*, JSFunction*) const; -
trunk/JavaScriptCore/kjs/DebuggerCallFrame.cpp
r35203 r35245 81 81 int errLine; 82 82 UString errMsg; 83 84 RefPtr<EvalNode> evalNode = newExec.parser()->parse<EvalNode>(&newExec, UString(), 1, UStringSourceProvider::create(script), &sourceId, &errLine, &errMsg); 85 83 RefPtr<SourceProvider> sourceProvider = UStringSourceProvider::create(script); 84 RefPtr<EvalNode> evalNode = newExec.parser()->parse<EvalNode>(&newExec, UString(), 1, sourceProvider, &sourceId, &errLine, &errMsg); 86 85 if (!evalNode) 87 86 return Error::create(&newExec, SyntaxError, errMsg, errLine, sourceId, 0); -
trunk/JavaScriptCore/kjs/Error.cpp
r35022 r35245 33 33 34 34 namespace KJS { 35 36 const char* expressionBeginOffsetPropertyName = "expressionBeginOffset"; 37 const char* expressionCaretOffsetPropertyName = "expressionCaretOffset"; 38 const char* expressionEndOffsetPropertyName = "expressionEndOffset"; 35 39 36 40 JSObject* Error::create(ExecState* exec, ErrorType type, const UString& message, int lineNumber, int sourceId, const UString& sourceURL) … … 79 83 80 84 if (lineNumber != -1) 81 error->put (exec, Identifier(exec, "line"), jsNumber(exec, lineNumber));85 error->putWithAttributes(exec, Identifier(exec, "line"), jsNumber(exec, lineNumber), ReadOnly | DontDelete); 82 86 if (sourceId != -1) 83 error->put (exec, Identifier(exec, "sourceId"), jsNumber(exec, sourceId));87 error->putWithAttributes(exec, Identifier(exec, "sourceId"), jsNumber(exec, sourceId), ReadOnly | DontDelete); 84 88 if (!sourceURL.isNull()) 85 error->put (exec, Identifier(exec, "sourceURL"), jsString(exec, sourceURL));89 error->putWithAttributes(exec, Identifier(exec, "sourceURL"), jsString(exec, sourceURL), ReadOnly | DontDelete); 86 90 87 91 return error; -
trunk/JavaScriptCore/kjs/Error.h
r35022 r35245 43 43 URIError = 6 44 44 }; 45 45 46 extern const char* expressionBeginOffsetPropertyName; 47 extern const char* expressionCaretOffsetPropertyName; 48 extern const char* expressionEndOffsetPropertyName; 49 46 50 class Error { 47 51 public: -
trunk/JavaScriptCore/kjs/JSGlobalObjectFunctions.cpp
r35027 r35245 137 137 } 138 138 139 staticbool isStrWhiteSpace(unsigned short c)139 bool isStrWhiteSpace(unsigned short c) 140 140 { 141 141 switch (c) { -
trunk/JavaScriptCore/kjs/JSImmediate.cpp
r35008 r35245 25 25 #include "BooleanPrototype.h" 26 26 #include "Error.h" 27 #include "ExceptionHelpers.h" 27 28 #include "JSGlobalObject.h" 28 29 #include "JSNotAnObject.h" … … 39 40 if (isBoolean(v)) 40 41 return constructBooleanFromImmediateBoolean(exec, const_cast<JSValue*>(v)); 41 if (v == jsNull())42 return new (exec) JSNotAnObject(throwError(exec, TypeError, "Null value"));43 ASSERT(v == jsUndefined());44 return new (exec) JSNotAnObject( throwError(exec, TypeError, "Undefined value"));42 43 JSNotAnObjectErrorStub* exception = createNotAnObjectErrorStub(exec, v == jsNull()); 44 exec->setException(exception); 45 return new (exec) JSNotAnObject(exception); 45 46 } 46 47 … … 52 53 if (isBoolean(v)) 53 54 return exec->lexicalGlobalObject()->booleanPrototype(); 54 if (v == jsNull()) 55 return new (exec) JSNotAnObject(throwError(exec, TypeError, "Null value"));56 ASSERT(v == jsUndefined());57 return new (exec) JSNotAnObject( throwError(exec, TypeError, "Undefined value"));55 56 JSNotAnObjectErrorStub* exception = createNotAnObjectErrorStub(exec, v == jsNull()); 57 exec->setException(exception); 58 return new (exec) JSNotAnObject(exception); 58 59 } 59 60 -
trunk/JavaScriptCore/kjs/JSNotAnObject.h
r35027 r35245 34 34 namespace KJS { 35 35 36 class JSNotAnObjectErrorStub : public JSObject { 37 public: 38 JSNotAnObjectErrorStub(bool isNull) 39 : m_isNull(isNull) 40 { 41 } 42 bool isNull() const { return m_isNull; } 43 bool isNotAnObjectErrorStub() const { return true; } 44 private: 45 bool m_isNull; 46 }; 47 36 48 // This unholy class is used to allow us to avoid multiple exception checks 37 49 // in certain SquirrelFish opcodes -- effectively it just silently consumes … … 39 51 class JSNotAnObject : public JSObject { 40 52 public: 41 JSNotAnObject(JS Object* exception)53 JSNotAnObject(JSNotAnObjectErrorStub* exception) 42 54 : m_exception(exception) 43 55 { … … 68 80 virtual void getPropertyNames(ExecState*, PropertyNameArray&); 69 81 70 JS Object* m_exception;82 JSNotAnObjectErrorStub* m_exception; 71 83 }; 72 84 -
trunk/JavaScriptCore/kjs/JSObject.h
r35068 r35245 324 324 325 325 virtual bool isWatchdogException() const { return false; } 326 327 virtual bool isNotAnObjectErrorStub() const { return false; } 326 328 327 329 protected: -
trunk/JavaScriptCore/kjs/Parser.h
r35037 r35245 81 81 { 82 82 m_sourceURL = sourceURL; 83 parse(exec, sourceURL, startingLineNumber, source, sourceId, errLine, errMsg); 83 RefPtr<SourceProvider> sourceProvider = source; 84 parse(exec, sourceURL, startingLineNumber, sourceProvider.get(), sourceId, errLine, errMsg); 84 85 if (!m_sourceElements) { 85 86 m_sourceURL = UString(); … … 90 91 m_varDeclarations ? &m_varDeclarations->data : 0, 91 92 m_funcDeclarations ? &m_funcDeclarations->data : 0, 93 sourceProvider.get(), 92 94 m_usesEval, 93 95 m_needsClosure); -
trunk/JavaScriptCore/kjs/SourceRange.h
r34372 r35245 54 54 return m_sourceProvider->getRange(m_startChar, m_endChar); 55 55 } 56 56 57 SourceProvider* sourceProvider() const { return m_sourceProvider.get(); } 58 int startOffset() const { return m_startChar; } 57 59 private: 58 60 RefPtr<SourceProvider> m_sourceProvider; -
trunk/JavaScriptCore/kjs/grammar.y
r35224 r35245 58 58 59 59 #define AUTO_SEMICOLON do { if (!allowAutomaticSemicolon(*LEXER, yychar)) YYABORT; } while (0) 60 #define SET_EXCEPTION_LOCATION(node, start, divot, end) node->setExceptionSourceRange((divot), (divot) - (start), (end) - (divot)) 60 61 #define DBG(l, s, e) (l)->setLoc((s).first_line, (e).last_line) 61 62 … … 63 64 using namespace std; 64 65 65 static ExpressionNode* makeAssignNode(void*, ExpressionNode* loc, Operator, ExpressionNode* expr, bool locHasAssignments, bool exprHasAssignments );66 static ExpressionNode* makePrefixNode(void*, ExpressionNode* expr, Operator );67 static ExpressionNode* makePostfixNode(void*, ExpressionNode* expr, Operator );66 static ExpressionNode* makeAssignNode(void*, ExpressionNode* loc, Operator, ExpressionNode* expr, bool locHasAssignments, bool exprHasAssignments, int start, int divot, int end); 67 static ExpressionNode* makePrefixNode(void*, ExpressionNode* expr, Operator, int start, int divot, int end); 68 static ExpressionNode* makePostfixNode(void*, ExpressionNode* expr, Operator, int start, int divot, int end); 68 69 static PropertyNode* makeGetterOrSetterPropertyNode(void*, const Identifier &getOrSet, const Identifier& name, ParameterNode*, FunctionBodyNode*, const SourceRange&); 69 static ExpressionNodeInfo makeFunctionCallNode(void*, ExpressionNodeInfo func, ArgumentsNodeInfo );70 static ExpressionNodeInfo makeFunctionCallNode(void*, ExpressionNodeInfo func, ArgumentsNodeInfo, int start, int divot, int end); 70 71 static ExpressionNode* makeTypeOfNode(void*, ExpressionNode*); 71 static ExpressionNode* makeDeleteNode(void*, ExpressionNode* );72 static ExpressionNode* makeDeleteNode(void*, ExpressionNode*, int start, int divot, int end); 72 73 static ExpressionNode* makeNegateNode(void*, ExpressionNode*); 73 74 static NumberNode* makeNumberNode(void*, double); … … 288 289 if (!l.scanRegExp()) 289 290 YYABORT; 290 $$ = createNodeFeatureInfo<ExpressionNode*>(new RegExpNode(GLOBAL_DATA, l.pattern(), l.flags()), 0); 291 RegExpNode* node = new RegExpNode(GLOBAL_DATA, l.pattern(), l.flags()); 292 int size = l.pattern().size() + 2; // + 2 for the two /'s 293 SET_EXCEPTION_LOCATION(node, @1.first_column, @1.first_column + size, @1.first_column + size); 294 $$ = createNodeFeatureInfo<ExpressionNode*>(node, 0); 291 295 } 292 296 | DIVEQUAL /* regexp with /= */ { … … 294 298 if (!l.scanRegExp()) 295 299 YYABORT; 296 $$ = createNodeFeatureInfo<ExpressionNode*>(new RegExpNode(GLOBAL_DATA, "=" + l.pattern(), l.flags()), 0); 300 RegExpNode* node = new RegExpNode(GLOBAL_DATA, l.pattern(), l.flags()); 301 int size = l.pattern().size() + 2; // + 2 for the two /'s 302 SET_EXCEPTION_LOCATION(node, @1.first_column, @1.first_column + size, @1.first_column + size); 303 $$ = createNodeFeatureInfo<ExpressionNode*>(node, 0); 297 304 } 298 305 ; … … 328 335 | Literal 329 336 | ArrayLiteral 330 | IDENT { $$ = createNodeFeatureInfo<ExpressionNode*>(new ResolveNode(GLOBAL_DATA, *$1 ), 0); }337 | IDENT { $$ = createNodeFeatureInfo<ExpressionNode*>(new ResolveNode(GLOBAL_DATA, *$1, @1.first_column), 0); } 331 338 | '(' Expr ')' { $$ = $2; } 332 339 ; … … 361 368 PrimaryExpr 362 369 | FunctionExpr { $$ = createNodeFeatureInfo<ExpressionNode*>($1.m_node, $1.m_featureInfo); } 363 | MemberExpr '[' Expr ']' { $$ = createNodeFeatureInfo<ExpressionNode*>(new BracketAccessorNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo & AssignFeature), $1.m_featureInfo | $3.m_featureInfo); } 364 | MemberExpr '.' IDENT { $$ = createNodeFeatureInfo<ExpressionNode*>(new DotAccessorNode(GLOBAL_DATA, $1.m_node, *$3), $1.m_featureInfo); } 365 | NEW MemberExpr Arguments { $$ = createNodeFeatureInfo<ExpressionNode*>(new NewExprNode(GLOBAL_DATA, $2.m_node, $3.m_node), $2.m_featureInfo | $3.m_featureInfo); } 370 | MemberExpr '[' Expr ']' { BracketAccessorNode* node = new BracketAccessorNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo & AssignFeature); 371 SET_EXCEPTION_LOCATION(node, @1.first_column, @1.last_column, @4.last_column); 372 $$ = createNodeFeatureInfo<ExpressionNode*>(node, $1.m_featureInfo | $3.m_featureInfo); 373 } 374 | MemberExpr '.' IDENT { DotAccessorNode* node = new DotAccessorNode(GLOBAL_DATA, $1.m_node, *$3); 375 SET_EXCEPTION_LOCATION(node, @1.first_column, @1.last_column, @3.last_column); 376 $$ = createNodeFeatureInfo<ExpressionNode*>(node, $1.m_featureInfo); 377 } 378 | NEW MemberExpr Arguments { NewExprNode* node = new NewExprNode(GLOBAL_DATA, $2.m_node, $3.m_node); 379 SET_EXCEPTION_LOCATION(node, @1.first_column, @2.last_column, @3.last_column); 380 $$ = createNodeFeatureInfo<ExpressionNode*>(node, $2.m_featureInfo | $3.m_featureInfo); 381 } 366 382 ; 367 383 368 384 MemberExprNoBF: 369 385 PrimaryExprNoBrace 370 | MemberExprNoBF '[' Expr ']' { $$ = createNodeFeatureInfo<ExpressionNode*>(new BracketAccessorNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo & AssignFeature), $1.m_featureInfo | $3.m_featureInfo); } 371 | MemberExprNoBF '.' IDENT { $$ = createNodeFeatureInfo<ExpressionNode*>(new DotAccessorNode(GLOBAL_DATA, $1.m_node, *$3), $1.m_featureInfo); } 372 | NEW MemberExpr Arguments { $$ = createNodeFeatureInfo<ExpressionNode*>(new NewExprNode(GLOBAL_DATA, $2.m_node, $3.m_node), $2.m_featureInfo | $3.m_featureInfo); } 386 | MemberExprNoBF '[' Expr ']' { BracketAccessorNode* node = new BracketAccessorNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo & AssignFeature); 387 SET_EXCEPTION_LOCATION(node, @1.first_column, @1.last_column, @4.last_column); 388 $$ = createNodeFeatureInfo<ExpressionNode*>(node, $1.m_featureInfo | $3.m_featureInfo); 389 } 390 | MemberExprNoBF '.' IDENT { DotAccessorNode* node = new DotAccessorNode(GLOBAL_DATA, $1.m_node, *$3); 391 SET_EXCEPTION_LOCATION(node, @1.first_column, @1.last_column, @3.last_column); 392 $$ = createNodeFeatureInfo<ExpressionNode*>(node, $1.m_featureInfo); 393 } 394 | NEW MemberExpr Arguments { NewExprNode* node = new NewExprNode(GLOBAL_DATA, $2.m_node, $3.m_node); 395 SET_EXCEPTION_LOCATION(node, @1.first_column, @2.last_column, @3.last_column); 396 $$ = createNodeFeatureInfo<ExpressionNode*>(node, $2.m_featureInfo | $3.m_featureInfo); 397 } 373 398 ; 374 399 375 400 NewExpr: 376 401 MemberExpr 377 | NEW NewExpr { $$ = createNodeFeatureInfo<ExpressionNode*>(new NewExprNode(GLOBAL_DATA, $2.m_node), $2.m_featureInfo); } 402 | NEW NewExpr { NewExprNode* node = new NewExprNode(GLOBAL_DATA, $2.m_node); 403 SET_EXCEPTION_LOCATION(node, @1.first_column, @2.last_column, @2.last_column); 404 $$ = createNodeFeatureInfo<ExpressionNode*>(node, $2.m_featureInfo); 405 } 378 406 ; 379 407 380 408 NewExprNoBF: 381 409 MemberExprNoBF 382 | NEW NewExpr { $$ = createNodeFeatureInfo<ExpressionNode*>(new NewExprNode(GLOBAL_DATA, $2.m_node), $2.m_featureInfo); } 410 | NEW NewExpr { NewExprNode* node = new NewExprNode(GLOBAL_DATA, $2.m_node); 411 SET_EXCEPTION_LOCATION(node, @1.first_column, @2.last_column, @2.last_column); 412 $$ = createNodeFeatureInfo<ExpressionNode*>(node, $2.m_featureInfo); 413 } 383 414 ; 384 415 385 416 CallExpr: 386 MemberExpr Arguments { $$ = makeFunctionCallNode(globalPtr, $1, $2); } 387 | CallExpr Arguments { $$ = makeFunctionCallNode(globalPtr, $1, $2); } 388 | CallExpr '[' Expr ']' { $$ = createNodeFeatureInfo<ExpressionNode*>(new BracketAccessorNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo & AssignFeature), $1.m_featureInfo | $3.m_featureInfo); } 389 | CallExpr '.' IDENT { $$ = createNodeFeatureInfo<ExpressionNode*>(new DotAccessorNode(GLOBAL_DATA, $1.m_node, *$3), $1.m_featureInfo); } 417 MemberExpr Arguments { $$ = makeFunctionCallNode(globalPtr, $1, $2, @1.first_column, @1.last_column, @2.last_column); } 418 | CallExpr Arguments { $$ = makeFunctionCallNode(globalPtr, $1, $2, @1.first_column, @1.last_column, @2.last_column); } 419 | CallExpr '[' Expr ']' { BracketAccessorNode* node = new BracketAccessorNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo & AssignFeature); 420 SET_EXCEPTION_LOCATION(node, @1.first_column, @1.last_column, @4.last_column); 421 $$ = createNodeFeatureInfo<ExpressionNode*>(node, $1.m_featureInfo | $3.m_featureInfo); 422 } 423 | CallExpr '.' IDENT { DotAccessorNode* node = new DotAccessorNode(GLOBAL_DATA, $1.m_node, *$3); 424 SET_EXCEPTION_LOCATION(node, @1.first_column, @1.last_column, @3.last_column); 425 $$ = createNodeFeatureInfo<ExpressionNode*>(node, $1.m_featureInfo); } 390 426 ; 391 427 392 428 CallExprNoBF: 393 MemberExprNoBF Arguments { $$ = makeFunctionCallNode(globalPtr, $1, $2); } 394 | CallExprNoBF Arguments { $$ = makeFunctionCallNode(globalPtr, $1, $2); } 395 | CallExprNoBF '[' Expr ']' { $$ = createNodeFeatureInfo<ExpressionNode*>(new BracketAccessorNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo & AssignFeature), $1.m_featureInfo | $3.m_featureInfo); } 396 | CallExprNoBF '.' IDENT { $$ = createNodeFeatureInfo<ExpressionNode*>(new DotAccessorNode(GLOBAL_DATA, $1.m_node, *$3), $1.m_featureInfo); } 429 MemberExprNoBF Arguments { $$ = makeFunctionCallNode(globalPtr, $1, $2, @1.first_column, @1.last_column, @2.last_column); } 430 | CallExprNoBF Arguments { $$ = makeFunctionCallNode(globalPtr, $1, $2, @1.first_column, @1.last_column, @2.last_column); } 431 | CallExprNoBF '[' Expr ']' { BracketAccessorNode* node = new BracketAccessorNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo & AssignFeature); 432 SET_EXCEPTION_LOCATION(node, @1.first_column, @1.last_column, @4.last_column); 433 $$ = createNodeFeatureInfo<ExpressionNode*>(node, $1.m_featureInfo | $3.m_featureInfo); 434 } 435 | CallExprNoBF '.' IDENT { DotAccessorNode* node = new DotAccessorNode(GLOBAL_DATA, $1.m_node, *$3); 436 SET_EXCEPTION_LOCATION(node, @1.first_column, @1.last_column, @3.last_column); 437 $$ = createNodeFeatureInfo<ExpressionNode*>(node, $1.m_featureInfo); 438 } 397 439 ; 398 440 … … 423 465 PostfixExpr: 424 466 LeftHandSideExpr 425 | LeftHandSideExpr PLUSPLUS { $$ = createNodeFeatureInfo<ExpressionNode*>(makePostfixNode(GLOBAL_DATA, $1.m_node, OpPlusPlus ), $1.m_featureInfo | AssignFeature); }426 | LeftHandSideExpr MINUSMINUS { $$ = createNodeFeatureInfo<ExpressionNode*>(makePostfixNode(GLOBAL_DATA, $1.m_node, OpMinusMinus ), $1.m_featureInfo | AssignFeature); }467 | LeftHandSideExpr PLUSPLUS { $$ = createNodeFeatureInfo<ExpressionNode*>(makePostfixNode(GLOBAL_DATA, $1.m_node, OpPlusPlus, @1.first_column, @1.last_column, @2.last_column), $1.m_featureInfo | AssignFeature); } 468 | LeftHandSideExpr MINUSMINUS { $$ = createNodeFeatureInfo<ExpressionNode*>(makePostfixNode(GLOBAL_DATA, $1.m_node, OpMinusMinus, @1.first_column, @1.last_column, @2.last_column), $1.m_featureInfo | AssignFeature); } 427 469 ; 428 470 429 471 PostfixExprNoBF: 430 472 LeftHandSideExprNoBF 431 | LeftHandSideExprNoBF PLUSPLUS { $$ = createNodeFeatureInfo<ExpressionNode*>(makePostfixNode(GLOBAL_DATA, $1.m_node, OpPlusPlus ), $1.m_featureInfo | AssignFeature); }432 | LeftHandSideExprNoBF MINUSMINUS { $$ = createNodeFeatureInfo<ExpressionNode*>(makePostfixNode(GLOBAL_DATA, $1.m_node, OpMinusMinus ), $1.m_featureInfo | AssignFeature); }473 | LeftHandSideExprNoBF PLUSPLUS { $$ = createNodeFeatureInfo<ExpressionNode*>(makePostfixNode(GLOBAL_DATA, $1.m_node, OpPlusPlus, @1.first_column, @1.last_column, @2.last_column), $1.m_featureInfo | AssignFeature); } 474 | LeftHandSideExprNoBF MINUSMINUS { $$ = createNodeFeatureInfo<ExpressionNode*>(makePostfixNode(GLOBAL_DATA, $1.m_node, OpMinusMinus, @1.first_column, @1.last_column, @2.last_column), $1.m_featureInfo | AssignFeature); } 433 475 ; 434 476 435 477 UnaryExprCommon: 436 DELETETOKEN UnaryExpr { $$ = createNodeFeatureInfo<ExpressionNode*>(makeDeleteNode(GLOBAL_DATA, $2.m_node ), $2.m_featureInfo); }478 DELETETOKEN UnaryExpr { $$ = createNodeFeatureInfo<ExpressionNode*>(makeDeleteNode(GLOBAL_DATA, $2.m_node, @1.first_column, @2.last_column, @2.last_column), $2.m_featureInfo); } 437 479 | VOIDTOKEN UnaryExpr { $$ = createNodeFeatureInfo<ExpressionNode*>(new VoidNode(GLOBAL_DATA, $2.m_node), $2.m_featureInfo); } 438 480 | TYPEOF UnaryExpr { $$ = createNodeFeatureInfo<ExpressionNode*>(makeTypeOfNode(GLOBAL_DATA, $2.m_node), $2.m_featureInfo); } 439 | PLUSPLUS UnaryExpr { $$ = createNodeFeatureInfo<ExpressionNode*>(makePrefixNode(GLOBAL_DATA, $2.m_node, OpPlusPlus ), $2.m_featureInfo | AssignFeature); }440 | AUTOPLUSPLUS UnaryExpr { $$ = createNodeFeatureInfo<ExpressionNode*>(makePrefixNode(GLOBAL_DATA, $2.m_node, OpPlusPlus ), $2.m_featureInfo | AssignFeature); }441 | MINUSMINUS UnaryExpr { $$ = createNodeFeatureInfo<ExpressionNode*>(makePrefixNode(GLOBAL_DATA, $2.m_node, OpMinusMinus ), $2.m_featureInfo | AssignFeature); }442 | AUTOMINUSMINUS UnaryExpr { $$ = createNodeFeatureInfo<ExpressionNode*>(makePrefixNode(GLOBAL_DATA, $2.m_node, OpMinusMinus ), $2.m_featureInfo | AssignFeature); }481 | PLUSPLUS UnaryExpr { $$ = createNodeFeatureInfo<ExpressionNode*>(makePrefixNode(GLOBAL_DATA, $2.m_node, OpPlusPlus, @1.first_column, @2.first_column + 1, @2.last_column), $2.m_featureInfo | AssignFeature); } 482 | AUTOPLUSPLUS UnaryExpr { $$ = createNodeFeatureInfo<ExpressionNode*>(makePrefixNode(GLOBAL_DATA, $2.m_node, OpPlusPlus, @1.first_column, @2.first_column + 1, @2.last_column), $2.m_featureInfo | AssignFeature); } 483 | MINUSMINUS UnaryExpr { $$ = createNodeFeatureInfo<ExpressionNode*>(makePrefixNode(GLOBAL_DATA, $2.m_node, OpMinusMinus, @1.first_column, @2.first_column + 1, @2.last_column), $2.m_featureInfo | AssignFeature); } 484 | AUTOMINUSMINUS UnaryExpr { $$ = createNodeFeatureInfo<ExpressionNode*>(makePrefixNode(GLOBAL_DATA, $2.m_node, OpMinusMinus, @1.first_column, @2.first_column + 1, @2.last_column), $2.m_featureInfo | AssignFeature); } 443 485 | '+' UnaryExpr { $$ = createNodeFeatureInfo<ExpressionNode*>(new UnaryPlusNode(GLOBAL_DATA, $2.m_node), $2.m_featureInfo); } 444 486 | '-' UnaryExpr { $$ = createNodeFeatureInfo<ExpressionNode*>(makeNegateNode(GLOBAL_DATA, $2.m_node), $2.m_featureInfo); } … … 507 549 | RelationalExpr LE ShiftExpr { $$ = createNodeFeatureInfo<ExpressionNode*>(new LessEqNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo & AssignFeature), $1.m_featureInfo | $3.m_featureInfo); } 508 550 | RelationalExpr GE ShiftExpr { $$ = createNodeFeatureInfo<ExpressionNode*>(new GreaterEqNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo & AssignFeature), $1.m_featureInfo | $3.m_featureInfo); } 509 | RelationalExpr INSTANCEOF ShiftExpr { $$ = createNodeFeatureInfo<ExpressionNode*>(new InstanceOfNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo & AssignFeature), $1.m_featureInfo | $3.m_featureInfo); } 510 | RelationalExpr INTOKEN ShiftExpr { $$ = createNodeFeatureInfo<ExpressionNode*>(new InNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo & AssignFeature), $1.m_featureInfo | $3.m_featureInfo); } 551 | RelationalExpr INSTANCEOF ShiftExpr { InstanceOfNode* node = new InstanceOfNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo & AssignFeature); 552 SET_EXCEPTION_LOCATION(node, @1.first_column, @3.first_column, @3.last_column); 553 $$ = createNodeFeatureInfo<ExpressionNode*>(node, $1.m_featureInfo | $3.m_featureInfo); } 554 | RelationalExpr INTOKEN ShiftExpr { InNode* node = new InNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo & AssignFeature); 555 SET_EXCEPTION_LOCATION(node, @1.first_column, @3.first_column, @3.last_column); 556 $$ = createNodeFeatureInfo<ExpressionNode*>(node, $1.m_featureInfo | $3.m_featureInfo); } 511 557 ; 512 558 … … 518 564 | RelationalExprNoIn GE ShiftExpr { $$ = createNodeFeatureInfo<ExpressionNode*>(new GreaterEqNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo & AssignFeature), $1.m_featureInfo | $3.m_featureInfo); } 519 565 | RelationalExprNoIn INSTANCEOF ShiftExpr 520 { $$ = createNodeFeatureInfo<ExpressionNode*>(new InstanceOfNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo & AssignFeature), $1.m_featureInfo | $3.m_featureInfo); } 566 { InstanceOfNode* node = new InstanceOfNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo & AssignFeature); 567 SET_EXCEPTION_LOCATION(node, @1.first_column, @3.first_column, @3.last_column); 568 $$ = createNodeFeatureInfo<ExpressionNode*>(node, $1.m_featureInfo | $3.m_featureInfo); } 521 569 ; 522 570 … … 528 576 | RelationalExprNoBF GE ShiftExpr { $$ = createNodeFeatureInfo<ExpressionNode*>(new GreaterEqNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo & AssignFeature), $1.m_featureInfo | $3.m_featureInfo); } 529 577 | RelationalExprNoBF INSTANCEOF ShiftExpr 530 { $$ = createNodeFeatureInfo<ExpressionNode*>(new InstanceOfNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo & AssignFeature), $1.m_featureInfo | $3.m_featureInfo); } 531 | RelationalExprNoBF INTOKEN ShiftExpr { $$ = createNodeFeatureInfo<ExpressionNode*>(new InNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo & AssignFeature), $1.m_featureInfo | $3.m_featureInfo); } 578 { InstanceOfNode* node = new InstanceOfNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo & AssignFeature); 579 SET_EXCEPTION_LOCATION(node, @1.first_column, @3.first_column, @3.last_column); 580 $$ = createNodeFeatureInfo<ExpressionNode*>(node, $1.m_featureInfo | $3.m_featureInfo); } 581 | RelationalExprNoBF INTOKEN ShiftExpr 582 { InNode* node = new InNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_featureInfo & AssignFeature); 583 SET_EXCEPTION_LOCATION(node, @1.first_column, @3.first_column, @3.last_column); 584 $$ = createNodeFeatureInfo<ExpressionNode*>(node, $1.m_featureInfo | $3.m_featureInfo); } 532 585 ; 533 586 … … 667 720 ConditionalExpr 668 721 | LeftHandSideExpr AssignmentOperator AssignmentExpr 669 { $$ = createNodeFeatureInfo<ExpressionNode*>(makeAssignNode(GLOBAL_DATA, $1.m_node, $2, $3.m_node, $1.m_featureInfo & AssignFeature, $3.m_featureInfo & AssignFeature), $1.m_featureInfo | $3.m_featureInfo | AssignFeature); } 722 { $$ = createNodeFeatureInfo<ExpressionNode*>(makeAssignNode(GLOBAL_DATA, $1.m_node, $2, $3.m_node, $1.m_featureInfo & AssignFeature, $3.m_featureInfo & AssignFeature, 723 @1.first_column, @2.first_column + 1, @3.last_column), $1.m_featureInfo | $3.m_featureInfo | AssignFeature); 724 } 670 725 ; 671 726 … … 673 728 ConditionalExprNoIn 674 729 | LeftHandSideExpr AssignmentOperator AssignmentExprNoIn 675 { $$ = createNodeFeatureInfo<ExpressionNode*>(makeAssignNode(GLOBAL_DATA, $1.m_node, $2, $3.m_node, $1.m_featureInfo & AssignFeature, $3.m_featureInfo & AssignFeature), $1.m_featureInfo | $3.m_featureInfo | AssignFeature); } 730 { $$ = createNodeFeatureInfo<ExpressionNode*>(makeAssignNode(GLOBAL_DATA, $1.m_node, $2, $3.m_node, $1.m_featureInfo & AssignFeature, $3.m_featureInfo & AssignFeature, 731 @1.first_column, @2.first_column + 1, @3.last_column), $1.m_featureInfo | $3.m_featureInfo | AssignFeature); 732 } 676 733 ; 677 734 … … 679 736 ConditionalExprNoBF 680 737 | LeftHandSideExprNoBF AssignmentOperator AssignmentExpr 681 { $$ = createNodeFeatureInfo<ExpressionNode*>(makeAssignNode(GLOBAL_DATA, $1.m_node, $2, $3.m_node, $1.m_featureInfo & AssignFeature, $3.m_featureInfo & AssignFeature), $1.m_featureInfo | $3.m_featureInfo | AssignFeature); } 738 { $$ = createNodeFeatureInfo<ExpressionNode*>(makeAssignNode(GLOBAL_DATA, $1.m_node, $2, $3.m_node, $1.m_featureInfo & AssignFeature, $3.m_featureInfo & AssignFeature, 739 @1.first_column, @2.first_column + 1, @3.last_column), $1.m_featureInfo | $3.m_featureInfo | AssignFeature); 740 } 682 741 ; 683 742 … … 753 812 $$.m_featureInfo = 0; 754 813 } 755 | IDENT Initializer { $$.m_node = new AssignResolveNode(GLOBAL_DATA, *$1, $2.m_node, $2.m_featureInfo & AssignFeature); 814 | IDENT Initializer { AssignResolveNode* node = new AssignResolveNode(GLOBAL_DATA, *$1, $2.m_node, $2.m_featureInfo & AssignFeature); 815 SET_EXCEPTION_LOCATION(node, @1.first_column, @2.first_column + 1, @2.last_column); 816 $$.m_node = node; 756 817 $$.m_varDeclarations = new ParserRefCountedData<DeclarationStacks::VarStack>(GLOBAL_DATA); 757 818 appendToVarDeclarationList(GLOBAL_DATA, $$.m_varDeclarations, *$1, DeclarationStacks::HasInitializer); … … 767 828 } 768 829 | VariableDeclarationList ',' IDENT Initializer 769 { $$.m_node = combineVarInitializers(GLOBAL_DATA, $1.m_node, new AssignResolveNode(GLOBAL_DATA, *$3, $4.m_node, $4.m_featureInfo & AssignFeature)); 830 { AssignResolveNode* node = new AssignResolveNode(GLOBAL_DATA, *$3, $4.m_node, $4.m_featureInfo & AssignFeature); 831 SET_EXCEPTION_LOCATION(node, @3.first_column, @4.first_column + 1, @4.last_column); 832 $$.m_node = combineVarInitializers(GLOBAL_DATA, $1.m_node, node); 770 833 $$.m_varDeclarations = $1.m_varDeclarations; 771 834 appendToVarDeclarationList(GLOBAL_DATA, $$.m_varDeclarations, *$3, DeclarationStacks::HasInitializer); … … 782 845 $$.m_featureInfo = 0; 783 846 } 784 | IDENT InitializerNoIn { $$.m_node = new AssignResolveNode(GLOBAL_DATA, *$1, $2.m_node, $2.m_featureInfo & AssignFeature); 847 | IDENT InitializerNoIn { AssignResolveNode* node = new AssignResolveNode(GLOBAL_DATA, *$1, $2.m_node, $2.m_featureInfo & AssignFeature); 848 SET_EXCEPTION_LOCATION(node, @1.first_column, @2.first_column + 1, @2.last_column); 849 $$.m_node = node; 785 850 $$.m_varDeclarations = new ParserRefCountedData<DeclarationStacks::VarStack>(GLOBAL_DATA); 786 851 appendToVarDeclarationList(GLOBAL_DATA, $$.m_varDeclarations, *$1, DeclarationStacks::HasInitializer); … … 796 861 } 797 862 | VariableDeclarationListNoIn ',' IDENT InitializerNoIn 798 { $$.m_node = combineVarInitializers(GLOBAL_DATA, $1.m_node, new AssignResolveNode(GLOBAL_DATA, *$3, $4.m_node, $4.m_featureInfo & AssignFeature)); 863 { AssignResolveNode* node = new AssignResolveNode(GLOBAL_DATA, *$3, $4.m_node, $4.m_featureInfo & AssignFeature); 864 SET_EXCEPTION_LOCATION(node, @3.first_column, @4.first_column + 1, @4.last_column); 865 $$.m_node = combineVarInitializers(GLOBAL_DATA, $1.m_node, node); 799 866 $$.m_varDeclarations = $1.m_varDeclarations; 800 867 appendToVarDeclarationList(GLOBAL_DATA, $$.m_varDeclarations, *$3, DeclarationStacks::HasInitializer); … … 888 955 if (!n->isLocation()) 889 956 YYABORT; 890 $$ = createNodeDeclarationInfo<StatementNode*>(new ForInNode(GLOBAL_DATA, $3.m_node, $5.m_node, $7.m_node), $7.m_varDeclarations, $7.m_funcDeclarations, 957 ForInNode* node = new ForInNode(GLOBAL_DATA, $3.m_node, $5.m_node, $7.m_node); 958 SET_EXCEPTION_LOCATION(node, @3.first_column, @3.last_column, @5.last_column); 959 $$ = createNodeDeclarationInfo<StatementNode*>(node, $7.m_varDeclarations, $7.m_funcDeclarations, 891 960 $3.m_featureInfo | $5.m_featureInfo | $7.m_featureInfo); 892 961 DBG($$.m_node, @1, @6); 893 962 } 894 963 | FOR '(' VAR IDENT INTOKEN Expr ')' Statement 895 { ForInNode *forIn = new ForInNode(GLOBAL_DATA, *$4, 0, $6.m_node, $8.m_node); 964 { ForInNode *forIn = new ForInNode(GLOBAL_DATA, *$4, 0, $6.m_node, $8.m_node, @5.first_column, @5.first_column - @4.first_column, @6.last_column - @5.first_column); 965 SET_EXCEPTION_LOCATION(forIn, @4.first_column, @5.first_column + 1, @6.last_column); 896 966 appendToVarDeclarationList(GLOBAL_DATA, $8.m_varDeclarations, *$4, DeclarationStacks::HasInitializer); 897 967 $$ = createNodeDeclarationInfo<StatementNode*>(forIn, $8.m_varDeclarations, $8.m_funcDeclarations, $6.m_featureInfo | $8.m_featureInfo); 898 968 DBG($$.m_node, @1, @7); } 899 969 | FOR '(' VAR IDENT InitializerNoIn INTOKEN Expr ')' Statement 900 { ForInNode *forIn = new ForInNode(GLOBAL_DATA, *$4, $5.m_node, $7.m_node, $9.m_node); 970 { ForInNode *forIn = new ForInNode(GLOBAL_DATA, *$4, $5.m_node, $7.m_node, $9.m_node, @5.first_column, @5.first_column - @4.first_column, @5.last_column - @5.first_column); 971 SET_EXCEPTION_LOCATION(forIn, @4.first_column, @6.first_column + 1, @7.last_column); 901 972 appendToVarDeclarationList(GLOBAL_DATA, $9.m_varDeclarations, *$4, DeclarationStacks::HasInitializer); 902 973 $$ = createNodeDeclarationInfo<StatementNode*>(forIn, $9.m_varDeclarations, $9.m_funcDeclarations, … … 916 987 917 988 ContinueStatement: 918 CONTINUE ';' { $$ = createNodeDeclarationInfo<StatementNode*>(new ContinueNode(GLOBAL_DATA), 0, 0, 0); 989 CONTINUE ';' { ContinueNode* node = new ContinueNode(GLOBAL_DATA); 990 SET_EXCEPTION_LOCATION(node, @1.first_column, @1.last_column, @1.last_column); 991 $$ = createNodeDeclarationInfo<StatementNode*>(node, 0, 0, 0); 919 992 DBG($$.m_node, @1, @2); } 920 | CONTINUE error { $$ = createNodeDeclarationInfo<StatementNode*>(new ContinueNode(GLOBAL_DATA), 0, 0, 0); 993 | CONTINUE error { ContinueNode* node = new ContinueNode(GLOBAL_DATA); 994 SET_EXCEPTION_LOCATION(node, @1.first_column, @1.last_column, @1.last_column); 995 $$ = createNodeDeclarationInfo<StatementNode*>(node, 0, 0, 0); 921 996 DBG($$.m_node, @1, @1); AUTO_SEMICOLON; } 922 | CONTINUE IDENT ';' { $$ = createNodeDeclarationInfo<StatementNode*>(new ContinueNode(GLOBAL_DATA, *$2), 0, 0, 0); 997 | CONTINUE IDENT ';' { ContinueNode* node = new ContinueNode(GLOBAL_DATA, *$2); 998 SET_EXCEPTION_LOCATION(node, @1.first_column, @2.last_column, @2.last_column); 999 $$ = createNodeDeclarationInfo<StatementNode*>(node, 0, 0, 0); 923 1000 DBG($$.m_node, @1, @3); } 924 | CONTINUE IDENT error { $$ = createNodeDeclarationInfo<StatementNode*>(new ContinueNode(GLOBAL_DATA, *$2), 0, 0, 0); 1001 | CONTINUE IDENT error { ContinueNode* node = new ContinueNode(GLOBAL_DATA, *$2); 1002 SET_EXCEPTION_LOCATION(node, @1.first_column, @2.last_column, @2.last_column); 1003 $$ = createNodeDeclarationInfo<StatementNode*>(node, 0, 0, 0); 925 1004 DBG($$.m_node, @1, @2); AUTO_SEMICOLON; } 926 1005 ; 927 1006 928 1007 BreakStatement: 929 BREAK ';' { $$ = createNodeDeclarationInfo<StatementNode*>(new BreakNode(GLOBAL_DATA), 0, 0, 0); DBG($$.m_node, @1, @2); } 930 | BREAK error { $$ = createNodeDeclarationInfo<StatementNode*>(new BreakNode(GLOBAL_DATA), 0, 0, 0); DBG($$.m_node, @1, @1); AUTO_SEMICOLON; } 931 | BREAK IDENT ';' { $$ = createNodeDeclarationInfo<StatementNode*>(new BreakNode(GLOBAL_DATA, *$2), 0, 0, 0); DBG($$.m_node, @1, @3); } 932 | BREAK IDENT error { $$ = createNodeDeclarationInfo<StatementNode*>(new BreakNode(GLOBAL_DATA, *$2), 0, 0, 0); DBG($$.m_node, @1, @2); AUTO_SEMICOLON; } 1008 BREAK ';' { BreakNode* node = new BreakNode(GLOBAL_DATA); 1009 SET_EXCEPTION_LOCATION(node, @1.first_column, @1.last_column, @1.last_column); 1010 $$ = createNodeDeclarationInfo<StatementNode*>(node, 0, 0, 0); DBG($$.m_node, @1, @2); } 1011 | BREAK error { BreakNode* node = new BreakNode(GLOBAL_DATA); 1012 SET_EXCEPTION_LOCATION(node, @1.first_column, @1.last_column, @1.last_column); 1013 $$ = createNodeDeclarationInfo<StatementNode*>(new BreakNode(GLOBAL_DATA), 0, 0, 0); DBG($$.m_node, @1, @1); AUTO_SEMICOLON; } 1014 | BREAK IDENT ';' { BreakNode* node = new BreakNode(GLOBAL_DATA, *$2); 1015 SET_EXCEPTION_LOCATION(node, @1.first_column, @2.last_column, @2.last_column); 1016 $$ = createNodeDeclarationInfo<StatementNode*>(node, 0, 0, 0); DBG($$.m_node, @1, @3); } 1017 | BREAK IDENT error { BreakNode* node = new BreakNode(GLOBAL_DATA, *$2); 1018 SET_EXCEPTION_LOCATION(node, @1.first_column, @2.last_column, @2.last_column); 1019 $$ = createNodeDeclarationInfo<StatementNode*>(new BreakNode(GLOBAL_DATA, *$2), 0, 0, 0); DBG($$.m_node, @1, @2); AUTO_SEMICOLON; } 933 1020 ; 934 1021 935 1022 ReturnStatement: 936 RETURN ';' { $$ = createNodeDeclarationInfo<StatementNode*>(new ReturnNode(GLOBAL_DATA, 0), 0, 0, 0); DBG($$.m_node, @1, @2); } 937 | RETURN error { $$ = createNodeDeclarationInfo<StatementNode*>(new ReturnNode(GLOBAL_DATA, 0), 0, 0, 0); DBG($$.m_node, @1, @1); AUTO_SEMICOLON; } 938 | RETURN Expr ';' { $$ = createNodeDeclarationInfo<StatementNode*>(new ReturnNode(GLOBAL_DATA, $2.m_node), 0, 0, $2.m_featureInfo); DBG($$.m_node, @1, @3); } 939 | RETURN Expr error { $$ = createNodeDeclarationInfo<StatementNode*>(new ReturnNode(GLOBAL_DATA, $2.m_node), 0, 0, $2.m_featureInfo); DBG($$.m_node, @1, @2); AUTO_SEMICOLON; } 1023 RETURN ';' { ReturnNode* node = new ReturnNode(GLOBAL_DATA, 0); 1024 SET_EXCEPTION_LOCATION(node, @1.first_column, @1.last_column, @1.last_column); 1025 $$ = createNodeDeclarationInfo<StatementNode*>(node, 0, 0, 0); DBG($$.m_node, @1, @2); } 1026 | RETURN error { ReturnNode* node = new ReturnNode(GLOBAL_DATA, 0); 1027 SET_EXCEPTION_LOCATION(node, @1.first_column, @1.last_column, @1.last_column); 1028 $$ = createNodeDeclarationInfo<StatementNode*>(node, 0, 0, 0); DBG($$.m_node, @1, @1); AUTO_SEMICOLON; } 1029 | RETURN Expr ';' { ReturnNode* node = new ReturnNode(GLOBAL_DATA, $2.m_node); 1030 SET_EXCEPTION_LOCATION(node, @1.first_column, @2.last_column, @2.last_column); 1031 $$ = createNodeDeclarationInfo<StatementNode*>(node, 0, 0, $2.m_featureInfo); DBG($$.m_node, @1, @3); } 1032 | RETURN Expr error { ReturnNode* node = new ReturnNode(GLOBAL_DATA, $2.m_node); 1033 SET_EXCEPTION_LOCATION(node, @1.first_column, @2.last_column, @2.last_column); 1034 $$ = createNodeDeclarationInfo<StatementNode*>(node, 0, 0, $2.m_featureInfo); DBG($$.m_node, @1, @2); AUTO_SEMICOLON; } 940 1035 ; 941 1036 942 1037 WithStatement: 943 WITH '(' Expr ')' Statement { $$ = createNodeDeclarationInfo<StatementNode*>(new WithNode(GLOBAL_DATA, $3.m_node, $5.m_node ), $5.m_varDeclarations, $5.m_funcDeclarations,944 $ 3.m_featureInfo | $5.m_featureInfo);1038 WITH '(' Expr ')' Statement { $$ = createNodeDeclarationInfo<StatementNode*>(new WithNode(GLOBAL_DATA, $3.m_node, $5.m_node, @3.last_column, @3.last_column - @3.first_column), 1039 $5.m_varDeclarations, $5.m_funcDeclarations, $3.m_featureInfo | $5.m_featureInfo); 945 1040 DBG($$.m_node, @1, @4); } 946 1041 ; … … 992 1087 LabelledStatement: 993 1088 IDENT ':' Statement { $3.m_node->pushLabel(*$1); 994 $$ = createNodeDeclarationInfo<StatementNode*>(new LabelNode(GLOBAL_DATA, *$1, $3.m_node), $3.m_varDeclarations, $3.m_funcDeclarations, $3.m_featureInfo); } 1089 LabelNode* node = new LabelNode(GLOBAL_DATA, *$1, $3.m_node); 1090 SET_EXCEPTION_LOCATION(node, @1.first_column, @2.last_column, @2.last_column); 1091 $$ = createNodeDeclarationInfo<StatementNode*>(node, $3.m_varDeclarations, $3.m_funcDeclarations, $3.m_featureInfo); } 995 1092 ; 996 1093 997 1094 ThrowStatement: 998 THROW Expr ';' { $$ = createNodeDeclarationInfo<StatementNode*>(new ThrowNode(GLOBAL_DATA, $2.m_node), 0, 0, $2.m_featureInfo); DBG($$.m_node, @1, @3); } 999 | THROW Expr error { $$ = createNodeDeclarationInfo<StatementNode*>(new ThrowNode(GLOBAL_DATA, $2.m_node), 0, 0, $2.m_featureInfo); DBG($$.m_node, @1, @2); AUTO_SEMICOLON; } 1095 THROW Expr ';' { ThrowNode* node = new ThrowNode(GLOBAL_DATA, $2.m_node); 1096 SET_EXCEPTION_LOCATION(node, @1.first_column, @2.last_column, @2.last_column); 1097 $$ = createNodeDeclarationInfo<StatementNode*>(node, 0, 0, $2.m_featureInfo); DBG($$.m_node, @1, @2); 1098 } 1099 | THROW Expr error { ThrowNode* node = new ThrowNode(GLOBAL_DATA, $2.m_node); 1100 SET_EXCEPTION_LOCATION(node, @1.first_column, @2.last_column, @2.last_column); 1101 $$ = createNodeDeclarationInfo<StatementNode*>(node, 0, 0, $2.m_featureInfo); DBG($$.m_node, @1, @2); AUTO_SEMICOLON; 1102 } 1000 1103 ; 1001 1104 … … 1092 1195 %% 1093 1196 1094 static ExpressionNode* makeAssignNode(void* globalPtr, ExpressionNode* loc, Operator op, ExpressionNode* expr, bool locHasAssignments, bool exprHasAssignments )1197 static ExpressionNode* makeAssignNode(void* globalPtr, ExpressionNode* loc, Operator op, ExpressionNode* expr, bool locHasAssignments, bool exprHasAssignments, int start, int divot, int end) 1095 1198 { 1096 1199 if (!loc->isLocation()) 1097 return new AssignErrorNode(GLOBAL_DATA, loc, op, expr );1200 return new AssignErrorNode(GLOBAL_DATA, loc, op, expr, divot, divot - start, end - divot); 1098 1201 1099 1202 if (loc->isResolveNode()) { 1100 1203 ResolveNode* resolve = static_cast<ResolveNode*>(loc); 1101 if (op == OpEqual) 1102 return new AssignResolveNode(GLOBAL_DATA, resolve->identifier(), expr, exprHasAssignments); 1103 else 1104 return new ReadModifyResolveNode(GLOBAL_DATA, resolve->identifier(), op, expr, exprHasAssignments); 1204 if (op == OpEqual) { 1205 AssignResolveNode* node = new AssignResolveNode(GLOBAL_DATA, resolve->identifier(), expr, exprHasAssignments); 1206 SET_EXCEPTION_LOCATION(node, start, divot, end); 1207 return node; 1208 } else 1209 return new ReadModifyResolveNode(GLOBAL_DATA, resolve->identifier(), op, expr, exprHasAssignments, divot, divot - start, end - divot); 1105 1210 } 1106 1211 if (loc->isBracketAccessorNode()) { 1107 1212 BracketAccessorNode* bracket = static_cast<BracketAccessorNode*>(loc); 1108 1213 if (op == OpEqual) 1109 return new AssignBracketNode(GLOBAL_DATA, bracket->base(), bracket->subscript(), expr, locHasAssignments, exprHasAssignments); 1110 else 1111 return new ReadModifyBracketNode(GLOBAL_DATA, bracket->base(), bracket->subscript(), op, expr, locHasAssignments, exprHasAssignments); 1214 return new AssignBracketNode(GLOBAL_DATA, bracket->base(), bracket->subscript(), expr, locHasAssignments, exprHasAssignments, divot, divot - start, end - divot); 1215 else { 1216 ReadModifyBracketNode* node = new ReadModifyBracketNode(GLOBAL_DATA, bracket->base(), bracket->subscript(), op, expr, locHasAssignments, exprHasAssignments, divot, divot - start, end - divot); 1217 node->setSubexpressionInfo(bracket->divot(), bracket->endOffset()); 1218 return node; 1219 } 1112 1220 } 1113 1221 ASSERT(loc->isDotAccessorNode()); 1114 1222 DotAccessorNode* dot = static_cast<DotAccessorNode*>(loc); 1115 1223 if (op == OpEqual) 1116 return new AssignDotNode(GLOBAL_DATA, dot->base(), dot->identifier(), expr, exprHasAssignments); 1117 return new ReadModifyDotNode(GLOBAL_DATA, dot->base(), dot->identifier(), op, expr, exprHasAssignments); 1118 } 1119 1120 static ExpressionNode* makePrefixNode(void* globalPtr, ExpressionNode* expr, Operator op) 1121 { 1224 return new AssignDotNode(GLOBAL_DATA, dot->base(), dot->identifier(), expr, exprHasAssignments, divot, divot - start, end - divot); 1225 1226 ReadModifyDotNode* node = new ReadModifyDotNode(GLOBAL_DATA, dot->base(), dot->identifier(), op, expr, exprHasAssignments, divot, divot - start, end - divot); 1227 node->setSubexpressionInfo(dot->divot(), dot->endOffset()); 1228 return node; 1229 } 1230 1231 static ExpressionNode* makePrefixNode(void* globalPtr, ExpressionNode* expr, Operator op, int start, int divot, int end) 1232 { 1122 1233 if (!expr->isLocation()) 1123 return new PrefixErrorNode(GLOBAL_DATA, expr, op );1234 return new PrefixErrorNode(GLOBAL_DATA, expr, op, divot, divot - start, end - divot); 1124 1235 1125 1236 if (expr->isResolveNode()) { 1126 1237 ResolveNode* resolve = static_cast<ResolveNode*>(expr); 1127 return new PrefixResolveNode(GLOBAL_DATA, resolve->identifier(), op );1238 return new PrefixResolveNode(GLOBAL_DATA, resolve->identifier(), op, divot, divot - start, end - divot); 1128 1239 } 1129 1240 if (expr->isBracketAccessorNode()) { 1130 1241 BracketAccessorNode* bracket = static_cast<BracketAccessorNode*>(expr); 1131 return new PrefixBracketNode(GLOBAL_DATA, bracket->base(), bracket->subscript(), op); 1242 PrefixBracketNode* node = new PrefixBracketNode(GLOBAL_DATA, bracket->base(), bracket->subscript(), op, divot, divot - start, end - divot); 1243 node->setSubexpressionInfo(bracket->divot(), bracket->startOffset()); 1244 return node; 1132 1245 } 1133 1246 ASSERT(expr->isDotAccessorNode()); 1134 1247 DotAccessorNode* dot = static_cast<DotAccessorNode*>(expr); 1135 return new PrefixDotNode(GLOBAL_DATA, dot->base(), dot->identifier(), op); 1136 } 1137 1138 static ExpressionNode* makePostfixNode(void* globalPtr, ExpressionNode* expr, Operator op) 1248 PrefixDotNode* node = new PrefixDotNode(GLOBAL_DATA, dot->base(), dot->identifier(), op, divot, divot - start, end - divot); 1249 node->setSubexpressionInfo(dot->divot(), dot->startOffset()); 1250 return node; 1251 } 1252 1253 static ExpressionNode* makePostfixNode(void* globalPtr, ExpressionNode* expr, Operator op, int start, int divot, int end) 1139 1254 { 1140 1255 if (!expr->isLocation()) 1141 return new PostfixErrorNode(GLOBAL_DATA, expr, op );1256 return new PostfixErrorNode(GLOBAL_DATA, expr, op, divot, divot - start, end - divot); 1142 1257 1143 1258 if (expr->isResolveNode()) { 1144 1259 ResolveNode* resolve = static_cast<ResolveNode*>(expr); 1145 return new PostfixResolveNode(GLOBAL_DATA, resolve->identifier(), op );1260 return new PostfixResolveNode(GLOBAL_DATA, resolve->identifier(), op, divot, divot - start, end - divot); 1146 1261 } 1147 1262 if (expr->isBracketAccessorNode()) { 1148 1263 BracketAccessorNode* bracket = static_cast<BracketAccessorNode*>(expr); 1149 return new PostfixBracketNode(GLOBAL_DATA, bracket->base(), bracket->subscript(), op); 1264 PostfixBracketNode* node = new PostfixBracketNode(GLOBAL_DATA, bracket->base(), bracket->subscript(), op, divot, divot - start, end - divot); 1265 node->setSubexpressionInfo(bracket->divot(), bracket->endOffset()); 1266 return node; 1267 1150 1268 } 1151 1269 ASSERT(expr->isDotAccessorNode()); 1152 1270 DotAccessorNode* dot = static_cast<DotAccessorNode*>(expr); 1153 return new PostfixDotNode(GLOBAL_DATA, dot->base(), dot->identifier(), op); 1154 } 1155 1156 static ExpressionNodeInfo makeFunctionCallNode(void* globalPtr, ExpressionNodeInfo func, ArgumentsNodeInfo args) 1271 PostfixDotNode* node = new PostfixDotNode(GLOBAL_DATA, dot->base(), dot->identifier(), op, divot, divot - start, end - divot); 1272 node->setSubexpressionInfo(dot->divot(), dot->endOffset()); 1273 return node; 1274 } 1275 1276 static ExpressionNodeInfo makeFunctionCallNode(void* globalPtr, ExpressionNodeInfo func, ArgumentsNodeInfo args, int start, int divot, int end) 1157 1277 { 1158 1278 FeatureInfo features = func.m_featureInfo | args.m_featureInfo; 1159 1279 if (!func.m_node->isLocation()) 1160 return createNodeFeatureInfo<ExpressionNode*>(new FunctionCallValueNode(GLOBAL_DATA, func.m_node, args.m_node ), features);1280 return createNodeFeatureInfo<ExpressionNode*>(new FunctionCallValueNode(GLOBAL_DATA, func.m_node, args.m_node, divot, divot - start, end - divot), features); 1161 1281 if (func.m_node->isResolveNode()) { 1162 1282 ResolveNode* resolve = static_cast<ResolveNode*>(func.m_node); 1163 1283 const Identifier& identifier = resolve->identifier(); 1164 1284 if (identifier == GLOBAL_DATA->propertyNames->eval) 1165 return createNodeFeatureInfo<ExpressionNode*>(new EvalFunctionCallNode(GLOBAL_DATA, args.m_node ), EvalFeature | features);1166 return createNodeFeatureInfo<ExpressionNode*>(new FunctionCallResolveNode(GLOBAL_DATA, identifier, args.m_node ), features);1285 return createNodeFeatureInfo<ExpressionNode*>(new EvalFunctionCallNode(GLOBAL_DATA, args.m_node, divot, divot - start, end - divot), EvalFeature | features); 1286 return createNodeFeatureInfo<ExpressionNode*>(new FunctionCallResolveNode(GLOBAL_DATA, identifier, args.m_node, divot, divot - start, end - divot), features); 1167 1287 } 1168 1288 if (func.m_node->isBracketAccessorNode()) { 1169 1289 BracketAccessorNode* bracket = static_cast<BracketAccessorNode*>(func.m_node); 1170 return createNodeFeatureInfo<ExpressionNode*>(new FunctionCallBracketNode(GLOBAL_DATA, bracket->base(), bracket->subscript(), args.m_node), features); 1290 FunctionCallBracketNode* node = new FunctionCallBracketNode(GLOBAL_DATA, bracket->base(), bracket->subscript(), args.m_node, divot, divot - start, end - divot); 1291 node->setSubexpressionInfo(bracket->divot(), bracket->endOffset()); 1292 return createNodeFeatureInfo<ExpressionNode*>(node, features); 1171 1293 } 1172 1294 ASSERT(func.m_node->isDotAccessorNode()); 1173 1295 DotAccessorNode* dot = static_cast<DotAccessorNode*>(func.m_node); 1174 return createNodeFeatureInfo<ExpressionNode*>(new FunctionCallDotNode(GLOBAL_DATA, dot->base(), dot->identifier(), args.m_node), features); 1296 FunctionCallDotNode* node = new FunctionCallDotNode(GLOBAL_DATA, dot->base(), dot->identifier(), args.m_node, divot, divot - start, end - divot); 1297 node->setSubexpressionInfo(dot->divot(), dot->endOffset()); 1298 return createNodeFeatureInfo<ExpressionNode*>(node, features); 1175 1299 } 1176 1300 … … 1184 1308 } 1185 1309 1186 static ExpressionNode* makeDeleteNode(void* globalPtr, ExpressionNode* expr )1310 static ExpressionNode* makeDeleteNode(void* globalPtr, ExpressionNode* expr, int start, int divot, int end) 1187 1311 { 1188 1312 if (!expr->isLocation()) … … 1190 1314 if (expr->isResolveNode()) { 1191 1315 ResolveNode* resolve = static_cast<ResolveNode*>(expr); 1192 return new DeleteResolveNode(GLOBAL_DATA, resolve->identifier() );1316 return new DeleteResolveNode(GLOBAL_DATA, resolve->identifier(), divot, divot - start, end - divot); 1193 1317 } 1194 1318 if (expr->isBracketAccessorNode()) { 1195 1319 BracketAccessorNode* bracket = static_cast<BracketAccessorNode*>(expr); 1196 return new DeleteBracketNode(GLOBAL_DATA, bracket->base(), bracket->subscript() );1320 return new DeleteBracketNode(GLOBAL_DATA, bracket->base(), bracket->subscript(), divot, divot - start, end - divot); 1197 1321 } 1198 1322 ASSERT(expr->isDotAccessorNode()); 1199 1323 DotAccessorNode* dot = static_cast<DotAccessorNode*>(expr); 1200 return new DeleteDotNode(GLOBAL_DATA, dot->base(), dot->identifier() );1324 return new DeleteDotNode(GLOBAL_DATA, dot->base(), dot->identifier(), divot, divot - start, end - divot); 1201 1325 } 1202 1326 -
trunk/JavaScriptCore/kjs/lexer.cpp
r35195 r35245 75 75 , m_next2(0) 76 76 , m_next3(0) 77 , m_currentOffset(0) 78 , m_nextOffset1(0) 79 , m_nextOffset2(0) 80 , m_nextOffset3(0) 77 81 , m_globalData(globalData) 78 82 , m_mainTable(KJS::mainTable) … … 120 124 m_next1 = m_next2; 121 125 m_next2 = m_next3; 126 m_currentOffset = m_nextOffset1; 127 m_nextOffset1 = m_nextOffset2; 128 m_nextOffset2 = m_nextOffset3; 122 129 do { 123 130 if (m_position >= m_length) { 131 m_nextOffset3 = m_position; 124 132 m_position++; 125 133 m_next3 = -1; 126 134 break; 127 135 } 136 m_nextOffset3 = m_position; 128 137 m_next3 = m_code[m_position++]; 129 138 } while (m_next3 == 0xFEFF); … … 165 174 m_stackToken = 0; 166 175 } 167 176 int startOffset = m_currentOffset; 168 177 while (!m_done) { 169 178 if (m_skipLF && m_current != '\n') // found \r but not \n afterwards … … 178 187 switch (m_state) { 179 188 case Start: 189 startOffset = m_currentOffset; 180 190 if (isWhiteSpace()) { 181 191 // do nothing … … 522 532 llocp->first_line = yylineno; 523 533 llocp->last_line = yylineno; 524 534 llocp->first_column = startOffset; 535 llocp->last_column = m_currentOffset; 525 536 switch (m_state) { 526 537 case Eof: -
trunk/JavaScriptCore/kjs/lexer.h
r35037 r35245 134 134 State m_state; 135 135 unsigned int m_position; 136 137 136 RefPtr<SourceProvider> m_source; 138 137 const UChar* m_code; … … 146 145 int m_next2; 147 146 int m_next3; 148 147 148 int m_currentOffset; 149 int m_nextOffset1; 150 int m_nextOffset2; 151 int m_nextOffset3; 152 149 153 Vector<UString*> m_strings; 150 154 Vector<KJS::Identifier*> m_identifiers; -
trunk/JavaScriptCore/kjs/nodes.cpp
r35230 r35245 163 163 } 164 164 165 RegisterID* Node::emitThrowError(CodeGenerator& generator, ErrorType e, const char* msg) 166 { 165 RegisterID* ThrowableExpressionData::emitThrowError(CodeGenerator& generator, ErrorType e, const char* msg) 166 { 167 generator.emitExpressionInfo(m_divot, m_startOffset, m_endOffset); 167 168 RegisterID* exception = generator.emitNewError(generator.newTemporary(), e, jsString(generator.globalExec(), msg)); 168 169 generator.emitThrow(exception); … … 170 171 } 171 172 172 RegisterID* Node::emitThrowError(CodeGenerator& generator, ErrorType e, const char* msg, const Identifier& label)173 RegisterID* ThrowableExpressionData::emitThrowError(CodeGenerator& generator, ErrorType e, const char* msg, const Identifier& label) 173 174 { 174 175 UString message = msg; 175 176 substitute(message, label.ustring()); 177 generator.emitExpressionInfo(m_divot, m_startOffset, m_endOffset); 176 178 RegisterID* exception = generator.emitNewError(generator.newTemporary(), e, jsString(generator.globalExec(), message)); 177 179 generator.emitThrow(exception); … … 185 187 , m_lastLine(-1) 186 188 { 187 m_line = -1;188 189 } 189 190 … … 289 290 return generator.moveToDestinationIfNeeded(dst, local); 290 291 } 291 292 293 generator.emitExpressionInfo(m_startOffset + m_ident.size(), m_ident.size(), 0); 292 294 return generator.emitResolve(generator.finalDestination(dst), m_ident); 293 295 } … … 376 378 RefPtr<RegisterID> base = generator.emitNodeForLeftHandSide(m_base.get(), m_subscriptHasAssignments, m_subscript->isPure(generator)); 377 379 RegisterID* property = generator.emitNode(m_subscript.get()); 378 380 generator.emitExpressionInfo(m_divot, m_startOffset, m_endOffset); 379 381 return generator.emitGetByVal(generator.finalDestination(dst), base.get(), property); 380 382 } … … 385 387 { 386 388 RegisterID* base = generator.emitNode(m_base.get()); 389 generator.emitExpressionInfo(m_divot, m_startOffset, m_endOffset); 387 390 return generator.emitGetById(generator.finalDestination(dst), base, m_ident); 388 391 } … … 401 404 { 402 405 RegisterID* r0 = generator.emitNode(m_expr.get()); 406 generator.emitExpressionInfo(m_divot, m_startOffset, m_endOffset); 403 407 return generator.emitConstruct(generator.finalDestination(dst), r0, m_args.get()); 404 408 } … … 409 413 RegisterID* func = generator.newTemporary(); 410 414 generator.emitResolveWithBase(base.get(), func, generator.propertyNames().eval); 411 return generator.emitCallEval(generator.finalDestination(dst, base.get()), func, base.get(), m_args.get() );415 return generator.emitCallEval(generator.finalDestination(dst, base.get()), func, base.get(), m_args.get(), m_divot, m_startOffset, m_endOffset); 412 416 } 413 417 … … 415 419 { 416 420 RegisterID* func = generator.emitNode(m_expr.get()); 417 return generator.emitCall(generator.finalDestination(dst), func, 0, m_args.get() );421 return generator.emitCall(generator.finalDestination(dst), func, 0, m_args.get(), m_divot, m_startOffset, m_endOffset); 418 422 } 419 423 … … 421 425 { 422 426 if (RegisterID* local = generator.registerForLocal(m_ident)) 423 return generator.emitCall(generator.finalDestination(dst), local, 0, m_args.get() );427 return generator.emitCall(generator.finalDestination(dst), local, 0, m_args.get(), m_divot, m_startOffset, m_endOffset); 424 428 425 429 int index = 0; … … 427 431 if (generator.findScopedProperty(m_ident, index, depth) && index != missingSymbolMarker()) { 428 432 RegisterID* func = generator.emitGetScopedVar(generator.newTemporary(), depth, index); 429 return generator.emitCall(generator.finalDestination(dst), func, 0, m_args.get() );433 return generator.emitCall(generator.finalDestination(dst), func, 0, m_args.get(), m_divot, m_startOffset, m_endOffset); 430 434 } 431 435 432 436 RefPtr<RegisterID> base = generator.tempDestination(dst); 433 437 RegisterID* func = generator.newTemporary(); 438 int identifierStart = m_divot - m_startOffset; 439 generator.emitExpressionInfo(identifierStart + m_ident.size(), m_ident.size(), 0); 434 440 generator.emitResolveFunction(base.get(), func, m_ident); 435 return generator.emitCall(generator.finalDestination(dst, base.get()), func, base.get(), m_args.get() );441 return generator.emitCall(generator.finalDestination(dst, base.get()), func, base.get(), m_args.get(), m_divot, m_startOffset, m_endOffset); 436 442 } 437 443 … … 440 446 RefPtr<RegisterID> base = generator.emitNode(m_base.get()); 441 447 RegisterID* property = generator.emitNode(m_subscript.get()); 448 generator.emitExpressionInfo(m_divot - m_subexpressionDivotOffset, m_startOffset - m_subexpressionDivotOffset, m_subexpressionEndOffset); 442 449 RegisterID* function = generator.emitGetByVal(generator.newTemporary(), base.get(), property); 443 return generator.emitCall(generator.finalDestination(dst, base.get()), function, base.get(), m_args.get() );450 return generator.emitCall(generator.finalDestination(dst, base.get()), function, base.get(), m_args.get(), m_divot, m_startOffset, m_endOffset); 444 451 } 445 452 … … 447 454 { 448 455 RefPtr<RegisterID> base = generator.emitNode(m_base.get()); 456 generator.emitExpressionInfo(m_divot - m_subexpressionDivotOffset, m_startOffset - m_subexpressionDivotOffset, m_subexpressionEndOffset); 449 457 RegisterID* function = generator.emitGetById(generator.newTemporary(), base.get(), m_ident); 450 return generator.emitCall(generator.finalDestination(dst, base.get()), function, base.get(), m_args.get() );458 return generator.emitCall(generator.finalDestination(dst, base.get()), function, base.get(), m_args.get(), m_divot, m_startOffset, m_endOffset); 451 459 } 452 460 … … 492 500 } 493 501 502 generator.emitExpressionInfo(m_divot, m_startOffset, m_endOffset); 494 503 RefPtr<RegisterID> value = generator.newTemporary(); 495 504 RefPtr<RegisterID> base = generator.emitResolveWithBase(generator.newTemporary(), value.get(), m_ident); … … 511 520 RefPtr<RegisterID> base = generator.emitNode(m_base.get()); 512 521 RefPtr<RegisterID> property = generator.emitNode(m_subscript.get()); 522 523 generator.emitExpressionInfo(m_divot - m_subexpressionDivotOffset, m_startOffset - m_subexpressionDivotOffset, m_subexpressionEndOffset); 513 524 RefPtr<RegisterID> value = generator.emitGetByVal(generator.newTemporary(), base.get(), property.get()); 514 525 RegisterID* oldValue; … … 522 533 oldValue = (m_operator == OpPlusPlus) ? generator.emitPostInc(generator.finalDestination(dst), value.get()) : generator.emitPostDec(generator.finalDestination(dst), value.get()); 523 534 } 535 generator.emitExpressionInfo(m_divot, m_startOffset, m_endOffset); 524 536 generator.emitPutByVal(base.get(), property.get(), value.get()); 525 537 return oldValue; … … 531 543 { 532 544 RefPtr<RegisterID> base = generator.emitNode(m_base.get()); 545 546 generator.emitExpressionInfo(m_divot - m_subexpressionDivotOffset, m_startOffset - m_subexpressionDivotOffset, m_subexpressionEndOffset); 533 547 RefPtr<RegisterID> value = generator.emitGetById(generator.newTemporary(), base.get(), m_ident); 534 548 RegisterID* oldValue; … … 542 556 oldValue = (m_operator == OpPlusPlus) ? generator.emitPostInc(generator.finalDestination(dst), value.get()) : generator.emitPostDec(generator.finalDestination(dst), value.get()); 543 557 } 558 generator.emitExpressionInfo(m_divot, m_startOffset, m_endOffset); 544 559 generator.emitPutById(base.get(), m_ident, value.get()); 545 560 return oldValue; … … 560 575 return generator.emitLoad(generator.finalDestination(dst), false); 561 576 577 generator.emitExpressionInfo(m_divot, m_startOffset, m_endOffset); 562 578 RegisterID* base = generator.emitResolveBase(generator.tempDestination(dst), m_ident); 563 579 return generator.emitDeleteById(generator.finalDestination(dst, base), base, m_ident); … … 570 586 RefPtr<RegisterID> r0 = generator.emitNode(m_base.get()); 571 587 RefPtr<RegisterID> r1 = generator.emitNode(m_subscript.get()); 588 589 generator.emitExpressionInfo(m_divot, m_startOffset, m_endOffset); 572 590 return generator.emitDeleteByVal(generator.finalDestination(dst), r0.get(), r1.get()); 573 591 } … … 578 596 { 579 597 RegisterID* r0 = generator.emitNode(m_base.get()); 598 599 generator.emitExpressionInfo(m_divot, m_startOffset, m_endOffset); 580 600 return generator.emitDeleteById(generator.finalDestination(dst), r0, m_ident); 581 601 } … … 657 677 } 658 678 679 generator.emitExpressionInfo(m_divot, m_startOffset, m_endOffset); 659 680 RefPtr<RegisterID> propDst = generator.tempDestination(dst); 660 681 RefPtr<RegisterID> base = generator.emitResolveWithBase(generator.newTemporary(), propDst.get(), m_ident); … … 671 692 RefPtr<RegisterID> property = generator.emitNode(m_subscript.get()); 672 693 RefPtr<RegisterID> propDst = generator.tempDestination(dst); 694 695 generator.emitExpressionInfo(m_divot + m_subexpressionDivotOffset, m_subexpressionStartOffset, m_endOffset - m_subexpressionDivotOffset); 673 696 RegisterID* value = generator.emitGetByVal(propDst.get(), base.get(), property.get()); 674 697 if (m_operator == OpPlusPlus) … … 676 699 else 677 700 generator.emitPreDec(value); 701 generator.emitExpressionInfo(m_divot, m_startOffset, m_endOffset); 678 702 generator.emitPutByVal(base.get(), property.get(), value); 679 703 return generator.moveToDestinationIfNeeded(dst, propDst.get()); … … 686 710 RefPtr<RegisterID> base = generator.emitNode(m_base.get()); 687 711 RefPtr<RegisterID> propDst = generator.tempDestination(dst); 712 713 generator.emitExpressionInfo(m_divot + m_subexpressionDivotOffset, m_subexpressionStartOffset, m_endOffset - m_subexpressionDivotOffset); 688 714 RegisterID* value = generator.emitGetById(propDst.get(), base.get(), m_ident); 689 715 if (m_operator == OpPlusPlus) … … 691 717 else 692 718 generator.emitPreDec(value); 719 generator.emitExpressionInfo(m_divot, m_startOffset, m_endOffset); 693 720 generator.emitPutById(base.get(), m_ident, value); 694 721 return generator.moveToDestinationIfNeeded(dst, propDst.get()); … … 724 751 RegisterID* src2 = generator.emitNode(m_term2.get()); 725 752 return generator.emitBinaryOp(opcode(), generator.finalDestination(dst, src1.get()), src2, src1.get()); 753 } 754 755 RegisterID* ThrowableBinaryOpNode::emitCode(CodeGenerator& generator, RegisterID* dst) 756 { 757 RefPtr<RegisterID> src1 = generator.emitNodeForLeftHandSide(m_term1.get(), m_rightHasAssignments, m_term2->isPure(generator)); 758 RegisterID* src2 = generator.emitNode(m_term2.get()); 759 generator.emitExpressionInfo(m_divot, m_startOffset, m_endOffset); 760 return generator.emitBinaryOp(opcode(), generator.finalDestination(dst, src1.get()), src1.get(), src2); 726 761 } 727 762 … … 847 882 848 883 RefPtr<RegisterID> src1 = generator.tempDestination(dst); 884 generator.emitExpressionInfo(m_divot - m_startOffset + m_ident.size(), m_ident.size(), 0); 849 885 RefPtr<RegisterID> base = generator.emitResolveWithBase(generator.newTemporary(), src1.get(), m_ident); 850 886 RegisterID* src2 = generator.emitNode(m_right.get()); 887 generator.emitExpressionInfo(m_divot, m_startOffset, m_endOffset); 851 888 RegisterID* result = emitReadModifyAssignment(generator, generator.finalDestination(dst, src1.get()), src1.get(), src2, m_operator); 852 889 return generator.emitPutById(base.get(), m_ident, result); … … 879 916 dst = 0; 880 917 RegisterID* value = generator.emitNode(dst, m_right.get()); 918 generator.emitExpressionInfo(m_divot, m_startOffset, m_endOffset); 881 919 return generator.emitPutById(base.get(), m_ident, value); 882 920 } … … 889 927 RefPtr<RegisterID> value = generator.destinationForAssignResult(dst); 890 928 RegisterID* result = generator.emitNode(value.get(), m_right.get()); 929 generator.emitExpressionInfo(m_divot, m_startOffset, m_endOffset); 891 930 generator.emitPutById(base.get(), m_ident, result); 892 931 return generator.moveToDestinationIfNeeded(dst, result); … … 898 937 { 899 938 RefPtr<RegisterID> base = generator.emitNodeForLeftHandSide(m_base.get(), m_rightHasAssignments, m_right->isPure(generator)); 939 940 generator.emitExpressionInfo(m_divot - m_subexpressionDivotOffset, m_startOffset - m_subexpressionDivotOffset, m_subexpressionEndOffset); 900 941 RefPtr<RegisterID> value = generator.emitGetById(generator.tempDestination(dst), base.get(), m_ident); 901 942 RegisterID* change = generator.emitNode(m_right.get()); 902 943 RegisterID* updatedValue = emitReadModifyAssignment(generator, generator.finalDestination(dst, value.get()), value.get(), change, m_operator); 944 945 generator.emitExpressionInfo(m_divot, m_startOffset, m_endOffset); 903 946 return generator.emitPutById(base.get(), m_ident, updatedValue); 904 947 } … … 919 962 RefPtr<RegisterID> value = generator.destinationForAssignResult(dst); 920 963 RegisterID* result = generator.emitNode(value.get(), m_right.get()); 964 965 generator.emitExpressionInfo(m_divot, m_startOffset, m_endOffset); 921 966 generator.emitPutByVal(base.get(), property.get(), result); 922 967 return generator.moveToDestinationIfNeeded(dst, result); … … 928 973 RefPtr<RegisterID> property = generator.emitNodeForLeftHandSide(m_subscript.get(), m_rightHasAssignments, m_right->isPure(generator)); 929 974 975 generator.emitExpressionInfo(m_divot - m_subexpressionDivotOffset, m_startOffset - m_subexpressionDivotOffset, m_subexpressionEndOffset); 930 976 RefPtr<RegisterID> value = generator.emitGetByVal(generator.tempDestination(dst), base.get(), property.get()); 931 977 RegisterID* change = generator.emitNode(m_right.get()); 932 978 RegisterID* updatedValue = emitReadModifyAssignment(generator, generator.finalDestination(dst, value.get()), value.get(), change, m_operator); 933 979 980 generator.emitExpressionInfo(m_divot, m_startOffset, m_endOffset); 934 981 generator.emitPutByVal(base.get(), property.get(), updatedValue); 935 982 … … 1197 1244 } 1198 1245 1199 ForInNode::ForInNode(JSGlobalData* globalData, const Identifier& ident, ExpressionNode* in, ExpressionNode* expr, StatementNode* statement )1246 ForInNode::ForInNode(JSGlobalData* globalData, const Identifier& ident, ExpressionNode* in, ExpressionNode* expr, StatementNode* statement, int divot, int startOffset, int endOffset) 1200 1247 : StatementNode(globalData) 1201 1248 , m_ident(ident) 1202 , m_lexpr(new ResolveNode(globalData, ident ))1249 , m_lexpr(new ResolveNode(globalData, ident, divot - startOffset)) 1203 1250 , m_expr(expr) 1204 1251 , m_statement(statement) 1205 1252 , m_identIsVarDecl(true) 1206 1253 { 1207 if (in) 1208 m_init = new AssignResolveNode(globalData, ident, in, true); 1254 if (in) { 1255 AssignResolveNode* node = new AssignResolveNode(globalData, ident, in, true); 1256 node->setExceptionSourceRange(divot, divot - startOffset, endOffset - divot); 1257 m_init = node; 1258 } 1209 1259 // for( var foo = bar in baz ) 1210 1260 } … … 1230 1280 RefPtr<RegisterID> protect = propertyName; 1231 1281 RegisterID* base = generator.emitResolveBase(generator.newTemporary(), ident); 1282 1283 generator.emitExpressionInfo(m_divot, m_startOffset, m_endOffset); 1232 1284 generator.emitPutById(base, ident, propertyName); 1233 1285 } … … 1238 1290 RefPtr<RegisterID> protect = propertyName; 1239 1291 RegisterID* base = generator.emitNode(assignNode->base()); 1292 1293 generator.emitExpressionInfo(assignNode->divot(), assignNode->startOffset(), assignNode->endOffset()); 1240 1294 generator.emitPutById(base, ident, propertyName); 1241 1295 } else { … … 1246 1300 RefPtr<RegisterID> base = generator.emitNode(assignNode->base()); 1247 1301 RegisterID* subscript = generator.emitNode(assignNode->subscript()); 1302 1303 generator.emitExpressionInfo(assignNode->divot(), assignNode->startOffset(), assignNode->endOffset()); 1248 1304 generator.emitPutByVal(base.get(), subscript, propertyName); 1249 1305 } … … 1330 1386 { 1331 1387 RefPtr<RegisterID> scope = generator.emitNode(m_expr.get()); // scope must be protected until popped 1388 generator.emitExpressionInfo(m_divot, m_expressionLength, 0); 1332 1389 generator.emitPushScope(scope.get()); 1333 1390 RegisterID* result = generator.emitNode(dst, m_statement.get()); … … 1410 1467 if (generator.jumpContextForBreak(m_label)) 1411 1468 return emitThrowError(generator, SyntaxError, "Duplicated label %s found.", m_label); 1412 1469 1413 1470 RefPtr<LabelID> l0 = generator.newLabel(); 1414 1471 m_labelStack.push(m_label); … … 1428 1485 RegisterID* ThrowNode::emitCode(CodeGenerator& generator, RegisterID* dst) 1429 1486 { 1430 generator.emitThrow(generator.emitNode(dst, m_expr.get())); 1487 RefPtr<RegisterID> expr = generator.emitNode(dst, m_expr.get()); 1488 generator.emitExpressionInfo(m_divot, m_startOffset, m_endOffset); 1489 generator.emitThrow(expr.get()); 1431 1490 return dst; 1432 1491 } … … 1507 1566 // ------------------------------ ProgramNode ----------------------------- 1508 1567 1509 ProgramNode::ProgramNode(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, bool usesEval, bool needsClosure)1568 ProgramNode::ProgramNode(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, SourceProvider* sourceProvider, bool usesEval, bool needsClosure) 1510 1569 : ScopeNode(globalData, children, varStack, funcStack, usesEval, needsClosure) 1511 { 1512 } 1513 1514 ProgramNode* ProgramNode::create(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, bool usesEval, bool needsClosure) 1515 { 1516 return new ProgramNode(globalData, children, varStack, funcStack, usesEval, needsClosure); 1570 , m_sourceProvider(sourceProvider) 1571 { 1572 } 1573 1574 ProgramNode* ProgramNode::create(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, SourceProvider* sourceProvider, bool usesEval, bool needsClosure) 1575 { 1576 return new ProgramNode(globalData, children, varStack, funcStack, sourceProvider, usesEval, needsClosure); 1517 1577 } 1518 1578 1519 1579 // ------------------------------ EvalNode ----------------------------- 1520 1580 1521 EvalNode::EvalNode(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, bool usesEval, bool needsClosure)1581 EvalNode::EvalNode(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, SourceProvider* sourceProvider, bool usesEval, bool needsClosure) 1522 1582 : ScopeNode(globalData, children, varStack, funcStack, usesEval, needsClosure) 1583 , m_sourceProvider(sourceProvider) 1523 1584 { 1524 1585 } … … 1543 1604 1544 1605 SymbolTable symbolTable; 1545 1546 m_code.set(new EvalCodeBlock(this, globalObject ));1606 ASSERT(m_sourceProvider); 1607 m_code.set(new EvalCodeBlock(this, globalObject, m_sourceProvider)); 1547 1608 1548 1609 CodeGenerator generator(this, globalObject->debugger(), scopeChain, &symbolTable, m_code.get()); … … 1550 1611 } 1551 1612 1552 EvalNode* EvalNode::create(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, bool usesEval, bool needsClosure)1553 { 1554 return new EvalNode(globalData, children, varStack, funcStack, usesEval, needsClosure);1613 EvalNode* EvalNode::create(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, SourceProvider* sourceProvider, bool usesEval, bool needsClosure) 1614 { 1615 return new EvalNode(globalData, children, varStack, funcStack, sourceProvider, usesEval, needsClosure); 1555 1616 } 1556 1617 … … 1573 1634 } 1574 1635 1636 FunctionBodyNode* FunctionBodyNode::create(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, SourceProvider*, bool usesEval, bool needsClosure) 1637 { 1638 return new FunctionBodyNode(globalData, children, varStack, funcStack, usesEval, needsClosure); 1639 } 1640 1575 1641 void FunctionBodyNode::generateCode(ScopeChainNode* sc) 1576 1642 { … … 1578 1644 JSGlobalObject* globalObject = scopeChain.globalObject(); 1579 1645 1580 m_code.set(new CodeBlock(this, FunctionCode)); 1646 ASSERT(m_source.sourceProvider()); 1647 m_code.set(new CodeBlock(this, FunctionCode, m_source.sourceProvider(), m_source.startOffset())); 1581 1648 1582 1649 CodeGenerator generator(this, globalObject->debugger(), scopeChain, &m_symbolTable, m_code.get()); … … 1614 1681 JSGlobalObject* globalObject = scopeChain.globalObject(); 1615 1682 1616 m_code.set(new ProgramCodeBlock(this, GlobalCode, globalObject)); 1683 ASSERT(m_sourceProvider); 1684 m_code.set(new ProgramCodeBlock(this, GlobalCode, globalObject, m_sourceProvider)); 1617 1685 1618 1686 CodeGenerator generator(this, globalObject->debugger(), scopeChain, &globalObject->symbolTable(), m_code.get(), m_varStack, m_functionStack); -
trunk/JavaScriptCore/kjs/nodes.h
r35242 r35245 176 176 177 177 UString toString() const KJS_FAST_CALL; 178 int lineNo() const KJS_FAST_CALL{ return m_line; }178 int lineNo() const { return m_line; } 179 179 180 180 virtual bool isReturnNode() const KJS_FAST_CALL { return false; } … … 187 187 protected: 188 188 Node(JSGlobalData*, JSType) KJS_FAST_CALL; // used by ExpressionNode 189 190 RegisterID* emitThrowError(CodeGenerator&, ErrorType, const char* msg);191 RegisterID* emitThrowError(CodeGenerator&, ErrorType, const char* msg, const Identifier&);192 189 193 190 int m_line : 28; … … 319 316 UString m_value; 320 317 }; 321 322 class RegExpNode : public ExpressionNode { 318 319 class ThrowableExpressionData { 320 public: 321 ThrowableExpressionData() 322 : m_divot(-1) 323 , m_startOffset(-1) 324 , m_endOffset(-1) 325 { 326 } 327 328 ThrowableExpressionData(unsigned divot, unsigned startOffset, unsigned endOffset) 329 : m_divot(divot) 330 , m_startOffset(startOffset) 331 , m_endOffset(endOffset) 332 { 333 } 334 335 void setExceptionSourceRange(unsigned divot, unsigned startOffset, unsigned endOffset) 336 { 337 m_divot = divot; 338 m_startOffset = startOffset; 339 m_endOffset = endOffset; 340 } 341 342 uint32_t divot() const { return m_divot; } 343 uint16_t startOffset() const { return m_startOffset; } 344 uint16_t endOffset() const { return m_endOffset; } 345 346 protected: 347 RegisterID* emitThrowError(CodeGenerator&, ErrorType, const char* msg); 348 RegisterID* emitThrowError(CodeGenerator&, ErrorType, const char* msg, const Identifier&); 349 uint32_t m_divot; 350 uint16_t m_startOffset; 351 uint16_t m_endOffset; 352 }; 353 354 class ThrowableSubExpressionData : public ThrowableExpressionData { 355 public: 356 ThrowableSubExpressionData() 357 : ThrowableExpressionData() 358 , m_subexpressionDivotOffset(0) 359 , m_subexpressionEndOffset(0) 360 { 361 } 362 363 ThrowableSubExpressionData(unsigned divot, unsigned startOffset, unsigned endOffset) 364 : ThrowableExpressionData(divot, startOffset, endOffset) 365 , m_subexpressionDivotOffset(0) 366 , m_subexpressionEndOffset(0) 367 { 368 } 369 370 void setSubexpressionInfo(uint32_t subexpressionDivot, uint16_t subexpressionOffset) { 371 ASSERT(subexpressionDivot <= m_divot); 372 if ((m_divot - subexpressionDivot) & ~0xFFFF) // Overflow means we can't do this safely, so just point at the primary divot 373 return; 374 m_subexpressionDivotOffset = m_divot - subexpressionDivot; 375 m_subexpressionEndOffset = subexpressionOffset; 376 } 377 378 protected: 379 uint16_t m_subexpressionDivotOffset; 380 uint16_t m_subexpressionEndOffset; 381 }; 382 383 class ThrowablePrefixedSubExpressionData : public ThrowableExpressionData { 384 public: 385 ThrowablePrefixedSubExpressionData() 386 : ThrowableExpressionData() 387 , m_subexpressionDivotOffset(0) 388 , m_subexpressionStartOffset(0) 389 { 390 } 391 392 ThrowablePrefixedSubExpressionData(unsigned divot, unsigned startOffset, unsigned endOffset) 393 : ThrowableExpressionData(divot, startOffset, endOffset) 394 , m_subexpressionDivotOffset(0) 395 , m_subexpressionStartOffset(0) 396 { 397 } 398 399 void setSubexpressionInfo(uint32_t subexpressionDivot, uint16_t subexpressionOffset) { 400 ASSERT(subexpressionDivot >= m_divot); 401 if ((subexpressionDivot - m_divot) & ~0xFFFF) // Overflow means we can't do this safely, so just point at the primary divot 402 return; 403 m_subexpressionDivotOffset = subexpressionDivot - m_divot; 404 m_subexpressionStartOffset = subexpressionOffset; 405 } 406 407 protected: 408 uint16_t m_subexpressionDivotOffset; 409 uint16_t m_subexpressionStartOffset; 410 }; 411 412 class RegExpNode : public ExpressionNode, public ThrowableExpressionData { 323 413 public: 324 414 RegExpNode(JSGlobalData* globalData, const UString& pattern, const UString& flags) KJS_FAST_CALL … … 352 442 class ResolveNode : public ExpressionNode { 353 443 public: 354 ResolveNode(JSGlobalData* globalData, const Identifier& ident ) KJS_FAST_CALL444 ResolveNode(JSGlobalData* globalData, const Identifier& ident, int startOffset) KJS_FAST_CALL 355 445 : ExpressionNode(globalData) 356 446 , m_ident(ident) 447 , m_startOffset(startOffset) 357 448 { 358 449 } … … 370 461 protected: 371 462 Identifier m_ident; 372 int m_index; // Used by LocalVarAccessNode and ScopedVarAccessNode.373 size_t m_scopeDepth; // Used by ScopedVarAccessNode463 int32_t m_startOffset; 464 374 465 }; 375 466 … … 514 605 RefPtr<PropertyListNode> m_list; 515 606 }; 516 517 class BracketAccessorNode : public ExpressionNode {607 608 class BracketAccessorNode : public ExpressionNode, public ThrowableExpressionData { 518 609 public: 519 610 BracketAccessorNode(JSGlobalData* globalData, ExpressionNode* base, ExpressionNode* subscript, bool subscriptHasAssignments) KJS_FAST_CALL … … 541 632 }; 542 633 543 class DotAccessorNode : public ExpressionNode {634 class DotAccessorNode : public ExpressionNode, public ThrowableExpressionData { 544 635 public: 545 636 DotAccessorNode(JSGlobalData* globalData, ExpressionNode* base, const Identifier& ident) KJS_FAST_CALL … … 608 699 }; 609 700 610 class NewExprNode : public ExpressionNode {701 class NewExprNode : public ExpressionNode, public ThrowableExpressionData { 611 702 public: 612 703 NewExprNode(JSGlobalData* globalData, ExpressionNode* expr) KJS_FAST_CALL … … 633 724 }; 634 725 635 class EvalFunctionCallNode : public ExpressionNode { 636 public: 637 EvalFunctionCallNode(JSGlobalData* globalData, ArgumentsNode* args) KJS_FAST_CALL 638 : ExpressionNode(globalData) 726 class EvalFunctionCallNode : public ExpressionNode, public ThrowableExpressionData { 727 public: 728 EvalFunctionCallNode(JSGlobalData* globalData, ArgumentsNode* args, unsigned divot, unsigned startOffset, unsigned endOffset) KJS_FAST_CALL 729 : ExpressionNode(globalData) 730 , ThrowableExpressionData(divot, startOffset, endOffset) 639 731 , m_args(args) 640 732 { … … 649 741 }; 650 742 651 class FunctionCallValueNode : public ExpressionNode { 652 public: 653 FunctionCallValueNode(JSGlobalData* globalData, ExpressionNode* expr, ArgumentsNode* args) KJS_FAST_CALL 654 : ExpressionNode(globalData) 743 class FunctionCallValueNode : public ExpressionNode, public ThrowableExpressionData { 744 public: 745 FunctionCallValueNode(JSGlobalData* globalData, ExpressionNode* expr, ArgumentsNode* args, unsigned divot, unsigned startOffset, unsigned endOffset) KJS_FAST_CALL 746 : ExpressionNode(globalData) 747 , ThrowableExpressionData(divot, startOffset, endOffset) 655 748 , m_expr(expr) 656 749 , m_args(args) … … 667 760 }; 668 761 669 class FunctionCallResolveNode : public ExpressionNode { 670 public: 671 FunctionCallResolveNode(JSGlobalData* globalData, const Identifier& ident, ArgumentsNode* args) KJS_FAST_CALL 672 : ExpressionNode(globalData) 762 class FunctionCallResolveNode : public ExpressionNode, public ThrowableExpressionData { 763 public: 764 FunctionCallResolveNode(JSGlobalData* globalData, const Identifier& ident, ArgumentsNode* args, unsigned divot, unsigned startOffset, unsigned endOffset) KJS_FAST_CALL 765 : ExpressionNode(globalData) 766 , ThrowableExpressionData(divot, startOffset, endOffset) 673 767 , m_ident(ident) 674 768 , m_args(args) … … 688 782 }; 689 783 690 class FunctionCallBracketNode : public ExpressionNode { 691 public: 692 FunctionCallBracketNode(JSGlobalData* globalData, ExpressionNode* base, ExpressionNode* subscript, ArgumentsNode* args) KJS_FAST_CALL 693 : ExpressionNode(globalData) 784 class FunctionCallBracketNode : public ExpressionNode, public ThrowableSubExpressionData { 785 public: 786 FunctionCallBracketNode(JSGlobalData* globalData, ExpressionNode* base, ExpressionNode* subscript, ArgumentsNode* args, unsigned divot, unsigned startOffset, unsigned endOffset) KJS_FAST_CALL 787 : ExpressionNode(globalData) 788 , ThrowableSubExpressionData(divot, startOffset, endOffset) 694 789 , m_base(base) 695 790 , m_subscript(subscript) … … 708 803 }; 709 804 710 class FunctionCallDotNode : public ExpressionNode { 711 public: 712 FunctionCallDotNode(JSGlobalData* globalData, ExpressionNode* base, const Identifier& ident, ArgumentsNode* args) KJS_FAST_CALL 713 : ExpressionNode(globalData) 805 class FunctionCallDotNode : public ExpressionNode, public ThrowableSubExpressionData { 806 public: 807 FunctionCallDotNode(JSGlobalData* globalData, ExpressionNode* base, const Identifier& ident, ArgumentsNode* args, unsigned divot, unsigned startOffset, unsigned endOffset) KJS_FAST_CALL 808 : ExpressionNode(globalData) 809 , ThrowableSubExpressionData(divot, startOffset, endOffset) 714 810 , m_base(base) 715 811 , m_ident(ident) … … 728 824 }; 729 825 730 class PrePostResolveNode : public ExpressionNode {731 public: 732 PrePostResolveNode(JSGlobalData* globalData, const Identifier& ident ) KJS_FAST_CALL826 class PrePostResolveNode : public ExpressionNode, public ThrowableExpressionData { 827 public: 828 PrePostResolveNode(JSGlobalData* globalData, const Identifier& ident, unsigned divot, unsigned startOffset, unsigned endOffset) KJS_FAST_CALL 733 829 : ExpressionNode(globalData, NumberType) 830 , ThrowableExpressionData(divot, startOffset, endOffset) 734 831 , m_ident(ident) 735 832 { … … 738 835 protected: 739 836 Identifier m_ident; 740 size_t m_index; // Used by LocalVarPostfixNode.741 837 }; 742 838 743 839 class PostfixResolveNode : public PrePostResolveNode { 744 840 public: 745 PostfixResolveNode(JSGlobalData* globalData, const Identifier& ident, Operator oper ) KJS_FAST_CALL746 : PrePostResolveNode(globalData, ident )841 PostfixResolveNode(JSGlobalData* globalData, const Identifier& ident, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset) KJS_FAST_CALL 842 : PrePostResolveNode(globalData, ident, divot, startOffset, endOffset) 747 843 , m_operator(oper) 748 844 { … … 757 853 }; 758 854 759 class PostfixBracketNode : public ExpressionNode { 760 public: 761 PostfixBracketNode(JSGlobalData* globalData, ExpressionNode* base, ExpressionNode* subscript, Operator oper) KJS_FAST_CALL 762 : ExpressionNode(globalData) 855 class PostfixBracketNode : public ExpressionNode, public ThrowableSubExpressionData { 856 public: 857 PostfixBracketNode(JSGlobalData* globalData, ExpressionNode* base, ExpressionNode* subscript, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset) KJS_FAST_CALL 858 : ExpressionNode(globalData) 859 , ThrowableSubExpressionData(divot, startOffset, endOffset) 763 860 , m_base(base) 764 861 , m_subscript(subscript) … … 777 874 }; 778 875 779 class PostfixDotNode : public ExpressionNode { 780 public: 781 PostfixDotNode(JSGlobalData* globalData, ExpressionNode* base, const Identifier& ident, Operator oper) KJS_FAST_CALL 782 : ExpressionNode(globalData) 876 class PostfixDotNode : public ExpressionNode, public ThrowableSubExpressionData { 877 public: 878 PostfixDotNode(JSGlobalData* globalData, ExpressionNode* base, const Identifier& ident, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset) KJS_FAST_CALL 879 : ExpressionNode(globalData) 880 , ThrowableSubExpressionData(divot, startOffset, endOffset) 783 881 , m_base(base) 784 882 , m_ident(ident) … … 797 895 }; 798 896 799 class PostfixErrorNode : public ExpressionNode { 800 public: 801 PostfixErrorNode(JSGlobalData* globalData, ExpressionNode* expr, Operator oper) KJS_FAST_CALL 802 : ExpressionNode(globalData) 897 class PostfixErrorNode : public ExpressionNode, public ThrowableSubExpressionData { 898 public: 899 PostfixErrorNode(JSGlobalData* globalData, ExpressionNode* expr, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset) KJS_FAST_CALL 900 : ExpressionNode(globalData) 901 , ThrowableSubExpressionData(divot, startOffset, endOffset) 803 902 , m_expr(expr) 804 903 , m_operator(oper) … … 815 914 }; 816 915 817 class DeleteResolveNode : public ExpressionNode { 818 public: 819 DeleteResolveNode(JSGlobalData* globalData, const Identifier& ident) KJS_FAST_CALL 820 : ExpressionNode(globalData) 916 class DeleteResolveNode : public ExpressionNode, public ThrowableExpressionData { 917 public: 918 DeleteResolveNode(JSGlobalData* globalData, const Identifier& ident, unsigned divot, unsigned startOffset, unsigned endOffset) KJS_FAST_CALL 919 : ExpressionNode(globalData) 920 , ThrowableExpressionData(divot, startOffset, endOffset) 821 921 , m_ident(ident) 822 922 { … … 832 932 }; 833 933 834 class DeleteBracketNode : public ExpressionNode { 835 public: 836 DeleteBracketNode(JSGlobalData* globalData, ExpressionNode* base, ExpressionNode* subscript) KJS_FAST_CALL 837 : ExpressionNode(globalData) 934 class DeleteBracketNode : public ExpressionNode, public ThrowableExpressionData { 935 public: 936 DeleteBracketNode(JSGlobalData* globalData, ExpressionNode* base, ExpressionNode* subscript, unsigned divot, unsigned startOffset, unsigned endOffset) KJS_FAST_CALL 937 : ExpressionNode(globalData) 938 , ThrowableExpressionData(divot, startOffset, endOffset) 838 939 , m_base(base) 839 940 , m_subscript(subscript) … … 851 952 }; 852 953 853 class DeleteDotNode : public ExpressionNode { 854 public: 855 DeleteDotNode(JSGlobalData* globalData, ExpressionNode* base, const Identifier& ident) KJS_FAST_CALL 856 : ExpressionNode(globalData) 954 class DeleteDotNode : public ExpressionNode, public ThrowableExpressionData { 955 public: 956 DeleteDotNode(JSGlobalData* globalData, ExpressionNode* base, const Identifier& ident, unsigned divot, unsigned startOffset, unsigned endOffset) KJS_FAST_CALL 957 : ExpressionNode(globalData) 958 , ThrowableExpressionData(divot, startOffset, endOffset) 857 959 , m_base(base) 858 960 , m_ident(ident) … … 943 1045 class PrefixResolveNode : public PrePostResolveNode { 944 1046 public: 945 PrefixResolveNode(JSGlobalData* globalData, const Identifier& ident, Operator oper ) KJS_FAST_CALL946 : PrePostResolveNode(globalData, ident )1047 PrefixResolveNode(JSGlobalData* globalData, const Identifier& ident, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset) KJS_FAST_CALL 1048 : PrePostResolveNode(globalData, ident, divot, startOffset, endOffset) 947 1049 , m_operator(oper) 948 1050 { … … 958 1060 }; 959 1061 960 class PrefixBracketNode : public ExpressionNode { 961 public: 962 PrefixBracketNode(JSGlobalData* globalData, ExpressionNode* base, ExpressionNode* subscript, Operator oper) KJS_FAST_CALL 963 : ExpressionNode(globalData) 1062 class PrefixBracketNode : public ExpressionNode, public ThrowablePrefixedSubExpressionData { 1063 public: 1064 PrefixBracketNode(JSGlobalData* globalData, ExpressionNode* base, ExpressionNode* subscript, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset) KJS_FAST_CALL 1065 : ExpressionNode(globalData) 1066 , ThrowablePrefixedSubExpressionData(divot, startOffset, endOffset) 964 1067 , m_base(base) 965 1068 , m_subscript(subscript) … … 978 1081 }; 979 1082 980 class PrefixDotNode : public ExpressionNode { 981 public: 982 PrefixDotNode(JSGlobalData* globalData, ExpressionNode* base, const Identifier& ident, Operator oper) KJS_FAST_CALL 983 : ExpressionNode(globalData) 1083 class PrefixDotNode : public ExpressionNode, public ThrowablePrefixedSubExpressionData { 1084 public: 1085 PrefixDotNode(JSGlobalData* globalData, ExpressionNode* base, const Identifier& ident, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset) KJS_FAST_CALL 1086 : ExpressionNode(globalData) 1087 , ThrowablePrefixedSubExpressionData(divot, startOffset, endOffset) 984 1088 , m_base(base) 985 1089 , m_ident(ident) … … 998 1102 }; 999 1103 1000 class PrefixErrorNode : public ExpressionNode { 1001 public: 1002 PrefixErrorNode(JSGlobalData* globalData, ExpressionNode* expr, Operator oper) KJS_FAST_CALL 1003 : ExpressionNode(globalData) 1104 class PrefixErrorNode : public ExpressionNode, public ThrowableExpressionData { 1105 public: 1106 PrefixErrorNode(JSGlobalData* globalData, ExpressionNode* expr, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset) KJS_FAST_CALL 1107 : ExpressionNode(globalData) 1108 , ThrowableExpressionData(divot, startOffset, endOffset) 1004 1109 , m_expr(expr) 1005 1110 , m_operator(oper) … … 1283 1388 }; 1284 1389 1285 class InstanceOfNode : public BinaryOpNode { 1390 class ThrowableBinaryOpNode : public BinaryOpNode, public ThrowableExpressionData { 1391 public: 1392 ThrowableBinaryOpNode(JSGlobalData* globalData, JSType type, ExpressionNode* term1, ExpressionNode* term2, bool rightHasAssignments) KJS_FAST_CALL 1393 : BinaryOpNode(globalData, type, term1, term2, rightHasAssignments) 1394 { 1395 } 1396 ThrowableBinaryOpNode(JSGlobalData* globalData, ExpressionNode* term1, ExpressionNode* term2, bool rightHasAssignments) KJS_FAST_CALL 1397 : BinaryOpNode(globalData, term1, term2, rightHasAssignments) 1398 { 1399 } 1400 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL; 1401 }; 1402 1403 class InstanceOfNode : public ThrowableBinaryOpNode { 1286 1404 public: 1287 1405 InstanceOfNode(JSGlobalData* globalData, ExpressionNode* term1, ExpressionNode* term2, bool rightHasAssignments) KJS_FAST_CALL 1288 : BinaryOpNode(globalData, BooleanType, term1, term2, rightHasAssignments)1406 : ThrowableBinaryOpNode(globalData, BooleanType, term1, term2, rightHasAssignments) 1289 1407 { 1290 1408 } … … 1295 1413 }; 1296 1414 1297 class InNode : public BinaryOpNode {1415 class InNode : public ThrowableBinaryOpNode { 1298 1416 public: 1299 1417 InNode(JSGlobalData* globalData, ExpressionNode* term1, ExpressionNode* term2, bool rightHasAssignments) KJS_FAST_CALL 1300 : BinaryOpNode(globalData, term1, term2, rightHasAssignments)1418 : ThrowableBinaryOpNode(globalData, term1, term2, rightHasAssignments) 1301 1419 { 1302 1420 } … … 1437 1555 }; 1438 1556 1439 class ReadModifyResolveNode : public ExpressionNode { 1440 public: 1441 ReadModifyResolveNode(JSGlobalData* globalData, const Identifier& ident, Operator oper, ExpressionNode* right, bool rightHasAssignments) KJS_FAST_CALL 1442 : ExpressionNode(globalData) 1557 class ReadModifyResolveNode : public ExpressionNode, public ThrowableExpressionData { 1558 public: 1559 ReadModifyResolveNode(JSGlobalData* globalData, const Identifier& ident, Operator oper, ExpressionNode* right, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset) KJS_FAST_CALL 1560 : ExpressionNode(globalData) 1561 , ThrowableExpressionData(divot, startOffset, endOffset) 1443 1562 , m_ident(ident) 1444 1563 , m_right(right) … … 1461 1580 }; 1462 1581 1463 class AssignResolveNode : public ExpressionNode {1582 class AssignResolveNode : public ExpressionNode, public ThrowableExpressionData { 1464 1583 public: 1465 1584 AssignResolveNode(JSGlobalData* globalData, const Identifier& ident, ExpressionNode* right, bool rightHasAssignments) KJS_FAST_CALL … … 1483 1602 }; 1484 1603 1485 class ReadModifyBracketNode : public ExpressionNode { 1486 public: 1487 ReadModifyBracketNode(JSGlobalData* globalData, ExpressionNode* base, ExpressionNode* subscript, Operator oper, ExpressionNode* right, bool subscriptHasAssignments, bool rightHasAssignments) KJS_FAST_CALL 1488 : ExpressionNode(globalData) 1604 class ReadModifyBracketNode : public ExpressionNode, public ThrowableSubExpressionData { 1605 public: 1606 ReadModifyBracketNode(JSGlobalData* globalData, ExpressionNode* base, ExpressionNode* subscript, Operator oper, ExpressionNode* right, bool subscriptHasAssignments, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset) KJS_FAST_CALL 1607 : ExpressionNode(globalData) 1608 , ThrowableSubExpressionData(divot, startOffset, endOffset) 1489 1609 , m_base(base) 1490 1610 , m_subscript(subscript) … … 1510 1630 }; 1511 1631 1512 class AssignBracketNode : public ExpressionNode { 1513 public: 1514 AssignBracketNode(JSGlobalData* globalData, ExpressionNode* base, ExpressionNode* subscript, ExpressionNode* right, bool subscriptHasAssignments, bool rightHasAssignments) KJS_FAST_CALL 1515 : ExpressionNode(globalData) 1632 class AssignBracketNode : public ExpressionNode, public ThrowableExpressionData { 1633 public: 1634 AssignBracketNode(JSGlobalData* globalData, ExpressionNode* base, ExpressionNode* subscript, ExpressionNode* right, bool subscriptHasAssignments, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset) KJS_FAST_CALL 1635 : ExpressionNode(globalData) 1636 , ThrowableExpressionData(divot, startOffset, endOffset) 1516 1637 , m_base(base) 1517 1638 , m_subscript(subscript) … … 1535 1656 }; 1536 1657 1537 class AssignDotNode : public ExpressionNode { 1538 public: 1539 AssignDotNode(JSGlobalData* globalData, ExpressionNode* base, const Identifier& ident, ExpressionNode* right, bool rightHasAssignments) KJS_FAST_CALL 1540 : ExpressionNode(globalData) 1658 class AssignDotNode : public ExpressionNode, public ThrowableExpressionData { 1659 public: 1660 AssignDotNode(JSGlobalData* globalData, ExpressionNode* base, const Identifier& ident, ExpressionNode* right, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset) KJS_FAST_CALL 1661 : ExpressionNode(globalData) 1662 , ThrowableExpressionData(divot, startOffset, endOffset) 1541 1663 , m_base(base) 1542 1664 , m_ident(ident) … … 1557 1679 }; 1558 1680 1559 class ReadModifyDotNode : public ExpressionNode { 1560 public: 1561 ReadModifyDotNode(JSGlobalData* globalData, ExpressionNode* base, const Identifier& ident, Operator oper, ExpressionNode* right, bool rightHasAssignments) KJS_FAST_CALL 1562 : ExpressionNode(globalData) 1681 class ReadModifyDotNode : public ExpressionNode, public ThrowableSubExpressionData { 1682 public: 1683 ReadModifyDotNode(JSGlobalData* globalData, ExpressionNode* base, const Identifier& ident, Operator oper, ExpressionNode* right, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset) KJS_FAST_CALL 1684 : ExpressionNode(globalData) 1685 , ThrowableSubExpressionData(divot, startOffset, endOffset) 1563 1686 , m_base(base) 1564 1687 , m_ident(ident) … … 1582 1705 }; 1583 1706 1584 class AssignErrorNode : public ExpressionNode { 1585 public: 1586 AssignErrorNode(JSGlobalData* globalData, ExpressionNode* left, Operator oper, ExpressionNode* right) KJS_FAST_CALL 1587 : ExpressionNode(globalData) 1707 class AssignErrorNode : public ExpressionNode, public ThrowableExpressionData { 1708 public: 1709 AssignErrorNode(JSGlobalData* globalData, ExpressionNode* left, Operator oper, ExpressionNode* right, unsigned divot, unsigned startOffset, unsigned endOffset) KJS_FAST_CALL 1710 : ExpressionNode(globalData) 1711 , ThrowableExpressionData(divot, startOffset, endOffset) 1588 1712 , m_left(left) 1589 1713 , m_operator(oper) … … 1837 1961 }; 1838 1962 1839 class ForInNode : public StatementNode {1963 class ForInNode : public StatementNode, public ThrowableExpressionData { 1840 1964 public: 1841 1965 ForInNode(JSGlobalData*, ExpressionNode*, ExpressionNode*, StatementNode*) KJS_FAST_CALL; 1842 ForInNode(JSGlobalData*, const Identifier&, ExpressionNode*, ExpressionNode*, StatementNode* ) KJS_FAST_CALL;1966 ForInNode(JSGlobalData*, const Identifier&, ExpressionNode*, ExpressionNode*, StatementNode*, int divot, int startOffset, int endOffset) KJS_FAST_CALL; 1843 1967 1844 1968 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL; … … 1854 1978 }; 1855 1979 1856 class ContinueNode : public StatementNode {1980 class ContinueNode : public StatementNode, public ThrowableExpressionData { 1857 1981 public: 1858 1982 ContinueNode(JSGlobalData* globalData) KJS_FAST_CALL … … 1874 1998 }; 1875 1999 1876 class BreakNode : public StatementNode {2000 class BreakNode : public StatementNode, public ThrowableExpressionData { 1877 2001 public: 1878 2002 BreakNode(JSGlobalData* globalData) KJS_FAST_CALL … … 1894 2018 }; 1895 2019 1896 class ReturnNode : public StatementNode {2020 class ReturnNode : public StatementNode, public ThrowableExpressionData { 1897 2021 public: 1898 2022 ReturnNode(JSGlobalData* globalData, ExpressionNode* value) KJS_FAST_CALL … … 1912 2036 class WithNode : public StatementNode { 1913 2037 public: 1914 WithNode(JSGlobalData* globalData, ExpressionNode* expr, StatementNode* statement ) KJS_FAST_CALL2038 WithNode(JSGlobalData* globalData, ExpressionNode* expr, StatementNode* statement, uint32_t divot, uint32_t expressionLength) KJS_FAST_CALL 1915 2039 : StatementNode(globalData) 1916 2040 , m_expr(expr) 1917 2041 , m_statement(statement) 2042 , m_divot(divot) 2043 , m_expressionLength(expressionLength) 1918 2044 { 1919 2045 } … … 1925 2051 RefPtr<ExpressionNode> m_expr; 1926 2052 RefPtr<StatementNode> m_statement; 1927 }; 1928 1929 class LabelNode : public StatementNode { 2053 uint32_t m_divot; 2054 uint32_t m_expressionLength; 2055 }; 2056 2057 class LabelNode : public StatementNode, public ThrowableExpressionData { 1930 2058 public: 1931 2059 LabelNode(JSGlobalData* globalData, const Identifier& label, StatementNode* statement) KJS_FAST_CALL … … 1945 2073 }; 1946 2074 1947 class ThrowNode : public StatementNode {2075 class ThrowNode : public StatementNode, public ThrowableExpressionData { 1948 2076 public: 1949 2077 ThrowNode(JSGlobalData* globalData, ExpressionNode* expr) KJS_FAST_CALL … … 2023 2151 VarStack& varStack() { return m_varStack; } 2024 2152 FunctionStack& functionStack() { return m_functionStack; } 2025 2153 2026 2154 protected: 2027 2155 VarStack m_varStack; … … 2037 2165 class ProgramNode : public ScopeNode { 2038 2166 public: 2039 static ProgramNode* create(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, bool usesEval, bool needsClosure) KJS_FAST_CALL;2167 static ProgramNode* create(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, SourceProvider*, bool usesEval, bool needsClosure) KJS_FAST_CALL; 2040 2168 2041 2169 ProgramCodeBlock& byteCode(ScopeChainNode* scopeChain) KJS_FAST_CALL … … 2047 2175 2048 2176 private: 2049 ProgramNode(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, bool usesEval, bool needsClosure) KJS_FAST_CALL;2177 ProgramNode(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, SourceProvider*, bool usesEval, bool needsClosure) KJS_FAST_CALL; 2050 2178 2051 2179 void generateCode(ScopeChainNode*) KJS_FAST_CALL; … … 2055 2183 Vector<size_t> m_functionIndexes; // Storage indexes belonging to the nodes in m_functionStack. (Recorded to avoid double lookup.) 2056 2184 2185 RefPtr<SourceProvider> m_sourceProvider; 2186 2057 2187 OwnPtr<ProgramCodeBlock> m_code; 2058 2188 }; … … 2060 2190 class EvalNode : public ScopeNode { 2061 2191 public: 2062 static EvalNode* create(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, bool usesEval, bool needsClosure) KJS_FAST_CALL;2192 static EvalNode* create(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, SourceProvider*, bool usesEval, bool needsClosure) KJS_FAST_CALL; 2063 2193 2064 2194 EvalCodeBlock& byteCode(ScopeChainNode* scopeChain) KJS_FAST_CALL … … 2070 2200 2071 2201 private: 2072 EvalNode(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, bool usesEval, bool needsClosure) KJS_FAST_CALL;2202 EvalNode(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, SourceProvider*, bool usesEval, bool needsClosure) KJS_FAST_CALL; 2073 2203 2074 2204 void generateCode(ScopeChainNode*) KJS_FAST_CALL; 2075 2205 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL; 2206 2207 RefPtr<SourceProvider> m_sourceProvider; 2076 2208 2077 2209 OwnPtr<EvalCodeBlock> m_code; … … 2080 2212 class FunctionBodyNode : public ScopeNode { 2081 2213 public: 2214 static FunctionBodyNode* create(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, SourceProvider*, bool usesEval, bool needsClosure) KJS_FAST_CALL; 2082 2215 static FunctionBodyNode* create(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, bool usesEval, bool needsClosure) KJS_FAST_CALL; 2083 2216 … … 2107 2240 void setSource(const SourceRange& source) { m_source = source; } 2108 2241 UString toSourceString() const KJS_FAST_CALL { return UString("{") + m_source.toString() + UString("}"); } 2109 2110 2242 protected: 2111 2243 FunctionBodyNode(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, bool usesEval, bool needsClosure) KJS_FAST_CALL; -
trunk/LayoutTests/ChangeLog
r35244 r35245 1 2008-07-18 Oliver Hunt <oliver@apple.com> 2 3 Reviewed by Cameron Zwarich. 4 5 Update layout tests for new exception text, and add additional test covering the 6 expression ranges provided. 7 8 * fast/css/resources/font-face-descriptor-multiple-values-parsing.js: 9 * fast/dom/SelectorAPI/dumpNodeList-expected.txt: 10 * fast/forms/select-namedItem-expected.txt: 11 * fast/js/exception-expression-offset.html: Added. 12 * fast/js/resources/exception-expression-offset.js: Added. 13 New test covering the offset positions given for exceptions 14 * fast/xsl/transform-xhr-doc-expected.txt: 15 * http/tests/security/aboutBlank/xss-DENIED-navigate-opener-document-write-expected.txt: 16 * http/tests/security/aboutBlank/xss-DENIED-navigate-opener-javascript-url-expected.txt: 17 * http/tests/security/aboutBlank/xss-DENIED-set-opener-expected.txt: 18 * http/tests/security/cross-frame-access-call.html: 19 * platform/mac/fast/events/updateLayoutForHitTest-expected.txt: 20 * platform/mac/svg/custom/createelement-expected.txt: 21 * platform/mac/tables/mozilla/bugs/bug53690-1-expected.txt: 22 * platform/mac/tables/mozilla_expected_failures/bugs/bug92868_1-expected.txt: 23 1 24 2008-07-18 Adele Peterson & Maxime Britto <britto@apple.com> 2 25 -
trunk/LayoutTests/fast/css/resources/font-face-descriptor-multiple-values-parsing.js
r34880 r35245 17 17 shouldBe('test("font-weight", "bold, normal")', '"bold, normal"'); 18 18 shouldBe('test("font-weight", "100, 200, 300, 400, 500, 600, 700, 100")', '"100, 200, 300, 400, 500, 600, 700, 100"'); 19 shouldThrow('test("font-weight", "all, 100")', '"TypeError: Null value"');20 shouldThrow('test("font-weight", "bold, normal, all")', '"TypeError: Null value"');21 shouldThrow('test("font-weight", "")', '"TypeError: Null value"');19 shouldThrow('test("font-weight", "all, 100")', '"TypeError: Result of expression \'style.sheet.rules[0].style.getPropertyCSSValue(property)\' [null] is not an object."'); 20 shouldThrow('test("font-weight", "bold, normal, all")', '"TypeError: Result of expression \'style.sheet.rules[0].style.getPropertyCSSValue(property)\' [null] is not an object."'); 21 shouldThrow('test("font-weight", "")', '"TypeError: Result of expression \'style.sheet.rules[0].style.getPropertyCSSValue(property)\' [null] is not an object."'); 22 22 23 23 shouldBe('test("font-style", "normal")', '"normal"'); … … 25 25 shouldBe('test("font-style", "normal, oblique")', '"normal, oblique"'); 26 26 shouldBe('test("font-style", "all")', '"all"'); 27 shouldThrow('test("font-style", "all, normal")', '"TypeError: Null value"');28 shouldThrow('test("font-style", "italic, all")', '"TypeError: Null value"');29 shouldThrow('test("font-style", "")', '"TypeError: Null value"');27 shouldThrow('test("font-style", "all, normal")', '"TypeError: Result of expression \'style.sheet.rules[0].style.getPropertyCSSValue(property)\' [null] is not an object."'); 28 shouldThrow('test("font-style", "italic, all")', '"TypeError: Result of expression \'style.sheet.rules[0].style.getPropertyCSSValue(property)\' [null] is not an object."'); 29 shouldThrow('test("font-style", "")', '"TypeError: Result of expression \'style.sheet.rules[0].style.getPropertyCSSValue(property)\' [null] is not an object."'); 30 30 31 31 shouldBe('test("font-variant", "normal")', '"normal"'); … … 33 33 shouldBe('test("font-variant", "normal, small-caps")', '"normal, small-caps"'); 34 34 shouldBe('test("font-variant", "all")', '"all"'); 35 shouldThrow('test("font-variant", "all, normal")', '"TypeError: Null value"');36 shouldThrow('test("font-variant", "small-caps, all")', '"TypeError: Null value"');37 shouldThrow('test("font-variant", "")', '"TypeError: Null value"');35 shouldThrow('test("font-variant", "all, normal")', '"TypeError: Result of expression \'style.sheet.rules[0].style.getPropertyCSSValue(property)\' [null] is not an object."'); 36 shouldThrow('test("font-variant", "small-caps, all")', '"TypeError: Result of expression \'style.sheet.rules[0].style.getPropertyCSSValue(property)\' [null] is not an object."'); 37 shouldThrow('test("font-variant", "")', '"TypeError: Result of expression \'style.sheet.rules[0].style.getPropertyCSSValue(property)\' [null] is not an object."'); 38 38 39 39 var successfullyParsed = true; -
trunk/LayoutTests/fast/dom/SelectorAPI/dumpNodeList-expected.txt
r35108 r35245 47 47 Document.querySelector 48 48 49 TypeError: Null value50 TypeError: Null value49 TypeError: Result of expression 'node.querySelector(selectorString)' [null] is not an object. 50 TypeError: Result of expression 'node.querySelector(selectorString)' [null] is not an object. 51 51 [object HTMLDivElement] 52 52 [object HTMLDivElement] … … 59 59 Element.querySelector 60 60 61 TypeError: Null value62 TypeError: Null value63 TypeError: Null value61 TypeError: Result of expression 'node.querySelector(selectorString)' [null] is not an object. 62 TypeError: Result of expression 'node.querySelector(selectorString)' [null] is not an object. 63 TypeError: Result of expression 'node.querySelector(selectorString)' [null] is not an object. 64 64 [object HTMLDivElement] 65 65 [object HTMLDivElement] … … 72 72 DocumentFragment.querySelector 73 73 74 TypeError: Null value75 TypeError: Null value76 TypeError: Null value74 TypeError: Result of expression 'node.querySelector(selectorString)' [null] is not an object. 75 TypeError: Result of expression 'node.querySelector(selectorString)' [null] is not an object. 76 TypeError: Result of expression 'node.querySelector(selectorString)' [null] is not an object. 77 77 [object HTMLDivElement] 78 78 [object HTMLDivElement] -
trunk/LayoutTests/fast/forms/select-namedItem-expected.txt
r25617 r35245 5 5 FOUND ITEM: 1 6 6 FOUND ITEM: 1 7 ERROR: Null value7 ERROR: Result of expression 'item' [null] is not an object. 8 8 -
trunk/LayoutTests/fast/xsl/transform-xhr-doc-expected.txt
r21687 r35245 1 CONSOLE MESSAGE: line 20: Undefined value1 CONSOLE MESSAGE: line 20: Result of expression 'doc' [undefined] is not an object. 2 2 Test for bug 10313: xsl:import doesn't work in stylesheets loaded via XMLHttpRequest. 3 3 -
trunk/LayoutTests/http/tests/security/aboutBlank/xss-DENIED-navigate-opener-document-write-expected.txt
r29266 r35245 1 1 CONSOLE MESSAGE: line 1: Unsafe JavaScript attempt to access frame with URL http://localhost:8000/security/resources/innocent-victim-with-notify.html from frame with URL about:blank. Domains, protocols and ports must match. 2 2 3 CONSOLE MESSAGE: line 1: Undefined value3 CONSOLE MESSAGE: line 1: Result of expression 'target.document' [undefined] is not an object. 4 4 This page opens a window to "", injects malicious code, and then navigates its opener to the victim. The opened window then tries to scripts its opener after document.writeing a new document. 5 5 Code injected into window: -
trunk/LayoutTests/http/tests/security/aboutBlank/xss-DENIED-navigate-opener-javascript-url-expected.txt
r34506 r35245 1 1 CONSOLE MESSAGE: line 1: Unsafe JavaScript attempt to access frame with URL http://localhost:8000/security/resources/innocent-victim-with-notify.html from frame with URL http://127.0.0.1:8000/security/aboutBlank/xss-DENIED-navigate-opener-javascript-url.html. Domains, protocols and ports must match. 2 2 3 CONSOLE MESSAGE: line 1: Undefined value3 CONSOLE MESSAGE: line 1: Result of expression 'target.document' [undefined] is not an object. 4 4 This page opens a window to "", injects malicious code, and then navigates its opener to the victim. The opened window then tries to scripts its opener after reloading itself as a javascript URL. 5 5 Code injected into window: -
trunk/LayoutTests/http/tests/security/aboutBlank/xss-DENIED-set-opener-expected.txt
r30634 r35245 3 3 CONSOLE MESSAGE: line 1: Unsafe JavaScript attempt to access frame with URL http://localhost:8000/security/resources/innocent-victim.html from frame with URL about:blank. Domains, protocols and ports must match. 4 4 5 CONSOLE MESSAGE: line 1: Undefined value5 CONSOLE MESSAGE: line 1: Result of expression 'target.document' [undefined] is not an object. 6 6 This page opens a window to "", injects malicious code, and then uses window.open.call to set its opener to the victim. The opened window then tries to scripts its opener. 7 7 Code injected into window: -
trunk/LayoutTests/http/tests/security/cross-frame-access-call.html
r34447 r35245 57 57 58 58 // Throws a TypeError and logs to the error console 59 shouldBe("window.showModalDialog.call(targetWindow);", "' TypeError: Undefined value'");59 shouldBe("window.showModalDialog.call(targetWindow);", "'Result of expression 'window.showModalDialog' [undefined] is not an object.'"); 60 60 61 61 // - Tests for the Location object - -
trunk/LayoutTests/platform/mac/fast/events/updateLayoutForHitTest-expected.txt
r30635 r35245 1 CONSOLE MESSAGE: line 36: Null value2 CONSOLE MESSAGE: line 40: Null value3 CONSOLE MESSAGE: line 36: Null value4 CONSOLE MESSAGE: line 40: Null value1 CONSOLE MESSAGE: line 36: Result of expression 'triangleSpan.nextSibling.nextSibling.nextSibling.nextSibling' [null] is not an object. 2 CONSOLE MESSAGE: line 40: Result of expression 'triangleSpan.nextSibling.nextSibling.nextSibling.nextSibling' [null] is not an object. 3 CONSOLE MESSAGE: line 36: Result of expression 'triangleSpan.nextSibling.nextSibling.nextSibling.nextSibling' [null] is not an object. 4 CONSOLE MESSAGE: line 40: Result of expression 'triangleSpan.nextSibling.nextSibling.nextSibling.nextSibling' [null] is not an object. 5 5 layer at (0,0) size 800x600 6 6 RenderView at (0,0) size 800x600 -
trunk/LayoutTests/platform/mac/svg/custom/createelement-expected.txt
r34117 r35245 1 CONSOLE MESSAGE: line 13: TypeError: Null value1 CONSOLE MESSAGE: line 13: TypeError: Result of expression 'green' [null] is not an object. 2 2 layer at (0,0) size 800x600 3 3 RenderView at (0,0) size 800x600 -
trunk/LayoutTests/platform/mac/tables/mozilla/bugs/bug53690-1-expected.txt
r30635 r35245 1 CONSOLE MESSAGE: line 4: TypeError: Undefined value1 CONSOLE MESSAGE: line 4: TypeError: Result of expression 'document.forms[1]' [undefined] is not an object. 2 2 layer at (0,0) size 800x600 3 3 RenderView at (0,0) size 800x600 -
trunk/LayoutTests/platform/mac/tables/mozilla_expected_failures/bugs/bug92868_1-expected.txt
r30635 r35245 1 CONSOLE MESSAGE: line 14: Undefined value1 CONSOLE MESSAGE: line 14: Result of expression 'document.styleSheets[1].disabled =' [undefined] is not an object. 2 2 layer at (0,0) size 800x600 3 3 RenderView at (0,0) size 800x600
Note:
See TracChangeset
for help on using the changeset viewer.