| Differences between
and this patch
- a/Source/JavaScriptCore/ChangeLog +466 lines
Lines 1-3 a/Source/JavaScriptCore/ChangeLog_sec1
1
2012-08-01  Peter Wang  <peter.wang@torchmobile.com.cn>
2
3
        Web Inspector: [JSC] implement setting breakpoints by line:column
4
        https://bugs.webkit.org/show_bug.cgi?id=53003
5
6
        Reviewed by Geoffrey Garen.
7
8
        Add a counter in lexer to record the column of each token. Debugger will use column info
9
        in "Pretty Print" debug mode of Inspector.
10
11
        * bytecode/Opcode.h:
12
        (JSC):
13
        (JSC::padOpcodeName):
14
        * bytecompiler/BytecodeGenerator.cpp:
15
        (JSC::BytecodeGenerator::emitDebugHook):
16
        * bytecompiler/BytecodeGenerator.h:
17
        (BytecodeGenerator):
18
        * bytecompiler/NodesCodegen.cpp:
19
        (JSC::ArrayNode::toArgumentList):
20
        (JSC::ApplyFunctionCallDotNode::emitBytecode):
21
        (JSC::ConditionalNode::emitBytecode):
22
        (JSC::ConstStatementNode::emitBytecode):
23
        (JSC::EmptyStatementNode::emitBytecode):
24
        (JSC::DebuggerStatementNode::emitBytecode):
25
        (JSC::ExprStatementNode::emitBytecode):
26
        (JSC::VarStatementNode::emitBytecode):
27
        (JSC::IfNode::emitBytecode):
28
        (JSC::IfElseNode::emitBytecode):
29
        (JSC::DoWhileNode::emitBytecode):
30
        (JSC::WhileNode::emitBytecode):
31
        (JSC::ForNode::emitBytecode):
32
        (JSC::ForInNode::emitBytecode):
33
        (JSC::ContinueNode::emitBytecode):
34
        (JSC::BreakNode::emitBytecode):
35
        (JSC::ReturnNode::emitBytecode):
36
        (JSC::WithNode::emitBytecode):
37
        (JSC::SwitchNode::emitBytecode):
38
        (JSC::LabelNode::emitBytecode):
39
        (JSC::ThrowNode::emitBytecode):
40
        (JSC::TryNode::emitBytecode):
41
        (JSC::ProgramNode::emitBytecode):
42
        (JSC::EvalNode::emitBytecode):
43
        (JSC::FunctionBodyNode::emitBytecode):
44
        * debugger/Debugger.h:
45
        * interpreter/Interpreter.cpp:
46
        (JSC::Interpreter::unwindCallFrame):
47
        (JSC::Interpreter::throwException):
48
        (JSC::Interpreter::debug):
49
        * interpreter/Interpreter.h:
50
        (Interpreter):
51
        * jit/JITOpcodes.cpp:
52
        (JSC::JIT::emit_op_debug):
53
        * jit/JITOpcodes32_64.cpp:
54
        (JSC::JIT::emit_op_debug):
55
        * jit/JITStubs.cpp:
56
        (JSC::DEFINE_STUB_FUNCTION):
57
        * llint/LLIntSlowPaths.cpp:
58
        (JSC::LLInt::LLINT_SLOW_PATH_DECL):
59
        * parser/ASTBuilder.h:
60
        (ASTBuilder):
61
        (JSC::ASTBuilder::createCommaExpr):
62
        (JSC::ASTBuilder::createLogicalNot):
63
        (JSC::ASTBuilder::createUnaryPlus):
64
        (JSC::ASTBuilder::createVoid):
65
        (JSC::ASTBuilder::thisExpr):
66
        (JSC::ASTBuilder::createResolve):
67
        (JSC::ASTBuilder::createObjectLiteral):
68
        (JSC::ASTBuilder::createArray):
69
        (JSC::ASTBuilder::createNumberExpr):
70
        (JSC::ASTBuilder::createString):
71
        (JSC::ASTBuilder::createBoolean):
72
        (JSC::ASTBuilder::createNull):
73
        (JSC::ASTBuilder::createBracketAccess):
74
        (JSC::ASTBuilder::createDotAccess):
75
        (JSC::ASTBuilder::createRegExp):
76
        (JSC::ASTBuilder::createNewExpr):
77
        (JSC::ASTBuilder::createConditionalExpr):
78
        (JSC::ASTBuilder::createAssignResolve):
79
        (JSC::ASTBuilder::createFunctionExpr):
80
        (JSC::ASTBuilder::createFunctionBody):
81
        (JSC::ASTBuilder::createGetterOrSetterProperty):
82
        (JSC::ASTBuilder::createArgumentsList):
83
        (JSC::ASTBuilder::createPropertyList):
84
        (JSC::ASTBuilder::createFuncDeclStatement):
85
        (JSC::ASTBuilder::createBlockStatement):
86
        (JSC::ASTBuilder::createExprStatement):
87
        (JSC::ASTBuilder::createIfStatement):
88
        (JSC::ASTBuilder::createForLoop):
89
        (JSC::ASTBuilder::createForInLoop):
90
        (JSC::ASTBuilder::createEmptyStatement):
91
        (JSC::ASTBuilder::createVarStatement):
92
        (JSC::ASTBuilder::createReturnStatement):
93
        (JSC::ASTBuilder::createBreakStatement):
94
        (JSC::ASTBuilder::createContinueStatement):
95
        (JSC::ASTBuilder::createTryStatement):
96
        (JSC::ASTBuilder::createSwitchStatement):
97
        (JSC::ASTBuilder::createWhileStatement):
98
        (JSC::ASTBuilder::createDoWhileStatement):
99
        (JSC::ASTBuilder::createLabelStatement):
100
        (JSC::ASTBuilder::createWithStatement):
101
        (JSC::ASTBuilder::createThrowStatement):
102
        (JSC::ASTBuilder::createDebugger):
103
        (JSC::ASTBuilder::createConstStatement):
104
        (JSC::ASTBuilder::appendConstDecl):
105
        (JSC::ASTBuilder::combineCommaNodes):
106
        (JSC::ASTBuilder::appendBinaryOperation):
107
        (JSC::ASTBuilder::createAssignment):
108
        (JSC::ASTBuilder::createNumber):
109
        (JSC::ASTBuilder::makeTypeOfNode):
110
        (JSC::ASTBuilder::makeDeleteNode):
111
        (JSC::ASTBuilder::makeNegateNode):
112
        (JSC::ASTBuilder::makeBitwiseNotNode):
113
        (JSC::ASTBuilder::makeMultNode):
114
        (JSC::ASTBuilder::makeDivNode):
115
        (JSC::ASTBuilder::makeModNode):
116
        (JSC::ASTBuilder::makeAddNode):
117
        (JSC::ASTBuilder::makeSubNode):
118
        (JSC::ASTBuilder::makeLeftShiftNode):
119
        (JSC::ASTBuilder::makeRightShiftNode):
120
        (JSC::ASTBuilder::makeURightShiftNode):
121
        (JSC::ASTBuilder::makeBitOrNode):
122
        (JSC::ASTBuilder::makeBitAndNode):
123
        (JSC::ASTBuilder::makeBitXOrNode):
124
        (JSC::ASTBuilder::makeFunctionCallNode):
125
        (JSC::ASTBuilder::makeBinaryNode):
126
        (JSC::ASTBuilder::makeAssignNode):
127
        (JSC::ASTBuilder::makePrefixNode):
128
        (JSC::ASTBuilder::makePostfixNode):
129
        * parser/Lexer.cpp:
130
        (JSC::::setCode):
131
        (JSC::::internalShift):
132
        (JSC::::shift):
133
        (JSC::::lex):
134
        * parser/Lexer.h:
135
        (Lexer):
136
        (JSC::Lexer::currentColumnNumber):
137
        (JSC::::lexExpectIdentifier):
138
        * parser/NodeConstructors.h:
139
        (JSC::Node::Node):
140
        (JSC::ExpressionNode::ExpressionNode):
141
        (JSC::StatementNode::StatementNode):
142
        (JSC::NullNode::NullNode):
143
        (JSC::BooleanNode::BooleanNode):
144
        (JSC::NumberNode::NumberNode):
145
        (JSC::StringNode::StringNode):
146
        (JSC::RegExpNode::RegExpNode):
147
        (JSC::ThisNode::ThisNode):
148
        (JSC::ResolveNode::ResolveNode):
149
        (JSC::ArrayNode::ArrayNode):
150
        (JSC::PropertyListNode::PropertyListNode):
151
        (JSC::ObjectLiteralNode::ObjectLiteralNode):
152
        (JSC::BracketAccessorNode::BracketAccessorNode):
153
        (JSC::DotAccessorNode::DotAccessorNode):
154
        (JSC::ArgumentListNode::ArgumentListNode):
155
        (JSC::NewExprNode::NewExprNode):
156
        (JSC::EvalFunctionCallNode::EvalFunctionCallNode):
157
        (JSC::FunctionCallValueNode::FunctionCallValueNode):
158
        (JSC::FunctionCallResolveNode::FunctionCallResolveNode):
159
        (JSC::FunctionCallBracketNode::FunctionCallBracketNode):
160
        (JSC::FunctionCallDotNode::FunctionCallDotNode):
161
        (JSC::CallFunctionCallDotNode::CallFunctionCallDotNode):
162
        (JSC::ApplyFunctionCallDotNode::ApplyFunctionCallDotNode):
163
        (JSC::PrePostResolveNode::PrePostResolveNode):
164
        (JSC::PostfixResolveNode::PostfixResolveNode):
165
        (JSC::PostfixBracketNode::PostfixBracketNode):
166
        (JSC::PostfixDotNode::PostfixDotNode):
167
        (JSC::PostfixErrorNode::PostfixErrorNode):
168
        (JSC::DeleteResolveNode::DeleteResolveNode):
169
        (JSC::DeleteBracketNode::DeleteBracketNode):
170
        (JSC::DeleteDotNode::DeleteDotNode):
171
        (JSC::DeleteValueNode::DeleteValueNode):
172
        (JSC::VoidNode::VoidNode):
173
        (JSC::TypeOfResolveNode::TypeOfResolveNode):
174
        (JSC::TypeOfValueNode::TypeOfValueNode):
175
        (JSC::PrefixResolveNode::PrefixResolveNode):
176
        (JSC::PrefixBracketNode::PrefixBracketNode):
177
        (JSC::PrefixDotNode::PrefixDotNode):
178
        (JSC::PrefixErrorNode::PrefixErrorNode):
179
        (JSC::UnaryOpNode::UnaryOpNode):
180
        (JSC::UnaryPlusNode::UnaryPlusNode):
181
        (JSC::NegateNode::NegateNode):
182
        (JSC::BitwiseNotNode::BitwiseNotNode):
183
        (JSC::LogicalNotNode::LogicalNotNode):
184
        (JSC::BinaryOpNode::BinaryOpNode):
185
        (JSC::MultNode::MultNode):
186
        (JSC::DivNode::DivNode):
187
        (JSC::ModNode::ModNode):
188
        (JSC::AddNode::AddNode):
189
        (JSC::SubNode::SubNode):
190
        (JSC::LeftShiftNode::LeftShiftNode):
191
        (JSC::RightShiftNode::RightShiftNode):
192
        (JSC::UnsignedRightShiftNode::UnsignedRightShiftNode):
193
        (JSC::LessNode::LessNode):
194
        (JSC::GreaterNode::GreaterNode):
195
        (JSC::LessEqNode::LessEqNode):
196
        (JSC::GreaterEqNode::GreaterEqNode):
197
        (JSC::ThrowableBinaryOpNode::ThrowableBinaryOpNode):
198
        (JSC::InstanceOfNode::InstanceOfNode):
199
        (JSC::InNode::InNode):
200
        (JSC::EqualNode::EqualNode):
201
        (JSC::NotEqualNode::NotEqualNode):
202
        (JSC::StrictEqualNode::StrictEqualNode):
203
        (JSC::NotStrictEqualNode::NotStrictEqualNode):
204
        (JSC::BitAndNode::BitAndNode):
205
        (JSC::BitOrNode::BitOrNode):
206
        (JSC::BitXOrNode::BitXOrNode):
207
        (JSC::LogicalOpNode::LogicalOpNode):
208
        (JSC::ConditionalNode::ConditionalNode):
209
        (JSC::ReadModifyResolveNode::ReadModifyResolveNode):
210
        (JSC::AssignResolveNode::AssignResolveNode):
211
        (JSC::ReadModifyBracketNode::ReadModifyBracketNode):
212
        (JSC::AssignBracketNode::AssignBracketNode):
213
        (JSC::AssignDotNode::AssignDotNode):
214
        (JSC::ReadModifyDotNode::ReadModifyDotNode):
215
        (JSC::AssignErrorNode::AssignErrorNode):
216
        (JSC::CommaNode::CommaNode):
217
        (JSC::ConstStatementNode::ConstStatementNode):
218
        (JSC::EmptyStatementNode::EmptyStatementNode):
219
        (JSC::DebuggerStatementNode::DebuggerStatementNode):
220
        (JSC::ExprStatementNode::ExprStatementNode):
221
        (JSC::VarStatementNode::VarStatementNode):
222
        (JSC::IfNode::IfNode):
223
        (JSC::IfElseNode::IfElseNode):
224
        (JSC::DoWhileNode::DoWhileNode):
225
        (JSC::WhileNode::WhileNode):
226
        (JSC::ForNode::ForNode):
227
        (JSC::ContinueNode::ContinueNode):
228
        (JSC::BreakNode::BreakNode):
229
        (JSC::ReturnNode::ReturnNode):
230
        (JSC::WithNode::WithNode):
231
        (JSC::LabelNode::LabelNode):
232
        (JSC::ThrowNode::ThrowNode):
233
        (JSC::TryNode::TryNode):
234
        (JSC::FuncExprNode::FuncExprNode):
235
        (JSC::FuncDeclNode::FuncDeclNode):
236
        (JSC::SwitchNode::SwitchNode):
237
        (JSC::ConstDeclNode::ConstDeclNode):
238
        (JSC::BlockNode::BlockNode):
239
        (JSC::ForInNode::ForInNode):
240
        * parser/Nodes.cpp:
241
        (JSC::StatementNode::setLoc):
242
        (JSC):
243
        (JSC::ScopeNode::ScopeNode):
244
        (JSC::ProgramNode::ProgramNode):
245
        (JSC::ProgramNode::create):
246
        (JSC::EvalNode::EvalNode):
247
        (JSC::EvalNode::create):
248
        (JSC::FunctionBodyNode::FunctionBodyNode):
249
        (JSC::FunctionBodyNode::create):
250
        * parser/Nodes.h:
251
        (Node):
252
        (JSC::Node::columnNo):
253
        (ExpressionNode):
254
        (StatementNode):
255
        (JSC::StatementNode::column):
256
        (NullNode):
257
        (BooleanNode):
258
        (NumberNode):
259
        (StringNode):
260
        (RegExpNode):
261
        (ThisNode):
262
        (ResolveNode):
263
        (ArrayNode):
264
        (PropertyListNode):
265
        (ObjectLiteralNode):
266
        (BracketAccessorNode):
267
        (DotAccessorNode):
268
        (ArgumentListNode):
269
        (NewExprNode):
270
        (EvalFunctionCallNode):
271
        (FunctionCallValueNode):
272
        (FunctionCallResolveNode):
273
        (FunctionCallBracketNode):
274
        (FunctionCallDotNode):
275
        (CallFunctionCallDotNode):
276
        (ApplyFunctionCallDotNode):
277
        (PrePostResolveNode):
278
        (PostfixResolveNode):
279
        (PostfixBracketNode):
280
        (PostfixDotNode):
281
        (PostfixErrorNode):
282
        (DeleteResolveNode):
283
        (DeleteBracketNode):
284
        (DeleteDotNode):
285
        (DeleteValueNode):
286
        (VoidNode):
287
        (TypeOfResolveNode):
288
        (TypeOfValueNode):
289
        (PrefixResolveNode):
290
        (PrefixBracketNode):
291
        (PrefixDotNode):
292
        (PrefixErrorNode):
293
        (UnaryOpNode):
294
        (UnaryPlusNode):
295
        (NegateNode):
296
        (BitwiseNotNode):
297
        (LogicalNotNode):
298
        (BinaryOpNode):
299
        (MultNode):
300
        (DivNode):
301
        (ModNode):
302
        (AddNode):
303
        (SubNode):
304
        (LeftShiftNode):
305
        (RightShiftNode):
306
        (UnsignedRightShiftNode):
307
        (LessNode):
308
        (GreaterNode):
309
        (LessEqNode):
310
        (GreaterEqNode):
311
        (ThrowableBinaryOpNode):
312
        (InstanceOfNode):
313
        (InNode):
314
        (EqualNode):
315
        (NotEqualNode):
316
        (StrictEqualNode):
317
        (NotStrictEqualNode):
318
        (BitAndNode):
319
        (BitOrNode):
320
        (BitXOrNode):
321
        (LogicalOpNode):
322
        (ConditionalNode):
323
        (ReadModifyResolveNode):
324
        (AssignResolveNode):
325
        (ReadModifyBracketNode):
326
        (AssignBracketNode):
327
        (AssignDotNode):
328
        (ReadModifyDotNode):
329
        (AssignErrorNode):
330
        (CommaNode):
331
        (ConstDeclNode):
332
        (ConstStatementNode):
333
        (BlockNode):
334
        (EmptyStatementNode):
335
        (DebuggerStatementNode):
336
        (ExprStatementNode):
337
        (VarStatementNode):
338
        (IfNode):
339
        (IfElseNode):
340
        (DoWhileNode):
341
        (WhileNode):
342
        (ForNode):
343
        (ForInNode):
344
        (ContinueNode):
345
        (BreakNode):
346
        (ReturnNode):
347
        (WithNode):
348
        (LabelNode):
349
        (ThrowNode):
350
        (TryNode):
351
        (ScopeNode):
352
        (ProgramNode):
353
        (EvalNode):
354
        (FunctionBodyNode):
355
        (FuncExprNode):
356
        (FuncDeclNode):
357
        (SwitchNode):
358
        * parser/Parser.cpp:
359
        (JSC::::parseSourceElements):
360
        (JSC::::parseVarDeclaration):
361
        (JSC::::parseConstDeclaration):
362
        (JSC::::parseDoWhileStatement):
363
        (JSC::::parseWhileStatement):
364
        (JSC::::parseVarDeclarationList):
365
        (JSC::::parseConstDeclarationList):
366
        (JSC::::parseForStatement):
367
        (JSC::::parseBreakStatement):
368
        (JSC::::parseContinueStatement):
369
        (JSC::::parseReturnStatement):
370
        (JSC::::parseThrowStatement):
371
        (JSC::::parseWithStatement):
372
        (JSC::::parseSwitchStatement):
373
        (JSC::::parseTryStatement):
374
        (JSC::::parseDebuggerStatement):
375
        (JSC::::parseBlockStatement):
376
        (JSC::::parseStatement):
377
        (JSC::::parseFunctionBody):
378
        (JSC::::parseFunctionInfo):
379
        (JSC::::parseFunctionDeclaration):
380
        (JSC::::parseExpressionOrLabelStatement):
381
        (JSC::::parseExpressionStatement):
382
        (JSC::::parseIfStatement):
383
        (JSC::::parseExpression):
384
        (JSC::::parseAssignmentExpression):
385
        (JSC::::parseConditionalExpression):
386
        (JSC::::parseBinaryExpression):
387
        (JSC::::parseProperty):
388
        (JSC::::parseObjectLiteral):
389
        (JSC::::parseStrictObjectLiteral):
390
        (JSC::::parseArrayLiteral):
391
        (JSC::::parsePrimaryExpression):
392
        (JSC::::parseArguments):
393
        (JSC::::parseMemberExpression):
394
        (JSC::::parseUnaryExpression):
395
        * parser/Parser.h:
396
        (JSC::Parser::next):
397
        (JSC::Parser::nextExpectIdentifier):
398
        (JSC::Parser::tokenStart):
399
        (JSC::Parser::tokenLine):
400
        (JSC::Parser::tokenEnd):
401
        (JSC::Parser::tokenLocation):
402
        (Parser):
403
        (JSC::Parser::getTokenName):
404
        (JSC::::parse):
405
        * parser/ParserTokens.h:
406
        (JSC::JSTokenLocation::JSTokenLocation):
407
        (JSTokenLocation):
408
        (JSToken):
409
        * parser/SourceProviderCacheItem.h:
410
        (JSC::SourceProviderCacheItem::closeBraceToken):
411
        * parser/SyntaxChecker.h:
412
        (JSC::SyntaxChecker::makeFunctionCallNode):
413
        (JSC::SyntaxChecker::createCommaExpr):
414
        (JSC::SyntaxChecker::makeAssignNode):
415
        (JSC::SyntaxChecker::makePrefixNode):
416
        (JSC::SyntaxChecker::makePostfixNode):
417
        (JSC::SyntaxChecker::makeTypeOfNode):
418
        (JSC::SyntaxChecker::makeDeleteNode):
419
        (JSC::SyntaxChecker::makeNegateNode):
420
        (JSC::SyntaxChecker::makeBitwiseNotNode):
421
        (JSC::SyntaxChecker::createLogicalNot):
422
        (JSC::SyntaxChecker::createUnaryPlus):
423
        (JSC::SyntaxChecker::createVoid):
424
        (JSC::SyntaxChecker::thisExpr):
425
        (JSC::SyntaxChecker::createResolve):
426
        (JSC::SyntaxChecker::createObjectLiteral):
427
        (JSC::SyntaxChecker::createArray):
428
        (JSC::SyntaxChecker::createNumberExpr):
429
        (JSC::SyntaxChecker::createString):
430
        (JSC::SyntaxChecker::createBoolean):
431
        (JSC::SyntaxChecker::createNull):
432
        (JSC::SyntaxChecker::createBracketAccess):
433
        (JSC::SyntaxChecker::createDotAccess):
434
        (JSC::SyntaxChecker::createRegExp):
435
        (JSC::SyntaxChecker::createNewExpr):
436
        (JSC::SyntaxChecker::createConditionalExpr):
437
        (JSC::SyntaxChecker::createAssignResolve):
438
        (JSC::SyntaxChecker::createFunctionExpr):
439
        (JSC::SyntaxChecker::createFunctionBody):
440
        (JSC::SyntaxChecker::createArgumentsList):
441
        (JSC::SyntaxChecker::createPropertyList):
442
        (JSC::SyntaxChecker::createFuncDeclStatement):
443
        (JSC::SyntaxChecker::createBlockStatement):
444
        (JSC::SyntaxChecker::createExprStatement):
445
        (JSC::SyntaxChecker::createIfStatement):
446
        (JSC::SyntaxChecker::createForLoop):
447
        (JSC::SyntaxChecker::createForInLoop):
448
        (JSC::SyntaxChecker::createEmptyStatement):
449
        (JSC::SyntaxChecker::createVarStatement):
450
        (JSC::SyntaxChecker::createReturnStatement):
451
        (JSC::SyntaxChecker::createBreakStatement):
452
        (JSC::SyntaxChecker::createContinueStatement):
453
        (JSC::SyntaxChecker::createTryStatement):
454
        (JSC::SyntaxChecker::createSwitchStatement):
455
        (JSC::SyntaxChecker::createWhileStatement):
456
        (JSC::SyntaxChecker::createWithStatement):
457
        (JSC::SyntaxChecker::createDoWhileStatement):
458
        (JSC::SyntaxChecker::createLabelStatement):
459
        (JSC::SyntaxChecker::createThrowStatement):
460
        (JSC::SyntaxChecker::createDebugger):
461
        (JSC::SyntaxChecker::createConstStatement):
462
        (JSC::SyntaxChecker::appendConstDecl):
463
        (JSC::SyntaxChecker::createGetterOrSetterProperty):
464
        (JSC::SyntaxChecker::combineCommaNodes):
465
        (JSC::SyntaxChecker::operatorStackPop):
466
1
2012-08-01  Filip Pizlo  <fpizlo@apple.com>
467
2012-08-01  Filip Pizlo  <fpizlo@apple.com>
2
468
3
        DFG should distinguish between PutByVal's that clobber the world and ones that don't
469
        DFG should distinguish between PutByVal's that clobber the world and ones that don't
- a/Source/WebCore/ChangeLog +30 lines
Lines 1-3 a/Source/WebCore/ChangeLog_sec1
1
2012-08-01  Peter Wang  <peter.wang@torchmobile.com.cn>
2
3
        Web Inspector: [JSC] implement setting breakpoints by line:column
4
        https://bugs.webkit.org/show_bug.cgi?id=53003
5
6
        Reviewed by Geoffrey Garen.
7
8
        As JSC is enabled to provide column info of statement, ScriptDebugServer can use it to
9
        support "Pretty Print" debug mode.
10
11
        No new test case for this patch.
12
13
        * bindings/js/ScriptDebugServer.cpp:
14
        (WebCore::ScriptDebugServer::setBreakpoint):
15
        (WebCore::ScriptDebugServer::removeBreakpoint):
16
        (WebCore):
17
        (WebCore::ScriptDebugServer::updateCurrentStatementPosition):
18
        (WebCore::ScriptDebugServer::hasBreakpoint):
19
        (WebCore::ScriptDebugServer::createCallFrameAndPauseIfNeeded):
20
        (WebCore::ScriptDebugServer::updateCallFrameAndPauseIfNeeded):
21
        (WebCore::ScriptDebugServer::callEvent):
22
        (WebCore::ScriptDebugServer::atStatement):
23
        (WebCore::ScriptDebugServer::returnEvent):
24
        (WebCore::ScriptDebugServer::exception):
25
        (WebCore::ScriptDebugServer::willExecuteProgram):
26
        (WebCore::ScriptDebugServer::didExecuteProgram):
27
        (WebCore::ScriptDebugServer::didReachBreakpoint):
28
        * bindings/js/ScriptDebugServer.h:
29
        (ScriptDebugServer):
30
1
2012-08-01  Xingnan Wang  <xingnan.wang@intel.com>
31
2012-08-01  Xingnan Wang  <xingnan.wang@intel.com>
2
32
3
        IndexedDB: ObjectStoreMetaDataKey::m_metaDataType should use byte type
33
        IndexedDB: ObjectStoreMetaDataKey::m_metaDataType should use byte type
- a/Source/JavaScriptCore/bytecode/Opcode.h -1 / +1 lines
Lines 194-200 namespace JSC { a/Source/JavaScriptCore/bytecode/Opcode.h_sec1
194
        macro(op_throw, 2) \
194
        macro(op_throw, 2) \
195
        macro(op_throw_reference_error, 2) \
195
        macro(op_throw_reference_error, 2) \
196
        \
196
        \
197
        macro(op_debug, 4) \
197
        macro(op_debug, 5) \
198
        macro(op_profile_will_call, 2) \
198
        macro(op_profile_will_call, 2) \
199
        macro(op_profile_did_call, 2) \
199
        macro(op_profile_did_call, 2) \
200
        \
200
        \
- a/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp -1 / +2 lines
Lines 2083-2089 void BytecodeGenerator::emitPopScope() a/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp_sec1
2083
    m_dynamicScopeDepth--;
2083
    m_dynamicScopeDepth--;
2084
}
2084
}
2085
2085
2086
void BytecodeGenerator::emitDebugHook(DebugHookID debugHookID, int firstLine, int lastLine)
2086
void BytecodeGenerator::emitDebugHook(DebugHookID debugHookID, int firstLine, int lastLine, int column)
2087
{
2087
{
2088
#if ENABLE(DEBUG_WITH_BREAKPOINT)
2088
#if ENABLE(DEBUG_WITH_BREAKPOINT)
2089
    if (debugHookID != DidReachBreakpoint)
2089
    if (debugHookID != DidReachBreakpoint)
Lines 2096-2101 void BytecodeGenerator::emitDebugHook(DebugHookID debugHookID, int firstLine, in a/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp_sec2
2096
    instructions().append(debugHookID);
2096
    instructions().append(debugHookID);
2097
    instructions().append(firstLine);
2097
    instructions().append(firstLine);
2098
    instructions().append(lastLine);
2098
    instructions().append(lastLine);
2099
    instructions().append(column);
2099
}
2100
}
2100
2101
2101
void BytecodeGenerator::pushFinallyContext(StatementNode* finallyBlock)
2102
void BytecodeGenerator::pushFinallyContext(StatementNode* finallyBlock)
- a/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h -1 / +1 lines
Lines 506-512 namespace JSC { a/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h_sec1
506
        RegisterID* emitPushScope(RegisterID* scope);
506
        RegisterID* emitPushScope(RegisterID* scope);
507
        void emitPopScope();
507
        void emitPopScope();
508
508
509
        void emitDebugHook(DebugHookID, int firstLine, int lastLine);
509
        void emitDebugHook(DebugHookID, int firstLine, int lastLine, int column);
510
510
511
        int scopeDepth() { return m_dynamicScopeDepth + m_finallyDepth; }
511
        int scopeDepth() { return m_dynamicScopeDepth + m_finallyDepth; }
512
        bool hasFinaliser() { return m_finallyDepth != 0; }
512
        bool hasFinaliser() { return m_finallyDepth != 0; }
- a/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp -34 / +38 lines
Lines 202-219 bool ArrayNode::isSimpleArray() const a/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp_sec1
202
    return true;
202
    return true;
203
}
203
}
204
204
205
ArgumentListNode* ArrayNode::toArgumentList(JSGlobalData* globalData, int lineNumber) const
205
ArgumentListNode* ArrayNode::toArgumentList(JSGlobalData* globalData, int lineNumber, int columnNumber) const
206
{
206
{
207
    ASSERT(!m_elision && !m_optional);
207
    ASSERT(!m_elision && !m_optional);
208
    ElementNode* ptr = m_element;
208
    ElementNode* ptr = m_element;
209
    if (!ptr)
209
    if (!ptr)
210
        return 0;
210
        return 0;
211
    ArgumentListNode* head = new (globalData) ArgumentListNode(lineNumber, ptr->value());
211
    JSTokenLocation location;
212
    location.line = lineNumber;
213
    location.column = columnNumber;
214
    ArgumentListNode* head = new (globalData) ArgumentListNode(location, ptr->value());
212
    ArgumentListNode* tail = head;
215
    ArgumentListNode* tail = head;
213
    ptr = ptr->next();
216
    ptr = ptr->next();
214
    for (; ptr; ptr = ptr->next()) {
217
    for (; ptr; ptr = ptr->next()) {
215
        ASSERT(!ptr->elision());
218
        ASSERT(!ptr->elision());
216
        tail = new (globalData) ArgumentListNode(lineNumber, tail, ptr->value());
219
        tail = new (globalData) ArgumentListNode(location, tail, ptr->value());
217
    }
220
    }
218
    return head;
221
    return head;
219
}
222
}
Lines 536-542 RegisterID* ApplyFunctionCallDotNode::emitBytecode(BytecodeGenerator& generator, a/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp_sec2
536
                if (m_args->m_listNode->m_next) {
539
                if (m_args->m_listNode->m_next) {
537
                    ASSERT(m_args->m_listNode->m_next->m_expr->isSimpleArray());
540
                    ASSERT(m_args->m_listNode->m_next->m_expr->isSimpleArray());
538
                    ASSERT(!m_args->m_listNode->m_next->m_next);
541
                    ASSERT(!m_args->m_listNode->m_next->m_next);
539
                    m_args->m_listNode = static_cast<ArrayNode*>(m_args->m_listNode->m_next->m_expr)->toArgumentList(generator.globalData(), 0);
542
                    m_args->m_listNode = static_cast<ArrayNode*>(m_args->m_listNode->m_next->m_expr)->toArgumentList(generator.globalData(), 0, 0);
540
                    RefPtr<RegisterID> realFunction = generator.emitMove(generator.tempDestination(dst), base.get());
543
                    RefPtr<RegisterID> realFunction = generator.emitMove(generator.tempDestination(dst), base.get());
541
                    CallArguments callArguments(generator, m_args);
544
                    CallArguments callArguments(generator, m_args);
542
                    generator.emitNode(callArguments.thisRegister(), oldList->m_expr);
545
                    generator.emitNode(callArguments.thisRegister(), oldList->m_expr);
Lines 1128-1133 RegisterID* ConditionalNode::emitBytecode(BytecodeGenerator& generator, Register a/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp_sec3
1128
    RefPtr<Label> beforeElse = generator.newLabel();
1131
    RefPtr<Label> beforeElse = generator.newLabel();
1129
    RefPtr<Label> afterElse = generator.newLabel();
1132
    RefPtr<Label> afterElse = generator.newLabel();
1130
1133
1134
    generator.emitDebugHook(WillExecuteStatement, lineNo(), lineNo(), columnNo());
1135
1131
    if (m_logical->hasConditionContextCodegen()) {
1136
    if (m_logical->hasConditionContextCodegen()) {
1132
        RefPtr<Label> beforeThen = generator.newLabel();
1137
        RefPtr<Label> beforeThen = generator.newLabel();
1133
        generator.emitNodeInConditionContext(m_logical, beforeThen.get(), beforeElse.get(), true);
1138
        generator.emitNodeInConditionContext(m_logical, beforeThen.get(), beforeElse.get(), true);
Lines 1385-1391 RegisterID* ConstDeclNode::emitBytecode(BytecodeGenerator& generator, RegisterID a/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp_sec4
1385
1390
1386
RegisterID* ConstStatementNode::emitBytecode(BytecodeGenerator& generator, RegisterID*)
1391
RegisterID* ConstStatementNode::emitBytecode(BytecodeGenerator& generator, RegisterID*)
1387
{
1392
{
1388
    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine());
1393
    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), column());
1389
    return generator.emitNode(m_next);
1394
    return generator.emitNode(m_next);
1390
}
1395
}
1391
1396
Lines 1428-1434 RegisterID* BlockNode::emitBytecode(BytecodeGenerator& generator, RegisterID* ds a/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp_sec5
1428
1433
1429
RegisterID* EmptyStatementNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
1434
RegisterID* EmptyStatementNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
1430
{
1435
{
1431
    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine());
1436
    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), column());
1432
    return dst;
1437
    return dst;
1433
}
1438
}
1434
1439
Lines 1436-1442 RegisterID* EmptyStatementNode::emitBytecode(BytecodeGenerator& generator, Regis a/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp_sec6
1436
1441
1437
RegisterID* DebuggerStatementNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
1442
RegisterID* DebuggerStatementNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
1438
{
1443
{
1439
    generator.emitDebugHook(DidReachBreakpoint, firstLine(), lastLine());
1444
    generator.emitDebugHook(DidReachBreakpoint, firstLine(), lastLine(), column());
1440
    return dst;
1445
    return dst;
1441
}
1446
}
1442
1447
Lines 1445-1451 RegisterID* DebuggerStatementNode::emitBytecode(BytecodeGenerator& generator, Re a/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp_sec7
1445
RegisterID* ExprStatementNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
1450
RegisterID* ExprStatementNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
1446
{
1451
{
1447
    ASSERT(m_expr);
1452
    ASSERT(m_expr);
1448
    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine()); 
1453
    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), column());
1449
    return generator.emitNode(dst, m_expr);
1454
    return generator.emitNode(dst, m_expr);
1450
}
1455
}
1451
1456
Lines 1454-1460 RegisterID* ExprStatementNode::emitBytecode(BytecodeGenerator& generator, Regist a/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp_sec8
1454
RegisterID* VarStatementNode::emitBytecode(BytecodeGenerator& generator, RegisterID*)
1459
RegisterID* VarStatementNode::emitBytecode(BytecodeGenerator& generator, RegisterID*)
1455
{
1460
{
1456
    ASSERT(m_expr);
1461
    ASSERT(m_expr);
1457
    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine());
1462
    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), column());
1458
    return generator.emitNode(m_expr);
1463
    return generator.emitNode(m_expr);
1459
}
1464
}
1460
1465
Lines 1462-1468 RegisterID* VarStatementNode::emitBytecode(BytecodeGenerator& generator, Registe a/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp_sec9
1462
1467
1463
RegisterID* IfNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
1468
RegisterID* IfNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
1464
{
1469
{
1465
    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine());
1470
    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), column());
1466
    
1471
    
1467
    RefPtr<Label> afterThen = generator.newLabel();
1472
    RefPtr<Label> afterThen = generator.newLabel();
1468
1473
Lines 1486-1492 RegisterID* IfNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) a/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp_sec10
1486
1491
1487
RegisterID* IfElseNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
1492
RegisterID* IfElseNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
1488
{
1493
{
1489
    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine());
1494
    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), column());
1490
    
1495
    
1491
    RefPtr<Label> beforeElse = generator.newLabel();
1496
    RefPtr<Label> beforeElse = generator.newLabel();
1492
    RefPtr<Label> afterElse = generator.newLabel();
1497
    RefPtr<Label> afterElse = generator.newLabel();
Lines 1522-1533 RegisterID* DoWhileNode::emitBytecode(BytecodeGenerator& generator, RegisterID* a/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp_sec11
1522
    RefPtr<Label> topOfLoop = generator.newLabel();
1527
    RefPtr<Label> topOfLoop = generator.newLabel();
1523
    generator.emitLabel(topOfLoop.get());
1528
    generator.emitLabel(topOfLoop.get());
1524
    generator.emitLoopHint();
1529
    generator.emitLoopHint();
1525
    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine());
1526
   
1530
   
1527
    RefPtr<RegisterID> result = generator.emitNode(dst, m_statement);
1531
    RefPtr<RegisterID> result = generator.emitNode(dst, m_statement);
1528
1532
1529
    generator.emitLabel(scope->continueTarget());
1533
    generator.emitLabel(scope->continueTarget());
1530
    generator.emitDebugHook(WillExecuteStatement, m_expr->lineNo(), m_expr->lineNo());
1534
    generator.emitDebugHook(WillExecuteStatement, lastLine(), lastLine(), column());
1531
    if (m_expr->hasConditionContextCodegen())
1535
    if (m_expr->hasConditionContextCodegen())
1532
        generator.emitNodeInConditionContext(m_expr, topOfLoop.get(), scope->breakTarget(), false);
1536
        generator.emitNodeInConditionContext(m_expr, topOfLoop.get(), scope->breakTarget(), false);
1533
    else {
1537
    else {
Lines 1546-1552 RegisterID* WhileNode::emitBytecode(BytecodeGenerator& generator, RegisterID* ds a/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp_sec12
1546
    RefPtr<LabelScope> scope = generator.newLabelScope(LabelScope::Loop);
1550
    RefPtr<LabelScope> scope = generator.newLabelScope(LabelScope::Loop);
1547
    RefPtr<Label> topOfLoop = generator.newLabel();
1551
    RefPtr<Label> topOfLoop = generator.newLabel();
1548
1552
1549
    generator.emitDebugHook(WillExecuteStatement, m_expr->lineNo(), m_expr->lineNo());
1553
    generator.emitDebugHook(WillExecuteStatement, m_expr->lineNo(), m_expr->lineNo(), m_expr->columnNo());
1550
    if (m_expr->hasConditionContextCodegen())
1554
    if (m_expr->hasConditionContextCodegen())
1551
        generator.emitNodeInConditionContext(m_expr, topOfLoop.get(), scope->breakTarget(), true);
1555
        generator.emitNodeInConditionContext(m_expr, topOfLoop.get(), scope->breakTarget(), true);
1552
    else {
1556
    else {
Lines 1560-1566 RegisterID* WhileNode::emitBytecode(BytecodeGenerator& generator, RegisterID* ds a/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp_sec13
1560
    generator.emitNode(dst, m_statement);
1564
    generator.emitNode(dst, m_statement);
1561
1565
1562
    generator.emitLabel(scope->continueTarget());
1566
    generator.emitLabel(scope->continueTarget());
1563
    generator.emitDebugHook(WillExecuteStatement, m_expr->lineNo(), m_expr->lineNo());
1567
    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), column());
1564
1568
1565
    if (m_expr->hasConditionContextCodegen())
1569
    if (m_expr->hasConditionContextCodegen())
1566
        generator.emitNodeInConditionContext(m_expr, topOfLoop.get(), scope->breakTarget(), false);
1570
        generator.emitNodeInConditionContext(m_expr, topOfLoop.get(), scope->breakTarget(), false);
Lines 1581-1587 RegisterID* ForNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) a/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp_sec14
1581
{
1585
{
1582
    RefPtr<LabelScope> scope = generator.newLabelScope(LabelScope::Loop);
1586
    RefPtr<LabelScope> scope = generator.newLabelScope(LabelScope::Loop);
1583
1587
1584
    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine());
1588
    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), column());
1585
1589
1586
    if (m_expr1)
1590
    if (m_expr1)
1587
        generator.emitNode(generator.ignoredResult(), m_expr1);
1591
        generator.emitNode(generator.ignoredResult(), m_expr1);
Lines 1602-1608 RegisterID* ForNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) a/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp_sec15
1602
    RefPtr<RegisterID> result = generator.emitNode(dst, m_statement);
1606
    RefPtr<RegisterID> result = generator.emitNode(dst, m_statement);
1603
1607
1604
    generator.emitLabel(scope->continueTarget());
1608
    generator.emitLabel(scope->continueTarget());
1605
    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine());
1609
    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), column());
1606
    if (m_expr3)
1610
    if (m_expr3)
1607
        generator.emitNode(generator.ignoredResult(), m_expr3);
1611
        generator.emitNode(generator.ignoredResult(), m_expr3);
1608
1612
Lines 1629-1635 RegisterID* ForInNode::emitBytecode(BytecodeGenerator& generator, RegisterID* ds a/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp_sec16
1629
    if (!m_lexpr->isLocation())
1633
    if (!m_lexpr->isLocation())
1630
        return emitThrowReferenceError(generator, "Left side of for-in statement is not a reference.");
1634
        return emitThrowReferenceError(generator, "Left side of for-in statement is not a reference.");
1631
1635
1632
    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine());
1636
    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), column());
1633
1637
1634
    if (m_init)
1638
    if (m_init)
1635
        generator.emitNode(generator.ignoredResult(), m_init);
1639
        generator.emitNode(generator.ignoredResult(), m_init);
Lines 1692-1698 RegisterID* ForInNode::emitBytecode(BytecodeGenerator& generator, RegisterID* ds a/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp_sec17
1692
1696
1693
    generator.emitLabel(scope->continueTarget());
1697
    generator.emitLabel(scope->continueTarget());
1694
    generator.emitNextPropertyName(propertyName, base.get(), i.get(), size.get(), iter.get(), loopStart.get());
1698
    generator.emitNextPropertyName(propertyName, base.get(), i.get(), size.get(), iter.get(), loopStart.get());
1695
    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine());
1699
    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), column());
1696
    generator.emitLabel(scope->breakTarget());
1700
    generator.emitLabel(scope->breakTarget());
1697
    return dst;
1701
    return dst;
1698
}
1702
}
Lines 1702-1708 RegisterID* ForInNode::emitBytecode(BytecodeGenerator& generator, RegisterID* ds a/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp_sec18
1702
// ECMA 12.7
1706
// ECMA 12.7
1703
RegisterID* ContinueNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
1707
RegisterID* ContinueNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
1704
{
1708
{
1705
    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine());
1709
    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), column());
1706
    
1710
    
1707
    LabelScope* scope = generator.continueTarget(m_ident);
1711
    LabelScope* scope = generator.continueTarget(m_ident);
1708
    ASSERT(scope);
1712
    ASSERT(scope);
Lines 1716-1722 RegisterID* ContinueNode::emitBytecode(BytecodeGenerator& generator, RegisterID* a/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp_sec19
1716
// ECMA 12.8
1720
// ECMA 12.8
1717
RegisterID* BreakNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
1721
RegisterID* BreakNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
1718
{
1722
{
1719
    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine());
1723
    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), column());
1720
    
1724
    
1721
    LabelScope* scope = generator.breakTarget(m_ident);
1725
    LabelScope* scope = generator.breakTarget(m_ident);
1722
    ASSERT(scope);
1726
    ASSERT(scope);
Lines 1729-1735 RegisterID* BreakNode::emitBytecode(BytecodeGenerator& generator, RegisterID* ds a/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp_sec20
1729
1733
1730
RegisterID* ReturnNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
1734
RegisterID* ReturnNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
1731
{
1735
{
1732
    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine());
1736
    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), column());
1733
    ASSERT(generator.codeType() == FunctionCode);
1737
    ASSERT(generator.codeType() == FunctionCode);
1734
1738
1735
    if (dst == generator.ignoredResult())
1739
    if (dst == generator.ignoredResult())
Lines 1745-1751 RegisterID* ReturnNode::emitBytecode(BytecodeGenerator& generator, RegisterID* d a/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp_sec21
1745
        generator.emitJumpScopes(l0.get(), 0);
1749
        generator.emitJumpScopes(l0.get(), 0);
1746
        generator.emitLabel(l0.get());
1750
        generator.emitLabel(l0.get());
1747
    }
1751
    }
1748
    generator.emitDebugHook(WillLeaveCallFrame, firstLine(), lastLine());
1752
    generator.emitDebugHook(WillLeaveCallFrame, firstLine(), lastLine(), column());
1749
    return generator.emitReturn(r0);
1753
    return generator.emitReturn(r0);
1750
}
1754
}
1751
1755
Lines 1753-1759 RegisterID* ReturnNode::emitBytecode(BytecodeGenerator& generator, RegisterID* d a/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp_sec22
1753
1757
1754
RegisterID* WithNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
1758
RegisterID* WithNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
1755
{
1759
{
1756
    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine());
1760
    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), column());
1757
    
1761
    
1758
    RefPtr<RegisterID> scope = generator.newTemporary();
1762
    RefPtr<RegisterID> scope = generator.newTemporary();
1759
    generator.emitNode(scope.get(), m_expr); // scope must be protected until popped
1763
    generator.emitNode(scope.get(), m_expr); // scope must be protected until popped
Lines 1918-1924 RegisterID* CaseBlockNode::emitBytecodeForBlock(BytecodeGenerator& generator, Re a/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp_sec23
1918
1922
1919
RegisterID* SwitchNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
1923
RegisterID* SwitchNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
1920
{
1924
{
1921
    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine());
1925
    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), column());
1922
    
1926
    
1923
    RefPtr<LabelScope> scope = generator.newLabelScope(LabelScope::Switch);
1927
    RefPtr<LabelScope> scope = generator.newLabelScope(LabelScope::Switch);
1924
1928
Lines 1933-1939 RegisterID* SwitchNode::emitBytecode(BytecodeGenerator& generator, RegisterID* d a/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp_sec24
1933
1937
1934
RegisterID* LabelNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
1938
RegisterID* LabelNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
1935
{
1939
{
1936
    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine());
1940
    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), column());
1937
1941
1938
    ASSERT(!generator.breakTarget(m_name));
1942
    ASSERT(!generator.breakTarget(m_name));
1939
1943
Lines 1948-1954 RegisterID* LabelNode::emitBytecode(BytecodeGenerator& generator, RegisterID* ds a/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp_sec25
1948
1952
1949
RegisterID* ThrowNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
1953
RegisterID* ThrowNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
1950
{
1954
{
1951
    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine());
1955
    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), column());
1952
1956
1953
    if (dst == generator.ignoredResult())
1957
    if (dst == generator.ignoredResult())
1954
        dst = 0;
1958
        dst = 0;
Lines 1965-1971 RegisterID* TryNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) a/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp_sec26
1965
    // NOTE: The catch and finally blocks must be labeled explicitly, so the
1969
    // NOTE: The catch and finally blocks must be labeled explicitly, so the
1966
    // optimizer knows they may be jumped to from anywhere.
1970
    // optimizer knows they may be jumped to from anywhere.
1967
1971
1968
    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine());
1972
    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), column());
1969
1973
1970
    RefPtr<Label> tryStartLabel = generator.newLabel();
1974
    RefPtr<Label> tryStartLabel = generator.newLabel();
1971
    if (m_finallyBlock)
1975
    if (m_finallyBlock)
Lines 2022-2034 inline void ScopeNode::emitStatementsBytecode(BytecodeGenerator& generator, Regi a/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp_sec27
2022
2026
2023
RegisterID* ProgramNode::emitBytecode(BytecodeGenerator& generator, RegisterID*)
2027
RegisterID* ProgramNode::emitBytecode(BytecodeGenerator& generator, RegisterID*)
2024
{
2028
{
2025
    generator.emitDebugHook(WillExecuteProgram, firstLine(), lastLine());
2029
    generator.emitDebugHook(WillExecuteProgram, firstLine(), lastLine(), column());
2026
2030
2027
    RefPtr<RegisterID> dstRegister = generator.newTemporary();
2031
    RefPtr<RegisterID> dstRegister = generator.newTemporary();
2028
    generator.emitLoad(dstRegister.get(), jsUndefined());
2032
    generator.emitLoad(dstRegister.get(), jsUndefined());
2029
    emitStatementsBytecode(generator, dstRegister.get());
2033
    emitStatementsBytecode(generator, dstRegister.get());
2030
2034
2031
    generator.emitDebugHook(DidExecuteProgram, firstLine(), lastLine());
2035
    generator.emitDebugHook(DidExecuteProgram, firstLine(), lastLine(), column());
2032
    generator.emitEnd(dstRegister.get());
2036
    generator.emitEnd(dstRegister.get());
2033
    return 0;
2037
    return 0;
2034
}
2038
}
Lines 2037-2049 RegisterID* ProgramNode::emitBytecode(BytecodeGenerator& generator, RegisterID*) a/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp_sec28
2037
2041
2038
RegisterID* EvalNode::emitBytecode(BytecodeGenerator& generator, RegisterID*)
2042
RegisterID* EvalNode::emitBytecode(BytecodeGenerator& generator, RegisterID*)
2039
{
2043
{
2040
    generator.emitDebugHook(WillExecuteProgram, firstLine(), lastLine());
2044
    generator.emitDebugHook(WillExecuteProgram, firstLine(), lastLine(), column());
2041
2045
2042
    RefPtr<RegisterID> dstRegister = generator.newTemporary();
2046
    RefPtr<RegisterID> dstRegister = generator.newTemporary();
2043
    generator.emitLoad(dstRegister.get(), jsUndefined());
2047
    generator.emitLoad(dstRegister.get(), jsUndefined());
2044
    emitStatementsBytecode(generator, dstRegister.get());
2048
    emitStatementsBytecode(generator, dstRegister.get());
2045
2049
2046
    generator.emitDebugHook(DidExecuteProgram, firstLine(), lastLine());
2050
    generator.emitDebugHook(DidExecuteProgram, firstLine(), lastLine(), column());
2047
    generator.emitEnd(dstRegister.get());
2051
    generator.emitEnd(dstRegister.get());
2048
    return 0;
2052
    return 0;
2049
}
2053
}
Lines 2052-2058 RegisterID* EvalNode::emitBytecode(BytecodeGenerator& generator, RegisterID*) a/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp_sec29
2052
2056
2053
RegisterID* FunctionBodyNode::emitBytecode(BytecodeGenerator& generator, RegisterID*)
2057
RegisterID* FunctionBodyNode::emitBytecode(BytecodeGenerator& generator, RegisterID*)
2054
{
2058
{
2055
    generator.emitDebugHook(DidEnterCallFrame, firstLine(), lastLine());
2059
    generator.emitDebugHook(DidEnterCallFrame, firstLine(), lastLine(), column());
2056
    emitStatementsBytecode(generator, generator.ignoredResult());
2060
    emitStatementsBytecode(generator, generator.ignoredResult());
2057
2061
2058
    StatementNode* singleStatement = this->singleStatement();
2062
    StatementNode* singleStatement = this->singleStatement();
Lines 2068-2074 RegisterID* FunctionBodyNode::emitBytecode(BytecodeGenerator& generator, Registe a/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp_sec30
2068
    // If there is no return we must automatically insert one.
2072
    // If there is no return we must automatically insert one.
2069
    if (!returnNode) {
2073
    if (!returnNode) {
2070
        RegisterID* r0 = generator.isConstructor() ? generator.thisRegister() : generator.emitLoad(0, jsUndefined());
2074
        RegisterID* r0 = generator.isConstructor() ? generator.thisRegister() : generator.emitLoad(0, jsUndefined());
2071
        generator.emitDebugHook(WillLeaveCallFrame, firstLine(), lastLine());
2075
        generator.emitDebugHook(WillLeaveCallFrame, firstLine(), lastLine(), column());
2072
        generator.emitReturn(r0);
2076
        generator.emitReturn(r0);
2073
        return 0;
2077
        return 0;
2074
    }
2078
    }
- a/Source/JavaScriptCore/debugger/Debugger.h -8 / +19 lines
Lines 42-55 namespace JSC { a/Source/JavaScriptCore/debugger/Debugger.h_sec1
42
        virtual void detach(JSGlobalObject*);
42
        virtual void detach(JSGlobalObject*);
43
43
44
        virtual void sourceParsed(ExecState*, SourceProvider*, int errorLineNumber, const UString& errorMessage) = 0;
44
        virtual void sourceParsed(ExecState*, SourceProvider*, int errorLineNumber, const UString& errorMessage) = 0;
45
        virtual void exception(const DebuggerCallFrame&, intptr_t sourceID, int lineNumber, bool hasHandler) = 0;
45
        virtual void exception(const DebuggerCallFrame&, intptr_t, int, bool) = 0;
46
        virtual void atStatement(const DebuggerCallFrame&, intptr_t sourceID, int lineNumber) = 0;
46
        virtual void atStatement(const DebuggerCallFrame&, intptr_t, int) = 0;
47
        virtual void callEvent(const DebuggerCallFrame&, intptr_t sourceID, int lineNumber) = 0;
47
        virtual void callEvent(const DebuggerCallFrame&, intptr_t, int) = 0;
48
        virtual void returnEvent(const DebuggerCallFrame&, intptr_t sourceID, int lineNumber) = 0;
48
        virtual void returnEvent(const DebuggerCallFrame&, intptr_t, int) = 0;
49
49
50
        virtual void willExecuteProgram(const DebuggerCallFrame&, intptr_t sourceID, int lineNumber) = 0;
50
        virtual void exception(const DebuggerCallFrame&, intptr_t, int, int, bool) { };
51
        virtual void didExecuteProgram(const DebuggerCallFrame&, intptr_t sourceID, int lineNumber) = 0;
51
        virtual void atStatement(const DebuggerCallFrame&, intptr_t, int, int) { };
52
        virtual void didReachBreakpoint(const DebuggerCallFrame&, intptr_t sourceID, int lineNumber) = 0;
52
        virtual void callEvent(const DebuggerCallFrame&, intptr_t, int, int) { };
53
        virtual void returnEvent(const DebuggerCallFrame&, intptr_t, int, int) { };
54
55
56
        virtual void willExecuteProgram(const DebuggerCallFrame&, intptr_t, int) = 0;
57
        virtual void didExecuteProgram(const DebuggerCallFrame&, intptr_t, int) = 0;
58
        virtual void didReachBreakpoint(const DebuggerCallFrame&, intptr_t, int) = 0;
59
60
        virtual void willExecuteProgram(const DebuggerCallFrame&, intptr_t, int, int) { };
61
        virtual void didExecuteProgram(const DebuggerCallFrame&, intptr_t, int, int) { };
62
        virtual void didReachBreakpoint(const DebuggerCallFrame&, intptr_t, int, int) { };
63
53
64
54
        void recompileAllJSFunctions(JSGlobalData*);
65
        void recompileAllJSFunctions(JSGlobalData*);
55
66
- a/Source/JavaScriptCore/interpreter/Interpreter.cpp -10 / +10 lines
Lines 730-738 NEVER_INLINE bool Interpreter::unwindCallFrame(CallFrame*& callFrame, JSValue ex a/Source/JavaScriptCore/interpreter/Interpreter.cpp_sec1
730
    if (Debugger* debugger = callFrame->dynamicGlobalObject()->debugger()) {
730
    if (Debugger* debugger = callFrame->dynamicGlobalObject()->debugger()) {
731
        DebuggerCallFrame debuggerCallFrame(callFrame, exceptionValue);
731
        DebuggerCallFrame debuggerCallFrame(callFrame, exceptionValue);
732
        if (callFrame->callee())
732
        if (callFrame->callee())
733
            debugger->returnEvent(debuggerCallFrame, codeBlock->ownerExecutable()->sourceID(), codeBlock->ownerExecutable()->lastLine());
733
            debugger->returnEvent(debuggerCallFrame, codeBlock->ownerExecutable()->sourceID(), codeBlock->ownerExecutable()->lastLine(), 0);
734
        else
734
        else
735
            debugger->didExecuteProgram(debuggerCallFrame, codeBlock->ownerExecutable()->sourceID(), codeBlock->ownerExecutable()->lastLine());
735
            debugger->didExecuteProgram(debuggerCallFrame, codeBlock->ownerExecutable()->sourceID(), codeBlock->ownerExecutable()->lastLine(), 0);
736
    }
736
    }
737
737
738
    // If this call frame created an activation or an 'arguments' object, tear it off.
738
    // If this call frame created an activation or an 'arguments' object, tear it off.
Lines 1055-1061 NEVER_INLINE HandlerInfo* Interpreter::throwException(CallFrame*& callFrame, JSV a/Source/JavaScriptCore/interpreter/Interpreter.cpp_sec2
1055
    if (Debugger* debugger = callFrame->dynamicGlobalObject()->debugger()) {
1055
    if (Debugger* debugger = callFrame->dynamicGlobalObject()->debugger()) {
1056
        DebuggerCallFrame debuggerCallFrame(callFrame, exceptionValue);
1056
        DebuggerCallFrame debuggerCallFrame(callFrame, exceptionValue);
1057
        bool hasHandler = codeBlock->handlerForBytecodeOffset(bytecodeOffset);
1057
        bool hasHandler = codeBlock->handlerForBytecodeOffset(bytecodeOffset);
1058
        debugger->exception(debuggerCallFrame, codeBlock->ownerExecutable()->sourceID(), codeBlock->lineNumberForBytecodeOffset(bytecodeOffset), hasHandler);
1058
        debugger->exception(debuggerCallFrame, codeBlock->ownerExecutable()->sourceID(), codeBlock->lineNumberForBytecodeOffset(bytecodeOffset), 0, hasHandler);
1059
    }
1059
    }
1060
1060
1061
    // Calculate an exception handler vPC, unwinding call frames as necessary.
1061
    // Calculate an exception handler vPC, unwinding call frames as necessary.
Lines 1643-1649 JSValue Interpreter::execute(EvalExecutable* eval, CallFrame* callFrame, JSValue a/Source/JavaScriptCore/interpreter/Interpreter.cpp_sec3
1643
    return checkedReturn(result);
1643
    return checkedReturn(result);
1644
}
1644
}
1645
1645
1646
NEVER_INLINE void Interpreter::debug(CallFrame* callFrame, DebugHookID debugHookID, int firstLine, int lastLine)
1646
NEVER_INLINE void Interpreter::debug(CallFrame* callFrame, DebugHookID debugHookID, int firstLine, int lastLine, int column)
1647
{
1647
{
1648
    Debugger* debugger = callFrame->dynamicGlobalObject()->debugger();
1648
    Debugger* debugger = callFrame->dynamicGlobalObject()->debugger();
1649
    if (!debugger)
1649
    if (!debugger)
Lines 1651-1672 NEVER_INLINE void Interpreter::debug(CallFrame* callFrame, DebugHookID debugHook a/Source/JavaScriptCore/interpreter/Interpreter.cpp_sec4
1651
1651
1652
    switch (debugHookID) {
1652
    switch (debugHookID) {
1653
        case DidEnterCallFrame:
1653
        case DidEnterCallFrame:
1654
            debugger->callEvent(callFrame, callFrame->codeBlock()->ownerExecutable()->sourceID(), firstLine);
1654
            debugger->callEvent(callFrame, callFrame->codeBlock()->ownerExecutable()->sourceID(), firstLine, column);
1655
            return;
1655
            return;
1656
        case WillLeaveCallFrame:
1656
        case WillLeaveCallFrame:
1657
            debugger->returnEvent(callFrame, callFrame->codeBlock()->ownerExecutable()->sourceID(), lastLine);
1657
            debugger->returnEvent(callFrame, callFrame->codeBlock()->ownerExecutable()->sourceID(), lastLine, column);
1658
            return;
1658
            return;
1659
        case WillExecuteStatement:
1659
        case WillExecuteStatement:
1660
            debugger->atStatement(callFrame, callFrame->codeBlock()->ownerExecutable()->sourceID(), firstLine);
1660
            debugger->atStatement(callFrame, callFrame->codeBlock()->ownerExecutable()->sourceID(), firstLine, column);
1661
            return;
1661
            return;
1662
        case WillExecuteProgram:
1662
        case WillExecuteProgram:
1663
            debugger->willExecuteProgram(callFrame, callFrame->codeBlock()->ownerExecutable()->sourceID(), firstLine);
1663
            debugger->willExecuteProgram(callFrame, callFrame->codeBlock()->ownerExecutable()->sourceID(), firstLine, column);
1664
            return;
1664
            return;
1665
        case DidExecuteProgram:
1665
        case DidExecuteProgram:
1666
            debugger->didExecuteProgram(callFrame, callFrame->codeBlock()->ownerExecutable()->sourceID(), lastLine);
1666
            debugger->didExecuteProgram(callFrame, callFrame->codeBlock()->ownerExecutable()->sourceID(), lastLine, column);
1667
            return;
1667
            return;
1668
        case DidReachBreakpoint:
1668
        case DidReachBreakpoint:
1669
            debugger->didReachBreakpoint(callFrame, callFrame->codeBlock()->ownerExecutable()->sourceID(), lastLine);
1669
            debugger->didReachBreakpoint(callFrame, callFrame->codeBlock()->ownerExecutable()->sourceID(), lastLine, column);
1670
            return;
1670
            return;
1671
    }
1671
    }
1672
}
1672
}
- a/Source/JavaScriptCore/interpreter/Interpreter.h -1 / +1 lines
Lines 240-246 namespace JSC { a/Source/JavaScriptCore/interpreter/Interpreter.h_sec1
240
        SamplingTool* sampler() { return m_sampler.get(); }
240
        SamplingTool* sampler() { return m_sampler.get(); }
241
241
242
        NEVER_INLINE HandlerInfo* throwException(CallFrame*&, JSValue&, unsigned bytecodeOffset);
242
        NEVER_INLINE HandlerInfo* throwException(CallFrame*&, JSValue&, unsigned bytecodeOffset);
243
        NEVER_INLINE void debug(CallFrame*, DebugHookID, int firstLine, int lastLine);
243
        NEVER_INLINE void debug(CallFrame*, DebugHookID, int firstLine, int lastLine, int column);
244
        static const UString getTraceLine(CallFrame*, StackFrameCodeType, const UString&, int);
244
        static const UString getTraceLine(CallFrame*, StackFrameCodeType, const UString&, int);
245
        JS_EXPORT_PRIVATE static void getStackTrace(JSGlobalData*, Vector<StackFrame>& results);
245
        JS_EXPORT_PRIVATE static void getStackTrace(JSGlobalData*, Vector<StackFrame>& results);
246
        static void addStackTraceIfNecessary(CallFrame*, JSObject* error);
246
        static void addStackTraceIfNecessary(CallFrame*, JSObject* error);
- a/Source/JavaScriptCore/jit/JITOpcodes.cpp +1 lines
Lines 1158-1163 void JIT::emit_op_debug(Instruction* currentInstruction) a/Source/JavaScriptCore/jit/JITOpcodes.cpp_sec1
1158
    stubCall.addArgument(TrustedImm32(currentInstruction[1].u.operand));
1158
    stubCall.addArgument(TrustedImm32(currentInstruction[1].u.operand));
1159
    stubCall.addArgument(TrustedImm32(currentInstruction[2].u.operand));
1159
    stubCall.addArgument(TrustedImm32(currentInstruction[2].u.operand));
1160
    stubCall.addArgument(TrustedImm32(currentInstruction[3].u.operand));
1160
    stubCall.addArgument(TrustedImm32(currentInstruction[3].u.operand));
1161
    stubCall.addArgument(TrustedImm32(currentInstruction[4].u.operand));
1161
    stubCall.call();
1162
    stubCall.call();
1162
#endif
1163
#endif
1163
}
1164
}
- a/Source/JavaScriptCore/jit/JITOpcodes32_64.cpp +1 lines
Lines 1478-1483 void JIT::emit_op_debug(Instruction* currentInstruction) a/Source/JavaScriptCore/jit/JITOpcodes32_64.cpp_sec1
1478
    stubCall.addArgument(Imm32(currentInstruction[1].u.operand));
1478
    stubCall.addArgument(Imm32(currentInstruction[1].u.operand));
1479
    stubCall.addArgument(Imm32(currentInstruction[2].u.operand));
1479
    stubCall.addArgument(Imm32(currentInstruction[2].u.operand));
1480
    stubCall.addArgument(Imm32(currentInstruction[3].u.operand));
1480
    stubCall.addArgument(Imm32(currentInstruction[3].u.operand));
1481
    stubCall.addArgument(Imm32(currentInstruction[4].u.operand));
1481
    stubCall.call();
1482
    stubCall.call();
1482
#endif
1483
#endif
1483
}
1484
}
- a/Source/JavaScriptCore/jit/JITStubs.cpp -1 / +2 lines
Lines 3403-3410 DEFINE_STUB_FUNCTION(void, op_debug) a/Source/JavaScriptCore/jit/JITStubs.cpp_sec1
3403
    int debugHookID = stackFrame.args[0].int32();
3403
    int debugHookID = stackFrame.args[0].int32();
3404
    int firstLine = stackFrame.args[1].int32();
3404
    int firstLine = stackFrame.args[1].int32();
3405
    int lastLine = stackFrame.args[2].int32();
3405
    int lastLine = stackFrame.args[2].int32();
3406
    int column = stackFrame.args[3].int32();
3406
3407
3407
    stackFrame.globalData->interpreter->debug(callFrame, static_cast<DebugHookID>(debugHookID), firstLine, lastLine);
3408
    stackFrame.globalData->interpreter->debug(callFrame, static_cast<DebugHookID>(debugHookID), firstLine, lastLine, column);
3408
}
3409
}
3409
3410
3410
DEFINE_STUB_FUNCTION(void*, vm_throw)
3411
DEFINE_STUB_FUNCTION(void*, vm_throw)
- a/Source/JavaScriptCore/llint/LLIntSlowPaths.cpp -2 / +3 lines
Lines 1601-1608 LLINT_SLOW_PATH_DECL(slow_path_debug) a/Source/JavaScriptCore/llint/LLIntSlowPaths.cpp_sec1
1601
    int debugHookID = pc[1].u.operand;
1601
    int debugHookID = pc[1].u.operand;
1602
    int firstLine = pc[2].u.operand;
1602
    int firstLine = pc[2].u.operand;
1603
    int lastLine = pc[3].u.operand;
1603
    int lastLine = pc[3].u.operand;
1604
    
1604
    int column = pc[4].u.operand;
1605
    globalData.interpreter->debug(exec, static_cast<DebugHookID>(debugHookID), firstLine, lastLine);
1605
1606
    globalData.interpreter->debug(exec, static_cast<DebugHookID>(debugHookID), firstLine, lastLine, column);
1606
    
1607
    
1607
    LLINT_END();
1608
    LLINT_END();
1608
}
1609
}
- a/Source/JavaScriptCore/parser/ASTBuilder.h -252 / +252 lines
Lines 112-119 public: a/Source/JavaScriptCore/parser/ASTBuilder.h_sec1
112
    static const int  DontBuildKeywords = 0;
112
    static const int  DontBuildKeywords = 0;
113
    static const int  DontBuildStrings = 0;
113
    static const int  DontBuildStrings = 0;
114
114
115
    ExpressionNode* makeBinaryNode(int lineNumber, int token, std::pair<ExpressionNode*, BinaryOpInfo>, std::pair<ExpressionNode*, BinaryOpInfo>);
115
    ExpressionNode* makeBinaryNode(const JSTokenLocation&, int token, std::pair<ExpressionNode*, BinaryOpInfo>, std::pair<ExpressionNode*, BinaryOpInfo>);
116
    ExpressionNode* makeFunctionCallNode(int lineNumber, ExpressionNode* func, ArgumentsNode* args, int start, int divot, int end);
116
    ExpressionNode* makeFunctionCallNode(const JSTokenLocation&, ExpressionNode* func, ArgumentsNode* args, int start, int divot, int end);
117
117
118
    JSC::SourceElements* createSourceElements() { return new (m_globalData) JSC::SourceElements(); }
118
    JSC::SourceElements* createSourceElements() { return new (m_globalData) JSC::SourceElements(); }
119
119
Lines 124-291 public: a/Source/JavaScriptCore/parser/ASTBuilder.h_sec2
124
124
125
    void appendToComma(CommaNode* commaNode, ExpressionNode* expr) { commaNode->append(expr); }
125
    void appendToComma(CommaNode* commaNode, ExpressionNode* expr) { commaNode->append(expr); }
126
126
127
    CommaNode* createCommaExpr(int lineNumber, ExpressionNode* lhs, ExpressionNode* rhs) { return new (m_globalData) CommaNode(lineNumber, lhs, rhs); }
127
    CommaNode* createCommaExpr(const JSTokenLocation& location, ExpressionNode* lhs, ExpressionNode* rhs) { return new (m_globalData) CommaNode(location, lhs, rhs); }
128
128
129
    ExpressionNode* makeAssignNode(int lineNumber, ExpressionNode* left, Operator, ExpressionNode* right, bool leftHasAssignments, bool rightHasAssignments, int start, int divot, int end);
129
    ExpressionNode* makeAssignNode(const JSTokenLocation&, ExpressionNode* left, Operator, ExpressionNode* right, bool leftHasAssignments, bool rightHasAssignments, int start, int divot, int end);
130
    ExpressionNode* makePrefixNode(int lineNumber, ExpressionNode*, Operator, int start, int divot, int end);
130
    ExpressionNode* makePrefixNode(const JSTokenLocation&, ExpressionNode*, Operator, int start, int divot, int end);
131
    ExpressionNode* makePostfixNode(int lineNumber, ExpressionNode*, Operator, int start, int divot, int end);
131
    ExpressionNode* makePostfixNode(const JSTokenLocation&, ExpressionNode*, Operator, int start, int divot, int end);
132
    ExpressionNode* makeTypeOfNode(int lineNumber, ExpressionNode*);
132
    ExpressionNode* makeTypeOfNode(const JSTokenLocation&, ExpressionNode*);
133
    ExpressionNode* makeDeleteNode(int lineNumber, ExpressionNode*, int start, int divot, int end);
133
    ExpressionNode* makeDeleteNode(const JSTokenLocation&, ExpressionNode*, int start, int divot, int end);
134
    ExpressionNode* makeNegateNode(int lineNumber, ExpressionNode*);
134
    ExpressionNode* makeNegateNode(const JSTokenLocation&, ExpressionNode*);
135
    ExpressionNode* makeBitwiseNotNode(int lineNumber, ExpressionNode*);
135
    ExpressionNode* makeBitwiseNotNode(const JSTokenLocation&, ExpressionNode*);
136
    ExpressionNode* makeMultNode(int lineNumber, ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments);
136
    ExpressionNode* makeMultNode(const JSTokenLocation&, ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments);
137
    ExpressionNode* makeDivNode(int lineNumber, ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments);
137
    ExpressionNode* makeDivNode(const JSTokenLocation&, ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments);
138
    ExpressionNode* makeModNode(int lineNumber, ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments);
138
    ExpressionNode* makeModNode(const JSTokenLocation&, ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments);
139
    ExpressionNode* makeAddNode(int lineNumber, ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments);
139
    ExpressionNode* makeAddNode(const JSTokenLocation&, ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments);
140
    ExpressionNode* makeSubNode(int lineNumber, ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments);
140
    ExpressionNode* makeSubNode(const JSTokenLocation&, ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments);
141
    ExpressionNode* makeBitXOrNode(int lineNumber, ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments);
141
    ExpressionNode* makeBitXOrNode(const JSTokenLocation&, ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments);
142
    ExpressionNode* makeBitAndNode(int lineNumber, ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments);
142
    ExpressionNode* makeBitAndNode(const JSTokenLocation&, ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments);
143
    ExpressionNode* makeBitOrNode(int lineNumber, ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments);
143
    ExpressionNode* makeBitOrNode(const JSTokenLocation&, ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments);
144
    ExpressionNode* makeLeftShiftNode(int lineNumber, ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments);
144
    ExpressionNode* makeLeftShiftNode(const JSTokenLocation&, ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments);
145
    ExpressionNode* makeRightShiftNode(int lineNumber, ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments);
145
    ExpressionNode* makeRightShiftNode(const JSTokenLocation&, ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments);
146
    ExpressionNode* makeURightShiftNode(int lineNumber, ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments);
146
    ExpressionNode* makeURightShiftNode(const JSTokenLocation&, ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments);
147
147
148
    ExpressionNode* createLogicalNot(int lineNumber, ExpressionNode* expr) { return new (m_globalData) LogicalNotNode(lineNumber, expr); }
148
    ExpressionNode* createLogicalNot(const JSTokenLocation& location, ExpressionNode* expr) { return new (m_globalData) LogicalNotNode(location, expr); }
149
    ExpressionNode* createUnaryPlus(int lineNumber, ExpressionNode* expr) { return new (m_globalData) UnaryPlusNode(lineNumber, expr); }
149
    ExpressionNode* createUnaryPlus(const JSTokenLocation& location, ExpressionNode* expr) { return new (m_globalData) UnaryPlusNode(location, expr); }
150
    ExpressionNode* createVoid(int lineNumber, ExpressionNode* expr)
150
    ExpressionNode* createVoid(const JSTokenLocation& location, ExpressionNode* expr)
151
    {
151
    {
152
        incConstants();
152
        incConstants();
153
        return new (m_globalData) VoidNode(lineNumber, expr);
153
        return new (m_globalData) VoidNode(location, expr);
154
    }
154
    }
155
    ExpressionNode* thisExpr(int lineNumber)
155
    ExpressionNode* thisExpr(const JSTokenLocation& location)
156
    {
156
    {
157
        usesThis();
157
        usesThis();
158
        return new (m_globalData) ThisNode(lineNumber);
158
        return new (m_globalData) ThisNode(location);
159
    }
159
    }
160
    ExpressionNode* createResolve(int lineNumber, const Identifier* ident, int start)
160
    ExpressionNode* createResolve(const JSTokenLocation& location, const Identifier* ident, int start)
161
    {
161
    {
162
        if (m_globalData->propertyNames->arguments == *ident)
162
        if (m_globalData->propertyNames->arguments == *ident)
163
            usesArguments();
163
            usesArguments();
164
        return new (m_globalData) ResolveNode(lineNumber, *ident, start);
164
        return new (m_globalData) ResolveNode(location, *ident, start);
165
    }
165
    }
166
    ExpressionNode* createObjectLiteral(int lineNumber) { return new (m_globalData) ObjectLiteralNode(lineNumber); }
166
    ExpressionNode* createObjectLiteral(const JSTokenLocation& location) { return new (m_globalData) ObjectLiteralNode(location); }
167
    ExpressionNode* createObjectLiteral(int lineNumber, PropertyListNode* properties) { return new (m_globalData) ObjectLiteralNode(lineNumber, properties); }
167
    ExpressionNode* createObjectLiteral(const JSTokenLocation& location, PropertyListNode* properties) { return new (m_globalData) ObjectLiteralNode(location, properties); }
168
168
169
    ExpressionNode* createArray(int lineNumber, int elisions)
169
    ExpressionNode* createArray(const JSTokenLocation& location, int elisions)
170
    {
170
    {
171
        if (elisions)
171
        if (elisions)
172
            incConstants();
172
            incConstants();
173
        return new (m_globalData) ArrayNode(lineNumber, elisions);
173
        return new (m_globalData) ArrayNode(location, elisions);
174
    }
174
    }
175
175
176
    ExpressionNode* createArray(int lineNumber, ElementNode* elems) { return new (m_globalData) ArrayNode(lineNumber, elems); }
176
    ExpressionNode* createArray(const JSTokenLocation& location, ElementNode* elems) { return new (m_globalData) ArrayNode(location, elems); }
177
    ExpressionNode* createArray(int lineNumber, int elisions, ElementNode* elems)
177
    ExpressionNode* createArray(const JSTokenLocation& location, int elisions, ElementNode* elems)
178
    {
178
    {
179
        if (elisions)
179
        if (elisions)
180
            incConstants();
180
            incConstants();
181
        return new (m_globalData) ArrayNode(lineNumber, elisions, elems);
181
        return new (m_globalData) ArrayNode(location, elisions, elems);
182
    }
182
    }
183
    ExpressionNode* createNumberExpr(int lineNumber, double d)
183
    ExpressionNode* createNumberExpr(const JSTokenLocation& location, double d)
184
    {
184
    {
185
        incConstants();
185
        incConstants();
186
        return new (m_globalData) NumberNode(lineNumber, d);
186
        return new (m_globalData) NumberNode(location, d);
187
    }
187
    }
188
188
189
    ExpressionNode* createString(int lineNumber, const Identifier* string)
189
    ExpressionNode* createString(const JSTokenLocation& location, const Identifier* string)
190
    {
190
    {
191
        incConstants();
191
        incConstants();
192
        return new (m_globalData) StringNode(lineNumber, *string);
192
        return new (m_globalData) StringNode(location, *string);
193
    }
193
    }
194
194
195
    ExpressionNode* createBoolean(int lineNumber, bool b)
195
    ExpressionNode* createBoolean(const JSTokenLocation& location, bool b)
196
    {
196
    {
197
        incConstants();
197
        incConstants();
198
        return new (m_globalData) BooleanNode(lineNumber, b);
198
        return new (m_globalData) BooleanNode(location, b);
199
    }
199
    }
200
200
201
    ExpressionNode* createNull(int lineNumber)
201
    ExpressionNode* createNull(const JSTokenLocation& location)
202
    {
202
    {
203
        incConstants();
203
        incConstants();
204
        return new (m_globalData) NullNode(lineNumber);
204
        return new (m_globalData) NullNode(location);
205
    }
205
    }
206
206
207
    ExpressionNode* createBracketAccess(int lineNumber, ExpressionNode* base, ExpressionNode* property, bool propertyHasAssignments, int start, int divot, int end)
207
    ExpressionNode* createBracketAccess(const JSTokenLocation& location, ExpressionNode* base, ExpressionNode* property, bool propertyHasAssignments, int start, int divot, int end)
208
    {
208
    {
209
        BracketAccessorNode* node = new (m_globalData) BracketAccessorNode(lineNumber, base, property, propertyHasAssignments);
209
        BracketAccessorNode* node = new (m_globalData) BracketAccessorNode(location, base, property, propertyHasAssignments);
210
        setExceptionLocation(node, start, divot, end);
210
        setExceptionLocation(node, start, divot, end);
211
        return node;
211
        return node;
212
    }
212
    }
213
213
214
    ExpressionNode* createDotAccess(int lineNumber, ExpressionNode* base, const Identifier* property, int start, int divot, int end)
214
    ExpressionNode* createDotAccess(const JSTokenLocation& location, ExpressionNode* base, const Identifier* property, int start, int divot, int end)
215
    {
215
    {
216
        DotAccessorNode* node = new (m_globalData) DotAccessorNode(lineNumber, base, *property);
216
        DotAccessorNode* node = new (m_globalData) DotAccessorNode(location, base, *property);
217
        setExceptionLocation(node, start, divot, end);
217
        setExceptionLocation(node, start, divot, end);
218
        return node;
218
        return node;
219
    }
219
    }
220
220
221
    ExpressionNode* createRegExp(int lineNumber, const Identifier& pattern, const Identifier& flags, int start)
221
    ExpressionNode* createRegExp(const JSTokenLocation& location, const Identifier& pattern, const Identifier& flags, int start)
222
    {
222
    {
223
        if (Yarr::checkSyntax(pattern.ustring()))
223
        if (Yarr::checkSyntax(pattern.ustring()))
224
            return 0;
224
            return 0;
225
        RegExpNode* node = new (m_globalData) RegExpNode(lineNumber, pattern, flags);
225
        RegExpNode* node = new (m_globalData) RegExpNode(location, pattern, flags);
226
        int size = pattern.length() + 2; // + 2 for the two /'s
226
        int size = pattern.length() + 2; // + 2 for the two /'s
227
        setExceptionLocation(node, start, start + size, start + size);
227
        setExceptionLocation(node, start, start + size, start + size);
228
        return node;
228
        return node;
229
    }
229
    }
230
230
231
    ExpressionNode* createNewExpr(int lineNumber, ExpressionNode* expr, ArgumentsNode* arguments, int start, int divot, int end)
231
    ExpressionNode* createNewExpr(const JSTokenLocation& location, ExpressionNode* expr, ArgumentsNode* arguments, int start, int divot, int end)
232
    {
232
    {
233
        NewExprNode* node = new (m_globalData) NewExprNode(lineNumber, expr, arguments);
233
        NewExprNode* node = new (m_globalData) NewExprNode(location, expr, arguments);
234
        setExceptionLocation(node, start, divot, end);
234
        setExceptionLocation(node, start, divot, end);
235
        return node;
235
        return node;
236
    }
236
    }
237
237
238
    ExpressionNode* createNewExpr(int lineNumber, ExpressionNode* expr, int start, int end)
238
    ExpressionNode* createNewExpr(const JSTokenLocation& location, ExpressionNode* expr, int start, int end)
239
    {
239
    {
240
        NewExprNode* node = new (m_globalData) NewExprNode(lineNumber, expr);
240
        NewExprNode* node = new (m_globalData) NewExprNode(location, expr);
241
        setExceptionLocation(node, start, end, end);
241
        setExceptionLocation(node, start, end, end);
242
        return node;
242
        return node;
243
    }
243
    }
244
244
245
    ExpressionNode* createConditionalExpr(int lineNumber, ExpressionNode* condition, ExpressionNode* lhs, ExpressionNode* rhs)
245
    ExpressionNode* createConditionalExpr(const JSTokenLocation& location, ExpressionNode* condition, ExpressionNode* lhs, ExpressionNode* rhs)
246
    {
246
    {
247
        return new (m_globalData) ConditionalNode(lineNumber, condition, lhs, rhs);
247
        return new (m_globalData) ConditionalNode(location, condition, lhs, rhs);
248
    }
248
    }
249
249
250
    ExpressionNode* createAssignResolve(int lineNumber, const Identifier& ident, ExpressionNode* rhs, int start, int divot, int end)
250
    ExpressionNode* createAssignResolve(const JSTokenLocation& location, const Identifier& ident, ExpressionNode* rhs, int start, int divot, int end)
251
    {
251
    {
252
        if (rhs->isFuncExprNode())
252
        if (rhs->isFuncExprNode())
253
            static_cast<FuncExprNode*>(rhs)->body()->setInferredName(ident);
253
            static_cast<FuncExprNode*>(rhs)->body()->setInferredName(ident);
254
        AssignResolveNode* node = new (m_globalData) AssignResolveNode(lineNumber, ident, rhs);
254
        AssignResolveNode* node = new (m_globalData) AssignResolveNode(location, ident, rhs);
255
        setExceptionLocation(node, start, divot, end);
255
        setExceptionLocation(node, start, divot, end);
256
        return node;
256
        return node;
257
    }
257
    }
258
258
259
    ExpressionNode* createFunctionExpr(int lineNumber, const Identifier* name, FunctionBodyNode* body, ParameterNode* parameters, int openBracePos, int closeBracePos, int bodyStartLine, int bodyEndLine)
259
    ExpressionNode* createFunctionExpr(const JSTokenLocation& location, const Identifier* name, FunctionBodyNode* body, ParameterNode* parameters, int openBracePos, int closeBracePos, int bodyStartLine, int bodyEndLine)
260
    {
260
    {
261
        FuncExprNode* result = new (m_globalData) FuncExprNode(lineNumber, *name, body, m_sourceCode->subExpression(openBracePos, closeBracePos, bodyStartLine), parameters);
261
        FuncExprNode* result = new (m_globalData) FuncExprNode(location, *name, body, m_sourceCode->subExpression(openBracePos, closeBracePos, bodyStartLine), parameters);
262
        body->setLoc(bodyStartLine, bodyEndLine);
262
        body->setLoc(bodyStartLine, bodyEndLine, location.column);
263
        return result;
263
        return result;
264
    }
264
    }
265
265
266
    FunctionBodyNode* createFunctionBody(int lineNumber, bool inStrictContext)
266
    FunctionBodyNode* createFunctionBody(const JSTokenLocation& location, bool inStrictContext)
267
    {
267
    {
268
        return FunctionBodyNode::create(m_globalData, lineNumber, inStrictContext);
268
        return FunctionBodyNode::create(m_globalData, location, inStrictContext);
269
    }
269
    }
270
    
270
    
271
    template <bool> PropertyNode* createGetterOrSetterProperty(int lineNumber, PropertyNode::Type type, const Identifier* name, ParameterNode* params, FunctionBodyNode* body, int openBracePos, int closeBracePos, int bodyStartLine, int bodyEndLine)
271
    template <bool> PropertyNode* createGetterOrSetterProperty(const JSTokenLocation& location, PropertyNode::Type type, const Identifier* name, ParameterNode* params, FunctionBodyNode* body, int openBracePos, int closeBracePos, int bodyStartLine, int bodyEndLine)
272
    {
272
    {
273
        ASSERT(name);
273
        ASSERT(name);
274
        body->setLoc(bodyStartLine, bodyEndLine);
274
        body->setLoc(bodyStartLine, bodyEndLine, location.column);
275
        body->setInferredName(*name);
275
        body->setInferredName(*name);
276
        return new (m_globalData) PropertyNode(m_globalData, *name, new (m_globalData) FuncExprNode(lineNumber, m_globalData->propertyNames->nullIdentifier, body, m_sourceCode->subExpression(openBracePos, closeBracePos, bodyStartLine), params), type);
276
        return new (m_globalData) PropertyNode(m_globalData, *name, new (m_globalData) FuncExprNode(location, m_globalData->propertyNames->nullIdentifier, body, m_sourceCode->subExpression(openBracePos, closeBracePos, bodyStartLine), params), type);
277
    }
277
    }
278
    
278
    
279
    template <bool> PropertyNode* createGetterOrSetterProperty(JSGlobalData*, int lineNumber, PropertyNode::Type type, double name, ParameterNode* params, FunctionBodyNode* body, int openBracePos, int closeBracePos, int bodyStartLine, int bodyEndLine)
279
    template <bool> PropertyNode* createGetterOrSetterProperty(JSGlobalData*, const JSTokenLocation& location, PropertyNode::Type type, double name, ParameterNode* params, FunctionBodyNode* body, int openBracePos, int closeBracePos, int bodyStartLine, int bodyEndLine)
280
    {
280
    {
281
        body->setLoc(bodyStartLine, bodyEndLine);
281
        body->setLoc(bodyStartLine, bodyEndLine, location.column);
282
        return new (m_globalData) PropertyNode(m_globalData, name, new (m_globalData) FuncExprNode(lineNumber, m_globalData->propertyNames->nullIdentifier, body, m_sourceCode->subExpression(openBracePos, closeBracePos, bodyStartLine), params), type);
282
        return new (m_globalData) PropertyNode(m_globalData, name, new (m_globalData) FuncExprNode(location, m_globalData->propertyNames->nullIdentifier, body, m_sourceCode->subExpression(openBracePos, closeBracePos, bodyStartLine), params), type);
283
    }
283
    }
284
284
285
    ArgumentsNode* createArguments() { return new (m_globalData) ArgumentsNode(); }
285
    ArgumentsNode* createArguments() { return new (m_globalData) ArgumentsNode(); }
286
    ArgumentsNode* createArguments(ArgumentListNode* args) { return new (m_globalData) ArgumentsNode(args); }
286
    ArgumentsNode* createArguments(ArgumentListNode* args) { return new (m_globalData) ArgumentsNode(args); }
287
    ArgumentListNode* createArgumentsList(int lineNumber, ExpressionNode* arg) { return new (m_globalData) ArgumentListNode(lineNumber, arg); }
287
    ArgumentListNode* createArgumentsList(const JSTokenLocation& location, ExpressionNode* arg) { return new (m_globalData) ArgumentListNode(location, arg); }
288
    ArgumentListNode* createArgumentsList(int lineNumber, ArgumentListNode* args, ExpressionNode* arg) { return new (m_globalData) ArgumentListNode(lineNumber, args, arg); }
288
    ArgumentListNode* createArgumentsList(const JSTokenLocation& location, ArgumentListNode* args, ExpressionNode* arg) { return new (m_globalData) ArgumentListNode(location, args, arg); }
289
289
290
    template <bool> PropertyNode* createProperty(const Identifier* propertyName, ExpressionNode* node, PropertyNode::Type type)
290
    template <bool> PropertyNode* createProperty(const Identifier* propertyName, ExpressionNode* node, PropertyNode::Type type)
291
    {
291
    {
Lines 294-301 public: a/Source/JavaScriptCore/parser/ASTBuilder.h_sec3
294
        return new (m_globalData) PropertyNode(m_globalData, *propertyName, node, type);
294
        return new (m_globalData) PropertyNode(m_globalData, *propertyName, node, type);
295
    }
295
    }
296
    template <bool> PropertyNode* createProperty(JSGlobalData*, double propertyName, ExpressionNode* node, PropertyNode::Type type) { return new (m_globalData) PropertyNode(m_globalData, propertyName, node, type); }
296
    template <bool> PropertyNode* createProperty(JSGlobalData*, double propertyName, ExpressionNode* node, PropertyNode::Type type) { return new (m_globalData) PropertyNode(m_globalData, propertyName, node, type); }
297
    PropertyListNode* createPropertyList(int lineNumber, PropertyNode* property) { return new (m_globalData) PropertyListNode(lineNumber, property); }
297
    PropertyListNode* createPropertyList(const JSTokenLocation& location, PropertyNode* property) { return new (m_globalData) PropertyListNode(location, property); }
298
    PropertyListNode* createPropertyList(int lineNumber, PropertyNode* property, PropertyListNode* tail) { return new (m_globalData) PropertyListNode(lineNumber, property, tail); }
298
    PropertyListNode* createPropertyList(const JSTokenLocation& location, PropertyNode* property, PropertyListNode* tail) { return new (m_globalData) PropertyListNode(location, property, tail); }
299
299
300
    ElementNode* createElementList(int elisions, ExpressionNode* expr) { return new (m_globalData) ElementNode(elisions, expr); }
300
    ElementNode* createElementList(int elisions, ExpressionNode* expr) { return new (m_globalData) ElementNode(elisions, expr); }
301
    ElementNode* createElementList(ElementNode* elems, int elisions, ExpressionNode* expr) { return new (m_globalData) ElementNode(elems, elisions, expr); }
301
    ElementNode* createElementList(ElementNode* elems, int elisions, ExpressionNode* expr) { return new (m_globalData) ElementNode(elems, elisions, expr); }
Lines 309-499 public: a/Source/JavaScriptCore/parser/ASTBuilder.h_sec4
309
309
310
    void setUsesArguments(FunctionBodyNode* node) { node->setUsesArguments(); }
310
    void setUsesArguments(FunctionBodyNode* node) { node->setUsesArguments(); }
311
311
312
    StatementNode* createFuncDeclStatement(int lineNumber, const Identifier* name, FunctionBodyNode* body, ParameterNode* parameters, int openBracePos, int closeBracePos, int bodyStartLine, int bodyEndLine)
312
    StatementNode* createFuncDeclStatement(const JSTokenLocation& location, const Identifier* name, FunctionBodyNode* body, ParameterNode* parameters, int openBracePos, int closeBracePos, int bodyStartLine, int bodyEndLine)
313
    {
313
    {
314
        FuncDeclNode* decl = new (m_globalData) FuncDeclNode(lineNumber, *name, body, m_sourceCode->subExpression(openBracePos, closeBracePos, bodyStartLine), parameters);
314
        FuncDeclNode* decl = new (m_globalData) FuncDeclNode(location, *name, body, m_sourceCode->subExpression(openBracePos, closeBracePos, bodyStartLine), parameters);
315
        if (*name == m_globalData->propertyNames->arguments)
315
        if (*name == m_globalData->propertyNames->arguments)
316
            usesArguments();
316
            usesArguments();
317
        m_scope.m_funcDeclarations->data.append(decl->body());
317
        m_scope.m_funcDeclarations->data.append(decl->body());
318
        body->setLoc(bodyStartLine, bodyEndLine);
318
        body->setLoc(bodyStartLine, bodyEndLine, location.column);
319
        return decl;
319
        return decl;
320
    }
320
    }
321
321
322
    StatementNode* createBlockStatement(int lineNumber, JSC::SourceElements* elements, int startLine, int endLine)
322
    StatementNode* createBlockStatement(const JSTokenLocation& location, JSC::SourceElements* elements, int startLine, int endLine)
323
    {
323
    {
324
        BlockNode* block = new (m_globalData) BlockNode(lineNumber, elements);
324
        BlockNode* block = new (m_globalData) BlockNode(location, elements);
325
        block->setLoc(startLine, endLine);
325
        block->setLoc(startLine, endLine, location.column);
326
        return block;
326
        return block;
327
    }
327
    }
328
328
329
    StatementNode* createExprStatement(int lineNumber, ExpressionNode* expr, int start, int end)
329
    StatementNode* createExprStatement(const JSTokenLocation& location, ExpressionNode* expr, int start, int end)
330
    {
330
    {
331
        ExprStatementNode* result = new (m_globalData) ExprStatementNode(lineNumber, expr);
331
        ExprStatementNode* result = new (m_globalData) ExprStatementNode(location, expr);
332
        result->setLoc(start, end);
332
        result->setLoc(start, end, location.column);
333
        return result;
333
        return result;
334
    }
334
    }
335
335
336
    StatementNode* createIfStatement(int lineNumber, ExpressionNode* condition, StatementNode* trueBlock, int start, int end)
336
    StatementNode* createIfStatement(const JSTokenLocation& location, ExpressionNode* condition, StatementNode* trueBlock, int start, int end)
337
    {
337
    {
338
        IfNode* result = new (m_globalData) IfNode(lineNumber, condition, trueBlock);
338
        IfNode* result = new (m_globalData) IfNode(location, condition, trueBlock);
339
        result->setLoc(start, end);
339
        result->setLoc(start, end, location.column);
340
        return result;
340
        return result;
341
    }
341
    }
342
342
343
    StatementNode* createIfStatement(int lineNumber, ExpressionNode* condition, StatementNode* trueBlock, StatementNode* falseBlock, int start, int end)
343
    StatementNode* createIfStatement(const JSTokenLocation& location, ExpressionNode* condition, StatementNode* trueBlock, StatementNode* falseBlock, int start, int end)
344
    {
344
    {
345
        IfNode* result = new (m_globalData) IfElseNode(lineNumber, condition, trueBlock, falseBlock);
345
        IfNode* result = new (m_globalData) IfElseNode(location, condition, trueBlock, falseBlock);
346
        result->setLoc(start, end);
346
        result->setLoc(start, end, location.column);
347
        return result;
347
        return result;
348
    }
348
    }
349
349
350
    StatementNode* createForLoop(int lineNumber, ExpressionNode* initializer, ExpressionNode* condition, ExpressionNode* iter, StatementNode* statements, int start, int end)
350
    StatementNode* createForLoop(const JSTokenLocation& location, ExpressionNode* initializer, ExpressionNode* condition, ExpressionNode* iter, StatementNode* statements, int start, int end)
351
    {
351
    {
352
        ForNode* result = new (m_globalData) ForNode(lineNumber, initializer, condition, iter, statements);
352
        ForNode* result = new (m_globalData) ForNode(location, initializer, condition, iter, statements);
353
        result->setLoc(start, end);
353
        result->setLoc(start, end);
354
        return result;
354
        return result;
355
    }
355
    }
356
356
357
    StatementNode* createForInLoop(int lineNumber, const Identifier* ident, ExpressionNode* initializer, ExpressionNode* iter, StatementNode* statements, int start, int divot, int end, int initStart, int initEnd, int startLine, int endLine)
357
    StatementNode* createForInLoop(const JSTokenLocation& location, const Identifier* ident, ExpressionNode* initializer, ExpressionNode* iter, StatementNode* statements, int start, int divot, int end, int initStart, int initEnd, int startLine, int endLine)
358
    {
358
    {
359
        ForInNode* result = new (m_globalData) ForInNode(m_globalData, lineNumber, *ident, initializer, iter, statements, initStart, initStart - start, initEnd - initStart);
359
        ForInNode* result = new (m_globalData) ForInNode(m_globalData, location, *ident, initializer, iter, statements, initStart, initStart - start, initEnd - initStart);
360
        result->setLoc(startLine, endLine);
360
        result->setLoc(startLine, endLine, location.column);
361
        setExceptionLocation(result, start, divot + 1, end);
361
        setExceptionLocation(result, start, divot + 1, end);
362
        return result;
362
        return result;
363
    }
363
    }
364
364
365
    StatementNode* createForInLoop(int lineNumber, ExpressionNode* lhs, ExpressionNode* iter, StatementNode* statements, int eStart, int eDivot, int eEnd, int start, int end)
365
    StatementNode* createForInLoop(const JSTokenLocation& location, ExpressionNode* lhs, ExpressionNode* iter, StatementNode* statements, int eStart, int eDivot, int eEnd, int start, int end)
366
    {
366
    {
367
        ForInNode* result = new (m_globalData) ForInNode(lineNumber, lhs, iter, statements);
367
        ForInNode* result = new (m_globalData) ForInNode(location, lhs, iter, statements);
368
        result->setLoc(start, end);
368
        result->setLoc(start, end, location.column);
369
        setExceptionLocation(result, eStart, eDivot, eEnd);
369
        setExceptionLocation(result, eStart, eDivot, eEnd);
370
        return result;
370
        return result;
371
    }
371
    }
372
372
373
    StatementNode* createEmptyStatement(int lineNumber) { return new (m_globalData) EmptyStatementNode(lineNumber); }
373
    StatementNode* createEmptyStatement(const JSTokenLocation& location) { return new (m_globalData) EmptyStatementNode(location); }
374
374
375
    StatementNode* createVarStatement(int lineNumber, ExpressionNode* expr, int start, int end)
375
    StatementNode* createVarStatement(const JSTokenLocation& location, ExpressionNode* expr, int start, int end)
376
    {
376
    {
377
        StatementNode* result;
377
        StatementNode* result;
378
        if (!expr)
378
        if (!expr)
379
            result = new (m_globalData) EmptyStatementNode(lineNumber);
379
            result = new (m_globalData) EmptyStatementNode(location);
380
        else
380
        else
381
            result = new (m_globalData) VarStatementNode(lineNumber, expr);
381
            result = new (m_globalData) VarStatementNode(location, expr);
382
        result->setLoc(start, end);
382
        result->setLoc(start, end, location.column);
383
        return result;
383
        return result;
384
    }
384
    }
385
385
386
    StatementNode* createReturnStatement(int lineNumber, ExpressionNode* expression, int eStart, int eEnd, int startLine, int endLine)
386
    StatementNode* createReturnStatement(const JSTokenLocation& location, ExpressionNode* expression, int eStart, int eEnd, int startLine, int endLine)
387
    {
387
    {
388
        ReturnNode* result = new (m_globalData) ReturnNode(lineNumber, expression);
388
        ReturnNode* result = new (m_globalData) ReturnNode(location, expression);
389
        setExceptionLocation(result, eStart, eEnd, eEnd);
389
        setExceptionLocation(result, eStart, eEnd, eEnd);
390
        result->setLoc(startLine, endLine);
390
        result->setLoc(startLine, endLine, location.column);
391
        return result;
391
        return result;
392
    }
392
    }
393
393
394
    StatementNode* createBreakStatement(int lineNumber, int eStart, int eEnd, int startLine, int endLine)
394
    StatementNode* createBreakStatement(const JSTokenLocation& location, int eStart, int eEnd, int startLine, int endLine)
395
    {
395
    {
396
        BreakNode* result = new (m_globalData) BreakNode(m_globalData, lineNumber);
396
        BreakNode* result = new (m_globalData) BreakNode(m_globalData, location);
397
        setExceptionLocation(result, eStart, eEnd, eEnd);
397
        setExceptionLocation(result, eStart, eEnd, eEnd);
398
        result->setLoc(startLine, endLine);
398
        result->setLoc(startLine, endLine, location.column);
399
        return result;
399
        return result;
400
    }
400
    }
401
401
402
    StatementNode* createBreakStatement(int lineNumber, const Identifier* ident, int eStart, int eEnd, int startLine, int endLine)
402
    StatementNode* createBreakStatement(const JSTokenLocation& location, const Identifier* ident, int eStart, int eEnd, int startLine, int endLine)
403
    {
403
    {
404
        BreakNode* result = new (m_globalData) BreakNode(lineNumber, *ident);
404
        BreakNode* result = new (m_globalData) BreakNode(location, *ident);
405
        setExceptionLocation(result, eStart, eEnd, eEnd);
405
        setExceptionLocation(result, eStart, eEnd, eEnd);
406
        result->setLoc(startLine, endLine);
406
        result->setLoc(startLine, endLine, location.column);
407
        return result;
407
        return result;
408
    }
408
    }
409
409
410
    StatementNode* createContinueStatement(int lineNumber, int eStart, int eEnd, int startLine, int endLine)
410
    StatementNode* createContinueStatement(const JSTokenLocation& location, int eStart, int eEnd, int startLine, int endLine)
411
    {
411
    {
412
        ContinueNode* result = new (m_globalData) ContinueNode(m_globalData, lineNumber);
412
        ContinueNode* result = new (m_globalData) ContinueNode(m_globalData, location);
413
        setExceptionLocation(result, eStart, eEnd, eEnd);
413
        setExceptionLocation(result, eStart, eEnd, eEnd);
414
        result->setLoc(startLine, endLine);
414
        result->setLoc(startLine, endLine, location.column);
415
        return result;
415
        return result;
416
    }
416
    }
417
417
418
    StatementNode* createContinueStatement(int lineNumber, const Identifier* ident, int eStart, int eEnd, int startLine, int endLine)
418
    StatementNode* createContinueStatement(const JSTokenLocation& location, const Identifier* ident, int eStart, int eEnd, int startLine, int endLine)
419
    {
419
    {
420
        ContinueNode* result = new (m_globalData) ContinueNode(lineNumber, *ident);
420
        ContinueNode* result = new (m_globalData) ContinueNode(location, *ident);
421
        setExceptionLocation(result, eStart, eEnd, eEnd);
421
        setExceptionLocation(result, eStart, eEnd, eEnd);
422
        result->setLoc(startLine, endLine);
422
        result->setLoc(startLine, endLine, location.column);
423
        return result;
423
        return result;
424
    }
424
    }
425
425
426
    StatementNode* createTryStatement(int lineNumber, StatementNode* tryBlock, const Identifier* ident, StatementNode* catchBlock, StatementNode* finallyBlock, int startLine, int endLine)
426
    StatementNode* createTryStatement(const JSTokenLocation& location, StatementNode* tryBlock, const Identifier* ident, StatementNode* catchBlock, StatementNode* finallyBlock, int startLine, int endLine)
427
    {
427
    {
428
        TryNode* result = new (m_globalData) TryNode(lineNumber, tryBlock, *ident, catchBlock, finallyBlock);
428
        TryNode* result = new (m_globalData) TryNode(location, tryBlock, *ident, catchBlock, finallyBlock);
429
        if (catchBlock)
429
        if (catchBlock)
430
            usesCatch();
430
            usesCatch();
431
        result->setLoc(startLine, endLine);
431
        result->setLoc(startLine, endLine, location.column);
432
        return result;
432
        return result;
433
    }
433
    }
434
434
435
    StatementNode* createSwitchStatement(int lineNumber, ExpressionNode* expr, ClauseListNode* firstClauses, CaseClauseNode* defaultClause, ClauseListNode* secondClauses, int startLine, int endLine)
435
    StatementNode* createSwitchStatement(const JSTokenLocation& location, ExpressionNode* expr, ClauseListNode* firstClauses, CaseClauseNode* defaultClause, ClauseListNode* secondClauses, int startLine, int endLine)
436
    {
436
    {
437
        CaseBlockNode* cases = new (m_globalData) CaseBlockNode(firstClauses, defaultClause, secondClauses);
437
        CaseBlockNode* cases = new (m_globalData) CaseBlockNode(firstClauses, defaultClause, secondClauses);
438
        SwitchNode* result = new (m_globalData) SwitchNode(lineNumber, expr, cases);
438
        SwitchNode* result = new (m_globalData) SwitchNode(location, expr, cases);
439
        result->setLoc(startLine, endLine);
439
        result->setLoc(startLine, endLine, location.column);
440
        return result;
440
        return result;
441
    }
441
    }
442
442
443
    StatementNode* createWhileStatement(int lineNumber, ExpressionNode* expr, StatementNode* statement, int startLine, int endLine)
443
    StatementNode* createWhileStatement(const JSTokenLocation& location, ExpressionNode* expr, StatementNode* statement, int startLine, int endLine)
444
    {
444
    {
445
        WhileNode* result = new (m_globalData) WhileNode(lineNumber, expr, statement);
445
        WhileNode* result = new (m_globalData) WhileNode(location, expr, statement);
446
        result->setLoc(startLine, endLine);
446
        result->setLoc(startLine, endLine, location.column);
447
        return result;
447
        return result;
448
    }
448
    }
449
449
450
    StatementNode* createDoWhileStatement(int lineNumber, StatementNode* statement, ExpressionNode* expr, int startLine, int endLine)
450
    StatementNode* createDoWhileStatement(const JSTokenLocation& location, StatementNode* statement, ExpressionNode* expr, int startLine, int endLine)
451
    {
451
    {
452
        DoWhileNode* result = new (m_globalData) DoWhileNode(lineNumber, statement, expr);
452
        DoWhileNode* result = new (m_globalData) DoWhileNode(location, statement, expr);
453
        result->setLoc(startLine, endLine);
453
        result->setLoc(startLine, endLine, location.column);
454
        return result;
454
        return result;
455
    }
455
    }
456
456
457
    StatementNode* createLabelStatement(int lineNumber, const Identifier* ident, StatementNode* statement, int start, int end)
457
    StatementNode* createLabelStatement(const JSTokenLocation& location, const Identifier* ident, StatementNode* statement, int start, int end)
458
    {
458
    {
459
        LabelNode* result = new (m_globalData) LabelNode(lineNumber, *ident, statement);
459
        LabelNode* result = new (m_globalData) LabelNode(location, *ident, statement);
460
        setExceptionLocation(result, start, end, end);
460
        setExceptionLocation(result, start, end, end);
461
        return result;
461
        return result;
462
    }
462
    }
463
463
464
    StatementNode* createWithStatement(int lineNumber, ExpressionNode* expr, StatementNode* statement, int start, int end, int startLine, int endLine)
464
    StatementNode* createWithStatement(const JSTokenLocation& location, ExpressionNode* expr, StatementNode* statement, int start, int end, int startLine, int endLine)
465
    {
465
    {
466
        usesWith();
466
        usesWith();
467
        WithNode* result = new (m_globalData) WithNode(lineNumber, expr, statement, end, end - start);
467
        WithNode* result = new (m_globalData) WithNode(location, expr, statement, end, end - start);
468
        result->setLoc(startLine, endLine);
468
        result->setLoc(startLine, endLine, location.column);
469
        return result;
469
        return result;
470
    }    
470
    }    
471
    
471
    
472
    StatementNode* createThrowStatement(int lineNumber, ExpressionNode* expr, int start, int end, int startLine, int endLine)
472
    StatementNode* createThrowStatement(const JSTokenLocation& location, ExpressionNode* expr, int start, int end, int startLine, int endLine)
473
    {
473
    {
474
        ThrowNode* result = new (m_globalData) ThrowNode(lineNumber, expr);
474
        ThrowNode* result = new (m_globalData) ThrowNode(location, expr);
475
        result->setLoc(startLine, endLine);
475
        result->setLoc(startLine, endLine, location.column);
476
        setExceptionLocation(result, start, end, end);
476
        setExceptionLocation(result, start, end, end);
477
        return result;
477
        return result;
478
    }
478
    }
479
    
479
    
480
    StatementNode* createDebugger(int lineNumber, int startLine, int endLine)
480
    StatementNode* createDebugger(const JSTokenLocation& location, int startLine, int endLine)
481
    {
481
    {
482
        DebuggerStatementNode* result = new (m_globalData) DebuggerStatementNode(lineNumber);
482
        DebuggerStatementNode* result = new (m_globalData) DebuggerStatementNode(location);
483
        result->setLoc(startLine, endLine);
483
        result->setLoc(startLine, endLine, location.column);
484
        return result;
484
        return result;
485
    }
485
    }
486
    
486
    
487
    StatementNode* createConstStatement(int lineNumber, ConstDeclNode* decls, int startLine, int endLine)
487
    StatementNode* createConstStatement(const JSTokenLocation& location, ConstDeclNode* decls, int startLine, int endLine)
488
    {
488
    {
489
        ConstStatementNode* result = new (m_globalData) ConstStatementNode(lineNumber, decls);
489
        ConstStatementNode* result = new (m_globalData) ConstStatementNode(location, decls);
490
        result->setLoc(startLine, endLine);
490
        result->setLoc(startLine, endLine, location.column);
491
        return result;
491
        return result;
492
    }
492
    }
493
493
494
    ConstDeclNode* appendConstDecl(int lineNumber, ConstDeclNode* tail, const Identifier* name, ExpressionNode* initializer)
494
    ConstDeclNode* appendConstDecl(const JSTokenLocation& location, ConstDeclNode* tail, const Identifier* name, ExpressionNode* initializer)
495
    {
495
    {
496
        ConstDeclNode* result = new (m_globalData) ConstDeclNode(lineNumber, *name, initializer);
496
        ConstDeclNode* result = new (m_globalData) ConstDeclNode(location, *name, initializer);
497
        if (tail)
497
        if (tail)
498
            tail->m_next = result;
498
            tail->m_next = result;
499
        return result;
499
        return result;
Lines 511-517 public: a/Source/JavaScriptCore/parser/ASTBuilder.h_sec5
511
        m_scope.m_varDeclarations->data.append(std::make_pair(ident, attrs));
511
        m_scope.m_varDeclarations->data.append(std::make_pair(ident, attrs));
512
    }
512
    }
513
513
514
    ExpressionNode* combineCommaNodes(int lineNumber, ExpressionNode* list, ExpressionNode* init)
514
    ExpressionNode* combineCommaNodes(const JSTokenLocation& location, ExpressionNode* list, ExpressionNode* init)
515
    {
515
    {
516
        if (!list)
516
        if (!list)
517
            return init;
517
            return init;
Lines 519-525 public: a/Source/JavaScriptCore/parser/ASTBuilder.h_sec6
519
            static_cast<CommaNode*>(list)->append(init);
519
            static_cast<CommaNode*>(list)->append(init);
520
            return list;
520
            return list;
521
        }
521
        }
522
        return new (m_globalData) CommaNode(lineNumber, list, init);
522
        return new (m_globalData) CommaNode(location, list, init);
523
    }
523
    }
524
524
525
    int evalCount() const { return m_evalCount; }
525
    int evalCount() const { return m_evalCount; }
Lines 547-556 public: a/Source/JavaScriptCore/parser/ASTBuilder.h_sec7
547
        ASSERT(operandStackDepth >= 0);
547
        ASSERT(operandStackDepth >= 0);
548
        m_binaryOperandStack.resize(m_binaryOperandStack.size() - amount);
548
        m_binaryOperandStack.resize(m_binaryOperandStack.size() - amount);
549
    }
549
    }
550
    void appendBinaryOperation(int lineNumber, int& operandStackDepth, int&, const BinaryOperand& lhs, const BinaryOperand& rhs)
550
    void appendBinaryOperation(const JSTokenLocation& location, int& operandStackDepth, int&, const BinaryOperand& lhs, const BinaryOperand& rhs)
551
    {
551
    {
552
        operandStackDepth++;
552
        operandStackDepth++;
553
        m_binaryOperandStack.append(std::make_pair(makeBinaryNode(lineNumber, m_binaryOperatorStack.last().first, lhs, rhs), BinaryOpInfo(lhs.second, rhs.second)));
553
        m_binaryOperandStack.append(std::make_pair(makeBinaryNode(location, m_binaryOperatorStack.last().first, lhs, rhs), BinaryOpInfo(lhs.second, rhs.second)));
554
    }
554
    }
555
    void operatorStackAppend(int& operatorStackDepth, int op, int precedence)
555
    void operatorStackAppend(int& operatorStackDepth, int op, int precedence)
556
    {
556
    {
Lines 592-600 public: a/Source/JavaScriptCore/parser/ASTBuilder.h_sec8
592
        m_assignmentInfoStack.append(AssignmentInfo(node, start, divot, assignmentCount, op));
592
        m_assignmentInfoStack.append(AssignmentInfo(node, start, divot, assignmentCount, op));
593
    }
593
    }
594
594
595
    ExpressionNode* createAssignment(int lineNumber, int& assignmentStackDepth, ExpressionNode* rhs, int initialAssignmentCount, int currentAssignmentCount, int lastTokenEnd)
595
    ExpressionNode* createAssignment(const JSTokenLocation& location, int& assignmentStackDepth, ExpressionNode* rhs, int initialAssignmentCount, int currentAssignmentCount, int lastTokenEnd)
596
    {
596
    {
597
        ExpressionNode* result = makeAssignNode(lineNumber, m_assignmentInfoStack.last().m_node, m_assignmentInfoStack.last().m_op, rhs, m_assignmentInfoStack.last().m_initAssignments != initialAssignmentCount, m_assignmentInfoStack.last().m_initAssignments != currentAssignmentCount, m_assignmentInfoStack.last().m_start, m_assignmentInfoStack.last().m_divot + 1, lastTokenEnd);
597
        ExpressionNode* result = makeAssignNode(location, m_assignmentInfoStack.last().m_node, m_assignmentInfoStack.last().m_op, rhs, m_assignmentInfoStack.last().m_initAssignments != initialAssignmentCount, m_assignmentInfoStack.last().m_initAssignments != currentAssignmentCount, m_assignmentInfoStack.last().m_start, m_assignmentInfoStack.last().m_divot + 1, lastTokenEnd);
598
        m_assignmentInfoStack.removeLast();
598
        m_assignmentInfoStack.removeLast();
599
        assignmentStackDepth--;
599
        assignmentStackDepth--;
600
        return result;
600
        return result;
Lines 635-643 private: a/Source/JavaScriptCore/parser/ASTBuilder.h_sec9
635
        m_evalCount++;
635
        m_evalCount++;
636
        m_scope.m_features |= EvalFeature;
636
        m_scope.m_features |= EvalFeature;
637
    }
637
    }
638
    ExpressionNode* createNumber(int lineNumber, double d)
638
    ExpressionNode* createNumber(const JSTokenLocation& location, double d)
639
    {
639
    {
640
        return new (m_globalData) NumberNode(lineNumber, d);
640
        return new (m_globalData) NumberNode(location, d);
641
    }
641
    }
642
    
642
    
643
    JSGlobalData* m_globalData;
643
    JSGlobalData* m_globalData;
Lines 650-682 private: a/Source/JavaScriptCore/parser/ASTBuilder.h_sec10
650
    int m_evalCount;
650
    int m_evalCount;
651
};
651
};
652
652
653
ExpressionNode* ASTBuilder::makeTypeOfNode(int lineNumber, ExpressionNode* expr)
653
ExpressionNode* ASTBuilder::makeTypeOfNode(const JSTokenLocation& location, ExpressionNode* expr)
654
{
654
{
655
    if (expr->isResolveNode()) {
655
    if (expr->isResolveNode()) {
656
        ResolveNode* resolve = static_cast<ResolveNode*>(expr);
656
        ResolveNode* resolve = static_cast<ResolveNode*>(expr);
657
        return new (m_globalData) TypeOfResolveNode(lineNumber, resolve->identifier());
657
        return new (m_globalData) TypeOfResolveNode(location, resolve->identifier());
658
    }
658
    }
659
    return new (m_globalData) TypeOfValueNode(lineNumber, expr);
659
    return new (m_globalData) TypeOfValueNode(location, expr);
660
}
660
}
661
661
662
ExpressionNode* ASTBuilder::makeDeleteNode(int lineNumber, ExpressionNode* expr, int start, int divot, int end)
662
ExpressionNode* ASTBuilder::makeDeleteNode(const JSTokenLocation& location, ExpressionNode* expr, int start, int divot, int end)
663
{
663
{
664
    if (!expr->isLocation())
664
    if (!expr->isLocation())
665
        return new (m_globalData) DeleteValueNode(lineNumber, expr);
665
        return new (m_globalData) DeleteValueNode(location, expr);
666
    if (expr->isResolveNode()) {
666
    if (expr->isResolveNode()) {
667
        ResolveNode* resolve = static_cast<ResolveNode*>(expr);
667
        ResolveNode* resolve = static_cast<ResolveNode*>(expr);
668
        return new (m_globalData) DeleteResolveNode(lineNumber, resolve->identifier(), divot, divot - start, end - divot);
668
        return new (m_globalData) DeleteResolveNode(location, resolve->identifier(), divot, divot - start, end - divot);
669
    }
669
    }
670
    if (expr->isBracketAccessorNode()) {
670
    if (expr->isBracketAccessorNode()) {
671
        BracketAccessorNode* bracket = static_cast<BracketAccessorNode*>(expr);
671
        BracketAccessorNode* bracket = static_cast<BracketAccessorNode*>(expr);
672
        return new (m_globalData) DeleteBracketNode(lineNumber, bracket->base(), bracket->subscript(), divot, divot - start, end - divot);
672
        return new (m_globalData) DeleteBracketNode(location, bracket->base(), bracket->subscript(), divot, divot - start, end - divot);
673
    }
673
    }
674
    ASSERT(expr->isDotAccessorNode());
674
    ASSERT(expr->isDotAccessorNode());
675
    DotAccessorNode* dot = static_cast<DotAccessorNode*>(expr);
675
    DotAccessorNode* dot = static_cast<DotAccessorNode*>(expr);
676
    return new (m_globalData) DeleteDotNode(lineNumber, dot->base(), dot->identifier(), divot, divot - start, end - divot);
676
    return new (m_globalData) DeleteDotNode(location, dot->base(), dot->identifier(), divot, divot - start, end - divot);
677
}
677
}
678
678
679
ExpressionNode* ASTBuilder::makeNegateNode(int lineNumber, ExpressionNode* n)
679
ExpressionNode* ASTBuilder::makeNegateNode(const JSTokenLocation& location, ExpressionNode* n)
680
{
680
{
681
    if (n->isNumber()) {
681
    if (n->isNumber()) {
682
        NumberNode* numberNode = static_cast<NumberNode*>(n);
682
        NumberNode* numberNode = static_cast<NumberNode*>(n);
Lines 684-811 ExpressionNode* ASTBuilder::makeNegateNode(int lineNumber, ExpressionNode* n) a/Source/JavaScriptCore/parser/ASTBuilder.h_sec11
684
        return numberNode;
684
        return numberNode;
685
    }
685
    }
686
686
687
    return new (m_globalData) NegateNode(lineNumber, n);
687
    return new (m_globalData) NegateNode(location, n);
688
}
688
}
689
689
690
ExpressionNode* ASTBuilder::makeBitwiseNotNode(int lineNumber, ExpressionNode* expr)
690
ExpressionNode* ASTBuilder::makeBitwiseNotNode(const JSTokenLocation& location, ExpressionNode* expr)
691
{
691
{
692
    if (expr->isNumber())
692
    if (expr->isNumber())
693
        return createNumber(lineNumber, ~toInt32(static_cast<NumberNode*>(expr)->value()));
693
        return createNumber(location, ~toInt32(static_cast<NumberNode*>(expr)->value()));
694
    return new (m_globalData) BitwiseNotNode(lineNumber, expr);
694
    return new (m_globalData) BitwiseNotNode(location, expr);
695
}
695
}
696
696
697
ExpressionNode* ASTBuilder::makeMultNode(int lineNumber, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
697
ExpressionNode* ASTBuilder::makeMultNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
698
{
698
{
699
    expr1 = expr1->stripUnaryPlus();
699
    expr1 = expr1->stripUnaryPlus();
700
    expr2 = expr2->stripUnaryPlus();
700
    expr2 = expr2->stripUnaryPlus();
701
701
702
    if (expr1->isNumber() && expr2->isNumber())
702
    if (expr1->isNumber() && expr2->isNumber())
703
        return createNumber(lineNumber, static_cast<NumberNode*>(expr1)->value() * static_cast<NumberNode*>(expr2)->value());
703
        return createNumber(location, static_cast<NumberNode*>(expr1)->value() * static_cast<NumberNode*>(expr2)->value());
704
704
705
    if (expr1->isNumber() && static_cast<NumberNode*>(expr1)->value() == 1)
705
    if (expr1->isNumber() && static_cast<NumberNode*>(expr1)->value() == 1)
706
        return new (m_globalData) UnaryPlusNode(lineNumber, expr2);
706
        return new (m_globalData) UnaryPlusNode(location, expr2);
707
707
708
    if (expr2->isNumber() && static_cast<NumberNode*>(expr2)->value() == 1)
708
    if (expr2->isNumber() && static_cast<NumberNode*>(expr2)->value() == 1)
709
        return new (m_globalData) UnaryPlusNode(lineNumber, expr1);
709
        return new (m_globalData) UnaryPlusNode(location, expr1);
710
710
711
    return new (m_globalData) MultNode(lineNumber, expr1, expr2, rightHasAssignments);
711
    return new (m_globalData) MultNode(location, expr1, expr2, rightHasAssignments);
712
}
712
}
713
713
714
ExpressionNode* ASTBuilder::makeDivNode(int lineNumber, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
714
ExpressionNode* ASTBuilder::makeDivNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
715
{
715
{
716
    expr1 = expr1->stripUnaryPlus();
716
    expr1 = expr1->stripUnaryPlus();
717
    expr2 = expr2->stripUnaryPlus();
717
    expr2 = expr2->stripUnaryPlus();
718
718
719
    if (expr1->isNumber() && expr2->isNumber())
719
    if (expr1->isNumber() && expr2->isNumber())
720
        return createNumber(lineNumber, static_cast<NumberNode*>(expr1)->value() / static_cast<NumberNode*>(expr2)->value());
720
        return createNumber(location, static_cast<NumberNode*>(expr1)->value() / static_cast<NumberNode*>(expr2)->value());
721
    return new (m_globalData) DivNode(lineNumber, expr1, expr2, rightHasAssignments);
721
    return new (m_globalData) DivNode(location, expr1, expr2, rightHasAssignments);
722
}
722
}
723
723
724
ExpressionNode* ASTBuilder::makeModNode(int lineNumber, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
724
ExpressionNode* ASTBuilder::makeModNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
725
{
725
{
726
    expr1 = expr1->stripUnaryPlus();
726
    expr1 = expr1->stripUnaryPlus();
727
    expr2 = expr2->stripUnaryPlus();
727
    expr2 = expr2->stripUnaryPlus();
728
    
728
    
729
    if (expr1->isNumber() && expr2->isNumber())
729
    if (expr1->isNumber() && expr2->isNumber())
730
        return createNumber(lineNumber, fmod(static_cast<NumberNode*>(expr1)->value(), static_cast<NumberNode*>(expr2)->value()));
730
        return createNumber(location, fmod(static_cast<NumberNode*>(expr1)->value(), static_cast<NumberNode*>(expr2)->value()));
731
    return new (m_globalData) ModNode(lineNumber, expr1, expr2, rightHasAssignments);
731
    return new (m_globalData) ModNode(location, expr1, expr2, rightHasAssignments);
732
}
732
}
733
733
734
ExpressionNode* ASTBuilder::makeAddNode(int lineNumber, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
734
ExpressionNode* ASTBuilder::makeAddNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
735
{
735
{
736
    if (expr1->isNumber() && expr2->isNumber())
736
    if (expr1->isNumber() && expr2->isNumber())
737
        return createNumber(lineNumber, static_cast<NumberNode*>(expr1)->value() + static_cast<NumberNode*>(expr2)->value());
737
        return createNumber(location, static_cast<NumberNode*>(expr1)->value() + static_cast<NumberNode*>(expr2)->value());
738
    return new (m_globalData) AddNode(lineNumber, expr1, expr2, rightHasAssignments);
738
    return new (m_globalData) AddNode(location, expr1, expr2, rightHasAssignments);
739
}
739
}
740
740
741
ExpressionNode* ASTBuilder::makeSubNode(int lineNumber, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
741
ExpressionNode* ASTBuilder::makeSubNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
742
{
742
{
743
    expr1 = expr1->stripUnaryPlus();
743
    expr1 = expr1->stripUnaryPlus();
744
    expr2 = expr2->stripUnaryPlus();
744
    expr2 = expr2->stripUnaryPlus();
745
745
746
    if (expr1->isNumber() && expr2->isNumber())
746
    if (expr1->isNumber() && expr2->isNumber())
747
        return createNumber(lineNumber, static_cast<NumberNode*>(expr1)->value() - static_cast<NumberNode*>(expr2)->value());
747
        return createNumber(location, static_cast<NumberNode*>(expr1)->value() - static_cast<NumberNode*>(expr2)->value());
748
    return new (m_globalData) SubNode(lineNumber, expr1, expr2, rightHasAssignments);
748
    return new (m_globalData) SubNode(location, expr1, expr2, rightHasAssignments);
749
}
749
}
750
750
751
ExpressionNode* ASTBuilder::makeLeftShiftNode(int lineNumber, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
751
ExpressionNode* ASTBuilder::makeLeftShiftNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
752
{
752
{
753
    if (expr1->isNumber() && expr2->isNumber())
753
    if (expr1->isNumber() && expr2->isNumber())
754
        return createNumber(lineNumber, toInt32(static_cast<NumberNode*>(expr1)->value()) << (toUInt32(static_cast<NumberNode*>(expr2)->value()) & 0x1f));
754
        return createNumber(location, toInt32(static_cast<NumberNode*>(expr1)->value()) << (toUInt32(static_cast<NumberNode*>(expr2)->value()) & 0x1f));
755
    return new (m_globalData) LeftShiftNode(lineNumber, expr1, expr2, rightHasAssignments);
755
    return new (m_globalData) LeftShiftNode(location, expr1, expr2, rightHasAssignments);
756
}
756
}
757
757
758
ExpressionNode* ASTBuilder::makeRightShiftNode(int lineNumber, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
758
ExpressionNode* ASTBuilder::makeRightShiftNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
759
{
759
{
760
    if (expr1->isNumber() && expr2->isNumber())
760
    if (expr1->isNumber() && expr2->isNumber())
761
        return createNumber(lineNumber, toInt32(static_cast<NumberNode*>(expr1)->value()) >> (toUInt32(static_cast<NumberNode*>(expr2)->value()) & 0x1f));
761
        return createNumber(location, toInt32(static_cast<NumberNode*>(expr1)->value()) >> (toUInt32(static_cast<NumberNode*>(expr2)->value()) & 0x1f));
762
    return new (m_globalData) RightShiftNode(lineNumber, expr1, expr2, rightHasAssignments);
762
    return new (m_globalData) RightShiftNode(location, expr1, expr2, rightHasAssignments);
763
}
763
}
764
764
765
ExpressionNode* ASTBuilder::makeURightShiftNode(int lineNumber, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
765
ExpressionNode* ASTBuilder::makeURightShiftNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
766
{
766
{
767
    if (expr1->isNumber() && expr2->isNumber())
767
    if (expr1->isNumber() && expr2->isNumber())
768
        return createNumber(lineNumber, toUInt32(static_cast<NumberNode*>(expr1)->value()) >> (toUInt32(static_cast<NumberNode*>(expr2)->value()) & 0x1f));
768
        return createNumber(location, toUInt32(static_cast<NumberNode*>(expr1)->value()) >> (toUInt32(static_cast<NumberNode*>(expr2)->value()) & 0x1f));
769
    return new (m_globalData) UnsignedRightShiftNode(lineNumber, expr1, expr2, rightHasAssignments);
769
    return new (m_globalData) UnsignedRightShiftNode(location, expr1, expr2, rightHasAssignments);
770
}
770
}
771
771
772
ExpressionNode* ASTBuilder::makeBitOrNode(int lineNumber, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
772
ExpressionNode* ASTBuilder::makeBitOrNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
773
{
773
{
774
    if (expr1->isNumber() && expr2->isNumber())
774
    if (expr1->isNumber() && expr2->isNumber())
775
        return createNumber(lineNumber, toInt32(static_cast<NumberNode*>(expr1)->value()) | toInt32(static_cast<NumberNode*>(expr2)->value()));
775
        return createNumber(location, toInt32(static_cast<NumberNode*>(expr1)->value()) | toInt32(static_cast<NumberNode*>(expr2)->value()));
776
    return new (m_globalData) BitOrNode(lineNumber, expr1, expr2, rightHasAssignments);
776
    return new (m_globalData) BitOrNode(location, expr1, expr2, rightHasAssignments);
777
}
777
}
778
778
779
ExpressionNode* ASTBuilder::makeBitAndNode(int lineNumber, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
779
ExpressionNode* ASTBuilder::makeBitAndNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
780
{
780
{
781
    if (expr1->isNumber() && expr2->isNumber())
781
    if (expr1->isNumber() && expr2->isNumber())
782
        return createNumber(lineNumber, toInt32(static_cast<NumberNode*>(expr1)->value()) & toInt32(static_cast<NumberNode*>(expr2)->value()));
782
        return createNumber(location, toInt32(static_cast<NumberNode*>(expr1)->value()) & toInt32(static_cast<NumberNode*>(expr2)->value()));
783
    return new (m_globalData) BitAndNode(lineNumber, expr1, expr2, rightHasAssignments);
783
    return new (m_globalData) BitAndNode(location, expr1, expr2, rightHasAssignments);
784
}
784
}
785
785
786
ExpressionNode* ASTBuilder::makeBitXOrNode(int lineNumber, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
786
ExpressionNode* ASTBuilder::makeBitXOrNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
787
{
787
{
788
    if (expr1->isNumber() && expr2->isNumber())
788
    if (expr1->isNumber() && expr2->isNumber())
789
        return createNumber(lineNumber, toInt32(static_cast<NumberNode*>(expr1)->value()) ^ toInt32(static_cast<NumberNode*>(expr2)->value()));
789
        return createNumber(location, toInt32(static_cast<NumberNode*>(expr1)->value()) ^ toInt32(static_cast<NumberNode*>(expr2)->value()));
790
    return new (m_globalData) BitXOrNode(lineNumber, expr1, expr2, rightHasAssignments);
790
    return new (m_globalData) BitXOrNode(location, expr1, expr2, rightHasAssignments);
791
}
791
}
792
792
793
ExpressionNode* ASTBuilder::makeFunctionCallNode(int lineNumber, ExpressionNode* func, ArgumentsNode* args, int start, int divot, int end)
793
ExpressionNode* ASTBuilder::makeFunctionCallNode(const JSTokenLocation& location, ExpressionNode* func, ArgumentsNode* args, int start, int divot, int end)
794
{
794
{
795
    if (!func->isLocation())
795
    if (!func->isLocation())
796
        return new (m_globalData) FunctionCallValueNode(lineNumber, func, args, divot, divot - start, end - divot);
796
        return new (m_globalData) FunctionCallValueNode(location, func, args, divot, divot - start, end - divot);
797
    if (func->isResolveNode()) {
797
    if (func->isResolveNode()) {
798
        ResolveNode* resolve = static_cast<ResolveNode*>(func);
798
        ResolveNode* resolve = static_cast<ResolveNode*>(func);
799
        const Identifier& identifier = resolve->identifier();
799
        const Identifier& identifier = resolve->identifier();
800
        if (identifier == m_globalData->propertyNames->eval) {
800
        if (identifier == m_globalData->propertyNames->eval) {
801
            usesEval();
801
            usesEval();
802
            return new (m_globalData) EvalFunctionCallNode(lineNumber, args, divot, divot - start, end - divot);
802
            return new (m_globalData) EvalFunctionCallNode(location, args, divot, divot - start, end - divot);
803
        }
803
        }
804
        return new (m_globalData) FunctionCallResolveNode(lineNumber, identifier, args, divot, divot - start, end - divot);
804
        return new (m_globalData) FunctionCallResolveNode(location, identifier, args, divot, divot - start, end - divot);
805
    }
805
    }
806
    if (func->isBracketAccessorNode()) {
806
    if (func->isBracketAccessorNode()) {
807
        BracketAccessorNode* bracket = static_cast<BracketAccessorNode*>(func);
807
        BracketAccessorNode* bracket = static_cast<BracketAccessorNode*>(func);
808
        FunctionCallBracketNode* node = new (m_globalData) FunctionCallBracketNode(lineNumber, bracket->base(), bracket->subscript(), args, divot, divot - start, end - divot);
808
        FunctionCallBracketNode* node = new (m_globalData) FunctionCallBracketNode(location, bracket->base(), bracket->subscript(), args, divot, divot - start, end - divot);
809
        node->setSubexpressionInfo(bracket->divot(), bracket->endOffset());
809
        node->setSubexpressionInfo(bracket->divot(), bracket->endOffset());
810
        return node;
810
        return node;
811
    }
811
    }
Lines 813-930 ExpressionNode* ASTBuilder::makeFunctionCallNode(int lineNumber, ExpressionNode* a/Source/JavaScriptCore/parser/ASTBuilder.h_sec12
813
    DotAccessorNode* dot = static_cast<DotAccessorNode*>(func);
813
    DotAccessorNode* dot = static_cast<DotAccessorNode*>(func);
814
    FunctionCallDotNode* node;
814
    FunctionCallDotNode* node;
815
    if (dot->identifier() == m_globalData->propertyNames->call)
815
    if (dot->identifier() == m_globalData->propertyNames->call)
816
        node = new (m_globalData) CallFunctionCallDotNode(lineNumber, dot->base(), dot->identifier(), args, divot, divot - start, end - divot);
816
        node = new (m_globalData) CallFunctionCallDotNode(location, dot->base(), dot->identifier(), args, divot, divot - start, end - divot);
817
    else if (dot->identifier() == m_globalData->propertyNames->apply)
817
    else if (dot->identifier() == m_globalData->propertyNames->apply)
818
        node = new (m_globalData) ApplyFunctionCallDotNode(lineNumber, dot->base(), dot->identifier(), args, divot, divot - start, end - divot);
818
        node = new (m_globalData) ApplyFunctionCallDotNode(location, dot->base(), dot->identifier(), args, divot, divot - start, end - divot);
819
    else
819
    else
820
        node = new (m_globalData) FunctionCallDotNode(lineNumber, dot->base(), dot->identifier(), args, divot, divot - start, end - divot);
820
        node = new (m_globalData) FunctionCallDotNode(location, dot->base(), dot->identifier(), args, divot, divot - start, end - divot);
821
    node->setSubexpressionInfo(dot->divot(), dot->endOffset());
821
    node->setSubexpressionInfo(dot->divot(), dot->endOffset());
822
    return node;
822
    return node;
823
}
823
}
824
824
825
ExpressionNode* ASTBuilder::makeBinaryNode(int lineNumber, int token, pair<ExpressionNode*, BinaryOpInfo> lhs, pair<ExpressionNode*, BinaryOpInfo> rhs)
825
ExpressionNode* ASTBuilder::makeBinaryNode(const JSTokenLocation& location, int token, pair<ExpressionNode*, BinaryOpInfo> lhs, pair<ExpressionNode*, BinaryOpInfo> rhs)
826
{
826
{
827
    switch (token) {
827
    switch (token) {
828
    case OR:
828
    case OR:
829
        return new (m_globalData) LogicalOpNode(lineNumber, lhs.first, rhs.first, OpLogicalOr);
829
        return new (m_globalData) LogicalOpNode(location, lhs.first, rhs.first, OpLogicalOr);
830
830
831
    case AND:
831
    case AND:
832
        return new (m_globalData) LogicalOpNode(lineNumber, lhs.first, rhs.first, OpLogicalAnd);
832
        return new (m_globalData) LogicalOpNode(location, lhs.first, rhs.first, OpLogicalAnd);
833
833
834
    case BITOR:
834
    case BITOR:
835
        return makeBitOrNode(lineNumber, lhs.first, rhs.first, rhs.second.hasAssignment);
835
        return makeBitOrNode(location, lhs.first, rhs.first, rhs.second.hasAssignment);
836
836
837
    case BITXOR:
837
    case BITXOR:
838
        return makeBitXOrNode(lineNumber, lhs.first, rhs.first, rhs.second.hasAssignment);
838
        return makeBitXOrNode(location, lhs.first, rhs.first, rhs.second.hasAssignment);
839
839
840
    case BITAND:
840
    case BITAND:
841
        return makeBitAndNode(lineNumber, lhs.first, rhs.first, rhs.second.hasAssignment);
841
        return makeBitAndNode(location, lhs.first, rhs.first, rhs.second.hasAssignment);
842
842
843
    case EQEQ:
843
    case EQEQ:
844
        return new (m_globalData) EqualNode(lineNumber, lhs.first, rhs.first, rhs.second.hasAssignment);
844
        return new (m_globalData) EqualNode(location, lhs.first, rhs.first, rhs.second.hasAssignment);
845
845
846
    case NE:
846
    case NE:
847
        return new (m_globalData) NotEqualNode(lineNumber, lhs.first, rhs.first, rhs.second.hasAssignment);
847
        return new (m_globalData) NotEqualNode(location, lhs.first, rhs.first, rhs.second.hasAssignment);
848
848
849
    case STREQ:
849
    case STREQ:
850
        return new (m_globalData) StrictEqualNode(lineNumber, lhs.first, rhs.first, rhs.second.hasAssignment);
850
        return new (m_globalData) StrictEqualNode(location, lhs.first, rhs.first, rhs.second.hasAssignment);
851
851
852
    case STRNEQ:
852
    case STRNEQ:
853
        return new (m_globalData) NotStrictEqualNode(lineNumber, lhs.first, rhs.first, rhs.second.hasAssignment);
853
        return new (m_globalData) NotStrictEqualNode(location, lhs.first, rhs.first, rhs.second.hasAssignment);
854
854
855
    case LT:
855
    case LT:
856
        return new (m_globalData) LessNode(lineNumber, lhs.first, rhs.first, rhs.second.hasAssignment);
856
        return new (m_globalData) LessNode(location, lhs.first, rhs.first, rhs.second.hasAssignment);
857
857
858
    case GT:
858
    case GT:
859
        return new (m_globalData) GreaterNode(lineNumber, lhs.first, rhs.first, rhs.second.hasAssignment);
859
        return new (m_globalData) GreaterNode(location, lhs.first, rhs.first, rhs.second.hasAssignment);
860
860
861
    case LE:
861
    case LE:
862
        return new (m_globalData) LessEqNode(lineNumber, lhs.first, rhs.first, rhs.second.hasAssignment);
862
        return new (m_globalData) LessEqNode(location, lhs.first, rhs.first, rhs.second.hasAssignment);
863
863
864
    case GE:
864
    case GE:
865
        return new (m_globalData) GreaterEqNode(lineNumber, lhs.first, rhs.first, rhs.second.hasAssignment);
865
        return new (m_globalData) GreaterEqNode(location, lhs.first, rhs.first, rhs.second.hasAssignment);
866
866
867
    case INSTANCEOF: {
867
    case INSTANCEOF: {
868
        InstanceOfNode* node = new (m_globalData) InstanceOfNode(lineNumber, lhs.first, rhs.first, rhs.second.hasAssignment);
868
        InstanceOfNode* node = new (m_globalData) InstanceOfNode(location, lhs.first, rhs.first, rhs.second.hasAssignment);
869
        setExceptionLocation(node, lhs.second.start, rhs.second.start, rhs.second.end);
869
        setExceptionLocation(node, lhs.second.start, rhs.second.start, rhs.second.end);
870
        return node;
870
        return node;
871
    }
871
    }
872
872
873
    case INTOKEN: {
873
    case INTOKEN: {
874
        InNode* node = new (m_globalData) InNode(lineNumber, lhs.first, rhs.first, rhs.second.hasAssignment);
874
        InNode* node = new (m_globalData) InNode(location, lhs.first, rhs.first, rhs.second.hasAssignment);
875
        setExceptionLocation(node, lhs.second.start, rhs.second.start, rhs.second.end);
875
        setExceptionLocation(node, lhs.second.start, rhs.second.start, rhs.second.end);
876
        return node;
876
        return node;
877
    }
877
    }
878
878
879
    case LSHIFT:
879
    case LSHIFT:
880
        return makeLeftShiftNode(lineNumber, lhs.first, rhs.first, rhs.second.hasAssignment);
880
        return makeLeftShiftNode(location, lhs.first, rhs.first, rhs.second.hasAssignment);
881
881
882
    case RSHIFT:
882
    case RSHIFT:
883
        return makeRightShiftNode(lineNumber, lhs.first, rhs.first, rhs.second.hasAssignment);
883
        return makeRightShiftNode(location, lhs.first, rhs.first, rhs.second.hasAssignment);
884
884
885
    case URSHIFT:
885
    case URSHIFT:
886
        return makeURightShiftNode(lineNumber, lhs.first, rhs.first, rhs.second.hasAssignment);
886
        return makeURightShiftNode(location, lhs.first, rhs.first, rhs.second.hasAssignment);
887
887
888
    case PLUS:
888
    case PLUS:
889
        return makeAddNode(lineNumber, lhs.first, rhs.first, rhs.second.hasAssignment);
889
        return makeAddNode(location, lhs.first, rhs.first, rhs.second.hasAssignment);
890
890
891
    case MINUS:
891
    case MINUS:
892
        return makeSubNode(lineNumber, lhs.first, rhs.first, rhs.second.hasAssignment);
892
        return makeSubNode(location, lhs.first, rhs.first, rhs.second.hasAssignment);
893
893
894
    case TIMES:
894
    case TIMES:
895
        return makeMultNode(lineNumber, lhs.first, rhs.first, rhs.second.hasAssignment);
895
        return makeMultNode(location, lhs.first, rhs.first, rhs.second.hasAssignment);
896
896
897
    case DIVIDE:
897
    case DIVIDE:
898
        return makeDivNode(lineNumber, lhs.first, rhs.first, rhs.second.hasAssignment);
898
        return makeDivNode(location, lhs.first, rhs.first, rhs.second.hasAssignment);
899
899
900
    case MOD:
900
    case MOD:
901
        return makeModNode(lineNumber, lhs.first, rhs.first, rhs.second.hasAssignment);
901
        return makeModNode(location, lhs.first, rhs.first, rhs.second.hasAssignment);
902
    }
902
    }
903
    CRASH();
903
    CRASH();
904
    return 0;
904
    return 0;
905
}
905
}
906
906
907
ExpressionNode* ASTBuilder::makeAssignNode(int lineNumber, ExpressionNode* loc, Operator op, ExpressionNode* expr, bool locHasAssignments, bool exprHasAssignments, int start, int divot, int end)
907
ExpressionNode* ASTBuilder::makeAssignNode(const JSTokenLocation& location, ExpressionNode* loc, Operator op, ExpressionNode* expr, bool locHasAssignments, bool exprHasAssignments, int start, int divot, int end)
908
{
908
{
909
    if (!loc->isLocation())
909
    if (!loc->isLocation())
910
        return new (m_globalData) AssignErrorNode(lineNumber, divot, divot - start, end - divot);
910
        return new (m_globalData) AssignErrorNode(location, divot, divot - start, end - divot);
911
911
912
    if (loc->isResolveNode()) {
912
    if (loc->isResolveNode()) {
913
        ResolveNode* resolve = static_cast<ResolveNode*>(loc);
913
        ResolveNode* resolve = static_cast<ResolveNode*>(loc);
914
        if (op == OpEqual) {
914
        if (op == OpEqual) {
915
            if (expr->isFuncExprNode())
915
            if (expr->isFuncExprNode())
916
                static_cast<FuncExprNode*>(expr)->body()->setInferredName(resolve->identifier());
916
                static_cast<FuncExprNode*>(expr)->body()->setInferredName(resolve->identifier());
917
            AssignResolveNode* node = new (m_globalData) AssignResolveNode(lineNumber, resolve->identifier(), expr);
917
            AssignResolveNode* node = new (m_globalData) AssignResolveNode(location, resolve->identifier(), expr);
918
            setExceptionLocation(node, start, divot, end);
918
            setExceptionLocation(node, start, divot, end);
919
            return node;
919
            return node;
920
        }
920
        }
921
        return new (m_globalData) ReadModifyResolveNode(lineNumber, resolve->identifier(), op, expr, exprHasAssignments, divot, divot - start, end - divot);
921
        return new (m_globalData) ReadModifyResolveNode(location, resolve->identifier(), op, expr, exprHasAssignments, divot, divot - start, end - divot);
922
    }
922
    }
923
    if (loc->isBracketAccessorNode()) {
923
    if (loc->isBracketAccessorNode()) {
924
        BracketAccessorNode* bracket = static_cast<BracketAccessorNode*>(loc);
924
        BracketAccessorNode* bracket = static_cast<BracketAccessorNode*>(loc);
925
        if (op == OpEqual)
925
        if (op == OpEqual)
926
            return new (m_globalData) AssignBracketNode(lineNumber, bracket->base(), bracket->subscript(), expr, locHasAssignments, exprHasAssignments, bracket->divot(), bracket->divot() - start, end - bracket->divot());
926
            return new (m_globalData) AssignBracketNode(location, bracket->base(), bracket->subscript(), expr, locHasAssignments, exprHasAssignments, bracket->divot(), bracket->divot() - start, end - bracket->divot());
927
        ReadModifyBracketNode* node = new (m_globalData) ReadModifyBracketNode(lineNumber, bracket->base(), bracket->subscript(), op, expr, locHasAssignments, exprHasAssignments, divot, divot - start, end - divot);
927
        ReadModifyBracketNode* node = new (m_globalData) ReadModifyBracketNode(location, bracket->base(), bracket->subscript(), op, expr, locHasAssignments, exprHasAssignments, divot, divot - start, end - divot);
928
        node->setSubexpressionInfo(bracket->divot(), bracket->endOffset());
928
        node->setSubexpressionInfo(bracket->divot(), bracket->endOffset());
929
        return node;
929
        return node;
930
    }
930
    }
Lines 933-987 ExpressionNode* ASTBuilder::makeAssignNode(int lineNumber, ExpressionNode* loc, a/Source/JavaScriptCore/parser/ASTBuilder.h_sec13
933
    if (op == OpEqual) {
933
    if (op == OpEqual) {
934
        if (expr->isFuncExprNode())
934
        if (expr->isFuncExprNode())
935
            static_cast<FuncExprNode*>(expr)->body()->setInferredName(dot->identifier());
935
            static_cast<FuncExprNode*>(expr)->body()->setInferredName(dot->identifier());
936
        return new (m_globalData) AssignDotNode(lineNumber, dot->base(), dot->identifier(), expr, exprHasAssignments, dot->divot(), dot->divot() - start, end - dot->divot());
936
        return new (m_globalData) AssignDotNode(location, dot->base(), dot->identifier(), expr, exprHasAssignments, dot->divot(), dot->divot() - start, end - dot->divot());
937
    }
937
    }
938
938
939
    ReadModifyDotNode* node = new (m_globalData) ReadModifyDotNode(lineNumber, dot->base(), dot->identifier(), op, expr, exprHasAssignments, divot, divot - start, end - divot);
939
    ReadModifyDotNode* node = new (m_globalData) ReadModifyDotNode(location, dot->base(), dot->identifier(), op, expr, exprHasAssignments, divot, divot - start, end - divot);
940
    node->setSubexpressionInfo(dot->divot(), dot->endOffset());
940
    node->setSubexpressionInfo(dot->divot(), dot->endOffset());
941
    return node;
941
    return node;
942
}
942
}
943
943
944
ExpressionNode* ASTBuilder::makePrefixNode(int lineNumber, ExpressionNode* expr, Operator op, int start, int divot, int end)
944
ExpressionNode* ASTBuilder::makePrefixNode(const JSTokenLocation& location, ExpressionNode* expr, Operator op, int start, int divot, int end)
945
{
945
{
946
    if (!expr->isLocation())
946
    if (!expr->isLocation())
947
        return new (m_globalData) PrefixErrorNode(lineNumber, op, divot, divot - start, end - divot);
947
        return new (m_globalData) PrefixErrorNode(location, op, divot, divot - start, end - divot);
948
948
949
    if (expr->isResolveNode()) {
949
    if (expr->isResolveNode()) {
950
        ResolveNode* resolve = static_cast<ResolveNode*>(expr);
950
        ResolveNode* resolve = static_cast<ResolveNode*>(expr);
951
        return new (m_globalData) PrefixResolveNode(lineNumber, resolve->identifier(), op, divot, divot - start, end - divot);
951
        return new (m_globalData) PrefixResolveNode(location, resolve->identifier(), op, divot, divot - start, end - divot);
952
    }
952
    }
953
    if (expr->isBracketAccessorNode()) {
953
    if (expr->isBracketAccessorNode()) {
954
        BracketAccessorNode* bracket = static_cast<BracketAccessorNode*>(expr);
954
        BracketAccessorNode* bracket = static_cast<BracketAccessorNode*>(expr);
955
        PrefixBracketNode* node = new (m_globalData) PrefixBracketNode(lineNumber, bracket->base(), bracket->subscript(), op, divot, divot - start, end - divot);
955
        PrefixBracketNode* node = new (m_globalData) PrefixBracketNode(location, bracket->base(), bracket->subscript(), op, divot, divot - start, end - divot);
956
        node->setSubexpressionInfo(bracket->divot(), bracket->startOffset());
956
        node->setSubexpressionInfo(bracket->divot(), bracket->startOffset());
957
        return node;
957
        return node;
958
    }
958
    }
959
    ASSERT(expr->isDotAccessorNode());
959
    ASSERT(expr->isDotAccessorNode());
960
    DotAccessorNode* dot = static_cast<DotAccessorNode*>(expr);
960
    DotAccessorNode* dot = static_cast<DotAccessorNode*>(expr);
961
    PrefixDotNode* node = new (m_globalData) PrefixDotNode(lineNumber, dot->base(), dot->identifier(), op, divot, divot - start, end - divot);
961
    PrefixDotNode* node = new (m_globalData) PrefixDotNode(location, dot->base(), dot->identifier(), op, divot, divot - start, end - divot);
962
    node->setSubexpressionInfo(dot->divot(), dot->startOffset());
962
    node->setSubexpressionInfo(dot->divot(), dot->startOffset());
963
    return node;
963
    return node;
964
}
964
}
965
965
966
ExpressionNode* ASTBuilder::makePostfixNode(int lineNumber, ExpressionNode* expr, Operator op, int start, int divot, int end)
966
ExpressionNode* ASTBuilder::makePostfixNode(const JSTokenLocation& location, ExpressionNode* expr, Operator op, int start, int divot, int end)
967
{
967
{
968
    if (!expr->isLocation())
968
    if (!expr->isLocation())
969
        return new (m_globalData) PostfixErrorNode(lineNumber, op, divot, divot - start, end - divot);
969
        return new (m_globalData) PostfixErrorNode(location, op, divot, divot - start, end - divot);
970
970
971
    if (expr->isResolveNode()) {
971
    if (expr->isResolveNode()) {
972
        ResolveNode* resolve = static_cast<ResolveNode*>(expr);
972
        ResolveNode* resolve = static_cast<ResolveNode*>(expr);
973
        return new (m_globalData) PostfixResolveNode(lineNumber, resolve->identifier(), op, divot, divot - start, end - divot);
973
        return new (m_globalData) PostfixResolveNode(location, resolve->identifier(), op, divot, divot - start, end - divot);
974
    }
974
    }
975
    if (expr->isBracketAccessorNode()) {
975
    if (expr->isBracketAccessorNode()) {
976
        BracketAccessorNode* bracket = static_cast<BracketAccessorNode*>(expr);
976
        BracketAccessorNode* bracket = static_cast<BracketAccessorNode*>(expr);
977
        PostfixBracketNode* node = new (m_globalData) PostfixBracketNode(lineNumber, bracket->base(), bracket->subscript(), op, divot, divot - start, end - divot);
977
        PostfixBracketNode* node = new (m_globalData) PostfixBracketNode(location, bracket->base(), bracket->subscript(), op, divot, divot - start, end - divot);
978
        node->setSubexpressionInfo(bracket->divot(), bracket->endOffset());
978
        node->setSubexpressionInfo(bracket->divot(), bracket->endOffset());
979
        return node;
979
        return node;
980
980
981
    }
981
    }
982
    ASSERT(expr->isDotAccessorNode());
982
    ASSERT(expr->isDotAccessorNode());
983
    DotAccessorNode* dot = static_cast<DotAccessorNode*>(expr);
983
    DotAccessorNode* dot = static_cast<DotAccessorNode*>(expr);
984
    PostfixDotNode* node = new (m_globalData) PostfixDotNode(lineNumber, dot->base(), dot->identifier(), op, divot, divot - start, end - divot);
984
    PostfixDotNode* node = new (m_globalData) PostfixDotNode(location, dot->base(), dot->identifier(), op, divot, divot - start, end - divot);
985
    node->setSubexpressionInfo(dot->divot(), dot->endOffset());
985
    node->setSubexpressionInfo(dot->divot(), dot->endOffset());
986
    return node;
986
    return node;
987
}
987
}
- a/Source/JavaScriptCore/parser/Lexer.cpp -6 / +12 lines
Lines 417-422 void Lexer<T>::setCode(const SourceCode& source, ParserArena* arena) a/Source/JavaScriptCore/parser/Lexer.cpp_sec1
417
    m_codeEnd = m_codeStart + source.endOffset();
417
    m_codeEnd = m_codeStart + source.endOffset();
418
    m_error = false;
418
    m_error = false;
419
    m_atLineStart = true;
419
    m_atLineStart = true;
420
    m_columnNumber = 0;
420
    m_lexErrorMessage = UString();
421
    m_lexErrorMessage = UString();
421
    
422
    
422
    m_buffer8.reserveInitialCapacity(initialReadBufferCapacity);
423
    m_buffer8.reserveInitialCapacity(initialReadBufferCapacity);
Lines 433-438 template <typename T> a/Source/JavaScriptCore/parser/Lexer.cpp_sec2
433
template <int shiftAmount> ALWAYS_INLINE void Lexer<T>::internalShift()
434
template <int shiftAmount> ALWAYS_INLINE void Lexer<T>::internalShift()
434
{
435
{
435
    m_code += shiftAmount;
436
    m_code += shiftAmount;
437
    m_columnNumber += shiftAmount;
436
    m_current = *m_code;
438
    m_current = *m_code;
437
}
439
}
438
440
Lines 444-449 ALWAYS_INLINE void Lexer<T>::shift() a/Source/JavaScriptCore/parser/Lexer.cpp_sec3
444
    ++m_code;
446
    ++m_code;
445
    if (LIKELY(m_code < m_codeEnd))
447
    if (LIKELY(m_code < m_codeEnd))
446
        m_current = *m_code;
448
        m_current = *m_code;
449
    ++m_columnNumber;
447
}
450
}
448
451
449
template <typename T>
452
template <typename T>
Lines 1183-1189 bool Lexer<T>::nextTokenIsColon() a/Source/JavaScriptCore/parser/Lexer.cpp_sec4
1183
}
1186
}
1184
1187
1185
template <typename T>
1188
template <typename T>
1186
JSTokenType Lexer<T>::lex(JSTokenData* tokenData, JSTokenInfo* tokenInfo, unsigned lexerFlags, bool strictMode)
1189
JSTokenType Lexer<T>::lex(JSTokenData* tokenData, JSTokenLocation* tokenLocation, unsigned lexerFlags, bool strictMode)
1187
{
1190
{
1188
    ASSERT(!m_error);
1191
    ASSERT(!m_error);
1189
    ASSERT(m_buffer8.isEmpty());
1192
    ASSERT(m_buffer8.isEmpty());
Lines 1199-1205 start: a/Source/JavaScriptCore/parser/Lexer.cpp_sec5
1199
    if (atEnd())
1202
    if (atEnd())
1200
        return EOFTOK;
1203
        return EOFTOK;
1201
    
1204
    
1202
    tokenInfo->startOffset = currentOffset();
1205
    tokenLocation->startOffset = currentOffset();
1206
    tokenLocation->column = m_columnNumber;
1203
1207
1204
    CharacterType type;
1208
    CharacterType type;
1205
    if (LIKELY(isLatin1(m_current)))
1209
    if (LIKELY(isLatin1(m_current)))
Lines 1522-1527 inNumberAfterDecimalPoint: a/Source/JavaScriptCore/parser/Lexer.cpp_sec6
1522
        shiftLineTerminator();
1526
        shiftLineTerminator();
1523
        m_atLineStart = true;
1527
        m_atLineStart = true;
1524
        m_terminator = true;
1528
        m_terminator = true;
1529
        m_columnNumber = 0;
1525
        goto start;
1530
        goto start;
1526
    case CharacterInvalid:
1531
    case CharacterInvalid:
1527
        m_lexErrorMessage = invalidCharacterMessage();
1532
        m_lexErrorMessage = invalidCharacterMessage();
Lines 1544-1549 inSingleLineComment: a/Source/JavaScriptCore/parser/Lexer.cpp_sec7
1544
    shiftLineTerminator();
1549
    shiftLineTerminator();
1545
    m_atLineStart = true;
1550
    m_atLineStart = true;
1546
    m_terminator = true;
1551
    m_terminator = true;
1552
    m_columnNumber = 0;
1547
    if (!lastTokenWasRestrKeyword())
1553
    if (!lastTokenWasRestrKeyword())
1548
        goto start;
1554
        goto start;
1549
1555
Lines 1551-1565 inSingleLineComment: a/Source/JavaScriptCore/parser/Lexer.cpp_sec8
1551
    // Fall through into returnToken.
1557
    // Fall through into returnToken.
1552
1558
1553
returnToken:
1559
returnToken:
1554
    tokenInfo->line = m_lineNumber;
1560
    tokenLocation->line = m_lineNumber;
1555
    tokenInfo->endOffset = currentOffset();
1561
    tokenLocation->endOffset = currentOffset();
1556
    m_lastToken = token;
1562
    m_lastToken = token;
1557
    return token;
1563
    return token;
1558
1564
1559
returnError:
1565
returnError:
1560
    m_error = true;
1566
    m_error = true;
1561
    tokenInfo->line = m_lineNumber;
1567
    tokenLocation->line = m_lineNumber;
1562
    tokenInfo->endOffset = currentOffset();
1568
    tokenLocation->endOffset = currentOffset();
1563
    return ERRORTOK;
1569
    return ERRORTOK;
1564
}
1570
}
1565
1571
- a/Source/JavaScriptCore/parser/Lexer.h -7 / +11 lines
Lines 87-95 public: a/Source/JavaScriptCore/parser/Lexer.h_sec1
87
    void setIsReparsing() { m_isReparsing = true; }
87
    void setIsReparsing() { m_isReparsing = true; }
88
    bool isReparsing() const { return m_isReparsing; }
88
    bool isReparsing() const { return m_isReparsing; }
89
89
90
    JSTokenType lex(JSTokenData*, JSTokenInfo*, unsigned, bool strictMode);
90
    JSTokenType lex(JSTokenData*, JSTokenLocation*, unsigned, bool strictMode);
91
    bool nextTokenIsColon();
91
    bool nextTokenIsColon();
92
    int lineNumber() const { return m_lineNumber; }
92
    int lineNumber() const { return m_lineNumber; }
93
    int currentColumnNumber() const { return m_columnNumber; }
93
    void setLastLineNumber(int lastLineNumber) { m_lastLineNumber = lastLineNumber; }
94
    void setLastLineNumber(int lastLineNumber) { m_lastLineNumber = lastLineNumber; }
94
    int lastLineNumber() const { return m_lastLineNumber; }
95
    int lastLineNumber() const { return m_lastLineNumber; }
95
    bool prevTerminator() const { return m_terminator; }
96
    bool prevTerminator() const { return m_terminator; }
Lines 120-126 public: a/Source/JavaScriptCore/parser/Lexer.h_sec2
120
121
121
    SourceProvider* sourceProvider() const { return m_source->provider(); }
122
    SourceProvider* sourceProvider() const { return m_source->provider(); }
122
123
123
    JSTokenType lexExpectIdentifier(JSTokenData*, JSTokenInfo*, unsigned, bool strictMode);
124
    JSTokenType lexExpectIdentifier(JSTokenData*, JSTokenLocation*, unsigned, bool strictMode);
124
125
125
private:
126
private:
126
    void record8(int);
127
    void record8(int);
Lines 166-171 private: a/Source/JavaScriptCore/parser/Lexer.h_sec3
166
167
167
    int m_lineNumber;
168
    int m_lineNumber;
168
    int m_lastLineNumber;
169
    int m_lastLineNumber;
170
    int m_columnNumber;
169
171
170
    Vector<LChar> m_buffer8;
172
    Vector<LChar> m_buffer8;
171
    Vector<UChar> m_buffer16;
173
    Vector<UChar> m_buffer16;
Lines 257-263 ALWAYS_INLINE const Identifier* Lexer<T>::makeIdentifierLCharFromUChar(const UCh a/Source/JavaScriptCore/parser/Lexer.h_sec4
257
}
259
}
258
260
259
template <typename T>
261
template <typename T>
260
ALWAYS_INLINE JSTokenType Lexer<T>::lexExpectIdentifier(JSTokenData* tokenData, JSTokenInfo* tokenInfo, unsigned lexerFlags, bool strictMode)
262
ALWAYS_INLINE JSTokenType Lexer<T>::lexExpectIdentifier(JSTokenData* tokenData, JSTokenLocation* tokenLocation, unsigned lexerFlags, bool strictMode)
261
{
263
{
262
    ASSERT((lexerFlags & LexerFlagsIgnoreReservedWords));
264
    ASSERT((lexerFlags & LexerFlagsIgnoreReservedWords));
263
    const T* start = m_code;
265
    const T* start = m_code;
Lines 285-304 ALWAYS_INLINE JSTokenType Lexer<T>::lexExpectIdentifier(JSTokenData* tokenData, a/Source/JavaScriptCore/parser/Lexer.h_sec5
285
        m_current = 0;
287
        m_current = 0;
286
288
287
    m_code = ptr;
289
    m_code = ptr;
290
    m_columnNumber = m_columnNumber + (m_code - start);
288
291
289
    // Create the identifier if needed
292
    // Create the identifier if needed
290
    if (lexerFlags & LexexFlagsDontBuildKeywords)
293
    if (lexerFlags & LexexFlagsDontBuildKeywords)
291
        tokenData->ident = 0;
294
        tokenData->ident = 0;
292
    else
295
    else
293
        tokenData->ident = makeIdentifier(start, ptr - start);
296
        tokenData->ident = makeIdentifier(start, ptr - start);
294
    tokenInfo->line = m_lineNumber;
297
    tokenLocation->line = m_lineNumber;
295
    tokenInfo->startOffset = start - m_codeStart;
298
    tokenLocation->startOffset = start - m_codeStart;
296
    tokenInfo->endOffset = currentOffset();
299
    tokenLocation->endOffset = currentOffset();
300
    tokenLocation->column = m_columnNumber;
297
    m_lastToken = IDENT;
301
    m_lastToken = IDENT;
298
    return IDENT;
302
    return IDENT;
299
    
303
    
300
slowCase:
304
slowCase:
301
    return lex(tokenData, tokenInfo, lexerFlags, strictMode);
305
    return lex(tokenData, tokenLocation, lexerFlags, strictMode);
302
}
306
}
303
307
304
} // namespace JSC
308
} // namespace JSC
- a/Source/JavaScriptCore/parser/NodeConstructors.h -226 / +227 lines
Lines 42-101 namespace JSC { a/Source/JavaScriptCore/parser/NodeConstructors.h_sec1
42
        globalData->parserArena->derefWithArena(adoptRef(this));
42
        globalData->parserArena->derefWithArena(adoptRef(this));
43
    }
43
    }
44
44
45
    inline Node::Node(int lineNumber)
45
    inline Node::Node(const JSTokenLocation& location)
46
        : m_lineNumber(lineNumber)
46
        : m_lineNumber(location.line)
47
        , m_columnNumber(location.column)
47
    {
48
    {
48
    }
49
    }
49
50
50
    inline ExpressionNode::ExpressionNode(int lineNumber, ResultType resultType)
51
    inline ExpressionNode::ExpressionNode(const JSTokenLocation& location, ResultType resultType)
51
        : Node(lineNumber)
52
        : Node(location)
52
        , m_resultType(resultType)
53
        , m_resultType(resultType)
53
    {
54
    {
54
    }
55
    }
55
56
56
    inline StatementNode::StatementNode(int lineNumber)
57
    inline StatementNode::StatementNode(const JSTokenLocation& location)
57
        : Node(lineNumber)
58
        : Node(location)
58
        , m_lastLine(-1)
59
        , m_lastLine(-1)
59
    {
60
    {
60
    }
61
    }
61
62
62
    inline NullNode::NullNode(int lineNumber)
63
    inline NullNode::NullNode(const JSTokenLocation& location)
63
        : ExpressionNode(lineNumber, ResultType::nullType())
64
        : ExpressionNode(location, ResultType::nullType())
64
    {
65
    {
65
    }
66
    }
66
67
67
    inline BooleanNode::BooleanNode(int lineNumber, bool value)
68
    inline BooleanNode::BooleanNode(const JSTokenLocation& location, bool value)
68
        : ExpressionNode(lineNumber, ResultType::booleanType())
69
        : ExpressionNode(location, ResultType::booleanType())
69
        , m_value(value)
70
        , m_value(value)
70
    {
71
    {
71
    }
72
    }
72
73
73
    inline NumberNode::NumberNode(int lineNumber, double value)
74
    inline NumberNode::NumberNode(const JSTokenLocation& location, double value)
74
        : ExpressionNode(lineNumber, ResultType::numberType())
75
        : ExpressionNode(location, ResultType::numberType())
75
        , m_value(value)
76
        , m_value(value)
76
    {
77
    {
77
    }
78
    }
78
79
79
    inline StringNode::StringNode(int lineNumber, const Identifier& value)
80
    inline StringNode::StringNode(const JSTokenLocation& location, const Identifier& value)
80
        : ExpressionNode(lineNumber, ResultType::stringType())
81
        : ExpressionNode(location, ResultType::stringType())
81
        , m_value(value)
82
        , m_value(value)
82
    {
83
    {
83
    }
84
    }
84
85
85
    inline RegExpNode::RegExpNode(int lineNumber, const Identifier& pattern, const Identifier& flags)
86
    inline RegExpNode::RegExpNode(const JSTokenLocation& location, const Identifier& pattern, const Identifier& flags)
86
        : ExpressionNode(lineNumber)
87
        : ExpressionNode(location)
87
        , m_pattern(pattern)
88
        , m_pattern(pattern)
88
        , m_flags(flags)
89
        , m_flags(flags)
89
    {
90
    {
90
    }
91
    }
91
92
92
    inline ThisNode::ThisNode(int lineNumber)
93
    inline ThisNode::ThisNode(const JSTokenLocation& location)
93
        : ExpressionNode(lineNumber)
94
        : ExpressionNode(location)
94
    {
95
    {
95
    }
96
    }
96
97
97
    inline ResolveNode::ResolveNode(int lineNumber, const Identifier& ident, int startOffset)
98
    inline ResolveNode::ResolveNode(const JSTokenLocation& location, const Identifier& ident, int startOffset)
98
        : ExpressionNode(lineNumber)
99
        : ExpressionNode(location)
99
        , m_ident(ident)
100
        , m_ident(ident)
100
        , m_startOffset(startOffset)
101
        , m_startOffset(startOffset)
101
    {
102
    {
Lines 116-139 namespace JSC { a/Source/JavaScriptCore/parser/NodeConstructors.h_sec2
116
        l->m_next = this;
117
        l->m_next = this;
117
    }
118
    }
118
119
119
    inline ArrayNode::ArrayNode(int lineNumber, int elision)
120
    inline ArrayNode::ArrayNode(const JSTokenLocation& location, int elision)
120
        : ExpressionNode(lineNumber)
121
        : ExpressionNode(location)
121
        , m_element(0)
122
        , m_element(0)
122
        , m_elision(elision)
123
        , m_elision(elision)
123
        , m_optional(true)
124
        , m_optional(true)
124
    {
125
    {
125
    }
126
    }
126
127
127
    inline ArrayNode::ArrayNode(int lineNumber, ElementNode* element)
128
    inline ArrayNode::ArrayNode(const JSTokenLocation& location, ElementNode* element)
128
        : ExpressionNode(lineNumber)
129
        : ExpressionNode(location)
129
        , m_element(element)
130
        , m_element(element)
130
        , m_elision(0)
131
        , m_elision(0)
131
        , m_optional(false)
132
        , m_optional(false)
132
    {
133
    {
133
    }
134
    }
134
135
135
    inline ArrayNode::ArrayNode(int lineNumber, int elision, ElementNode* element)
136
    inline ArrayNode::ArrayNode(const JSTokenLocation& location, int elision, ElementNode* element)
136
        : ExpressionNode(lineNumber)
137
        : ExpressionNode(location)
137
        , m_element(element)
138
        , m_element(element)
138
        , m_elision(elision)
139
        , m_elision(elision)
139
        , m_optional(true)
140
        , m_optional(true)
Lines 154-210 namespace JSC { a/Source/JavaScriptCore/parser/NodeConstructors.h_sec3
154
    {
155
    {
155
    }
156
    }
156
157
157
    inline PropertyListNode::PropertyListNode(int lineNumber, PropertyNode* node)
158
    inline PropertyListNode::PropertyListNode(const JSTokenLocation& location, PropertyNode* node)
158
        : Node(lineNumber)
159
        : Node(location)
159
        , m_node(node)
160
        , m_node(node)
160
        , m_next(0)
161
        , m_next(0)
161
    {
162
    {
162
    }
163
    }
163
164
164
    inline PropertyListNode::PropertyListNode(int lineNumber, PropertyNode* node, PropertyListNode* list)
165
    inline PropertyListNode::PropertyListNode(const JSTokenLocation& location, PropertyNode* node, PropertyListNode* list)
165
        : Node(lineNumber)
166
        : Node(location)
166
        , m_node(node)
167
        , m_node(node)
167
        , m_next(0)
168
        , m_next(0)
168
    {
169
    {
169
        list->m_next = this;
170
        list->m_next = this;
170
    }
171
    }
171
172
172
    inline ObjectLiteralNode::ObjectLiteralNode(int lineNumber)
173
    inline ObjectLiteralNode::ObjectLiteralNode(const JSTokenLocation& location)
173
        : ExpressionNode(lineNumber)
174
        : ExpressionNode(location)
174
        , m_list(0)
175
        , m_list(0)
175
    {
176
    {
176
    }
177
    }
177
178
178
    inline ObjectLiteralNode::ObjectLiteralNode(int lineNumber, PropertyListNode* list)
179
    inline ObjectLiteralNode::ObjectLiteralNode(const JSTokenLocation& location, PropertyListNode* list)
179
        : ExpressionNode(lineNumber)
180
        : ExpressionNode(location)
180
        , m_list(list)
181
        , m_list(list)
181
    {
182
    {
182
    }
183
    }
183
184
184
    inline BracketAccessorNode::BracketAccessorNode(int lineNumber, ExpressionNode* base, ExpressionNode* subscript, bool subscriptHasAssignments)
185
    inline BracketAccessorNode::BracketAccessorNode(const JSTokenLocation& location, ExpressionNode* base, ExpressionNode* subscript, bool subscriptHasAssignments)
185
        : ExpressionNode(lineNumber)
186
        : ExpressionNode(location)
186
        , m_base(base)
187
        , m_base(base)
187
        , m_subscript(subscript)
188
        , m_subscript(subscript)
188
        , m_subscriptHasAssignments(subscriptHasAssignments)
189
        , m_subscriptHasAssignments(subscriptHasAssignments)
189
    {
190
    {
190
    }
191
    }
191
192
192
    inline DotAccessorNode::DotAccessorNode(int lineNumber, ExpressionNode* base, const Identifier& ident)
193
    inline DotAccessorNode::DotAccessorNode(const JSTokenLocation& location, ExpressionNode* base, const Identifier& ident)
193
        : ExpressionNode(lineNumber)
194
        : ExpressionNode(location)
194
        , m_base(base)
195
        , m_base(base)
195
        , m_ident(ident)
196
        , m_ident(ident)
196
    {
197
    {
197
    }
198
    }
198
199
199
    inline ArgumentListNode::ArgumentListNode(int lineNumber, ExpressionNode* expr)
200
    inline ArgumentListNode::ArgumentListNode(const JSTokenLocation& location, ExpressionNode* expr)
200
        : Node(lineNumber)
201
        : Node(location)
201
        , m_next(0)
202
        , m_next(0)
202
        , m_expr(expr)
203
        , m_expr(expr)
203
    {
204
    {
204
    }
205
    }
205
206
206
    inline ArgumentListNode::ArgumentListNode(int lineNumber, ArgumentListNode* listNode, ExpressionNode* expr)
207
    inline ArgumentListNode::ArgumentListNode(const JSTokenLocation& location, ArgumentListNode* listNode, ExpressionNode* expr)
207
        : Node(lineNumber)
208
        : Node(location)
208
        , m_next(0)
209
        , m_next(0)
209
        , m_expr(expr)
210
        , m_expr(expr)
210
    {
211
    {
Lines 221-265 namespace JSC { a/Source/JavaScriptCore/parser/NodeConstructors.h_sec4
221
    {
222
    {
222
    }
223
    }
223
224
224
    inline NewExprNode::NewExprNode(int lineNumber, ExpressionNode* expr)
225
    inline NewExprNode::NewExprNode(const JSTokenLocation& location, ExpressionNode* expr)
225
        : ExpressionNode(lineNumber)
226
        : ExpressionNode(location)
226
        , m_expr(expr)
227
        , m_expr(expr)
227
        , m_args(0)
228
        , m_args(0)
228
    {
229
    {
229
    }
230
    }
230
231
231
    inline NewExprNode::NewExprNode(int lineNumber, ExpressionNode* expr, ArgumentsNode* args)
232
    inline NewExprNode::NewExprNode(const JSTokenLocation& location, ExpressionNode* expr, ArgumentsNode* args)
232
        : ExpressionNode(lineNumber)
233
        : ExpressionNode(location)
233
        , m_expr(expr)
234
        , m_expr(expr)
234
        , m_args(args)
235
        , m_args(args)
235
    {
236
    {
236
    }
237
    }
237
238
238
    inline EvalFunctionCallNode::EvalFunctionCallNode(int lineNumber, ArgumentsNode* args, unsigned divot, unsigned startOffset, unsigned endOffset)
239
    inline EvalFunctionCallNode::EvalFunctionCallNode(const JSTokenLocation& location, ArgumentsNode* args, unsigned divot, unsigned startOffset, unsigned endOffset)
239
        : ExpressionNode(lineNumber)
240
        : ExpressionNode(location)
240
        , ThrowableExpressionData(divot, startOffset, endOffset)
241
        , ThrowableExpressionData(divot, startOffset, endOffset)
241
        , m_args(args)
242
        , m_args(args)
242
    {
243
    {
243
    }
244
    }
244
245
245
    inline FunctionCallValueNode::FunctionCallValueNode(int lineNumber, ExpressionNode* expr, ArgumentsNode* args, unsigned divot, unsigned startOffset, unsigned endOffset)
246
    inline FunctionCallValueNode::FunctionCallValueNode(const JSTokenLocation& location, ExpressionNode* expr, ArgumentsNode* args, unsigned divot, unsigned startOffset, unsigned endOffset)
246
        : ExpressionNode(lineNumber)
247
        : ExpressionNode(location)
247
        , ThrowableExpressionData(divot, startOffset, endOffset)
248
        , ThrowableExpressionData(divot, startOffset, endOffset)
248
        , m_expr(expr)
249
        , m_expr(expr)
249
        , m_args(args)
250
        , m_args(args)
250
    {
251
    {
251
    }
252
    }
252
253
253
    inline FunctionCallResolveNode::FunctionCallResolveNode(int lineNumber, const Identifier& ident, ArgumentsNode* args, unsigned divot, unsigned startOffset, unsigned endOffset)
254
    inline FunctionCallResolveNode::FunctionCallResolveNode(const JSTokenLocation& location, const Identifier& ident, ArgumentsNode* args, unsigned divot, unsigned startOffset, unsigned endOffset)
254
        : ExpressionNode(lineNumber)
255
        : ExpressionNode(location)
255
        , ThrowableExpressionData(divot, startOffset, endOffset)
256
        , ThrowableExpressionData(divot, startOffset, endOffset)
256
        , m_ident(ident)
257
        , m_ident(ident)
257
        , m_args(args)
258
        , m_args(args)
258
    {
259
    {
259
    }
260
    }
260
261
261
    inline FunctionCallBracketNode::FunctionCallBracketNode(int lineNumber, ExpressionNode* base, ExpressionNode* subscript, ArgumentsNode* args, unsigned divot, unsigned startOffset, unsigned endOffset)
262
    inline FunctionCallBracketNode::FunctionCallBracketNode(const JSTokenLocation& location, ExpressionNode* base, ExpressionNode* subscript, ArgumentsNode* args, unsigned divot, unsigned startOffset, unsigned endOffset)
262
        : ExpressionNode(lineNumber)
263
        : ExpressionNode(location)
263
        , ThrowableSubExpressionData(divot, startOffset, endOffset)
264
        , ThrowableSubExpressionData(divot, startOffset, endOffset)
264
        , m_base(base)
265
        , m_base(base)
265
        , m_subscript(subscript)
266
        , m_subscript(subscript)
Lines 267-274 namespace JSC { a/Source/JavaScriptCore/parser/NodeConstructors.h_sec5
267
    {
268
    {
268
    }
269
    }
269
270
270
    inline FunctionCallDotNode::FunctionCallDotNode(int lineNumber, ExpressionNode* base, const Identifier& ident, ArgumentsNode* args, unsigned divot, unsigned startOffset, unsigned endOffset)
271
    inline FunctionCallDotNode::FunctionCallDotNode(const JSTokenLocation& location, ExpressionNode* base, const Identifier& ident, ArgumentsNode* args, unsigned divot, unsigned startOffset, unsigned endOffset)
271
        : ExpressionNode(lineNumber)
272
        : ExpressionNode(location)
272
        , ThrowableSubExpressionData(divot, startOffset, endOffset)
273
        , ThrowableSubExpressionData(divot, startOffset, endOffset)
273
        , m_base(base)
274
        , m_base(base)
274
        , m_ident(ident)
275
        , m_ident(ident)
Lines 276-306 namespace JSC { a/Source/JavaScriptCore/parser/NodeConstructors.h_sec6
276
    {
277
    {
277
    }
278
    }
278
279
279
    inline CallFunctionCallDotNode::CallFunctionCallDotNode(int lineNumber, ExpressionNode* base, const Identifier& ident, ArgumentsNode* args, unsigned divot, unsigned startOffset, unsigned endOffset)
280
    inline CallFunctionCallDotNode::CallFunctionCallDotNode(const JSTokenLocation& location, ExpressionNode* base, const Identifier& ident, ArgumentsNode* args, unsigned divot, unsigned startOffset, unsigned endOffset)
280
        : FunctionCallDotNode(lineNumber, base, ident, args, divot, startOffset, endOffset)
281
        : FunctionCallDotNode(location, base, ident, args, divot, startOffset, endOffset)
281
    {
282
    {
282
    }
283
    }
283
284
284
    inline ApplyFunctionCallDotNode::ApplyFunctionCallDotNode(int lineNumber, ExpressionNode* base, const Identifier& ident, ArgumentsNode* args, unsigned divot, unsigned startOffset, unsigned endOffset)
285
    inline ApplyFunctionCallDotNode::ApplyFunctionCallDotNode(const JSTokenLocation& location, ExpressionNode* base, const Identifier& ident, ArgumentsNode* args, unsigned divot, unsigned startOffset, unsigned endOffset)
285
        : FunctionCallDotNode(lineNumber, base, ident, args, divot, startOffset, endOffset)
286
        : FunctionCallDotNode(location, base, ident, args, divot, startOffset, endOffset)
286
    {
287
    {
287
    }
288
    }
288
289
289
    inline PrePostResolveNode::PrePostResolveNode(int lineNumber, const Identifier& ident, unsigned divot, unsigned startOffset, unsigned endOffset)
290
    inline PrePostResolveNode::PrePostResolveNode(const JSTokenLocation& location, const Identifier& ident, unsigned divot, unsigned startOffset, unsigned endOffset)
290
        : ExpressionNode(lineNumber, ResultType::numberType()) // could be reusable for pre?
291
        : ExpressionNode(location, ResultType::numberType()) // could be reusable for pre?
291
        , ThrowableExpressionData(divot, startOffset, endOffset)
292
        , ThrowableExpressionData(divot, startOffset, endOffset)
292
        , m_ident(ident)
293
        , m_ident(ident)
293
    {
294
    {
294
    }
295
    }
295
296
296
    inline PostfixResolveNode::PostfixResolveNode(int lineNumber, const Identifier& ident, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset)
297
    inline PostfixResolveNode::PostfixResolveNode(const JSTokenLocation& location, const Identifier& ident, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset)
297
        : PrePostResolveNode(lineNumber, ident, divot, startOffset, endOffset)
298
        : PrePostResolveNode(location, ident, divot, startOffset, endOffset)
298
        , m_operator(oper)
299
        , m_operator(oper)
299
    {
300
    {
300
    }
301
    }
301
302
302
    inline PostfixBracketNode::PostfixBracketNode(int lineNumber, ExpressionNode* base, ExpressionNode* subscript, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset)
303
    inline PostfixBracketNode::PostfixBracketNode(const JSTokenLocation& location, ExpressionNode* base, ExpressionNode* subscript, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset)
303
        : ExpressionNode(lineNumber)
304
        : ExpressionNode(location)
304
        , ThrowableSubExpressionData(divot, startOffset, endOffset)
305
        , ThrowableSubExpressionData(divot, startOffset, endOffset)
305
        , m_base(base)
306
        , m_base(base)
306
        , m_subscript(subscript)
307
        , m_subscript(subscript)
Lines 308-315 namespace JSC { a/Source/JavaScriptCore/parser/NodeConstructors.h_sec7
308
    {
309
    {
309
    }
310
    }
310
311
311
    inline PostfixDotNode::PostfixDotNode(int lineNumber, ExpressionNode* base, const Identifier& ident, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset)
312
    inline PostfixDotNode::PostfixDotNode(const JSTokenLocation& location, ExpressionNode* base, const Identifier& ident, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset)
312
        : ExpressionNode(lineNumber)
313
        : ExpressionNode(location)
313
        , ThrowableSubExpressionData(divot, startOffset, endOffset)
314
        , ThrowableSubExpressionData(divot, startOffset, endOffset)
314
        , m_base(base)
315
        , m_base(base)
315
        , m_ident(ident)
316
        , m_ident(ident)
Lines 317-384 namespace JSC { a/Source/JavaScriptCore/parser/NodeConstructors.h_sec8
317
    {
318
    {
318
    }
319
    }
319
320
320
    inline PostfixErrorNode::PostfixErrorNode(int lineNumber, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset)
321
    inline PostfixErrorNode::PostfixErrorNode(const JSTokenLocation& location, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset)
321
        : ExpressionNode(lineNumber)
322
        : ExpressionNode(location)
322
        , ThrowableSubExpressionData(divot, startOffset, endOffset)
323
        , ThrowableSubExpressionData(divot, startOffset, endOffset)
323
        , m_operator(oper)
324
        , m_operator(oper)
324
    {
325
    {
325
    }
326
    }
326
327
327
    inline DeleteResolveNode::DeleteResolveNode(int lineNumber, const Identifier& ident, unsigned divot, unsigned startOffset, unsigned endOffset)
328
    inline DeleteResolveNode::DeleteResolveNode(const JSTokenLocation& location, const Identifier& ident, unsigned divot, unsigned startOffset, unsigned endOffset)
328
        : ExpressionNode(lineNumber)
329
        : ExpressionNode(location)
329
        , ThrowableExpressionData(divot, startOffset, endOffset)
330
        , ThrowableExpressionData(divot, startOffset, endOffset)
330
        , m_ident(ident)
331
        , m_ident(ident)
331
    {
332
    {
332
    }
333
    }
333
334
334
    inline DeleteBracketNode::DeleteBracketNode(int lineNumber, ExpressionNode* base, ExpressionNode* subscript, unsigned divot, unsigned startOffset, unsigned endOffset)
335
    inline DeleteBracketNode::DeleteBracketNode(const JSTokenLocation& location, ExpressionNode* base, ExpressionNode* subscript, unsigned divot, unsigned startOffset, unsigned endOffset)
335
        : ExpressionNode(lineNumber)
336
        : ExpressionNode(location)
336
        , ThrowableExpressionData(divot, startOffset, endOffset)
337
        , ThrowableExpressionData(divot, startOffset, endOffset)
337
        , m_base(base)
338
        , m_base(base)
338
        , m_subscript(subscript)
339
        , m_subscript(subscript)
339
    {
340
    {
340
    }
341
    }
341
342
342
    inline DeleteDotNode::DeleteDotNode(int lineNumber, ExpressionNode* base, const Identifier& ident, unsigned divot, unsigned startOffset, unsigned endOffset)
343
    inline DeleteDotNode::DeleteDotNode(const JSTokenLocation& location, ExpressionNode* base, const Identifier& ident, unsigned divot, unsigned startOffset, unsigned endOffset)
343
        : ExpressionNode(lineNumber)
344
        : ExpressionNode(location)
344
        , ThrowableExpressionData(divot, startOffset, endOffset)
345
        , ThrowableExpressionData(divot, startOffset, endOffset)
345
        , m_base(base)
346
        , m_base(base)
346
        , m_ident(ident)
347
        , m_ident(ident)
347
    {
348
    {
348
    }
349
    }
349
350
350
    inline DeleteValueNode::DeleteValueNode(int lineNumber, ExpressionNode* expr)
351
    inline DeleteValueNode::DeleteValueNode(const JSTokenLocation& location, ExpressionNode* expr)
351
        : ExpressionNode(lineNumber)
352
        : ExpressionNode(location)
352
        , m_expr(expr)
353
        , m_expr(expr)
353
    {
354
    {
354
    }
355
    }
355
356
356
    inline VoidNode::VoidNode(int lineNumber, ExpressionNode* expr)
357
    inline VoidNode::VoidNode(const JSTokenLocation& location, ExpressionNode* expr)
357
        : ExpressionNode(lineNumber)
358
        : ExpressionNode(location)
358
        , m_expr(expr)
359
        , m_expr(expr)
359
    {
360
    {
360
    }
361
    }
361
362
362
    inline TypeOfResolveNode::TypeOfResolveNode(int lineNumber, const Identifier& ident)
363
    inline TypeOfResolveNode::TypeOfResolveNode(const JSTokenLocation& location, const Identifier& ident)
363
        : ExpressionNode(lineNumber, ResultType::stringType())
364
        : ExpressionNode(location, ResultType::stringType())
364
        , m_ident(ident)
365
        , m_ident(ident)
365
    {
366
    {
366
    }
367
    }
367
368
368
    inline TypeOfValueNode::TypeOfValueNode(int lineNumber, ExpressionNode* expr)
369
    inline TypeOfValueNode::TypeOfValueNode(const JSTokenLocation& location, ExpressionNode* expr)
369
        : ExpressionNode(lineNumber, ResultType::stringType())
370
        : ExpressionNode(location, ResultType::stringType())
370
        , m_expr(expr)
371
        , m_expr(expr)
371
    {
372
    {
372
    }
373
    }
373
374
374
    inline PrefixResolveNode::PrefixResolveNode(int lineNumber, const Identifier& ident, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset)
375
    inline PrefixResolveNode::PrefixResolveNode(const JSTokenLocation& location, const Identifier& ident, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset)
375
        : PrePostResolveNode(lineNumber, ident, divot, startOffset, endOffset)
376
        : PrePostResolveNode(location, ident, divot, startOffset, endOffset)
376
        , m_operator(oper)
377
        , m_operator(oper)
377
    {
378
    {
378
    }
379
    }
379
380
380
    inline PrefixBracketNode::PrefixBracketNode(int lineNumber, ExpressionNode* base, ExpressionNode* subscript, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset)
381
    inline PrefixBracketNode::PrefixBracketNode(const JSTokenLocation& location, ExpressionNode* base, ExpressionNode* subscript, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset)
381
        : ExpressionNode(lineNumber)
382
        : ExpressionNode(location)
382
        , ThrowablePrefixedSubExpressionData(divot, startOffset, endOffset)
383
        , ThrowablePrefixedSubExpressionData(divot, startOffset, endOffset)
383
        , m_base(base)
384
        , m_base(base)
384
        , m_subscript(subscript)
385
        , m_subscript(subscript)
Lines 386-393 namespace JSC { a/Source/JavaScriptCore/parser/NodeConstructors.h_sec9
386
    {
387
    {
387
    }
388
    }
388
389
389
    inline PrefixDotNode::PrefixDotNode(int lineNumber, ExpressionNode* base, const Identifier& ident, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset)
390
    inline PrefixDotNode::PrefixDotNode(const JSTokenLocation& location, ExpressionNode* base, const Identifier& ident, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset)
390
        : ExpressionNode(lineNumber)
391
        : ExpressionNode(location)
391
        , ThrowablePrefixedSubExpressionData(divot, startOffset, endOffset)
392
        , ThrowablePrefixedSubExpressionData(divot, startOffset, endOffset)
392
        , m_base(base)
393
        , m_base(base)
393
        , m_ident(ident)
394
        , m_ident(ident)
Lines 395-437 namespace JSC { a/Source/JavaScriptCore/parser/NodeConstructors.h_sec10
395
    {
396
    {
396
    }
397
    }
397
398
398
    inline PrefixErrorNode::PrefixErrorNode(int lineNumber, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset)
399
    inline PrefixErrorNode::PrefixErrorNode(const JSTokenLocation& location, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset)
399
        : ExpressionNode(lineNumber)
400
        : ExpressionNode(location)
400
        , ThrowableExpressionData(divot, startOffset, endOffset)
401
        , ThrowableExpressionData(divot, startOffset, endOffset)
401
        , m_operator(oper)
402
        , m_operator(oper)
402
    {
403
    {
403
    }
404
    }
404
405
405
    inline UnaryOpNode::UnaryOpNode(int lineNumber, ResultType type, ExpressionNode* expr, OpcodeID opcodeID)
406
    inline UnaryOpNode::UnaryOpNode(const JSTokenLocation& location, ResultType type, ExpressionNode* expr, OpcodeID opcodeID)
406
        : ExpressionNode(lineNumber, type)
407
        : ExpressionNode(location, type)
407
        , m_expr(expr)
408
        , m_expr(expr)
408
        , m_opcodeID(opcodeID)
409
        , m_opcodeID(opcodeID)
409
    {
410
    {
410
    }
411
    }
411
412
412
    inline UnaryPlusNode::UnaryPlusNode(int lineNumber, ExpressionNode* expr)
413
    inline UnaryPlusNode::UnaryPlusNode(const JSTokenLocation& location, ExpressionNode* expr)
413
        : UnaryOpNode(lineNumber, ResultType::numberType(), expr, op_to_jsnumber)
414
        : UnaryOpNode(location, ResultType::numberType(), expr, op_to_jsnumber)
414
    {
415
    {
415
    }
416
    }
416
417
417
    inline NegateNode::NegateNode(int lineNumber, ExpressionNode* expr)
418
    inline NegateNode::NegateNode(const JSTokenLocation& location, ExpressionNode* expr)
418
        : UnaryOpNode(lineNumber, ResultType::numberType(), expr, op_negate)
419
        : UnaryOpNode(location, ResultType::numberType(), expr, op_negate)
419
    {
420
    {
420
    }
421
    }
421
422
422
    inline BitwiseNotNode::BitwiseNotNode(int lineNumber, ExpressionNode* expr)
423
    inline BitwiseNotNode::BitwiseNotNode(const JSTokenLocation& location, ExpressionNode* expr)
423
        : ExpressionNode(lineNumber, ResultType::forBitOp())
424
        : ExpressionNode(location, ResultType::forBitOp())
424
        , m_expr(expr)
425
        , m_expr(expr)
425
    {
426
    {
426
    }
427
    }
427
428
428
    inline LogicalNotNode::LogicalNotNode(int lineNumber, ExpressionNode* expr)
429
    inline LogicalNotNode::LogicalNotNode(const JSTokenLocation& location, ExpressionNode* expr)
429
        : UnaryOpNode(lineNumber, ResultType::booleanType(), expr, op_not)
430
        : UnaryOpNode(location, ResultType::booleanType(), expr, op_not)
430
    {
431
    {
431
    }
432
    }
432
433
433
    inline BinaryOpNode::BinaryOpNode(int lineNumber, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID opcodeID, bool rightHasAssignments)
434
    inline BinaryOpNode::BinaryOpNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID opcodeID, bool rightHasAssignments)
434
        : ExpressionNode(lineNumber)
435
        : ExpressionNode(location)
435
        , m_expr1(expr1)
436
        , m_expr1(expr1)
436
        , m_expr2(expr2)
437
        , m_expr2(expr2)
437
        , m_opcodeID(opcodeID)
438
        , m_opcodeID(opcodeID)
Lines 439-446 namespace JSC { a/Source/JavaScriptCore/parser/NodeConstructors.h_sec11
439
    {
440
    {
440
    }
441
    }
441
442
442
    inline BinaryOpNode::BinaryOpNode(int lineNumber, ResultType type, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID opcodeID, bool rightHasAssignments)
443
    inline BinaryOpNode::BinaryOpNode(const JSTokenLocation& location, ResultType type, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID opcodeID, bool rightHasAssignments)
443
        : ExpressionNode(lineNumber, type)
444
        : ExpressionNode(location, type)
444
        , m_expr1(expr1)
445
        , m_expr1(expr1)
445
        , m_expr2(expr2)
446
        , m_expr2(expr2)
446
        , m_opcodeID(opcodeID)
447
        , m_opcodeID(opcodeID)
Lines 448-587 namespace JSC { a/Source/JavaScriptCore/parser/NodeConstructors.h_sec12
448
    {
449
    {
449
    }
450
    }
450
451
451
    inline MultNode::MultNode(int lineNumber, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
452
    inline MultNode::MultNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
452
        : BinaryOpNode(lineNumber, ResultType::numberType(), expr1, expr2, op_mul, rightHasAssignments)
453
        : BinaryOpNode(location, ResultType::numberType(), expr1, expr2, op_mul, rightHasAssignments)
453
    {
454
    {
454
    }
455
    }
455
456
456
    inline DivNode::DivNode(int lineNumber, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
457
    inline DivNode::DivNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
457
        : BinaryOpNode(lineNumber, ResultType::numberType(), expr1, expr2, op_div, rightHasAssignments)
458
        : BinaryOpNode(location, ResultType::numberType(), expr1, expr2, op_div, rightHasAssignments)
458
    {
459
    {
459
    }
460
    }
460
461
461
462
462
    inline ModNode::ModNode(int lineNumber, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
463
    inline ModNode::ModNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
463
        : BinaryOpNode(lineNumber, ResultType::numberType(), expr1, expr2, op_mod, rightHasAssignments)
464
        : BinaryOpNode(location, ResultType::numberType(), expr1, expr2, op_mod, rightHasAssignments)
464
    {
465
    {
465
    }
466
    }
466
467
467
    inline AddNode::AddNode(int lineNumber, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
468
    inline AddNode::AddNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
468
        : BinaryOpNode(lineNumber, ResultType::forAdd(expr1->resultDescriptor(), expr2->resultDescriptor()), expr1, expr2, op_add, rightHasAssignments)
469
        : BinaryOpNode(location, ResultType::forAdd(expr1->resultDescriptor(), expr2->resultDescriptor()), expr1, expr2, op_add, rightHasAssignments)
469
    {
470
    {
470
    }
471
    }
471
472
472
    inline SubNode::SubNode(int lineNumber, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
473
    inline SubNode::SubNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
473
        : BinaryOpNode(lineNumber, ResultType::numberType(), expr1, expr2, op_sub, rightHasAssignments)
474
        : BinaryOpNode(location, ResultType::numberType(), expr1, expr2, op_sub, rightHasAssignments)
474
    {
475
    {
475
    }
476
    }
476
477
477
    inline LeftShiftNode::LeftShiftNode(int lineNumber, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
478
    inline LeftShiftNode::LeftShiftNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
478
        : BinaryOpNode(lineNumber, ResultType::forBitOp(), expr1, expr2, op_lshift, rightHasAssignments)
479
        : BinaryOpNode(location, ResultType::forBitOp(), expr1, expr2, op_lshift, rightHasAssignments)
479
    {
480
    {
480
    }
481
    }
481
482
482
    inline RightShiftNode::RightShiftNode(int lineNumber, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
483
    inline RightShiftNode::RightShiftNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
483
        : BinaryOpNode(lineNumber, ResultType::forBitOp(), expr1, expr2, op_rshift, rightHasAssignments)
484
        : BinaryOpNode(location, ResultType::forBitOp(), expr1, expr2, op_rshift, rightHasAssignments)
484
    {
485
    {
485
    }
486
    }
486
487
487
    inline UnsignedRightShiftNode::UnsignedRightShiftNode(int lineNumber, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
488
    inline UnsignedRightShiftNode::UnsignedRightShiftNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
488
        : BinaryOpNode(lineNumber, ResultType::numberType(), expr1, expr2, op_urshift, rightHasAssignments)
489
        : BinaryOpNode(location, ResultType::numberType(), expr1, expr2, op_urshift, rightHasAssignments)
489
    {
490
    {
490
    }
491
    }
491
492
492
    inline LessNode::LessNode(int lineNumber, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
493
    inline LessNode::LessNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
493
        : BinaryOpNode(lineNumber, ResultType::booleanType(), expr1, expr2, op_less, rightHasAssignments)
494
        : BinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_less, rightHasAssignments)
494
    {
495
    {
495
    }
496
    }
496
497
497
    inline GreaterNode::GreaterNode(int lineNumber, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
498
    inline GreaterNode::GreaterNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
498
        : BinaryOpNode(lineNumber, ResultType::booleanType(), expr1, expr2, op_greater, rightHasAssignments)
499
        : BinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_greater, rightHasAssignments)
499
    {
500
    {
500
    }
501
    }
501
502
502
    inline LessEqNode::LessEqNode(int lineNumber, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
503
    inline LessEqNode::LessEqNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
503
        : BinaryOpNode(lineNumber, ResultType::booleanType(), expr1, expr2, op_lesseq, rightHasAssignments)
504
        : BinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_lesseq, rightHasAssignments)
504
    {
505
    {
505
    }
506
    }
506
507
507
    inline GreaterEqNode::GreaterEqNode(int lineNumber, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
508
    inline GreaterEqNode::GreaterEqNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
508
        : BinaryOpNode(lineNumber, ResultType::booleanType(), expr1, expr2, op_greatereq, rightHasAssignments)
509
        : BinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_greatereq, rightHasAssignments)
509
    {
510
    {
510
    }
511
    }
511
512
512
    inline ThrowableBinaryOpNode::ThrowableBinaryOpNode(int lineNumber, ResultType type, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID opcodeID, bool rightHasAssignments)
513
    inline ThrowableBinaryOpNode::ThrowableBinaryOpNode(const JSTokenLocation& location, ResultType type, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID opcodeID, bool rightHasAssignments)
513
        : BinaryOpNode(lineNumber, type, expr1, expr2, opcodeID, rightHasAssignments)
514
        : BinaryOpNode(location, type, expr1, expr2, opcodeID, rightHasAssignments)
514
    {
515
    {
515
    }
516
    }
516
517
517
    inline ThrowableBinaryOpNode::ThrowableBinaryOpNode(int lineNumber, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID opcodeID, bool rightHasAssignments)
518
    inline ThrowableBinaryOpNode::ThrowableBinaryOpNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID opcodeID, bool rightHasAssignments)
518
        : BinaryOpNode(lineNumber, expr1, expr2, opcodeID, rightHasAssignments)
519
        : BinaryOpNode(location, expr1, expr2, opcodeID, rightHasAssignments)
519
    {
520
    {
520
    }
521
    }
521
522
522
    inline InstanceOfNode::InstanceOfNode(int lineNumber, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
523
    inline InstanceOfNode::InstanceOfNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
523
        : ThrowableBinaryOpNode(lineNumber, ResultType::booleanType(), expr1, expr2, op_instanceof, rightHasAssignments)
524
        : ThrowableBinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_instanceof, rightHasAssignments)
524
    {
525
    {
525
    }
526
    }
526
527
527
    inline InNode::InNode(int lineNumber, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
528
    inline InNode::InNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
528
        : ThrowableBinaryOpNode(lineNumber, expr1, expr2, op_in, rightHasAssignments)
529
        : ThrowableBinaryOpNode(location, expr1, expr2, op_in, rightHasAssignments)
529
    {
530
    {
530
    }
531
    }
531
532
532
    inline EqualNode::EqualNode(int lineNumber, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
533
    inline EqualNode::EqualNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
533
        : BinaryOpNode(lineNumber, ResultType::booleanType(), expr1, expr2, op_eq, rightHasAssignments)
534
        : BinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_eq, rightHasAssignments)
534
    {
535
    {
535
    }
536
    }
536
537
537
    inline NotEqualNode::NotEqualNode(int lineNumber, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
538
    inline NotEqualNode::NotEqualNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
538
        : BinaryOpNode(lineNumber, ResultType::booleanType(), expr1, expr2, op_neq, rightHasAssignments)
539
        : BinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_neq, rightHasAssignments)
539
    {
540
    {
540
    }
541
    }
541
542
542
    inline StrictEqualNode::StrictEqualNode(int lineNumber, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
543
    inline StrictEqualNode::StrictEqualNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
543
        : BinaryOpNode(lineNumber, ResultType::booleanType(), expr1, expr2, op_stricteq, rightHasAssignments)
544
        : BinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_stricteq, rightHasAssignments)
544
    {
545
    {
545
    }
546
    }
546
547
547
    inline NotStrictEqualNode::NotStrictEqualNode(int lineNumber, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
548
    inline NotStrictEqualNode::NotStrictEqualNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
548
        : BinaryOpNode(lineNumber, ResultType::booleanType(), expr1, expr2, op_nstricteq, rightHasAssignments)
549
        : BinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_nstricteq, rightHasAssignments)
549
    {
550
    {
550
    }
551
    }
551
552
552
    inline BitAndNode::BitAndNode(int lineNumber, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
553
    inline BitAndNode::BitAndNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
553
        : BinaryOpNode(lineNumber, ResultType::forBitOp(), expr1, expr2, op_bitand, rightHasAssignments)
554
        : BinaryOpNode(location, ResultType::forBitOp(), expr1, expr2, op_bitand, rightHasAssignments)
554
    {
555
    {
555
    }
556
    }
556
557
557
    inline BitOrNode::BitOrNode(int lineNumber, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
558
    inline BitOrNode::BitOrNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
558
        : BinaryOpNode(lineNumber, ResultType::forBitOp(), expr1, expr2, op_bitor, rightHasAssignments)
559
        : BinaryOpNode(location, ResultType::forBitOp(), expr1, expr2, op_bitor, rightHasAssignments)
559
    {
560
    {
560
    }
561
    }
561
562
562
    inline BitXOrNode::BitXOrNode(int lineNumber, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
563
    inline BitXOrNode::BitXOrNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
563
        : BinaryOpNode(lineNumber, ResultType::forBitOp(), expr1, expr2, op_bitxor, rightHasAssignments)
564
        : BinaryOpNode(location, ResultType::forBitOp(), expr1, expr2, op_bitxor, rightHasAssignments)
564
    {
565
    {
565
    }
566
    }
566
567
567
    inline LogicalOpNode::LogicalOpNode(int lineNumber, ExpressionNode* expr1, ExpressionNode* expr2, LogicalOperator oper)
568
    inline LogicalOpNode::LogicalOpNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, LogicalOperator oper)
568
        : ExpressionNode(lineNumber, ResultType::booleanType())
569
        : ExpressionNode(location, ResultType::booleanType())
569
        , m_expr1(expr1)
570
        , m_expr1(expr1)
570
        , m_expr2(expr2)
571
        , m_expr2(expr2)
571
        , m_operator(oper)
572
        , m_operator(oper)
572
    {
573
    {
573
    }
574
    }
574
575
575
    inline ConditionalNode::ConditionalNode(int lineNumber, ExpressionNode* logical, ExpressionNode* expr1, ExpressionNode* expr2)
576
    inline ConditionalNode::ConditionalNode(const JSTokenLocation& location, ExpressionNode* logical, ExpressionNode* expr1, ExpressionNode* expr2)
576
        : ExpressionNode(lineNumber)
577
        : ExpressionNode(location)
577
        , m_logical(logical)
578
        , m_logical(logical)
578
        , m_expr1(expr1)
579
        , m_expr1(expr1)
579
        , m_expr2(expr2)
580
        , m_expr2(expr2)
580
    {
581
    {
581
    }
582
    }
582
583
583
    inline ReadModifyResolveNode::ReadModifyResolveNode(int lineNumber, const Identifier& ident, Operator oper, ExpressionNode*  right, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset)
584
    inline ReadModifyResolveNode::ReadModifyResolveNode(const JSTokenLocation& location, const Identifier& ident, Operator oper, ExpressionNode*  right, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset)
584
        : ExpressionNode(lineNumber)
585
        : ExpressionNode(location)
585
        , ThrowableExpressionData(divot, startOffset, endOffset)
586
        , ThrowableExpressionData(divot, startOffset, endOffset)
586
        , m_ident(ident)
587
        , m_ident(ident)
587
        , m_right(right)
588
        , m_right(right)
Lines 590-604 namespace JSC { a/Source/JavaScriptCore/parser/NodeConstructors.h_sec13
590
    {
591
    {
591
    }
592
    }
592
593
593
    inline AssignResolveNode::AssignResolveNode(int lineNumber, const Identifier& ident, ExpressionNode* right)
594
    inline AssignResolveNode::AssignResolveNode(const JSTokenLocation& location, const Identifier& ident, ExpressionNode* right)
594
        : ExpressionNode(lineNumber)
595
        : ExpressionNode(location)
595
        , m_ident(ident)
596
        , m_ident(ident)
596
        , m_right(right)
597
        , m_right(right)
597
    {
598
    {
598
    }
599
    }
599
600
600
    inline ReadModifyBracketNode::ReadModifyBracketNode(int lineNumber, ExpressionNode* base, ExpressionNode* subscript, Operator oper, ExpressionNode* right, bool subscriptHasAssignments, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset)
601
    inline ReadModifyBracketNode::ReadModifyBracketNode(const JSTokenLocation& location, ExpressionNode* base, ExpressionNode* subscript, Operator oper, ExpressionNode* right, bool subscriptHasAssignments, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset)
601
        : ExpressionNode(lineNumber)
602
        : ExpressionNode(location)
602
        , ThrowableSubExpressionData(divot, startOffset, endOffset)
603
        , ThrowableSubExpressionData(divot, startOffset, endOffset)
603
        , m_base(base)
604
        , m_base(base)
604
        , m_subscript(subscript)
605
        , m_subscript(subscript)
Lines 609-616 namespace JSC { a/Source/JavaScriptCore/parser/NodeConstructors.h_sec14
609
    {
610
    {
610
    }
611
    }
611
612
612
    inline AssignBracketNode::AssignBracketNode(int lineNumber, ExpressionNode* base, ExpressionNode* subscript, ExpressionNode* right, bool subscriptHasAssignments, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset)
613
    inline AssignBracketNode::AssignBracketNode(const JSTokenLocation& location, ExpressionNode* base, ExpressionNode* subscript, ExpressionNode* right, bool subscriptHasAssignments, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset)
613
        : ExpressionNode(lineNumber)
614
        : ExpressionNode(location)
614
        , ThrowableExpressionData(divot, startOffset, endOffset)
615
        , ThrowableExpressionData(divot, startOffset, endOffset)
615
        , m_base(base)
616
        , m_base(base)
616
        , m_subscript(subscript)
617
        , m_subscript(subscript)
Lines 620-627 namespace JSC { a/Source/JavaScriptCore/parser/NodeConstructors.h_sec15
620
    {
621
    {
621
    }
622
    }
622
623
623
    inline AssignDotNode::AssignDotNode(int lineNumber, ExpressionNode* base, const Identifier& ident, ExpressionNode* right, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset)
624
    inline AssignDotNode::AssignDotNode(const JSTokenLocation& location, ExpressionNode* base, const Identifier& ident, ExpressionNode* right, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset)
624
        : ExpressionNode(lineNumber)
625
        : ExpressionNode(location)
625
        , ThrowableExpressionData(divot, startOffset, endOffset)
626
        , ThrowableExpressionData(divot, startOffset, endOffset)
626
        , m_base(base)
627
        , m_base(base)
627
        , m_ident(ident)
628
        , m_ident(ident)
Lines 630-637 namespace JSC { a/Source/JavaScriptCore/parser/NodeConstructors.h_sec16
630
    {
631
    {
631
    }
632
    }
632
633
633
    inline ReadModifyDotNode::ReadModifyDotNode(int lineNumber, ExpressionNode* base, const Identifier& ident, Operator oper, ExpressionNode* right, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset)
634
    inline ReadModifyDotNode::ReadModifyDotNode(const JSTokenLocation& location, ExpressionNode* base, const Identifier& ident, Operator oper, ExpressionNode* right, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset)
634
        : ExpressionNode(lineNumber)
635
        : ExpressionNode(location)
635
        , ThrowableSubExpressionData(divot, startOffset, endOffset)
636
        , ThrowableSubExpressionData(divot, startOffset, endOffset)
636
        , m_base(base)
637
        , m_base(base)
637
        , m_ident(ident)
638
        , m_ident(ident)
Lines 641-661 namespace JSC { a/Source/JavaScriptCore/parser/NodeConstructors.h_sec17
641
    {
642
    {
642
    }
643
    }
643
644
644
    inline AssignErrorNode::AssignErrorNode(int lineNumber, unsigned divot, unsigned startOffset, unsigned endOffset)
645
    inline AssignErrorNode::AssignErrorNode(const JSTokenLocation& location, unsigned divot, unsigned startOffset, unsigned endOffset)
645
        : ExpressionNode(lineNumber)
646
        : ExpressionNode(location)
646
        , ThrowableExpressionData(divot, startOffset, endOffset)
647
        , ThrowableExpressionData(divot, startOffset, endOffset)
647
    {
648
    {
648
    }
649
    }
649
650
650
    inline CommaNode::CommaNode(int lineNumber, ExpressionNode* expr1, ExpressionNode* expr2)
651
    inline CommaNode::CommaNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2)
651
        : ExpressionNode(lineNumber)
652
        : ExpressionNode(location)
652
    {
653
    {
653
        m_expressions.append(expr1);
654
        m_expressions.append(expr1);
654
        m_expressions.append(expr2);
655
        m_expressions.append(expr2);
655
    }
656
    }
656
657
657
    inline ConstStatementNode::ConstStatementNode(int lineNumber, ConstDeclNode* next)
658
    inline ConstStatementNode::ConstStatementNode(const JSTokenLocation& location, ConstDeclNode* next)
658
        : StatementNode(lineNumber)
659
        : StatementNode(location)
659
        , m_next(next)
660
        , m_next(next)
660
    {
661
    {
661
    }
662
    }
Lines 664-720 namespace JSC { a/Source/JavaScriptCore/parser/NodeConstructors.h_sec18
664
    {
665
    {
665
    }
666
    }
666
667
667
    inline EmptyStatementNode::EmptyStatementNode(int lineNumber)
668
    inline EmptyStatementNode::EmptyStatementNode(const JSTokenLocation& location)
668
        : StatementNode(lineNumber)
669
        : StatementNode(location)
669
    {
670
    {
670
    }
671
    }
671
672
672
    inline DebuggerStatementNode::DebuggerStatementNode(int lineNumber)
673
    inline DebuggerStatementNode::DebuggerStatementNode(const JSTokenLocation& location)
673
        : StatementNode(lineNumber)
674
        : StatementNode(location)
674
    {
675
    {
675
    }
676
    }
676
    
677
    
677
    inline ExprStatementNode::ExprStatementNode(int lineNumber, ExpressionNode* expr)
678
    inline ExprStatementNode::ExprStatementNode(const JSTokenLocation& location, ExpressionNode* expr)
678
        : StatementNode(lineNumber)
679
        : StatementNode(location)
679
        , m_expr(expr)
680
        , m_expr(expr)
680
    {
681
    {
681
    }
682
    }
682
683
683
    inline VarStatementNode::VarStatementNode(int lineNumber, ExpressionNode* expr)
684
    inline VarStatementNode::VarStatementNode(const JSTokenLocation& location, ExpressionNode* expr)
684
        : StatementNode(lineNumber)
685
        : StatementNode(location)
685
        , m_expr(expr)
686
        , m_expr(expr)
686
    {
687
    {
687
    }
688
    }
688
    
689
    
689
    inline IfNode::IfNode(int lineNumber, ExpressionNode* condition, StatementNode* ifBlock)
690
    inline IfNode::IfNode(const JSTokenLocation& location, ExpressionNode* condition, StatementNode* ifBlock)
690
        : StatementNode(lineNumber)
691
        : StatementNode(location)
691
        , m_condition(condition)
692
        , m_condition(condition)
692
        , m_ifBlock(ifBlock)
693
        , m_ifBlock(ifBlock)
693
    {
694
    {
694
    }
695
    }
695
696
696
    inline IfElseNode::IfElseNode(int lineNumber, ExpressionNode* condition, StatementNode* ifBlock, StatementNode* elseBlock)
697
    inline IfElseNode::IfElseNode(const JSTokenLocation& location, ExpressionNode* condition, StatementNode* ifBlock, StatementNode* elseBlock)
697
        : IfNode(lineNumber, condition, ifBlock)
698
        : IfNode(location, condition, ifBlock)
698
        , m_elseBlock(elseBlock)
699
        , m_elseBlock(elseBlock)
699
    {
700
    {
700
    }
701
    }
701
702
702
    inline DoWhileNode::DoWhileNode(int lineNumber, StatementNode* statement, ExpressionNode* expr)
703
    inline DoWhileNode::DoWhileNode(const JSTokenLocation& location, StatementNode* statement, ExpressionNode* expr)
703
        : StatementNode(lineNumber)
704
        : StatementNode(location)
704
        , m_statement(statement)
705
        , m_statement(statement)
705
        , m_expr(expr)
706
        , m_expr(expr)
706
    {
707
    {
707
    }
708
    }
708
709
709
    inline WhileNode::WhileNode(int lineNumber, ExpressionNode* expr, StatementNode* statement)
710
    inline WhileNode::WhileNode(const JSTokenLocation& location, ExpressionNode* expr, StatementNode* statement)
710
        : StatementNode(lineNumber)
711
        : StatementNode(location)
711
        , m_expr(expr)
712
        , m_expr(expr)
712
        , m_statement(statement)
713
        , m_statement(statement)
713
    {
714
    {
714
    }
715
    }
715
716
716
    inline ForNode::ForNode(int lineNumber, ExpressionNode* expr1, ExpressionNode* expr2, ExpressionNode* expr3, StatementNode* statement)
717
    inline ForNode::ForNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, ExpressionNode* expr3, StatementNode* statement)
717
        : StatementNode(lineNumber)
718
        : StatementNode(location)
718
        , m_expr1(expr1)
719
        , m_expr1(expr1)
719
        , m_expr2(expr2)
720
        , m_expr2(expr2)
720
        , m_expr3(expr3)
721
        , m_expr3(expr3)
Lines 723-760 namespace JSC { a/Source/JavaScriptCore/parser/NodeConstructors.h_sec19
723
        ASSERT(statement);
724
        ASSERT(statement);
724
    }
725
    }
725
726
726
    inline ContinueNode::ContinueNode(JSGlobalData* globalData, int lineNumber)
727
    inline ContinueNode::ContinueNode(JSGlobalData* globalData, const JSTokenLocation& location)
727
        : StatementNode(lineNumber)
728
        : StatementNode(location)
728
        , m_ident(globalData->propertyNames->nullIdentifier)
729
        , m_ident(globalData->propertyNames->nullIdentifier)
729
    {
730
    {
730
    }
731
    }
731
732
732
    inline ContinueNode::ContinueNode(int lineNumber, const Identifier& ident)
733
    inline ContinueNode::ContinueNode(const JSTokenLocation& location, const Identifier& ident)
733
        : StatementNode(lineNumber)
734
        : StatementNode(location)
734
        , m_ident(ident)
735
        , m_ident(ident)
735
    {
736
    {
736
    }
737
    }
737
    
738
    
738
    inline BreakNode::BreakNode(JSGlobalData* globalData, int lineNumber)
739
    inline BreakNode::BreakNode(JSGlobalData* globalData, const JSTokenLocation& location)
739
        : StatementNode(lineNumber)
740
        : StatementNode(location)
740
        , m_ident(globalData->propertyNames->nullIdentifier)
741
        , m_ident(globalData->propertyNames->nullIdentifier)
741
    {
742
    {
742
    }
743
    }
743
744
744
    inline BreakNode::BreakNode(int lineNumber, const Identifier& ident)
745
    inline BreakNode::BreakNode(const JSTokenLocation& location, const Identifier& ident)
745
        : StatementNode(lineNumber)
746
        : StatementNode(location)
746
        , m_ident(ident)
747
        , m_ident(ident)
747
    {
748
    {
748
    }
749
    }
749
    
750
    
750
    inline ReturnNode::ReturnNode(int lineNumber, ExpressionNode* value)
751
    inline ReturnNode::ReturnNode(const JSTokenLocation& location, ExpressionNode* value)
751
        : StatementNode(lineNumber)
752
        : StatementNode(location)
752
        , m_value(value)
753
        , m_value(value)
753
    {
754
    {
754
    }
755
    }
755
756
756
    inline WithNode::WithNode(int lineNumber, ExpressionNode* expr, StatementNode* statement, uint32_t divot, uint32_t expressionLength)
757
    inline WithNode::WithNode(const JSTokenLocation& location, ExpressionNode* expr, StatementNode* statement, uint32_t divot, uint32_t expressionLength)
757
        : StatementNode(lineNumber)
758
        : StatementNode(location)
758
        , m_expr(expr)
759
        , m_expr(expr)
759
        , m_statement(statement)
760
        , m_statement(statement)
760
        , m_divot(divot)
761
        , m_divot(divot)
Lines 762-782 namespace JSC { a/Source/JavaScriptCore/parser/NodeConstructors.h_sec20
762
    {
763
    {
763
    }
764
    }
764
765
765
    inline LabelNode::LabelNode(int lineNumber, const Identifier& name, StatementNode* statement)
766
    inline LabelNode::LabelNode(const JSTokenLocation& location, const Identifier& name, StatementNode* statement)
766
        : StatementNode(lineNumber)
767
        : StatementNode(location)
767
        , m_name(name)
768
        , m_name(name)
768
        , m_statement(statement)
769
        , m_statement(statement)
769
    {
770
    {
770
    }
771
    }
771
772
772
    inline ThrowNode::ThrowNode(int lineNumber, ExpressionNode* expr)
773
    inline ThrowNode::ThrowNode(const JSTokenLocation& location, ExpressionNode* expr)
773
        : StatementNode(lineNumber)
774
        : StatementNode(location)
774
        , m_expr(expr)
775
        , m_expr(expr)
775
    {
776
    {
776
    }
777
    }
777
778
778
    inline TryNode::TryNode(int lineNumber, StatementNode* tryBlock, const Identifier& exceptionIdent, StatementNode* catchBlock, StatementNode* finallyBlock)
779
    inline TryNode::TryNode(const JSTokenLocation& location, StatementNode* tryBlock, const Identifier& exceptionIdent, StatementNode* catchBlock, StatementNode* finallyBlock)
779
        : StatementNode(lineNumber)
780
        : StatementNode(location)
780
        , m_tryBlock(tryBlock)
781
        , m_tryBlock(tryBlock)
781
        , m_exceptionIdent(exceptionIdent)
782
        , m_exceptionIdent(exceptionIdent)
782
        , m_catchBlock(catchBlock)
783
        , m_catchBlock(catchBlock)
Lines 797-811 namespace JSC { a/Source/JavaScriptCore/parser/NodeConstructors.h_sec21
797
        l->m_next = this;
798
        l->m_next = this;
798
    }
799
    }
799
800
800
    inline FuncExprNode::FuncExprNode(int lineNumber, const Identifier& ident, FunctionBodyNode* body, const SourceCode& source, ParameterNode* parameter)
801
    inline FuncExprNode::FuncExprNode(const JSTokenLocation& location, const Identifier& ident, FunctionBodyNode* body, const SourceCode& source, ParameterNode* parameter)
801
        : ExpressionNode(lineNumber)
802
        : ExpressionNode(location)
802
        , m_body(body)
803
        , m_body(body)
803
    {
804
    {
804
        m_body->finishParsing(source, parameter, ident);
805
        m_body->finishParsing(source, parameter, ident);
805
    }
806
    }
806
807
807
    inline FuncDeclNode::FuncDeclNode(int lineNumber, const Identifier& ident, FunctionBodyNode* body, const SourceCode& source, ParameterNode* parameter)
808
    inline FuncDeclNode::FuncDeclNode(const JSTokenLocation& location, const Identifier& ident, FunctionBodyNode* body, const SourceCode& source, ParameterNode* parameter)
808
        : StatementNode(lineNumber)
809
        : StatementNode(location)
809
        , m_body(body)
810
        , m_body(body)
810
    {
811
    {
811
        m_body->finishParsing(source, parameter, ident);
812
        m_body->finishParsing(source, parameter, ident);
Lines 837-865 namespace JSC { a/Source/JavaScriptCore/parser/NodeConstructors.h_sec22
837
    {
838
    {
838
    }
839
    }
839
840
840
    inline SwitchNode::SwitchNode(int lineNumber, ExpressionNode* expr, CaseBlockNode* block)
841
    inline SwitchNode::SwitchNode(const JSTokenLocation& location, ExpressionNode* expr, CaseBlockNode* block)
841
        : StatementNode(lineNumber)
842
        : StatementNode(location)
842
        , m_expr(expr)
843
        , m_expr(expr)
843
        , m_block(block)
844
        , m_block(block)
844
    {
845
    {
845
    }
846
    }
846
847
847
    inline ConstDeclNode::ConstDeclNode(int lineNumber, const Identifier& ident, ExpressionNode* init)
848
    inline ConstDeclNode::ConstDeclNode(const JSTokenLocation& location, const Identifier& ident, ExpressionNode* init)
848
        : ExpressionNode(lineNumber)
849
        : ExpressionNode(location)
849
        , m_ident(ident)
850
        , m_ident(ident)
850
        , m_next(0)
851
        , m_next(0)
851
        , m_init(init)
852
        , m_init(init)
852
    {
853
    {
853
    }
854
    }
854
855
855
    inline BlockNode::BlockNode(int lineNumber, SourceElements* statements)
856
    inline BlockNode::BlockNode(const JSTokenLocation& location, SourceElements* statements)
856
        : StatementNode(lineNumber)
857
        : StatementNode(location)
857
        , m_statements(statements)
858
        , m_statements(statements)
858
    {
859
    {
859
    }
860
    }
860
861
861
    inline ForInNode::ForInNode(int lineNumber, ExpressionNode* l, ExpressionNode* expr, StatementNode* statement)
862
    inline ForInNode::ForInNode(const JSTokenLocation& location, ExpressionNode* l, ExpressionNode* expr, StatementNode* statement)
862
        : StatementNode(lineNumber)
863
        : StatementNode(location)
863
        , m_init(0)
864
        , m_init(0)
864
        , m_lexpr(l)
865
        , m_lexpr(l)
865
        , m_expr(expr)
866
        , m_expr(expr)
Lines 868-883 namespace JSC { a/Source/JavaScriptCore/parser/NodeConstructors.h_sec23
868
    {
869
    {
869
    }
870
    }
870
871
871
    inline ForInNode::ForInNode(JSGlobalData* globalData, int lineNumber, const Identifier& ident, ExpressionNode* in, ExpressionNode* expr, StatementNode* statement, int divot, int startOffset, int endOffset)
872
    inline ForInNode::ForInNode(JSGlobalData* globalData, const JSTokenLocation& location, const Identifier& ident, ExpressionNode* in, ExpressionNode* expr, StatementNode* statement, int divot, int startOffset, int endOffset)
872
        : StatementNode(lineNumber)
873
        : StatementNode(location)
873
        , m_init(0)
874
        , m_init(0)
874
        , m_lexpr(new (globalData) ResolveNode(lineNumber, ident, divot - startOffset))
875
        , m_lexpr(new (globalData) ResolveNode(location, ident, divot - startOffset))
875
        , m_expr(expr)
876
        , m_expr(expr)
876
        , m_statement(statement)
877
        , m_statement(statement)
877
        , m_identIsVarDecl(true)
878
        , m_identIsVarDecl(true)
878
    {
879
    {
879
        if (in) {
880
        if (in) {
880
            AssignResolveNode* node = new (globalData) AssignResolveNode(lineNumber, ident, in);
881
            AssignResolveNode* node = new (globalData) AssignResolveNode(location, ident, in);
881
            node->setExceptionSourceCode(divot, divot - startOffset, endOffset - divot);
882
            node->setExceptionSourceCode(divot, divot - startOffset, endOffset - divot);
882
            m_init = node;
883
            m_init = node;
883
        }
884
        }
- a/Source/JavaScriptCore/parser/Nodes.cpp -20 / +28 lines
Lines 52-61 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.cpp_sec1
52
52
53
// ------------------------------ StatementNode --------------------------------
53
// ------------------------------ StatementNode --------------------------------
54
54
55
void StatementNode::setLoc(int firstLine, int lastLine, int column)
56
{
57
    m_lineNumber = firstLine;
58
    m_lastLine = lastLine;
59
    m_columnNumber = column;
60
}
61
55
void StatementNode::setLoc(int firstLine, int lastLine)
62
void StatementNode::setLoc(int firstLine, int lastLine)
56
{
63
{
57
    m_lineNumber = firstLine;
64
    m_lineNumber = firstLine;
58
    m_lastLine = lastLine;
65
    m_lastLine = lastLine;
66
    m_columnNumber = 0;
59
}
67
}
60
68
61
// ------------------------------ SourceElements --------------------------------
69
// ------------------------------ SourceElements --------------------------------
Lines 75-82 StatementNode* SourceElements::singleStatement() const a/Source/JavaScriptCore/parser/Nodes.cpp_sec2
75
83
76
// ------------------------------ ScopeNode -----------------------------
84
// ------------------------------ ScopeNode -----------------------------
77
85
78
ScopeNode::ScopeNode(JSGlobalData* globalData, int lineNumber, bool inStrictContext)
86
ScopeNode::ScopeNode(JSGlobalData* globalData, const JSTokenLocation& location, bool inStrictContext)
79
    : StatementNode(lineNumber)
87
    : StatementNode(location)
80
    , ParserArenaRefCounted(globalData)
88
    , ParserArenaRefCounted(globalData)
81
    , m_features(inStrictContext ? StrictModeFeature : NoFeatures)
89
    , m_features(inStrictContext ? StrictModeFeature : NoFeatures)
82
    , m_numConstants(0)
90
    , m_numConstants(0)
Lines 84-91 ScopeNode::ScopeNode(JSGlobalData* globalData, int lineNumber, bool inStrictCont a/Source/JavaScriptCore/parser/Nodes.cpp_sec3
84
{
92
{
85
}
93
}
86
94
87
ScopeNode::ScopeNode(JSGlobalData* globalData, int lineNumber, const SourceCode& source, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, IdentifierSet& capturedVariables, CodeFeatures features, int numConstants)
95
ScopeNode::ScopeNode(JSGlobalData* globalData, const JSTokenLocation& location, const SourceCode& source, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, IdentifierSet& capturedVariables, CodeFeatures features, int numConstants)
88
    : StatementNode(lineNumber)
96
    : StatementNode(location)
89
    , ParserArenaRefCounted(globalData)
97
    , ParserArenaRefCounted(globalData)
90
    , m_features(features)
98
    , m_features(features)
91
    , m_source(source)
99
    , m_source(source)
Lines 107-120 StatementNode* ScopeNode::singleStatement() const a/Source/JavaScriptCore/parser/Nodes.cpp_sec4
107
115
108
// ------------------------------ ProgramNode -----------------------------
116
// ------------------------------ ProgramNode -----------------------------
109
117
110
inline ProgramNode::ProgramNode(JSGlobalData* globalData, int lineNumber, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, IdentifierSet& capturedVariables, const SourceCode& source, CodeFeatures features, int numConstants)
118
inline ProgramNode::ProgramNode(JSGlobalData* globalData, const JSTokenLocation& location, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, IdentifierSet& capturedVariables, const SourceCode& source, CodeFeatures features, int numConstants)
111
    : ScopeNode(globalData, lineNumber, source, children, varStack, funcStack, capturedVariables, features, numConstants)
119
    : ScopeNode(globalData, location, source, children, varStack, funcStack, capturedVariables, features, numConstants)
112
{
120
{
113
}
121
}
114
122
115
PassRefPtr<ProgramNode> ProgramNode::create(JSGlobalData* globalData, int lineNumber, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, IdentifierSet& capturedVariables, const SourceCode& source, CodeFeatures features, int numConstants)
123
PassRefPtr<ProgramNode> ProgramNode::create(JSGlobalData* globalData, const JSTokenLocation& location, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, IdentifierSet& capturedVariables, const SourceCode& source, CodeFeatures features, int numConstants)
116
{
124
{
117
    RefPtr<ProgramNode> node = new ProgramNode(globalData, lineNumber, children, varStack, funcStack,  capturedVariables, source, features, numConstants);
125
    RefPtr<ProgramNode> node = new ProgramNode(globalData, location, children, varStack, funcStack,  capturedVariables, source, features, numConstants);
118
126
119
    ASSERT(node->m_arena.last() == node);
127
    ASSERT(node->m_arena.last() == node);
120
    node->m_arena.removeLast();
128
    node->m_arena.removeLast();
Lines 125-138 PassRefPtr<ProgramNode> ProgramNode::create(JSGlobalData* globalData, int lineNu a/Source/JavaScriptCore/parser/Nodes.cpp_sec5
125
133
126
// ------------------------------ EvalNode -----------------------------
134
// ------------------------------ EvalNode -----------------------------
127
135
128
inline EvalNode::EvalNode(JSGlobalData* globalData, int lineNumber, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, IdentifierSet& capturedVariables, const SourceCode& source, CodeFeatures features, int numConstants)
136
inline EvalNode::EvalNode(JSGlobalData* globalData, const JSTokenLocation& location, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, IdentifierSet& capturedVariables, const SourceCode& source, CodeFeatures features, int numConstants)
129
    : ScopeNode(globalData, lineNumber, source, children, varStack, funcStack, capturedVariables, features, numConstants)
137
    : ScopeNode(globalData, location, source, children, varStack, funcStack, capturedVariables, features, numConstants)
130
{
138
{
131
}
139
}
132
140
133
PassRefPtr<EvalNode> EvalNode::create(JSGlobalData* globalData, int lineNumber, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, IdentifierSet& capturedVariables, const SourceCode& source, CodeFeatures features, int numConstants)
141
PassRefPtr<EvalNode> EvalNode::create(JSGlobalData* globalData, const JSTokenLocation& location, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, IdentifierSet& capturedVariables, const SourceCode& source, CodeFeatures features, int numConstants)
134
{
142
{
135
    RefPtr<EvalNode> node = new EvalNode(globalData, lineNumber, children, varStack, funcStack, capturedVariables, source, features, numConstants);
143
    RefPtr<EvalNode> node = new EvalNode(globalData, location, children, varStack, funcStack, capturedVariables, source, features, numConstants);
136
144
137
    ASSERT(node->m_arena.last() == node);
145
    ASSERT(node->m_arena.last() == node);
138
    node->m_arena.removeLast();
146
    node->m_arena.removeLast();
Lines 149-161 FunctionParameters::FunctionParameters(ParameterNode* firstParameter) a/Source/JavaScriptCore/parser/Nodes.cpp_sec6
149
        append(parameter->ident());
157
        append(parameter->ident());
150
}
158
}
151
159
152
inline FunctionBodyNode::FunctionBodyNode(JSGlobalData* globalData, int lineNumber, bool inStrictContext)
160
inline FunctionBodyNode::FunctionBodyNode(JSGlobalData* globalData, const JSTokenLocation& location, bool inStrictContext)
153
    : ScopeNode(globalData, lineNumber, inStrictContext)
161
    : ScopeNode(globalData, location, inStrictContext)
154
{
162
{
155
}
163
}
156
164
157
inline FunctionBodyNode::FunctionBodyNode(JSGlobalData* globalData, int lineNumber, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, IdentifierSet& capturedVariables, const SourceCode& sourceCode, CodeFeatures features, int numConstants)
165
inline FunctionBodyNode::FunctionBodyNode(JSGlobalData* globalData, const JSTokenLocation& location, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, IdentifierSet& capturedVariables, const SourceCode& sourceCode, CodeFeatures features, int numConstants)
158
    : ScopeNode(globalData, lineNumber, sourceCode, children, varStack, funcStack, capturedVariables, features, numConstants)
166
    : ScopeNode(globalData, location, sourceCode, children, varStack, funcStack, capturedVariables, features, numConstants)
159
{
167
{
160
}
168
}
161
169
Lines 172-185 void FunctionBodyNode::finishParsing(PassRefPtr<FunctionParameters> parameters, a/Source/JavaScriptCore/parser/Nodes.cpp_sec7
172
    m_ident = ident;
180
    m_ident = ident;
173
}
181
}
174
182
175
FunctionBodyNode* FunctionBodyNode::create(JSGlobalData* globalData, int lineNumber, bool inStrictContext)
183
FunctionBodyNode* FunctionBodyNode::create(JSGlobalData* globalData, const JSTokenLocation& location, bool inStrictContext)
176
{
184
{
177
    return new FunctionBodyNode(globalData, lineNumber, inStrictContext);
185
    return new FunctionBodyNode(globalData, location, inStrictContext);
178
}
186
}
179
187
180
PassRefPtr<FunctionBodyNode> FunctionBodyNode::create(JSGlobalData* globalData, int lineNumber, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, IdentifierSet& capturedVariables, const SourceCode& sourceCode, CodeFeatures features, int numConstants)
188
PassRefPtr<FunctionBodyNode> FunctionBodyNode::create(JSGlobalData* globalData, const JSTokenLocation& location, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, IdentifierSet& capturedVariables, const SourceCode& sourceCode, CodeFeatures features, int numConstants)
181
{
189
{
182
    RefPtr<FunctionBodyNode> node = new FunctionBodyNode(globalData, lineNumber, children, varStack, funcStack, capturedVariables, sourceCode, features, numConstants);
190
    RefPtr<FunctionBodyNode> node = new FunctionBodyNode(globalData, location, children, varStack, funcStack, capturedVariables, sourceCode, features, numConstants);
183
191
184
    ASSERT(node->m_arena.last() == node);
192
    ASSERT(node->m_arena.last() == node);
185
    node->m_arena.removeLast();
193
    node->m_arena.removeLast();
- a/Source/JavaScriptCore/parser/Nodes.h -124 / +128 lines
Lines 130-136 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec1
130
130
131
    class Node : public ParserArenaFreeable {
131
    class Node : public ParserArenaFreeable {
132
    protected:
132
    protected:
133
        Node(int);
133
        Node(const JSTokenLocation&);
134
134
135
    public:
135
    public:
136
        virtual ~Node() { }
136
        virtual ~Node() { }
Lines 139-151 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec2
139
139
140
        int lineNo() const { return m_lineNumber; }
140
        int lineNo() const { return m_lineNumber; }
141
141
142
        int columnNo() const { return m_columnNumber; }
143
142
    protected:
144
    protected:
143
        int m_lineNumber;
145
        int m_lineNumber;
146
        int m_columnNumber;
144
    };
147
    };
145
148
146
    class ExpressionNode : public Node {
149
    class ExpressionNode : public Node {
147
    protected:
150
    protected:
148
        ExpressionNode(int, ResultType = ResultType::unknownType());
151
        ExpressionNode(const JSTokenLocation&, ResultType = ResultType::unknownType());
149
152
150
    public:
153
    public:
151
        virtual bool isNumber() const { return false; }
154
        virtual bool isNumber() const { return false; }
Lines 175-186 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec3
175
178
176
    class StatementNode : public Node {
179
    class StatementNode : public Node {
177
    protected:
180
    protected:
178
        StatementNode(int);
181
        StatementNode(const JSTokenLocation&);
179
182
180
    public:
183
    public:
181
        JS_EXPORT_PRIVATE void setLoc(int firstLine, int lastLine);
184
        JS_EXPORT_PRIVATE void setLoc(int firstLine, int lastLine);
185
        void setLoc(int firstLine, int lastLine, int column);
182
        int firstLine() const { return lineNo(); }
186
        int firstLine() const { return lineNo(); }
183
        int lastLine() const { return m_lastLine; }
187
        int lastLine() const { return m_lastLine; }
188
        int column() const { return columnNo();}
184
189
185
        virtual bool isEmptyStatement() const { return false; }
190
        virtual bool isEmptyStatement() const { return false; }
186
        virtual bool isReturnNode() const { return false; }
191
        virtual bool isReturnNode() const { return false; }
Lines 194-200 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec4
194
199
195
    class NullNode : public ExpressionNode {
200
    class NullNode : public ExpressionNode {
196
    public:
201
    public:
197
        NullNode(int);
202
        NullNode(const JSTokenLocation&);
198
203
199
    private:
204
    private:
200
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
205
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 204-210 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec5
204
209
205
    class BooleanNode : public ExpressionNode {
210
    class BooleanNode : public ExpressionNode {
206
    public:
211
    public:
207
        BooleanNode(int, bool value);
212
        BooleanNode(const JSTokenLocation&, bool value);
208
213
209
    private:
214
    private:
210
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
215
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 216-222 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec6
216
221
217
    class NumberNode : public ExpressionNode {
222
    class NumberNode : public ExpressionNode {
218
    public:
223
    public:
219
        NumberNode(int, double value);
224
        NumberNode(const JSTokenLocation&, double value);
220
225
221
        double value() const { return m_value; }
226
        double value() const { return m_value; }
222
        void setValue(double value) { m_value = value; }
227
        void setValue(double value) { m_value = value; }
Lines 232-238 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec7
232
237
233
    class StringNode : public ExpressionNode {
238
    class StringNode : public ExpressionNode {
234
    public:
239
    public:
235
        StringNode(int, const Identifier&);
240
        StringNode(const JSTokenLocation&, const Identifier&);
236
241
237
        const Identifier& value() { return m_value; }
242
        const Identifier& value() { return m_value; }
238
243
Lines 342-348 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec8
342
347
343
    class RegExpNode : public ExpressionNode, public ThrowableExpressionData {
348
    class RegExpNode : public ExpressionNode, public ThrowableExpressionData {
344
    public:
349
    public:
345
        RegExpNode(int, const Identifier& pattern, const Identifier& flags);
350
        RegExpNode(const JSTokenLocation&, const Identifier& pattern, const Identifier& flags);
346
351
347
    private:
352
    private:
348
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
353
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 353-359 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec9
353
358
354
    class ThisNode : public ExpressionNode {
359
    class ThisNode : public ExpressionNode {
355
    public:
360
    public:
356
        ThisNode(int);
361
        ThisNode(const JSTokenLocation&);
357
362
358
    private:
363
    private:
359
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
364
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 361-367 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec10
361
366
362
    class ResolveNode : public ExpressionNode {
367
    class ResolveNode : public ExpressionNode {
363
    public:
368
    public:
364
        ResolveNode(int, const Identifier&, int startOffset);
369
        ResolveNode(const JSTokenLocation&, const Identifier&, int startOffset);
365
370
366
        const Identifier& identifier() const { return m_ident; }
371
        const Identifier& identifier() const { return m_ident; }
367
372
Lines 393-403 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec11
393
398
394
    class ArrayNode : public ExpressionNode {
399
    class ArrayNode : public ExpressionNode {
395
    public:
400
    public:
396
        ArrayNode(int, int elision);
401
        ArrayNode(const JSTokenLocation&, int elision);
397
        ArrayNode(int, ElementNode*);
402
        ArrayNode(const JSTokenLocation&, ElementNode*);
398
        ArrayNode(int, int elision, ElementNode*);
403
        ArrayNode(const JSTokenLocation&, int elision, ElementNode*);
399
404
400
        ArgumentListNode* toArgumentList(JSGlobalData*, int) const;
405
        ArgumentListNode* toArgumentList(JSGlobalData*, int, int) const;
401
406
402
    private:
407
    private:
403
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
408
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 428-435 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec12
428
433
429
    class PropertyListNode : public Node {
434
    class PropertyListNode : public Node {
430
    public:
435
    public:
431
        PropertyListNode(int, PropertyNode*);
436
        PropertyListNode(const JSTokenLocation&, PropertyNode*);
432
        PropertyListNode(int, PropertyNode*, PropertyListNode*);
437
        PropertyListNode(const JSTokenLocation&, PropertyNode*, PropertyListNode*);
433
438
434
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
439
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
435
440
Lines 440-447 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec13
440
445
441
    class ObjectLiteralNode : public ExpressionNode {
446
    class ObjectLiteralNode : public ExpressionNode {
442
    public:
447
    public:
443
        ObjectLiteralNode(int);
448
        ObjectLiteralNode(const JSTokenLocation&);
444
        ObjectLiteralNode(int, PropertyListNode*);
449
        ObjectLiteralNode(const JSTokenLocation&, PropertyListNode*);
445
450
446
    private:
451
    private:
447
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
452
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 451-457 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec14
451
    
456
    
452
    class BracketAccessorNode : public ExpressionNode, public ThrowableExpressionData {
457
    class BracketAccessorNode : public ExpressionNode, public ThrowableExpressionData {
453
    public:
458
    public:
454
        BracketAccessorNode(int, ExpressionNode* base, ExpressionNode* subscript, bool subscriptHasAssignments);
459
        BracketAccessorNode(const JSTokenLocation&, ExpressionNode* base, ExpressionNode* subscript, bool subscriptHasAssignments);
455
460
456
        ExpressionNode* base() const { return m_base; }
461
        ExpressionNode* base() const { return m_base; }
457
        ExpressionNode* subscript() const { return m_subscript; }
462
        ExpressionNode* subscript() const { return m_subscript; }
Lines 469-475 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec15
469
474
470
    class DotAccessorNode : public ExpressionNode, public ThrowableExpressionData {
475
    class DotAccessorNode : public ExpressionNode, public ThrowableExpressionData {
471
    public:
476
    public:
472
        DotAccessorNode(int, ExpressionNode* base, const Identifier&);
477
        DotAccessorNode(const JSTokenLocation&, ExpressionNode* base, const Identifier&);
473
478
474
        ExpressionNode* base() const { return m_base; }
479
        ExpressionNode* base() const { return m_base; }
475
        const Identifier& identifier() const { return m_ident; }
480
        const Identifier& identifier() const { return m_ident; }
Lines 486-493 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec16
486
491
487
    class ArgumentListNode : public Node {
492
    class ArgumentListNode : public Node {
488
    public:
493
    public:
489
        ArgumentListNode(int, ExpressionNode*);
494
        ArgumentListNode(const JSTokenLocation&, ExpressionNode*);
490
        ArgumentListNode(int, ArgumentListNode*, ExpressionNode*);
495
        ArgumentListNode(const JSTokenLocation&, ArgumentListNode*, ExpressionNode*);
491
496
492
        ArgumentListNode* m_next;
497
        ArgumentListNode* m_next;
493
        ExpressionNode* m_expr;
498
        ExpressionNode* m_expr;
Lines 506-513 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec17
506
511
507
    class NewExprNode : public ExpressionNode, public ThrowableExpressionData {
512
    class NewExprNode : public ExpressionNode, public ThrowableExpressionData {
508
    public:
513
    public:
509
        NewExprNode(int, ExpressionNode*);
514
        NewExprNode(const JSTokenLocation&, ExpressionNode*);
510
        NewExprNode(int, ExpressionNode*, ArgumentsNode*);
515
        NewExprNode(const JSTokenLocation&, ExpressionNode*, ArgumentsNode*);
511
516
512
    private:
517
    private:
513
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
518
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 518-524 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec18
518
523
519
    class EvalFunctionCallNode : public ExpressionNode, public ThrowableExpressionData {
524
    class EvalFunctionCallNode : public ExpressionNode, public ThrowableExpressionData {
520
    public:
525
    public:
521
        EvalFunctionCallNode(int, ArgumentsNode*, unsigned divot, unsigned startOffset, unsigned endOffset);
526
        EvalFunctionCallNode(const JSTokenLocation&, ArgumentsNode*, unsigned divot, unsigned startOffset, unsigned endOffset);
522
527
523
    private:
528
    private:
524
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
529
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 528-534 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec19
528
533
529
    class FunctionCallValueNode : public ExpressionNode, public ThrowableExpressionData {
534
    class FunctionCallValueNode : public ExpressionNode, public ThrowableExpressionData {
530
    public:
535
    public:
531
        FunctionCallValueNode(int, ExpressionNode*, ArgumentsNode*, unsigned divot, unsigned startOffset, unsigned endOffset);
536
        FunctionCallValueNode(const JSTokenLocation&, ExpressionNode*, ArgumentsNode*, unsigned divot, unsigned startOffset, unsigned endOffset);
532
537
533
    private:
538
    private:
534
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
539
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 539-545 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec20
539
544
540
    class FunctionCallResolveNode : public ExpressionNode, public ThrowableExpressionData {
545
    class FunctionCallResolveNode : public ExpressionNode, public ThrowableExpressionData {
541
    public:
546
    public:
542
        FunctionCallResolveNode(int, const Identifier&, ArgumentsNode*, unsigned divot, unsigned startOffset, unsigned endOffset);
547
        FunctionCallResolveNode(const JSTokenLocation&, const Identifier&, ArgumentsNode*, unsigned divot, unsigned startOffset, unsigned endOffset);
543
548
544
    private:
549
    private:
545
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
550
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 550-556 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec21
550
    
555
    
551
    class FunctionCallBracketNode : public ExpressionNode, public ThrowableSubExpressionData {
556
    class FunctionCallBracketNode : public ExpressionNode, public ThrowableSubExpressionData {
552
    public:
557
    public:
553
        FunctionCallBracketNode(int, ExpressionNode* base, ExpressionNode* subscript, ArgumentsNode*, unsigned divot, unsigned startOffset, unsigned endOffset);
558
        FunctionCallBracketNode(const JSTokenLocation&, ExpressionNode* base, ExpressionNode* subscript, ArgumentsNode*, unsigned divot, unsigned startOffset, unsigned endOffset);
554
559
555
    private:
560
    private:
556
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
561
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 562-568 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec22
562
567
563
    class FunctionCallDotNode : public ExpressionNode, public ThrowableSubExpressionData {
568
    class FunctionCallDotNode : public ExpressionNode, public ThrowableSubExpressionData {
564
    public:
569
    public:
565
        FunctionCallDotNode(int, ExpressionNode* base, const Identifier&, ArgumentsNode*, unsigned divot, unsigned startOffset, unsigned endOffset);
570
        FunctionCallDotNode(const JSTokenLocation&, ExpressionNode* base, const Identifier&, ArgumentsNode*, unsigned divot, unsigned startOffset, unsigned endOffset);
566
571
567
    private:
572
    private:
568
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
573
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 575-581 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec23
575
580
576
    class CallFunctionCallDotNode : public FunctionCallDotNode {
581
    class CallFunctionCallDotNode : public FunctionCallDotNode {
577
    public:
582
    public:
578
        CallFunctionCallDotNode(int, ExpressionNode* base, const Identifier&, ArgumentsNode*, unsigned divot, unsigned startOffset, unsigned endOffset);
583
        CallFunctionCallDotNode(const JSTokenLocation&, ExpressionNode* base, const Identifier&, ArgumentsNode*, unsigned divot, unsigned startOffset, unsigned endOffset);
579
584
580
    private:
585
    private:
581
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
586
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 583-589 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec24
583
    
588
    
584
    class ApplyFunctionCallDotNode : public FunctionCallDotNode {
589
    class ApplyFunctionCallDotNode : public FunctionCallDotNode {
585
    public:
590
    public:
586
        ApplyFunctionCallDotNode(int, ExpressionNode* base, const Identifier&, ArgumentsNode*, unsigned divot, unsigned startOffset, unsigned endOffset);
591
        ApplyFunctionCallDotNode(const JSTokenLocation&, ExpressionNode* base, const Identifier&, ArgumentsNode*, unsigned divot, unsigned startOffset, unsigned endOffset);
587
592
588
    private:
593
    private:
589
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
594
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 591-597 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec25
591
596
592
    class PrePostResolveNode : public ExpressionNode, public ThrowableExpressionData {
597
    class PrePostResolveNode : public ExpressionNode, public ThrowableExpressionData {
593
    public:
598
    public:
594
        PrePostResolveNode(int, const Identifier&, unsigned divot, unsigned startOffset, unsigned endOffset);
599
        PrePostResolveNode(const JSTokenLocation&, const Identifier&, unsigned divot, unsigned startOffset, unsigned endOffset);
595
600
596
    protected:
601
    protected:
597
        const Identifier& m_ident;
602
        const Identifier& m_ident;
Lines 599-605 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec26
599
604
600
    class PostfixResolveNode : public PrePostResolveNode {
605
    class PostfixResolveNode : public PrePostResolveNode {
601
    public:
606
    public:
602
        PostfixResolveNode(int, const Identifier&, Operator, unsigned divot, unsigned startOffset, unsigned endOffset);
607
        PostfixResolveNode(const JSTokenLocation&, const Identifier&, Operator, unsigned divot, unsigned startOffset, unsigned endOffset);
603
608
604
    private:
609
    private:
605
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
610
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 609-615 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec27
609
614
610
    class PostfixBracketNode : public ExpressionNode, public ThrowableSubExpressionData {
615
    class PostfixBracketNode : public ExpressionNode, public ThrowableSubExpressionData {
611
    public:
616
    public:
612
        PostfixBracketNode(int, ExpressionNode* base, ExpressionNode* subscript, Operator, unsigned divot, unsigned startOffset, unsigned endOffset);
617
        PostfixBracketNode(const JSTokenLocation&, ExpressionNode* base, ExpressionNode* subscript, Operator, unsigned divot, unsigned startOffset, unsigned endOffset);
613
618
614
    private:
619
    private:
615
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
620
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 621-627 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec28
621
626
622
    class PostfixDotNode : public ExpressionNode, public ThrowableSubExpressionData {
627
    class PostfixDotNode : public ExpressionNode, public ThrowableSubExpressionData {
623
    public:
628
    public:
624
        PostfixDotNode(int, ExpressionNode* base, const Identifier&, Operator, unsigned divot, unsigned startOffset, unsigned endOffset);
629
        PostfixDotNode(const JSTokenLocation&, ExpressionNode* base, const Identifier&, Operator, unsigned divot, unsigned startOffset, unsigned endOffset);
625
630
626
    private:
631
    private:
627
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
632
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 633-639 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec29
633
638
634
    class PostfixErrorNode : public ExpressionNode, public ThrowableSubExpressionData {
639
    class PostfixErrorNode : public ExpressionNode, public ThrowableSubExpressionData {
635
    public:
640
    public:
636
        PostfixErrorNode(int, Operator, unsigned divot, unsigned startOffset, unsigned endOffset);
641
        PostfixErrorNode(const JSTokenLocation&, Operator, unsigned divot, unsigned startOffset, unsigned endOffset);
637
642
638
    private:
643
    private:
639
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
644
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 643-649 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec30
643
648
644
    class DeleteResolveNode : public ExpressionNode, public ThrowableExpressionData {
649
    class DeleteResolveNode : public ExpressionNode, public ThrowableExpressionData {
645
    public:
650
    public:
646
        DeleteResolveNode(int, const Identifier&, unsigned divot, unsigned startOffset, unsigned endOffset);
651
        DeleteResolveNode(const JSTokenLocation&, const Identifier&, unsigned divot, unsigned startOffset, unsigned endOffset);
647
652
648
    private:
653
    private:
649
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
654
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 653-659 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec31
653
658
654
    class DeleteBracketNode : public ExpressionNode, public ThrowableExpressionData {
659
    class DeleteBracketNode : public ExpressionNode, public ThrowableExpressionData {
655
    public:
660
    public:
656
        DeleteBracketNode(int, ExpressionNode* base, ExpressionNode* subscript, unsigned divot, unsigned startOffset, unsigned endOffset);
661
        DeleteBracketNode(const JSTokenLocation&, ExpressionNode* base, ExpressionNode* subscript, unsigned divot, unsigned startOffset, unsigned endOffset);
657
662
658
    private:
663
    private:
659
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
664
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 664-670 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec32
664
669
665
    class DeleteDotNode : public ExpressionNode, public ThrowableExpressionData {
670
    class DeleteDotNode : public ExpressionNode, public ThrowableExpressionData {
666
    public:
671
    public:
667
        DeleteDotNode(int, ExpressionNode* base, const Identifier&, unsigned divot, unsigned startOffset, unsigned endOffset);
672
        DeleteDotNode(const JSTokenLocation&, ExpressionNode* base, const Identifier&, unsigned divot, unsigned startOffset, unsigned endOffset);
668
673
669
    private:
674
    private:
670
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
675
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 675-681 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec33
675
680
676
    class DeleteValueNode : public ExpressionNode {
681
    class DeleteValueNode : public ExpressionNode {
677
    public:
682
    public:
678
        DeleteValueNode(int, ExpressionNode*);
683
        DeleteValueNode(const JSTokenLocation&, ExpressionNode*);
679
684
680
    private:
685
    private:
681
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
686
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 685-691 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec34
685
690
686
    class VoidNode : public ExpressionNode {
691
    class VoidNode : public ExpressionNode {
687
    public:
692
    public:
688
        VoidNode(int, ExpressionNode*);
693
        VoidNode(const JSTokenLocation&, ExpressionNode*);
689
694
690
    private:
695
    private:
691
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
696
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 695-701 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec35
695
700
696
    class TypeOfResolveNode : public ExpressionNode {
701
    class TypeOfResolveNode : public ExpressionNode {
697
    public:
702
    public:
698
        TypeOfResolveNode(int, const Identifier&);
703
        TypeOfResolveNode(const JSTokenLocation&, const Identifier&);
699
704
700
        const Identifier& identifier() const { return m_ident; }
705
        const Identifier& identifier() const { return m_ident; }
701
706
Lines 707-713 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec36
707
712
708
    class TypeOfValueNode : public ExpressionNode {
713
    class TypeOfValueNode : public ExpressionNode {
709
    public:
714
    public:
710
        TypeOfValueNode(int, ExpressionNode*);
715
        TypeOfValueNode(const JSTokenLocation&, ExpressionNode*);
711
716
712
    private:
717
    private:
713
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
718
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 717-723 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec37
717
722
718
    class PrefixResolveNode : public PrePostResolveNode {
723
    class PrefixResolveNode : public PrePostResolveNode {
719
    public:
724
    public:
720
        PrefixResolveNode(int, const Identifier&, Operator, unsigned divot, unsigned startOffset, unsigned endOffset);
725
        PrefixResolveNode(const JSTokenLocation&, const Identifier&, Operator, unsigned divot, unsigned startOffset, unsigned endOffset);
721
726
722
    private:
727
    private:
723
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
728
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 727-733 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec38
727
732
728
    class PrefixBracketNode : public ExpressionNode, public ThrowablePrefixedSubExpressionData {
733
    class PrefixBracketNode : public ExpressionNode, public ThrowablePrefixedSubExpressionData {
729
    public:
734
    public:
730
        PrefixBracketNode(int, ExpressionNode* base, ExpressionNode* subscript, Operator, unsigned divot, unsigned startOffset, unsigned endOffset);
735
        PrefixBracketNode(const JSTokenLocation&, ExpressionNode* base, ExpressionNode* subscript, Operator, unsigned divot, unsigned startOffset, unsigned endOffset);
731
736
732
    private:
737
    private:
733
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
738
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 739-745 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec39
739
744
740
    class PrefixDotNode : public ExpressionNode, public ThrowablePrefixedSubExpressionData {
745
    class PrefixDotNode : public ExpressionNode, public ThrowablePrefixedSubExpressionData {
741
    public:
746
    public:
742
        PrefixDotNode(int, ExpressionNode* base, const Identifier&, Operator, unsigned divot, unsigned startOffset, unsigned endOffset);
747
        PrefixDotNode(const JSTokenLocation&, ExpressionNode* base, const Identifier&, Operator, unsigned divot, unsigned startOffset, unsigned endOffset);
743
748
744
    private:
749
    private:
745
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
750
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 751-757 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec40
751
756
752
    class PrefixErrorNode : public ExpressionNode, public ThrowableExpressionData {
757
    class PrefixErrorNode : public ExpressionNode, public ThrowableExpressionData {
753
    public:
758
    public:
754
        PrefixErrorNode(int, Operator, unsigned divot, unsigned startOffset, unsigned endOffset);
759
        PrefixErrorNode(const JSTokenLocation&, Operator, unsigned divot, unsigned startOffset, unsigned endOffset);
755
760
756
    private:
761
    private:
757
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
762
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 761-767 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec41
761
766
762
    class UnaryOpNode : public ExpressionNode {
767
    class UnaryOpNode : public ExpressionNode {
763
    public:
768
    public:
764
        UnaryOpNode(int, ResultType, ExpressionNode*, OpcodeID);
769
        UnaryOpNode(const JSTokenLocation&, ResultType, ExpressionNode*, OpcodeID);
765
770
766
    protected:
771
    protected:
767
        ExpressionNode* expr() { return m_expr; }
772
        ExpressionNode* expr() { return m_expr; }
Lines 778-784 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec42
778
783
779
    class UnaryPlusNode : public UnaryOpNode {
784
    class UnaryPlusNode : public UnaryOpNode {
780
    public:
785
    public:
781
        UnaryPlusNode(int, ExpressionNode*);
786
        UnaryPlusNode(const JSTokenLocation&, ExpressionNode*);
782
787
783
    private:
788
    private:
784
        virtual ExpressionNode* stripUnaryPlus() { return expr(); }
789
        virtual ExpressionNode* stripUnaryPlus() { return expr(); }
Lines 786-797 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec43
786
791
787
    class NegateNode : public UnaryOpNode {
792
    class NegateNode : public UnaryOpNode {
788
    public:
793
    public:
789
        NegateNode(int, ExpressionNode*);
794
        NegateNode(const JSTokenLocation&, ExpressionNode*);
790
    };
795
    };
791
796
792
    class BitwiseNotNode : public ExpressionNode {
797
    class BitwiseNotNode : public ExpressionNode {
793
    public:
798
    public:
794
        BitwiseNotNode(int, ExpressionNode*);
799
        BitwiseNotNode(const JSTokenLocation&, ExpressionNode*);
795
800
796
    protected:
801
    protected:
797
        ExpressionNode* expr() { return m_expr; }
802
        ExpressionNode* expr() { return m_expr; }
Lines 805-811 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec44
805
 
810
 
806
    class LogicalNotNode : public UnaryOpNode {
811
    class LogicalNotNode : public UnaryOpNode {
807
    public:
812
    public:
808
        LogicalNotNode(int, ExpressionNode*);
813
        LogicalNotNode(const JSTokenLocation&, ExpressionNode*);
809
    private:
814
    private:
810
        void emitBytecodeInConditionContext(BytecodeGenerator&, Label* trueTarget, Label* falseTarget, bool fallThroughMeansTrue);
815
        void emitBytecodeInConditionContext(BytecodeGenerator&, Label* trueTarget, Label* falseTarget, bool fallThroughMeansTrue);
811
        virtual bool hasConditionContextCodegen() const { return expr()->hasConditionContextCodegen(); }
816
        virtual bool hasConditionContextCodegen() const { return expr()->hasConditionContextCodegen(); }
Lines 813-820 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec45
813
818
814
    class BinaryOpNode : public ExpressionNode {
819
    class BinaryOpNode : public ExpressionNode {
815
    public:
820
    public:
816
        BinaryOpNode(int, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID, bool rightHasAssignments);
821
        BinaryOpNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID, bool rightHasAssignments);
817
        BinaryOpNode(int, ResultType, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID, bool rightHasAssignments);
822
        BinaryOpNode(const JSTokenLocation&, ResultType, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID, bool rightHasAssignments);
818
823
819
        RegisterID* emitStrcat(BytecodeGenerator& generator, RegisterID* destination, RegisterID* lhs = 0, ReadModifyResolveNode* emitExpressionInfoForMe = 0);
824
        RegisterID* emitStrcat(BytecodeGenerator& generator, RegisterID* destination, RegisterID* lhs = 0, ReadModifyResolveNode* emitExpressionInfoForMe = 0);
820
825
Lines 838-909 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec46
838
843
839
    class MultNode : public BinaryOpNode {
844
    class MultNode : public BinaryOpNode {
840
    public:
845
    public:
841
        MultNode(int, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
846
        MultNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
842
    };
847
    };
843
848
844
    class DivNode : public BinaryOpNode {
849
    class DivNode : public BinaryOpNode {
845
    public:
850
    public:
846
        DivNode(int, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
851
        DivNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
847
    };
852
    };
848
853
849
    class ModNode : public BinaryOpNode {
854
    class ModNode : public BinaryOpNode {
850
    public:
855
    public:
851
        ModNode(int, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
856
        ModNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
852
    };
857
    };
853
858
854
    class AddNode : public BinaryOpNode {
859
    class AddNode : public BinaryOpNode {
855
    public:
860
    public:
856
        AddNode(int, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
861
        AddNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
857
862
858
        virtual bool isAdd() const { return true; }
863
        virtual bool isAdd() const { return true; }
859
    };
864
    };
860
865
861
    class SubNode : public BinaryOpNode {
866
    class SubNode : public BinaryOpNode {
862
    public:
867
    public:
863
        SubNode(int, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
868
        SubNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
864
869
865
        virtual bool isSubtract() const { return true; }
870
        virtual bool isSubtract() const { return true; }
866
    };
871
    };
867
872
868
    class LeftShiftNode : public BinaryOpNode {
873
    class LeftShiftNode : public BinaryOpNode {
869
    public:
874
    public:
870
        LeftShiftNode(int, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
875
        LeftShiftNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
871
    };
876
    };
872
877
873
    class RightShiftNode : public BinaryOpNode {
878
    class RightShiftNode : public BinaryOpNode {
874
    public:
879
    public:
875
        RightShiftNode(int, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
880
        RightShiftNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
876
    };
881
    };
877
882
878
    class UnsignedRightShiftNode : public BinaryOpNode {
883
    class UnsignedRightShiftNode : public BinaryOpNode {
879
    public:
884
    public:
880
        UnsignedRightShiftNode(int, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
885
        UnsignedRightShiftNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
881
    };
886
    };
882
887
883
    class LessNode : public BinaryOpNode {
888
    class LessNode : public BinaryOpNode {
884
    public:
889
    public:
885
        LessNode(int, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
890
        LessNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
886
    };
891
    };
887
892
888
    class GreaterNode : public BinaryOpNode {
893
    class GreaterNode : public BinaryOpNode {
889
    public:
894
    public:
890
        GreaterNode(int, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
895
        GreaterNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
891
    };
896
    };
892
897
893
    class LessEqNode : public BinaryOpNode {
898
    class LessEqNode : public BinaryOpNode {
894
    public:
899
    public:
895
        LessEqNode(int, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
900
        LessEqNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
896
    };
901
    };
897
902
898
    class GreaterEqNode : public BinaryOpNode {
903
    class GreaterEqNode : public BinaryOpNode {
899
    public:
904
    public:
900
        GreaterEqNode(int, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
905
        GreaterEqNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
901
    };
906
    };
902
907
903
    class ThrowableBinaryOpNode : public BinaryOpNode, public ThrowableExpressionData {
908
    class ThrowableBinaryOpNode : public BinaryOpNode, public ThrowableExpressionData {
904
    public:
909
    public:
905
        ThrowableBinaryOpNode(int, ResultType, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID, bool rightHasAssignments);
910
        ThrowableBinaryOpNode(const JSTokenLocation&, ResultType, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID, bool rightHasAssignments);
906
        ThrowableBinaryOpNode(int, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID, bool rightHasAssignments);
911
        ThrowableBinaryOpNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID, bool rightHasAssignments);
907
912
908
    private:
913
    private:
909
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
914
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 911-917 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec47
911
    
916
    
912
    class InstanceOfNode : public ThrowableBinaryOpNode {
917
    class InstanceOfNode : public ThrowableBinaryOpNode {
913
    public:
918
    public:
914
        InstanceOfNode(int, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
919
        InstanceOfNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
915
920
916
    private:
921
    private:
917
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
922
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 919-930 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec48
919
924
920
    class InNode : public ThrowableBinaryOpNode {
925
    class InNode : public ThrowableBinaryOpNode {
921
    public:
926
    public:
922
        InNode(int, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
927
        InNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
923
    };
928
    };
924
929
925
    class EqualNode : public BinaryOpNode {
930
    class EqualNode : public BinaryOpNode {
926
    public:
931
    public:
927
        EqualNode(int, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
932
        EqualNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
928
933
929
    private:
934
    private:
930
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
935
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 932-943 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec49
932
937
933
    class NotEqualNode : public BinaryOpNode {
938
    class NotEqualNode : public BinaryOpNode {
934
    public:
939
    public:
935
        NotEqualNode(int, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
940
        NotEqualNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
936
    };
941
    };
937
942
938
    class StrictEqualNode : public BinaryOpNode {
943
    class StrictEqualNode : public BinaryOpNode {
939
    public:
944
    public:
940
        StrictEqualNode(int, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
945
        StrictEqualNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
941
946
942
    private:
947
    private:
943
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
948
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 945-972 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec50
945
950
946
    class NotStrictEqualNode : public BinaryOpNode {
951
    class NotStrictEqualNode : public BinaryOpNode {
947
    public:
952
    public:
948
        NotStrictEqualNode(int, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
953
        NotStrictEqualNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
949
    };
954
    };
950
955
951
    class BitAndNode : public BinaryOpNode {
956
    class BitAndNode : public BinaryOpNode {
952
    public:
957
    public:
953
        BitAndNode(int, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
958
        BitAndNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
954
    };
959
    };
955
960
956
    class BitOrNode : public BinaryOpNode {
961
    class BitOrNode : public BinaryOpNode {
957
    public:
962
    public:
958
        BitOrNode(int, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
963
        BitOrNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
959
    };
964
    };
960
965
961
    class BitXOrNode : public BinaryOpNode {
966
    class BitXOrNode : public BinaryOpNode {
962
    public:
967
    public:
963
        BitXOrNode(int, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
968
        BitXOrNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments);
964
    };
969
    };
965
970
966
    // m_expr1 && m_expr2, m_expr1 || m_expr2
971
    // m_expr1 && m_expr2, m_expr1 || m_expr2
967
    class LogicalOpNode : public ExpressionNode {
972
    class LogicalOpNode : public ExpressionNode {
968
    public:
973
    public:
969
        LogicalOpNode(int, ExpressionNode* expr1, ExpressionNode* expr2, LogicalOperator);
974
        LogicalOpNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, LogicalOperator);
970
975
971
    private:
976
    private:
972
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
977
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 981-987 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec51
981
    // The ternary operator, "m_logical ? m_expr1 : m_expr2"
986
    // The ternary operator, "m_logical ? m_expr1 : m_expr2"
982
    class ConditionalNode : public ExpressionNode {
987
    class ConditionalNode : public ExpressionNode {
983
    public:
988
    public:
984
        ConditionalNode(int, ExpressionNode* logical, ExpressionNode* expr1, ExpressionNode* expr2);
989
        ConditionalNode(const JSTokenLocation&, ExpressionNode* logical, ExpressionNode* expr1, ExpressionNode* expr2);
985
990
986
    private:
991
    private:
987
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
992
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 993-999 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec52
993
998
994
    class ReadModifyResolveNode : public ExpressionNode, public ThrowableExpressionData {
999
    class ReadModifyResolveNode : public ExpressionNode, public ThrowableExpressionData {
995
    public:
1000
    public:
996
        ReadModifyResolveNode(int, const Identifier&, Operator, ExpressionNode*  right, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset);
1001
        ReadModifyResolveNode(const JSTokenLocation&, const Identifier&, Operator, ExpressionNode*  right, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset);
997
1002
998
    private:
1003
    private:
999
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1004
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 1006-1012 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec53
1006
1011
1007
    class AssignResolveNode : public ExpressionNode, public ThrowableExpressionData {
1012
    class AssignResolveNode : public ExpressionNode, public ThrowableExpressionData {
1008
    public:
1013
    public:
1009
        AssignResolveNode(int, const Identifier&, ExpressionNode* right);
1014
        AssignResolveNode(const JSTokenLocation&, const Identifier&, ExpressionNode* right);
1010
1015
1011
    private:
1016
    private:
1012
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1017
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 1017-1023 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec54
1017
1022
1018
    class ReadModifyBracketNode : public ExpressionNode, public ThrowableSubExpressionData {
1023
    class ReadModifyBracketNode : public ExpressionNode, public ThrowableSubExpressionData {
1019
    public:
1024
    public:
1020
        ReadModifyBracketNode(int, ExpressionNode* base, ExpressionNode* subscript, Operator, ExpressionNode* right, bool subscriptHasAssignments, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset);
1025
        ReadModifyBracketNode(const JSTokenLocation&, ExpressionNode* base, ExpressionNode* subscript, Operator, ExpressionNode* right, bool subscriptHasAssignments, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset);
1021
1026
1022
    private:
1027
    private:
1023
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1028
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 1032-1038 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec55
1032
1037
1033
    class AssignBracketNode : public ExpressionNode, public ThrowableExpressionData {
1038
    class AssignBracketNode : public ExpressionNode, public ThrowableExpressionData {
1034
    public:
1039
    public:
1035
        AssignBracketNode(int, ExpressionNode* base, ExpressionNode* subscript, ExpressionNode* right, bool subscriptHasAssignments, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset);
1040
        AssignBracketNode(const JSTokenLocation&, ExpressionNode* base, ExpressionNode* subscript, ExpressionNode* right, bool subscriptHasAssignments, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset);
1036
1041
1037
    private:
1042
    private:
1038
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1043
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 1046-1052 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec56
1046
1051
1047
    class AssignDotNode : public ExpressionNode, public ThrowableExpressionData {
1052
    class AssignDotNode : public ExpressionNode, public ThrowableExpressionData {
1048
    public:
1053
    public:
1049
        AssignDotNode(int, ExpressionNode* base, const Identifier&, ExpressionNode* right, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset);
1054
        AssignDotNode(const JSTokenLocation&, ExpressionNode* base, const Identifier&, ExpressionNode* right, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset);
1050
1055
1051
    private:
1056
    private:
1052
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1057
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 1059-1065 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec57
1059
1064
1060
    class ReadModifyDotNode : public ExpressionNode, public ThrowableSubExpressionData {
1065
    class ReadModifyDotNode : public ExpressionNode, public ThrowableSubExpressionData {
1061
    public:
1066
    public:
1062
        ReadModifyDotNode(int, ExpressionNode* base, const Identifier&, Operator, ExpressionNode* right, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset);
1067
        ReadModifyDotNode(const JSTokenLocation&, ExpressionNode* base, const Identifier&, Operator, ExpressionNode* right, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset);
1063
1068
1064
    private:
1069
    private:
1065
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1070
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 1073-1079 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec58
1073
1078
1074
    class AssignErrorNode : public ExpressionNode, public ThrowableExpressionData {
1079
    class AssignErrorNode : public ExpressionNode, public ThrowableExpressionData {
1075
    public:
1080
    public:
1076
        AssignErrorNode(int, unsigned divot, unsigned startOffset, unsigned endOffset);
1081
        AssignErrorNode(const JSTokenLocation&, unsigned divot, unsigned startOffset, unsigned endOffset);
1077
1082
1078
    private:
1083
    private:
1079
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1084
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 1083-1089 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec59
1083
1088
1084
    class CommaNode : public ExpressionNode, public ParserArenaDeletable {
1089
    class CommaNode : public ExpressionNode, public ParserArenaDeletable {
1085
    public:
1090
    public:
1086
        CommaNode(int, ExpressionNode* expr1, ExpressionNode* expr2);
1091
        CommaNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2);
1087
1092
1088
        using ParserArenaDeletable::operator new;
1093
        using ParserArenaDeletable::operator new;
1089
1094
Lines 1098-1104 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec60
1098
    
1103
    
1099
    class ConstDeclNode : public ExpressionNode {
1104
    class ConstDeclNode : public ExpressionNode {
1100
    public:
1105
    public:
1101
        ConstDeclNode(int, const Identifier&, ExpressionNode*);
1106
        ConstDeclNode(const JSTokenLocation&, const Identifier&, ExpressionNode*);
1102
1107
1103
        bool hasInitializer() const { return m_init; }
1108
        bool hasInitializer() const { return m_init; }
1104
        const Identifier& ident() { return m_ident; }
1109
        const Identifier& ident() { return m_ident; }
Lines 1118-1124 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec61
1118
1123
1119
    class ConstStatementNode : public StatementNode {
1124
    class ConstStatementNode : public StatementNode {
1120
    public:
1125
    public:
1121
        ConstStatementNode(int, ConstDeclNode* next);
1126
        ConstStatementNode(const JSTokenLocation&, ConstDeclNode* next);
1122
1127
1123
    private:
1128
    private:
1124
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1129
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 1143-1149 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec62
1143
1148
1144
    class BlockNode : public StatementNode {
1149
    class BlockNode : public StatementNode {
1145
    public:
1150
    public:
1146
        BlockNode(int, SourceElements* = 0);
1151
        BlockNode(const JSTokenLocation&, SourceElements* = 0);
1147
1152
1148
        StatementNode* singleStatement() const;
1153
        StatementNode* singleStatement() const;
1149
        StatementNode* lastStatement() const;
1154
        StatementNode* lastStatement() const;
Lines 1158-1164 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec63
1158
1163
1159
    class EmptyStatementNode : public StatementNode {
1164
    class EmptyStatementNode : public StatementNode {
1160
    public:
1165
    public:
1161
        EmptyStatementNode(int);
1166
        EmptyStatementNode(const JSTokenLocation&);
1162
1167
1163
    private:
1168
    private:
1164
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1169
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 1168-1174 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec64
1168
    
1173
    
1169
    class DebuggerStatementNode : public StatementNode {
1174
    class DebuggerStatementNode : public StatementNode {
1170
    public:
1175
    public:
1171
        DebuggerStatementNode(int);
1176
        DebuggerStatementNode(const JSTokenLocation&);
1172
        
1177
        
1173
    private:
1178
    private:
1174
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1179
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 1176-1182 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec65
1176
1181
1177
    class ExprStatementNode : public StatementNode {
1182
    class ExprStatementNode : public StatementNode {
1178
    public:
1183
    public:
1179
        ExprStatementNode(int, ExpressionNode*);
1184
        ExprStatementNode(const JSTokenLocation&, ExpressionNode*);
1180
1185
1181
        ExpressionNode* expr() const { return m_expr; }
1186
        ExpressionNode* expr() const { return m_expr; }
1182
1187
Lines 1190-1197 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec66
1190
1195
1191
    class VarStatementNode : public StatementNode {
1196
    class VarStatementNode : public StatementNode {
1192
    public:
1197
    public:
1193
        VarStatementNode(int, ExpressionNode*);        
1198
        VarStatementNode(const JSTokenLocation&, ExpressionNode*);
1194
1195
    private:
1199
    private:
1196
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1200
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1197
1201
Lines 1200-1206 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec67
1200
1204
1201
    class IfNode : public StatementNode {
1205
    class IfNode : public StatementNode {
1202
    public:
1206
    public:
1203
        IfNode(int, ExpressionNode* condition, StatementNode* ifBlock);
1207
        IfNode(const JSTokenLocation&, ExpressionNode* condition, StatementNode* ifBlock);
1204
1208
1205
    protected:
1209
    protected:
1206
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1210
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 1211-1217 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec68
1211
1215
1212
    class IfElseNode : public IfNode {
1216
    class IfElseNode : public IfNode {
1213
    public:
1217
    public:
1214
        IfElseNode(int, ExpressionNode* condition, StatementNode* ifBlock, StatementNode* elseBlock);
1218
        IfElseNode(const JSTokenLocation&, ExpressionNode* condition, StatementNode* ifBlock, StatementNode* elseBlock);
1215
1219
1216
    private:
1220
    private:
1217
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1221
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 1221-1227 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec69
1221
1225
1222
    class DoWhileNode : public StatementNode {
1226
    class DoWhileNode : public StatementNode {
1223
    public:
1227
    public:
1224
        DoWhileNode(int, StatementNode*, ExpressionNode*);
1228
        DoWhileNode(const JSTokenLocation&, StatementNode*, ExpressionNode*);
1225
1229
1226
    private:
1230
    private:
1227
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1231
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 1232-1238 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec70
1232
1236
1233
    class WhileNode : public StatementNode {
1237
    class WhileNode : public StatementNode {
1234
    public:
1238
    public:
1235
        WhileNode(int, ExpressionNode*, StatementNode*);
1239
        WhileNode(const JSTokenLocation&, ExpressionNode*, StatementNode*);
1236
1240
1237
    private:
1241
    private:
1238
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1242
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 1243-1249 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec71
1243
1247
1244
    class ForNode : public StatementNode {
1248
    class ForNode : public StatementNode {
1245
    public:
1249
    public:
1246
        ForNode(int, ExpressionNode* expr1, ExpressionNode* expr2, ExpressionNode* expr3, StatementNode*);
1250
        ForNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, ExpressionNode* expr3, StatementNode*);
1247
1251
1248
    private:
1252
    private:
1249
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1253
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 1256-1263 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec72
1256
1260
1257
    class ForInNode : public StatementNode, public ThrowableExpressionData {
1261
    class ForInNode : public StatementNode, public ThrowableExpressionData {
1258
    public:
1262
    public:
1259
        ForInNode(int, ExpressionNode*, ExpressionNode*, StatementNode*);
1263
        ForInNode(const JSTokenLocation&, ExpressionNode*, ExpressionNode*, StatementNode*);
1260
        ForInNode(JSGlobalData*, int, const Identifier&, ExpressionNode*, ExpressionNode*, StatementNode*, int divot, int startOffset, int endOffset);
1264
        ForInNode(JSGlobalData*, const JSTokenLocation&, const Identifier&, ExpressionNode*, ExpressionNode*, StatementNode*, int divot, int startOffset, int endOffset);
1261
1265
1262
    private:
1266
    private:
1263
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1267
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 1271-1278 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec73
1271
1275
1272
    class ContinueNode : public StatementNode, public ThrowableExpressionData {
1276
    class ContinueNode : public StatementNode, public ThrowableExpressionData {
1273
    public:
1277
    public:
1274
        ContinueNode(JSGlobalData*, int);
1278
        ContinueNode(JSGlobalData*, const JSTokenLocation&);
1275
        ContinueNode(int, const Identifier&);
1279
        ContinueNode(const JSTokenLocation&, const Identifier&);
1276
        
1280
        
1277
    private:
1281
    private:
1278
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1282
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 1282-1289 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec74
1282
1286
1283
    class BreakNode : public StatementNode, public ThrowableExpressionData {
1287
    class BreakNode : public StatementNode, public ThrowableExpressionData {
1284
    public:
1288
    public:
1285
        BreakNode(JSGlobalData*, int);
1289
        BreakNode(JSGlobalData*, const JSTokenLocation&);
1286
        BreakNode(int, const Identifier&);
1290
        BreakNode(const JSTokenLocation&, const Identifier&);
1287
        
1291
        
1288
    private:
1292
    private:
1289
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1293
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 1293-1299 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec75
1293
1297
1294
    class ReturnNode : public StatementNode, public ThrowableExpressionData {
1298
    class ReturnNode : public StatementNode, public ThrowableExpressionData {
1295
    public:
1299
    public:
1296
        ReturnNode(int, ExpressionNode* value);
1300
        ReturnNode(const JSTokenLocation&, ExpressionNode* value);
1297
1301
1298
        ExpressionNode* value() { return m_value; }
1302
        ExpressionNode* value() { return m_value; }
1299
1303
Lines 1307-1313 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec76
1307
1311
1308
    class WithNode : public StatementNode {
1312
    class WithNode : public StatementNode {
1309
    public:
1313
    public:
1310
        WithNode(int, ExpressionNode*, StatementNode*, uint32_t divot, uint32_t expressionLength);
1314
        WithNode(const JSTokenLocation&, ExpressionNode*, StatementNode*, uint32_t divot, uint32_t expressionLength);
1311
1315
1312
    private:
1316
    private:
1313
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1317
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 1320-1326 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec77
1320
1324
1321
    class LabelNode : public StatementNode, public ThrowableExpressionData {
1325
    class LabelNode : public StatementNode, public ThrowableExpressionData {
1322
    public:
1326
    public:
1323
        LabelNode(int, const Identifier& name, StatementNode*);
1327
        LabelNode(const JSTokenLocation&, const Identifier& name, StatementNode*);
1324
1328
1325
    private:
1329
    private:
1326
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1330
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 1331-1337 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec78
1331
1335
1332
    class ThrowNode : public StatementNode, public ThrowableExpressionData {
1336
    class ThrowNode : public StatementNode, public ThrowableExpressionData {
1333
    public:
1337
    public:
1334
        ThrowNode(int, ExpressionNode*);
1338
        ThrowNode(const JSTokenLocation&, ExpressionNode*);
1335
1339
1336
    private:
1340
    private:
1337
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1341
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 1341-1347 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec79
1341
1345
1342
    class TryNode : public StatementNode {
1346
    class TryNode : public StatementNode {
1343
    public:
1347
    public:
1344
        TryNode(int, StatementNode* tryBlock, const Identifier& exceptionIdent, StatementNode* catchBlock, StatementNode* finallyBlock);
1348
        TryNode(const JSTokenLocation&, StatementNode* tryBlock, const Identifier& exceptionIdent, StatementNode* catchBlock, StatementNode* finallyBlock);
1345
1349
1346
    private:
1350
    private:
1347
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1351
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
Lines 1370-1377 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec80
1370
        typedef DeclarationStacks::VarStack VarStack;
1374
        typedef DeclarationStacks::VarStack VarStack;
1371
        typedef DeclarationStacks::FunctionStack FunctionStack;
1375
        typedef DeclarationStacks::FunctionStack FunctionStack;
1372
1376
1373
        ScopeNode(JSGlobalData*, int, bool inStrictContext);
1377
        ScopeNode(JSGlobalData*, const JSTokenLocation&, bool inStrictContext);
1374
        ScopeNode(JSGlobalData*, int, const SourceCode&, SourceElements*, VarStack*, FunctionStack*, IdentifierSet&, CodeFeatures, int numConstants);
1378
        ScopeNode(JSGlobalData*, const JSTokenLocation&, const SourceCode&, SourceElements*, VarStack*, FunctionStack*, IdentifierSet&, CodeFeatures, int numConstants);
1375
1379
1376
        using ParserArenaRefCounted::operator new;
1380
        using ParserArenaRefCounted::operator new;
1377
1381
Lines 1433-1444 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec81
1433
    class ProgramNode : public ScopeNode {
1437
    class ProgramNode : public ScopeNode {
1434
    public:
1438
    public:
1435
        static const bool isFunctionNode = false;
1439
        static const bool isFunctionNode = false;
1436
        static PassRefPtr<ProgramNode> create(JSGlobalData*, int, SourceElements*, VarStack*, FunctionStack*, IdentifierSet&, const SourceCode&, CodeFeatures, int numConstants);
1440
        static PassRefPtr<ProgramNode> create(JSGlobalData*, const JSTokenLocation&, SourceElements*, VarStack*, FunctionStack*, IdentifierSet&, const SourceCode&, CodeFeatures, int numConstants);
1437
1441
1438
        static const bool scopeIsFunction = false;
1442
        static const bool scopeIsFunction = false;
1439
1443
1440
    private:
1444
    private:
1441
        ProgramNode(JSGlobalData*, int, SourceElements*, VarStack*, FunctionStack*, IdentifierSet&, const SourceCode&, CodeFeatures, int numConstants);
1445
        ProgramNode(JSGlobalData*, const JSTokenLocation&, SourceElements*, VarStack*, FunctionStack*, IdentifierSet&, const SourceCode&, CodeFeatures, int numConstants);
1442
1446
1443
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1447
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1444
    };
1448
    };
Lines 1446-1457 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec82
1446
    class EvalNode : public ScopeNode {
1450
    class EvalNode : public ScopeNode {
1447
    public:
1451
    public:
1448
        static const bool isFunctionNode = false;
1452
        static const bool isFunctionNode = false;
1449
        static PassRefPtr<EvalNode> create(JSGlobalData*, int, SourceElements*, VarStack*, FunctionStack*, IdentifierSet&, const SourceCode&, CodeFeatures, int numConstants);
1453
        static PassRefPtr<EvalNode> create(JSGlobalData*, const JSTokenLocation&, SourceElements*, VarStack*, FunctionStack*, IdentifierSet&, const SourceCode&, CodeFeatures, int numConstants);
1450
1454
1451
        static const bool scopeIsFunction = false;
1455
        static const bool scopeIsFunction = false;
1452
1456
1453
    private:
1457
    private:
1454
        EvalNode(JSGlobalData*, int, SourceElements*, VarStack*, FunctionStack*, IdentifierSet&, const SourceCode&, CodeFeatures, int numConstants);
1458
        EvalNode(JSGlobalData*, const JSTokenLocation&, SourceElements*, VarStack*, FunctionStack*, IdentifierSet&, const SourceCode&, CodeFeatures, int numConstants);
1455
1459
1456
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1460
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1457
    };
1461
    };
Lines 1468-1475 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec83
1468
    class FunctionBodyNode : public ScopeNode {
1472
    class FunctionBodyNode : public ScopeNode {
1469
    public:
1473
    public:
1470
        static const bool isFunctionNode = true;
1474
        static const bool isFunctionNode = true;
1471
        static FunctionBodyNode* create(JSGlobalData*, int, bool isStrictMode);
1475
        static FunctionBodyNode* create(JSGlobalData*, const JSTokenLocation&, bool isStrictMode);
1472
        static PassRefPtr<FunctionBodyNode> create(JSGlobalData*, int, SourceElements*, VarStack*, FunctionStack*, IdentifierSet&, const SourceCode&, CodeFeatures, int numConstants);
1476
        static PassRefPtr<FunctionBodyNode> create(JSGlobalData*, const JSTokenLocation&, SourceElements*, VarStack*, FunctionStack*, IdentifierSet&, const SourceCode&, CodeFeatures, int numConstants);
1473
1477
1474
        FunctionParameters* parameters() const { return m_parameters.get(); }
1478
        FunctionParameters* parameters() const { return m_parameters.get(); }
1475
        size_t parameterCount() const { return m_parameters->size(); }
1479
        size_t parameterCount() const { return m_parameters->size(); }
Lines 1486-1493 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec84
1486
        static const bool scopeIsFunction = true;
1490
        static const bool scopeIsFunction = true;
1487
1491
1488
    private:
1492
    private:
1489
        FunctionBodyNode(JSGlobalData*, int, bool inStrictContext);
1493
        FunctionBodyNode(JSGlobalData*, const JSTokenLocation&, bool inStrictContext);
1490
        FunctionBodyNode(JSGlobalData*, int, SourceElements*, VarStack*, FunctionStack*, IdentifierSet&, const SourceCode&, CodeFeatures, int numConstants);
1494
        FunctionBodyNode(JSGlobalData*, const JSTokenLocation&, SourceElements*, VarStack*, FunctionStack*, IdentifierSet&, const SourceCode&, CodeFeatures, int numConstants);
1491
1495
1492
        Identifier m_ident;
1496
        Identifier m_ident;
1493
        Identifier m_inferredName;
1497
        Identifier m_inferredName;
Lines 1496-1502 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec85
1496
1500
1497
    class FuncExprNode : public ExpressionNode {
1501
    class FuncExprNode : public ExpressionNode {
1498
    public:
1502
    public:
1499
        FuncExprNode(int, const Identifier&, FunctionBodyNode*, const SourceCode&, ParameterNode* = 0);
1503
        FuncExprNode(const JSTokenLocation&, const Identifier&, FunctionBodyNode*, const SourceCode&, ParameterNode* = 0);
1500
1504
1501
        FunctionBodyNode* body() { return m_body; }
1505
        FunctionBodyNode* body() { return m_body; }
1502
1506
Lines 1510-1516 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec86
1510
1514
1511
    class FuncDeclNode : public StatementNode {
1515
    class FuncDeclNode : public StatementNode {
1512
    public:
1516
    public:
1513
        FuncDeclNode(int, const Identifier&, FunctionBodyNode*, const SourceCode&, ParameterNode* = 0);
1517
        FuncDeclNode(const JSTokenLocation&, const Identifier&, FunctionBodyNode*, const SourceCode&, ParameterNode* = 0);
1514
1518
1515
        FunctionBodyNode* body() { return m_body; }
1519
        FunctionBodyNode* body() { return m_body; }
1516
1520
Lines 1561-1567 namespace JSC { a/Source/JavaScriptCore/parser/Nodes.h_sec87
1561
1565
1562
    class SwitchNode : public StatementNode {
1566
    class SwitchNode : public StatementNode {
1563
    public:
1567
    public:
1564
        SwitchNode(int, ExpressionNode*, CaseBlockNode*);
1568
        SwitchNode(const JSTokenLocation&, ExpressionNode*, CaseBlockNode*);
1565
1569
1566
    private:
1570
    private:
1567
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
1571
        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
- a/Source/JavaScriptCore/parser/Parser.cpp -94 / +152 lines
Lines 138-144 template <SourceElementsMode mode, class TreeBuilder> TreeSourceElements Parser< a/Source/JavaScriptCore/parser/Parser.cpp_sec1
138
    bool seenNonDirective = false;
138
    bool seenNonDirective = false;
139
    const Identifier* directive = 0;
139
    const Identifier* directive = 0;
140
    unsigned directiveLiteralLength = 0;
140
    unsigned directiveLiteralLength = 0;
141
    unsigned startOffset = m_token.m_info.startOffset;
141
    unsigned startOffset = m_token.m_location.startOffset;
142
    unsigned oldLastLineNumber = m_lexer->lastLineNumber();
142
    unsigned oldLastLineNumber = m_lexer->lastLineNumber();
143
    unsigned oldLineNumber = m_lexer->lineNumber();
143
    unsigned oldLineNumber = m_lexer->lineNumber();
144
    bool hasSetStrict = false;
144
    bool hasSetStrict = false;
Lines 172-177 template <typename LexerType> a/Source/JavaScriptCore/parser/Parser.cpp_sec2
172
template <class TreeBuilder> TreeStatement Parser<LexerType>::parseVarDeclaration(TreeBuilder& context)
172
template <class TreeBuilder> TreeStatement Parser<LexerType>::parseVarDeclaration(TreeBuilder& context)
173
{
173
{
174
    ASSERT(match(VAR));
174
    ASSERT(match(VAR));
175
    JSTokenLocation location(tokenLocation());
175
    int start = tokenLine();
176
    int start = tokenLine();
176
    int end = 0;
177
    int end = 0;
177
    int scratch;
178
    int scratch;
Lines 182-201 template <class TreeBuilder> TreeStatement Parser<LexerType>::parseVarDeclaratio a/Source/JavaScriptCore/parser/Parser.cpp_sec3
182
    failIfTrue(m_error);
183
    failIfTrue(m_error);
183
    failIfFalse(autoSemiColon());
184
    failIfFalse(autoSemiColon());
184
    
185
    
185
    return context.createVarStatement(m_lexer->lastLineNumber(), varDecls, start, end);
186
    return context.createVarStatement(location, varDecls, start, end);
186
}
187
}
187
188
188
template <typename LexerType>
189
template <typename LexerType>
189
template <class TreeBuilder> TreeStatement Parser<LexerType>::parseConstDeclaration(TreeBuilder& context)
190
template <class TreeBuilder> TreeStatement Parser<LexerType>::parseConstDeclaration(TreeBuilder& context)
190
{
191
{
191
    ASSERT(match(CONSTTOKEN));
192
    ASSERT(match(CONSTTOKEN));
193
    JSTokenLocation location(tokenLocation());
192
    int start = tokenLine();
194
    int start = tokenLine();
193
    int end = 0;
195
    int end = 0;
194
    TreeConstDeclList constDecls = parseConstDeclarationList(context);
196
    TreeConstDeclList constDecls = parseConstDeclarationList(context);
195
    failIfTrue(m_error);
197
    failIfTrue(m_error);
196
    failIfFalse(autoSemiColon());
198
    failIfFalse(autoSemiColon());
197
    
199
    
198
    return context.createConstStatement(m_lexer->lastLineNumber(), constDecls, start, end);
200
    return context.createConstStatement(location, constDecls, start, end);
199
}
201
}
200
202
201
template <typename LexerType>
203
template <typename LexerType>
Lines 210-215 template <class TreeBuilder> TreeStatement Parser<LexerType>::parseDoWhileStatem a/Source/JavaScriptCore/parser/Parser.cpp_sec4
210
    endLoop();
212
    endLoop();
211
    failIfFalse(statement);
213
    failIfFalse(statement);
212
    int endLine = tokenLine();
214
    int endLine = tokenLine();
215
    JSTokenLocation location(tokenLocation());
213
    consumeOrFail(WHILE);
216
    consumeOrFail(WHILE);
214
    consumeOrFail(OPENPAREN);
217
    consumeOrFail(OPENPAREN);
215
    TreeExpression expr = parseExpression(context);
218
    TreeExpression expr = parseExpression(context);
Lines 217-229 template <class TreeBuilder> TreeStatement Parser<LexerType>::parseDoWhileStatem a/Source/JavaScriptCore/parser/Parser.cpp_sec5
217
    consumeOrFail(CLOSEPAREN);
220
    consumeOrFail(CLOSEPAREN);
218
    if (match(SEMICOLON))
221
    if (match(SEMICOLON))
219
        next(); // Always performs automatic semicolon insertion.
222
        next(); // Always performs automatic semicolon insertion.
220
    return context.createDoWhileStatement(m_lexer->lastLineNumber(), statement, expr, startLine, endLine);
223
    return context.createDoWhileStatement(location, statement, expr, startLine, endLine);
221
}
224
}
222
225
223
template <typename LexerType>
226
template <typename LexerType>
224
template <class TreeBuilder> TreeStatement Parser<LexerType>::parseWhileStatement(TreeBuilder& context)
227
template <class TreeBuilder> TreeStatement Parser<LexerType>::parseWhileStatement(TreeBuilder& context)
225
{
228
{
226
    ASSERT(match(WHILE));
229
    ASSERT(match(WHILE));
230
    JSTokenLocation location(tokenLocation());
227
    int startLine = tokenLine();
231
    int startLine = tokenLine();
228
    next();
232
    next();
229
    consumeOrFail(OPENPAREN);
233
    consumeOrFail(OPENPAREN);
Lines 236-242 template <class TreeBuilder> TreeStatement Parser<LexerType>::parseWhileStatemen a/Source/JavaScriptCore/parser/Parser.cpp_sec6
236
    TreeStatement statement = parseStatement(context, unused);
240
    TreeStatement statement = parseStatement(context, unused);
237
    endLoop();
241
    endLoop();
238
    failIfFalse(statement);
242
    failIfFalse(statement);
239
    return context.createWhileStatement(m_lexer->lastLineNumber(), expr, statement, startLine, endLine);
243
    return context.createWhileStatement(location, expr, statement, startLine, endLine);
240
}
244
}
241
245
242
template <typename LexerType>
246
template <typename LexerType>
Lines 245-250 template <class TreeBuilder> TreeExpression Parser<LexerType>::parseVarDeclarati a/Source/JavaScriptCore/parser/Parser.cpp_sec7
245
    TreeExpression varDecls = 0;
249
    TreeExpression varDecls = 0;
246
    do {
250
    do {
247
        declarations++;
251
        declarations++;
252
        JSTokenLocation location(tokenLocation());
248
        next();
253
        next();
249
        matchOrFail(IDENT);
254
        matchOrFail(IDENT);
250
        
255
        
Lines 265-275 template <class TreeBuilder> TreeExpression Parser<LexerType>::parseVarDeclarati a/Source/JavaScriptCore/parser/Parser.cpp_sec8
265
            lastInitializer = initializer;
270
            lastInitializer = initializer;
266
            failIfFalse(initializer);
271
            failIfFalse(initializer);
267
            
272
            
268
            TreeExpression node = context.createAssignResolve(m_lexer->lastLineNumber(), *name, initializer, varStart, varDivot, lastTokenEnd());
273
            TreeExpression node = context.createAssignResolve(location, *name, initializer, varStart, varDivot, lastTokenEnd());
269
            if (!varDecls)
274
            if (!varDecls)
270
                varDecls = node;
275
                varDecls = node;
271
            else
276
            else
272
                varDecls = context.combineCommaNodes(m_lexer->lastLineNumber(), varDecls, node);
277
                varDecls = context.combineCommaNodes(location, varDecls, node);
273
        }
278
        }
274
    } while (match(COMMA));
279
    } while (match(COMMA));
275
    return varDecls;
280
    return varDecls;
Lines 282-287 template <class TreeBuilder> TreeConstDeclList Parser<LexerType>::parseConstDecl a/Source/JavaScriptCore/parser/Parser.cpp_sec9
282
    TreeConstDeclList constDecls = 0;
287
    TreeConstDeclList constDecls = 0;
283
    TreeConstDeclList tail = 0;
288
    TreeConstDeclList tail = 0;
284
    do {
289
    do {
290
        JSTokenLocation location(tokenLocation());
285
        next();
291
        next();
286
        matchOrFail(IDENT);
292
        matchOrFail(IDENT);
287
        const Identifier* name = m_token.m_data.ident;
293
        const Identifier* name = m_token.m_data.ident;
Lines 294-300 template <class TreeBuilder> TreeConstDeclList Parser<LexerType>::parseConstDecl a/Source/JavaScriptCore/parser/Parser.cpp_sec10
294
            next(TreeBuilder::DontBuildStrings); // consume '='
300
            next(TreeBuilder::DontBuildStrings); // consume '='
295
            initializer = parseAssignmentExpression(context);
301
            initializer = parseAssignmentExpression(context);
296
        }
302
        }
297
        tail = context.appendConstDecl(m_lexer->lastLineNumber(), tail, name, initializer);
303
        tail = context.appendConstDecl(location, tail, name, initializer);
298
        if (!constDecls)
304
        if (!constDecls)
299
            constDecls = tail;
305
            constDecls = tail;
300
    } while (match(COMMA));
306
    } while (match(COMMA));
Lines 305-310 template <typename LexerType> a/Source/JavaScriptCore/parser/Parser.cpp_sec11
305
template <class TreeBuilder> TreeStatement Parser<LexerType>::parseForStatement(TreeBuilder& context)
311
template <class TreeBuilder> TreeStatement Parser<LexerType>::parseForStatement(TreeBuilder& context)
306
{
312
{
307
    ASSERT(match(FOR));
313
    ASSERT(match(FOR));
314
    JSTokenLocation location(tokenLocation());
308
    int startLine = tokenLine();
315
    int startLine = tokenLine();
309
    next();
316
    next();
310
    consumeOrFail(OPENPAREN);
317
    consumeOrFail(OPENPAREN);
Lines 352-358 template <class TreeBuilder> TreeStatement Parser<LexerType>::parseForStatement( a/Source/JavaScriptCore/parser/Parser.cpp_sec12
352
        endLoop();
359
        endLoop();
353
        failIfFalse(statement);
360
        failIfFalse(statement);
354
        
361
        
355
        return context.createForInLoop(m_lexer->lastLineNumber(), forInTarget, forInInitializer, expr, statement, declsStart, inLocation, exprEnd, initStart, initEnd, startLine, endLine);
362
        return context.createForInLoop(location, forInTarget, forInInitializer, expr, statement, declsStart, inLocation, exprEnd, initStart, initEnd, startLine, endLine);
356
    }
363
    }
357
    
364
    
358
    if (!match(SEMICOLON)) {
365
    if (!match(SEMICOLON)) {
Lines 388-394 template <class TreeBuilder> TreeStatement Parser<LexerType>::parseForStatement( a/Source/JavaScriptCore/parser/Parser.cpp_sec13
388
        TreeStatement statement = parseStatement(context, unused);
395
        TreeStatement statement = parseStatement(context, unused);
389
        endLoop();
396
        endLoop();
390
        failIfFalse(statement);
397
        failIfFalse(statement);
391
        return context.createForLoop(m_lexer->lastLineNumber(), decls, condition, increment, statement, startLine, endLine);
398
        return context.createForLoop(location, decls, condition, increment, statement, startLine, endLine);
392
    }
399
    }
393
    
400
    
394
    // For-in loop
401
    // For-in loop
Lines 405-417 template <class TreeBuilder> TreeStatement Parser<LexerType>::parseForStatement( a/Source/JavaScriptCore/parser/Parser.cpp_sec14
405
    endLoop();
412
    endLoop();
406
    failIfFalse(statement);
413
    failIfFalse(statement);
407
    
414
    
408
    return context.createForInLoop(m_lexer->lastLineNumber(), decls, expr, statement, declsStart, declsEnd, exprEnd, startLine, endLine);
415
    return context.createForInLoop(location, decls, expr, statement, declsStart, declsEnd, exprEnd, startLine, endLine);
409
}
416
}
410
417
411
template <typename LexerType>
418
template <typename LexerType>
412
template <class TreeBuilder> TreeStatement Parser<LexerType>::parseBreakStatement(TreeBuilder& context)
419
template <class TreeBuilder> TreeStatement Parser<LexerType>::parseBreakStatement(TreeBuilder& context)
413
{
420
{
414
    ASSERT(match(BREAK));
421
    ASSERT(match(BREAK));
422
    JSTokenLocation location(tokenLocation());
415
    int startCol = tokenStart();
423
    int startCol = tokenStart();
416
    int endCol = tokenEnd();
424
    int endCol = tokenEnd();
417
    int startLine = tokenLine();
425
    int startLine = tokenLine();
Lines 420-426 template <class TreeBuilder> TreeStatement Parser<LexerType>::parseBreakStatemen a/Source/JavaScriptCore/parser/Parser.cpp_sec15
420
    
428
    
421
    if (autoSemiColon()) {
429
    if (autoSemiColon()) {
422
        failIfFalseWithMessage(breakIsValid(), "'break' is only valid inside a switch or loop statement");
430
        failIfFalseWithMessage(breakIsValid(), "'break' is only valid inside a switch or loop statement");
423
        return context.createBreakStatement(m_lexer->lastLineNumber(), startCol, endCol, startLine, endLine);
431
        return context.createBreakStatement(location, startCol, endCol, startLine, endLine);
424
    }
432
    }
425
    matchOrFail(IDENT);
433
    matchOrFail(IDENT);
426
    const Identifier* ident = m_token.m_data.ident;
434
    const Identifier* ident = m_token.m_data.ident;
Lines 429-441 template <class TreeBuilder> TreeStatement Parser<LexerType>::parseBreakStatemen a/Source/JavaScriptCore/parser/Parser.cpp_sec16
429
    endLine = tokenLine();
437
    endLine = tokenLine();
430
    next();
438
    next();
431
    failIfFalse(autoSemiColon());
439
    failIfFalse(autoSemiColon());
432
    return context.createBreakStatement(m_lexer->lastLineNumber(), ident, startCol, endCol, startLine, endLine);
440
    return context.createBreakStatement(location, ident, startCol, endCol, startLine, endLine);
433
}
441
}
434
442
435
template <typename LexerType>
443
template <typename LexerType>
436
template <class TreeBuilder> TreeStatement Parser<LexerType>::parseContinueStatement(TreeBuilder& context)
444
template <class TreeBuilder> TreeStatement Parser<LexerType>::parseContinueStatement(TreeBuilder& context)
437
{
445
{
438
    ASSERT(match(CONTINUE));
446
    ASSERT(match(CONTINUE));
447
    JSTokenLocation location(tokenLocation());
439
    int startCol = tokenStart();
448
    int startCol = tokenStart();
440
    int endCol = tokenEnd();
449
    int endCol = tokenEnd();
441
    int startLine = tokenLine();
450
    int startLine = tokenLine();
Lines 444-450 template <class TreeBuilder> TreeStatement Parser<LexerType>::parseContinueState a/Source/JavaScriptCore/parser/Parser.cpp_sec17
444
    
453
    
445
    if (autoSemiColon()) {
454
    if (autoSemiColon()) {
446
        failIfFalseWithMessage(continueIsValid(), "'continue' is only valid inside a loop statement");
455
        failIfFalseWithMessage(continueIsValid(), "'continue' is only valid inside a loop statement");
447
        return context.createContinueStatement(m_lexer->lastLineNumber(), startCol, endCol, startLine, endLine);
456
        return context.createContinueStatement(location, startCol, endCol, startLine, endLine);
448
    }
457
    }
449
    matchOrFail(IDENT);
458
    matchOrFail(IDENT);
450
    const Identifier* ident = m_token.m_data.ident;
459
    const Identifier* ident = m_token.m_data.ident;
Lines 455-467 template <class TreeBuilder> TreeStatement Parser<LexerType>::parseContinueState a/Source/JavaScriptCore/parser/Parser.cpp_sec18
455
    endLine = tokenLine();
464
    endLine = tokenLine();
456
    next();
465
    next();
457
    failIfFalse(autoSemiColon());
466
    failIfFalse(autoSemiColon());
458
    return context.createContinueStatement(m_lexer->lastLineNumber(), ident, startCol, endCol, startLine, endLine);
467
    return context.createContinueStatement(location, ident, startCol, endCol, startLine, endLine);
459
}
468
}
460
469
461
template <typename LexerType>
470
template <typename LexerType>
462
template <class TreeBuilder> TreeStatement Parser<LexerType>::parseReturnStatement(TreeBuilder& context)
471
template <class TreeBuilder> TreeStatement Parser<LexerType>::parseReturnStatement(TreeBuilder& context)
463
{
472
{
464
    ASSERT(match(RETURN));
473
    ASSERT(match(RETURN));
474
    JSTokenLocation location(tokenLocation());
465
    failIfFalse(currentScope()->isFunction());
475
    failIfFalse(currentScope()->isFunction());
466
    int startLine = tokenLine();
476
    int startLine = tokenLine();
467
    int endLine = startLine;
477
    int endLine = startLine;
Lines 474-493 template <class TreeBuilder> TreeStatement Parser<LexerType>::parseReturnStateme a/Source/JavaScriptCore/parser/Parser.cpp_sec19
474
    if (match(SEMICOLON))
484
    if (match(SEMICOLON))
475
        endLine  = tokenLine();
485
        endLine  = tokenLine();
476
    if (autoSemiColon())
486
    if (autoSemiColon())
477
        return context.createReturnStatement(m_lexer->lastLineNumber(), 0, start, end, startLine, endLine);
487
        return context.createReturnStatement(location, 0, start, end, startLine, endLine);
478
    TreeExpression expr = parseExpression(context);
488
    TreeExpression expr = parseExpression(context);
479
    failIfFalse(expr);
489
    failIfFalse(expr);
480
    end = lastTokenEnd();
490
    end = lastTokenEnd();
481
    if (match(SEMICOLON))
491
    if (match(SEMICOLON))
482
        endLine  = tokenLine();
492
        endLine  = tokenLine();
483
    failIfFalse(autoSemiColon());
493
    failIfFalse(autoSemiColon());
484
    return context.createReturnStatement(m_lexer->lastLineNumber(), expr, start, end, startLine, endLine);
494
    return context.createReturnStatement(location, expr, start, end, startLine, endLine);
485
}
495
}
486
496
487
template <typename LexerType>
497
template <typename LexerType>
488
template <class TreeBuilder> TreeStatement Parser<LexerType>::parseThrowStatement(TreeBuilder& context)
498
template <class TreeBuilder> TreeStatement Parser<LexerType>::parseThrowStatement(TreeBuilder& context)
489
{
499
{
490
    ASSERT(match(THROW));
500
    ASSERT(match(THROW));
501
    JSTokenLocation location(tokenLocation());
491
    int eStart = tokenStart();
502
    int eStart = tokenStart();
492
    int startLine = tokenLine();
503
    int startLine = tokenLine();
493
    next();
504
    next();
Lines 500-512 template <class TreeBuilder> TreeStatement Parser<LexerType>::parseThrowStatemen a/Source/JavaScriptCore/parser/Parser.cpp_sec20
500
    int endLine = tokenLine();
511
    int endLine = tokenLine();
501
    failIfFalse(autoSemiColon());
512
    failIfFalse(autoSemiColon());
502
    
513
    
503
    return context.createThrowStatement(m_lexer->lastLineNumber(), expr, eStart, eEnd, startLine, endLine);
514
    return context.createThrowStatement(location, expr, eStart, eEnd, startLine, endLine);
504
}
515
}
505
516
506
template <typename LexerType>
517
template <typename LexerType>
507
template <class TreeBuilder> TreeStatement Parser<LexerType>::parseWithStatement(TreeBuilder& context)
518
template <class TreeBuilder> TreeStatement Parser<LexerType>::parseWithStatement(TreeBuilder& context)
508
{
519
{
509
    ASSERT(match(WITH));
520
    ASSERT(match(WITH));
521
    JSTokenLocation location(tokenLocation());
510
    failIfTrueWithMessage(strictMode(), "'with' statements are not valid in strict mode");
522
    failIfTrueWithMessage(strictMode(), "'with' statements are not valid in strict mode");
511
    currentScope()->setNeedsFullActivation();
523
    currentScope()->setNeedsFullActivation();
512
    int startLine = tokenLine();
524
    int startLine = tokenLine();
Lines 523-535 template <class TreeBuilder> TreeStatement Parser<LexerType>::parseWithStatement a/Source/JavaScriptCore/parser/Parser.cpp_sec21
523
    TreeStatement statement = parseStatement(context, unused);
535
    TreeStatement statement = parseStatement(context, unused);
524
    failIfFalse(statement);
536
    failIfFalse(statement);
525
    
537
    
526
    return context.createWithStatement(m_lexer->lastLineNumber(), expr, statement, start, end, startLine, endLine);
538
    return context.createWithStatement(location, expr, statement, start, end, startLine, endLine);
527
}
539
}
528
540
529
template <typename LexerType>
541
template <typename LexerType>
530
template <class TreeBuilder> TreeStatement Parser<LexerType>::parseSwitchStatement(TreeBuilder& context)
542
template <class TreeBuilder> TreeStatement Parser<LexerType>::parseSwitchStatement(TreeBuilder& context)
531
{
543
{
532
    ASSERT(match(SWITCH));
544
    ASSERT(match(SWITCH));
545
    JSTokenLocation location(tokenLocation());
533
    int startLine = tokenLine();
546
    int startLine = tokenLine();
534
    next();
547
    next();
535
    consumeOrFail(OPENPAREN);
548
    consumeOrFail(OPENPAREN);
Lines 550-556 template <class TreeBuilder> TreeStatement Parser<LexerType>::parseSwitchStateme a/Source/JavaScriptCore/parser/Parser.cpp_sec22
550
    endSwitch();
563
    endSwitch();
551
    consumeOrFail(CLOSEBRACE);
564
    consumeOrFail(CLOSEBRACE);
552
    
565
    
553
    return context.createSwitchStatement(m_lexer->lastLineNumber(), expr, firstClauses, defaultClause, secondClauses, startLine, endLine);
566
    return context.createSwitchStatement(location, expr, firstClauses, defaultClause, secondClauses, startLine, endLine);
554
    
567
    
555
}
568
}
556
569
Lines 598-603 template <typename LexerType> a/Source/JavaScriptCore/parser/Parser.cpp_sec23
598
template <class TreeBuilder> TreeStatement Parser<LexerType>::parseTryStatement(TreeBuilder& context)
611
template <class TreeBuilder> TreeStatement Parser<LexerType>::parseTryStatement(TreeBuilder& context)
599
{
612
{
600
    ASSERT(match(TRY));
613
    ASSERT(match(TRY));
614
    JSTokenLocation location(tokenLocation());
601
    TreeStatement tryBlock = 0;
615
    TreeStatement tryBlock = 0;
602
    const Identifier* ident = &m_globalData->propertyNames->nullIdentifier;
616
    const Identifier* ident = &m_globalData->propertyNames->nullIdentifier;
603
    TreeStatement catchBlock = 0;
617
    TreeStatement catchBlock = 0;
Lines 634-670 template <class TreeBuilder> TreeStatement Parser<LexerType>::parseTryStatement( a/Source/JavaScriptCore/parser/Parser.cpp_sec24
634
        failIfFalse(finallyBlock);
648
        failIfFalse(finallyBlock);
635
    }
649
    }
636
    failIfFalse(catchBlock || finallyBlock);
650
    failIfFalse(catchBlock || finallyBlock);
637
    return context.createTryStatement(m_lexer->lastLineNumber(), tryBlock, ident, catchBlock, finallyBlock, firstLine, lastLine);
651
    return context.createTryStatement(location, tryBlock, ident, catchBlock, finallyBlock, firstLine, lastLine);
638
}
652
}
639
653
640
template <typename LexerType>
654
template <typename LexerType>
641
template <class TreeBuilder> TreeStatement Parser<LexerType>::parseDebuggerStatement(TreeBuilder& context)
655
template <class TreeBuilder> TreeStatement Parser<LexerType>::parseDebuggerStatement(TreeBuilder& context)
642
{
656
{
643
    ASSERT(match(DEBUGGER));
657
    ASSERT(match(DEBUGGER));
658
    JSTokenLocation location(tokenLocation());
644
    int startLine = tokenLine();
659
    int startLine = tokenLine();
645
    int endLine = startLine;
660
    int endLine = startLine;
646
    next();
661
    next();
647
    if (match(SEMICOLON))
662
    if (match(SEMICOLON))
648
        startLine = tokenLine();
663
        startLine = tokenLine();
649
    failIfFalse(autoSemiColon());
664
    failIfFalse(autoSemiColon());
650
    return context.createDebugger(m_lexer->lastLineNumber(), startLine, endLine);
665
    return context.createDebugger(location, startLine, endLine);
651
}
666
}
652
667
653
template <typename LexerType>
668
template <typename LexerType>
654
template <class TreeBuilder> TreeStatement Parser<LexerType>::parseBlockStatement(TreeBuilder& context)
669
template <class TreeBuilder> TreeStatement Parser<LexerType>::parseBlockStatement(TreeBuilder& context)
655
{
670
{
656
    ASSERT(match(OPENBRACE));
671
    ASSERT(match(OPENBRACE));
672
    JSTokenLocation location(tokenLocation());
657
    int start = tokenLine();
673
    int start = tokenLine();
658
    next();
674
    next();
659
    if (match(CLOSEBRACE)) {
675
    if (match(CLOSEBRACE)) {
660
        next();
676
        next();
661
        return context.createBlockStatement(m_lexer->lastLineNumber(), 0, start, m_lastLine);
677
        return context.createBlockStatement(location, 0, start, m_lastLine);
662
    }
678
    }
663
    TreeSourceElements subtree = parseSourceElements<DontCheckForStrictMode>(context);
679
    TreeSourceElements subtree = parseSourceElements<DontCheckForStrictMode>(context);
664
    failIfFalse(subtree);
680
    failIfFalse(subtree);
665
    matchOrFail(CLOSEBRACE);
681
    matchOrFail(CLOSEBRACE);
666
    next();
682
    next();
667
    return context.createBlockStatement(m_lexer->lastLineNumber(), subtree, start, m_lastLine);
683
    return context.createBlockStatement(location, subtree, start, m_lastLine);
668
}
684
}
669
685
670
template <typename LexerType>
686
template <typename LexerType>
Lines 685-693 template <class TreeBuilder> TreeStatement Parser<LexerType>::parseStatement(Tre a/Source/JavaScriptCore/parser/Parser.cpp_sec25
685
    case FUNCTION:
701
    case FUNCTION:
686
        failIfFalseIfStrictWithMessage(m_statementDepth == 1, "Functions cannot be declared in a nested block in strict mode");
702
        failIfFalseIfStrictWithMessage(m_statementDepth == 1, "Functions cannot be declared in a nested block in strict mode");
687
        return parseFunctionDeclaration(context);
703
        return parseFunctionDeclaration(context);
688
    case SEMICOLON:
704
    case SEMICOLON: {
705
        JSTokenLocation location(tokenLocation());
689
        next();
706
        next();
690
        return context.createEmptyStatement(m_lexer->lastLineNumber());
707
        return context.createEmptyStatement(location);
708
    }
691
    case IF:
709
    case IF:
692
        return parseIfStatement(context);
710
        return parseIfStatement(context);
693
    case DO:
711
    case DO:
Lines 723-729 template <class TreeBuilder> TreeStatement Parser<LexerType>::parseStatement(Tre a/Source/JavaScriptCore/parser/Parser.cpp_sec26
723
    case STRING:
741
    case STRING:
724
        directive = m_token.m_data.ident;
742
        directive = m_token.m_data.ident;
725
        if (directiveLiteralLength)
743
        if (directiveLiteralLength)
726
            *directiveLiteralLength = m_token.m_info.endOffset - m_token.m_info.startOffset;
744
            *directiveLiteralLength = m_token.m_location.endOffset - m_token.m_location.startOffset;
727
        nonTrivialExpressionCount = m_nonTrivialExpressionCount;
745
        nonTrivialExpressionCount = m_nonTrivialExpressionCount;
728
    default:
746
    default:
729
        TreeStatement exprStatement = parseExpressionStatement(context);
747
        TreeStatement exprStatement = parseExpressionStatement(context);
Lines 756-767 template <typename LexerType> a/Source/JavaScriptCore/parser/Parser.cpp_sec27
756
template <class TreeBuilder> TreeFunctionBody Parser<LexerType>::parseFunctionBody(TreeBuilder& context)
774
template <class TreeBuilder> TreeFunctionBody Parser<LexerType>::parseFunctionBody(TreeBuilder& context)
757
{
775
{
758
    if (match(CLOSEBRACE))
776
    if (match(CLOSEBRACE))
759
        return context.createFunctionBody(m_lexer->lastLineNumber(), strictMode());
777
        return context.createFunctionBody(tokenLocation(), strictMode());
760
    DepthManager statementDepth(&m_statementDepth);
778
    DepthManager statementDepth(&m_statementDepth);
761
    m_statementDepth = 0;
779
    m_statementDepth = 0;
762
    typename TreeBuilder::FunctionBodyBuilder bodyBuilder(const_cast<JSGlobalData*>(m_globalData), m_lexer.get());
780
    typename TreeBuilder::FunctionBodyBuilder bodyBuilder(const_cast<JSGlobalData*>(m_globalData), m_lexer.get());
763
    failIfFalse(parseSourceElements<CheckForStrictMode>(bodyBuilder));
781
    failIfFalse(parseSourceElements<CheckForStrictMode>(bodyBuilder));
764
    return context.createFunctionBody(m_lexer->lastLineNumber(), strictMode());
782
    return context.createFunctionBody(tokenLocation(), strictMode());
765
}
783
}
766
784
767
template <typename LexerType>
785
template <typename LexerType>
Lines 786-805 template <FunctionRequirements requirements, bool nameIsInContainingScope, class a/Source/JavaScriptCore/parser/Parser.cpp_sec28
786
    
804
    
787
    openBracePos = m_token.m_data.intValue;
805
    openBracePos = m_token.m_data.intValue;
788
    bodyStartLine = tokenLine();
806
    bodyStartLine = tokenLine();
807
    JSTokenLocation location(tokenLocation());
789
    
808
    
790
    // If we know about this function already, we can use the cached info and skip the parser to the end of the function.
809
    // If we know about this function already, we can use the cached info and skip the parser to the end of the function.
791
    if (const SourceProviderCacheItem* cachedInfo = TreeBuilder::CanUseFunctionCache ? findCachedFunctionInfo(openBracePos) : 0) {
810
    if (const SourceProviderCacheItem* cachedInfo = TreeBuilder::CanUseFunctionCache ? findCachedFunctionInfo(openBracePos) : 0) {
792
        // If we're in a strict context, the cached function info must say it was strict too.
811
        // If we're in a strict context, the cached function info must say it was strict too.
793
        ASSERT(!strictMode() || cachedInfo->strictMode);
812
        ASSERT(!strictMode() || cachedInfo->strictMode);
794
        body = context.createFunctionBody(m_lexer->lastLineNumber(), cachedInfo->strictMode);
813
        body = context.createFunctionBody(location, cachedInfo->strictMode);
795
        
814
        
796
        functionScope->restoreFunctionInfo(cachedInfo);
815
        functionScope->restoreFunctionInfo(cachedInfo);
797
        failIfFalse(popScope(functionScope, TreeBuilder::NeedsFreeVariableInfo));
816
        failIfFalse(popScope(functionScope, TreeBuilder::NeedsFreeVariableInfo));
798
        
817
        
799
        closeBracePos = cachedInfo->closeBracePos;
818
        closeBracePos = cachedInfo->closeBracePos;
800
        m_token = cachedInfo->closeBraceToken();
819
        m_token = cachedInfo->closeBraceToken();
801
        m_lexer->setOffset(m_token.m_info.endOffset);
820
        m_lexer->setOffset(m_token.m_location.endOffset);
802
        m_lexer->setLineNumber(m_token.m_info.line);
821
        m_lexer->setLineNumber(m_token.m_location.line);
803
        
822
        
804
        next();
823
        next();
805
        return true;
824
        return true;
Lines 821-827 template <FunctionRequirements requirements, bool nameIsInContainingScope, class a/Source/JavaScriptCore/parser/Parser.cpp_sec29
821
    OwnPtr<SourceProviderCacheItem> newInfo;
840
    OwnPtr<SourceProviderCacheItem> newInfo;
822
    int functionLength = closeBracePos - openBracePos;
841
    int functionLength = closeBracePos - openBracePos;
823
    if (TreeBuilder::CanUseFunctionCache && m_functionCache && functionLength > minimumFunctionLengthToCache) {
842
    if (TreeBuilder::CanUseFunctionCache && m_functionCache && functionLength > minimumFunctionLengthToCache) {
824
        newInfo = adoptPtr(new SourceProviderCacheItem(m_token.m_info.line, closeBracePos));
843
        newInfo = adoptPtr(new SourceProviderCacheItem(m_token.m_location.line, closeBracePos));
825
        functionScope->saveFunctionInfo(newInfo.get());
844
        functionScope->saveFunctionInfo(newInfo.get());
826
    }
845
    }
827
    
846
    
Lines 841-846 template <typename LexerType> a/Source/JavaScriptCore/parser/Parser.cpp_sec30
841
template <class TreeBuilder> TreeStatement Parser<LexerType>::parseFunctionDeclaration(TreeBuilder& context)
860
template <class TreeBuilder> TreeStatement Parser<LexerType>::parseFunctionDeclaration(TreeBuilder& context)
842
{
861
{
843
    ASSERT(match(FUNCTION));
862
    ASSERT(match(FUNCTION));
863
    JSTokenLocation location(tokenLocation());
844
    next();
864
    next();
845
    const Identifier* name = 0;
865
    const Identifier* name = 0;
846
    TreeFormalParameterList parameters = 0;
866
    TreeFormalParameterList parameters = 0;
Lines 851-857 template <class TreeBuilder> TreeStatement Parser<LexerType>::parseFunctionDecla a/Source/JavaScriptCore/parser/Parser.cpp_sec31
851
    failIfFalse((parseFunctionInfo<FunctionNeedsName, true>(context, name, parameters, body, openBracePos, closeBracePos, bodyStartLine)));
871
    failIfFalse((parseFunctionInfo<FunctionNeedsName, true>(context, name, parameters, body, openBracePos, closeBracePos, bodyStartLine)));
852
    failIfFalse(name);
872
    failIfFalse(name);
853
    failIfFalseIfStrict(declareVariable(name));
873
    failIfFalseIfStrict(declareVariable(name));
854
    return context.createFuncDeclStatement(m_lexer->lastLineNumber(), name, body, parameters, openBracePos, closeBracePos, bodyStartLine, m_lastLine);
874
    return context.createFuncDeclStatement(location, name, body, parameters, openBracePos, closeBracePos, bodyStartLine, m_lastLine);
855
}
875
}
856
876
857
struct LabelInfo {
877
struct LabelInfo {
Lines 875-884 template <class TreeBuilder> TreeStatement Parser<LexerType>::parseExpressionOrL a/Source/JavaScriptCore/parser/Parser.cpp_sec32
875
     * special case that looks for a colon as the next character in the input.
895
     * special case that looks for a colon as the next character in the input.
876
     */
896
     */
877
    Vector<LabelInfo> labels;
897
    Vector<LabelInfo> labels;
878
    
898
    JSTokenLocation location;
879
    do {
899
    do {
880
        int start = tokenStart();
900
        int start = tokenStart();
881
        int startLine = tokenLine();
901
        int startLine = tokenLine();
902
        location = tokenLocation();
882
        if (!nextTokenIsColon()) {
903
        if (!nextTokenIsColon()) {
883
            // If we hit this path we're making a expression statement, which
904
            // If we hit this path we're making a expression statement, which
884
            // by definition can't make use of continue/break so we can just
905
            // by definition can't make use of continue/break so we can just
Lines 886-892 template <class TreeBuilder> TreeStatement Parser<LexerType>::parseExpressionOrL a/Source/JavaScriptCore/parser/Parser.cpp_sec33
886
            TreeExpression expression = parseExpression(context);
907
            TreeExpression expression = parseExpression(context);
887
            failIfFalse(expression);
908
            failIfFalse(expression);
888
            failIfFalse(autoSemiColon());
909
            failIfFalse(autoSemiColon());
889
            return context.createExprStatement(m_lexer->lastLineNumber(), expression, startLine, m_lastLine);
910
            return context.createExprStatement(location, expression, startLine, m_lastLine);
890
        }
911
        }
891
        const Identifier* ident = m_token.m_data.ident;
912
        const Identifier* ident = m_token.m_data.ident;
892
        int end = tokenEnd();
913
        int end = tokenEnd();
Lines 925-931 template <class TreeBuilder> TreeStatement Parser<LexerType>::parseExpressionOrL a/Source/JavaScriptCore/parser/Parser.cpp_sec34
925
    failIfFalse(statement);
946
    failIfFalse(statement);
926
    for (size_t i = 0; i < labels.size(); i++) {
947
    for (size_t i = 0; i < labels.size(); i++) {
927
        const LabelInfo& info = labels[labels.size() - i - 1];
948
        const LabelInfo& info = labels[labels.size() - i - 1];
928
        statement = context.createLabelStatement(m_lexer->lastLineNumber(), info.m_ident, statement, info.m_start, info.m_end);
949
        statement = context.createLabelStatement(location, info.m_ident, statement, info.m_start, info.m_end);
929
    }
950
    }
930
    return statement;
951
    return statement;
931
}
952
}
Lines 934-950 template <typename LexerType> a/Source/JavaScriptCore/parser/Parser.cpp_sec35
934
template <class TreeBuilder> TreeStatement Parser<LexerType>::parseExpressionStatement(TreeBuilder& context)
955
template <class TreeBuilder> TreeStatement Parser<LexerType>::parseExpressionStatement(TreeBuilder& context)
935
{
956
{
936
    int startLine = tokenLine();
957
    int startLine = tokenLine();
958
    JSTokenLocation location(tokenLocation());
937
    TreeExpression expression = parseExpression(context);
959
    TreeExpression expression = parseExpression(context);
938
    failIfFalse(expression);
960
    failIfFalse(expression);
939
    failIfFalse(autoSemiColon());
961
    failIfFalse(autoSemiColon());
940
    return context.createExprStatement(m_lexer->lastLineNumber(), expression, startLine, m_lastLine);
962
    return context.createExprStatement(location, expression, startLine, m_lastLine);
941
}
963
}
942
964
943
template <typename LexerType>
965
template <typename LexerType>
944
template <class TreeBuilder> TreeStatement Parser<LexerType>::parseIfStatement(TreeBuilder& context)
966
template <class TreeBuilder> TreeStatement Parser<LexerType>::parseIfStatement(TreeBuilder& context)
945
{
967
{
946
    ASSERT(match(IF));
968
    ASSERT(match(IF));
947
    
969
    JSTokenLocation ifLocation(tokenLocation());
948
    int start = tokenLine();
970
    int start = tokenLine();
949
    next();
971
    next();
950
    
972
    
Lines 960-972 template <class TreeBuilder> TreeStatement Parser<LexerType>::parseIfStatement(T a/Source/JavaScriptCore/parser/Parser.cpp_sec36
960
    failIfFalse(trueBlock);
982
    failIfFalse(trueBlock);
961
    
983
    
962
    if (!match(ELSE))
984
    if (!match(ELSE))
963
        return context.createIfStatement(m_lexer->lastLineNumber(), condition, trueBlock, start, end);
985
        return context.createIfStatement(ifLocation, condition, trueBlock, start, end);
964
    
986
    
965
    Vector<TreeExpression> exprStack;
987
    Vector<TreeExpression> exprStack;
966
    Vector<pair<int, int> > posStack;
988
    Vector<pair<int, int> > posStack;
989
    Vector<JSTokenLocation> tokenLocationStack;
967
    Vector<TreeStatement> statementStack;
990
    Vector<TreeStatement> statementStack;
968
    bool trailingElse = false;
991
    bool trailingElse = false;
969
    do {
992
    do {
993
        tokenLocationStack.append(tokenLocation());
970
        next();
994
        next();
971
        if (!match(IF)) {
995
        if (!match(IF)) {
972
            const Identifier* unused = 0;
996
            const Identifier* unused = 0;
Lines 992-998 template <class TreeBuilder> TreeStatement Parser<LexerType>::parseIfStatement(T a/Source/JavaScriptCore/parser/Parser.cpp_sec37
992
        posStack.append(make_pair(innerStart, innerEnd));
1016
        posStack.append(make_pair(innerStart, innerEnd));
993
        statementStack.append(innerTrueBlock);
1017
        statementStack.append(innerTrueBlock);
994
    } while (match(ELSE));
1018
    } while (match(ELSE));
995
    
1019
996
    if (!trailingElse) {
1020
    if (!trailingElse) {
997
        TreeExpression condition = exprStack.last();
1021
        TreeExpression condition = exprStack.last();
998
        exprStack.removeLast();
1022
        exprStack.removeLast();
Lines 1000-1006 template <class TreeBuilder> TreeStatement Parser<LexerType>::parseIfStatement(T a/Source/JavaScriptCore/parser/Parser.cpp_sec38
1000
        statementStack.removeLast();
1024
        statementStack.removeLast();
1001
        pair<int, int> pos = posStack.last();
1025
        pair<int, int> pos = posStack.last();
1002
        posStack.removeLast();
1026
        posStack.removeLast();
1003
        statementStack.append(context.createIfStatement(m_lexer->lastLineNumber(), condition, trueBlock, pos.first, pos.second));
1027
        JSTokenLocation elseLocation = tokenLocationStack.last();
1028
        tokenLocationStack.removeLast();
1029
        statementStack.append(context.createIfStatement(elseLocation, condition, trueBlock, pos.first, pos.second));
1004
    }
1030
    }
1005
    
1031
    
1006
    while (!exprStack.isEmpty()) {
1032
    while (!exprStack.isEmpty()) {
Lines 1012-1027 template <class TreeBuilder> TreeStatement Parser<LexerType>::parseIfStatement(T a/Source/JavaScriptCore/parser/Parser.cpp_sec39
1012
        statementStack.removeLast();
1038
        statementStack.removeLast();
1013
        pair<int, int> pos = posStack.last();
1039
        pair<int, int> pos = posStack.last();
1014
        posStack.removeLast();
1040
        posStack.removeLast();
1015
        statementStack.append(context.createIfStatement(m_lexer->lastLineNumber(), condition, trueBlock, falseBlock, pos.first, pos.second));
1041
        JSTokenLocation elseLocation = tokenLocationStack.last();
1042
        tokenLocationStack.removeLast();
1043
        statementStack.append(context.createIfStatement(elseLocation, condition, trueBlock, falseBlock, pos.first, pos.second));
1016
    }
1044
    }
1017
    
1045
    
1018
    return context.createIfStatement(m_lexer->lastLineNumber(), condition, trueBlock, statementStack.last(), start, end);
1046
    return context.createIfStatement(ifLocation, condition, trueBlock, statementStack.last(), start, end);
1019
}
1047
}
1020
1048
1021
template <typename LexerType>
1049
template <typename LexerType>
1022
template <class TreeBuilder> TreeExpression Parser<LexerType>::parseExpression(TreeBuilder& context)
1050
template <class TreeBuilder> TreeExpression Parser<LexerType>::parseExpression(TreeBuilder& context)
1023
{
1051
{
1024
    failIfStackOverflow();
1052
    failIfStackOverflow();
1053
    JSTokenLocation location(tokenLocation());
1025
    TreeExpression node = parseAssignmentExpression(context);
1054
    TreeExpression node = parseAssignmentExpression(context);
1026
    failIfFalse(node);
1055
    failIfFalse(node);
1027
    if (!match(COMMA))
1056
    if (!match(COMMA))
Lines 1031-1037 template <class TreeBuilder> TreeExpression Parser<LexerType>::parseExpression(T a/Source/JavaScriptCore/parser/Parser.cpp_sec40
1031
    m_nonLHSCount++;
1060
    m_nonLHSCount++;
1032
    TreeExpression right = parseAssignmentExpression(context);
1061
    TreeExpression right = parseAssignmentExpression(context);
1033
    failIfFalse(right);
1062
    failIfFalse(right);
1034
    typename TreeBuilder::Comma commaNode = context.createCommaExpr(m_lexer->lastLineNumber(), node, right);
1063
    typename TreeBuilder::Comma commaNode = context.createCommaExpr(location, node, right);
1035
    while (match(COMMA)) {
1064
    while (match(COMMA)) {
1036
        next(TreeBuilder::DontBuildStrings);
1065
        next(TreeBuilder::DontBuildStrings);
1037
        right = parseAssignmentExpression(context);
1066
        right = parseAssignmentExpression(context);
Lines 1046-1051 template <typename TreeBuilder> TreeExpression Parser<LexerType>::parseAssignmen a/Source/JavaScriptCore/parser/Parser.cpp_sec41
1046
{
1075
{
1047
    failIfStackOverflow();
1076
    failIfStackOverflow();
1048
    int start = tokenStart();
1077
    int start = tokenStart();
1078
    JSTokenLocation location(tokenLocation());
1049
    int initialAssignmentCount = m_assignmentCount;
1079
    int initialAssignmentCount = m_assignmentCount;
1050
    int initialNonLHSCount = m_nonLHSCount;
1080
    int initialNonLHSCount = m_nonLHSCount;
1051
    TreeExpression lhs = parseConditionalExpression(context);
1081
    TreeExpression lhs = parseConditionalExpression(context);
Lines 1098-1104 end: a/Source/JavaScriptCore/parser/Parser.cpp_sec42
1098
        return lhs;
1128
        return lhs;
1099
    
1129
    
1100
    while (assignmentStack)
1130
    while (assignmentStack)
1101
        lhs = context.createAssignment(m_lexer->lastLineNumber(), assignmentStack, lhs, initialAssignmentCount, m_assignmentCount, lastTokenEnd());
1131
        lhs = context.createAssignment(location, assignmentStack, lhs, initialAssignmentCount, m_assignmentCount, lastTokenEnd());
1102
    
1132
    
1103
    return lhs;
1133
    return lhs;
1104
}
1134
}
Lines 1106-1111 end: a/Source/JavaScriptCore/parser/Parser.cpp_sec43
1106
template <typename LexerType>
1136
template <typename LexerType>
1107
template <class TreeBuilder> TreeExpression Parser<LexerType>::parseConditionalExpression(TreeBuilder& context)
1137
template <class TreeBuilder> TreeExpression Parser<LexerType>::parseConditionalExpression(TreeBuilder& context)
1108
{
1138
{
1139
    JSTokenLocation location(tokenLocation());
1109
    TreeExpression cond = parseBinaryExpression(context);
1140
    TreeExpression cond = parseBinaryExpression(context);
1110
    failIfFalse(cond);
1141
    failIfFalse(cond);
1111
    if (!match(QUESTION))
1142
    if (!match(QUESTION))
Lines 1118-1124 template <class TreeBuilder> TreeExpression Parser<LexerType>::parseConditionalE a/Source/JavaScriptCore/parser/Parser.cpp_sec44
1118
    
1149
    
1119
    TreeExpression rhs = parseAssignmentExpression(context);
1150
    TreeExpression rhs = parseAssignmentExpression(context);
1120
    failIfFalse(rhs);
1151
    failIfFalse(rhs);
1121
    return context.createConditionalExpr(m_lexer->lastLineNumber(), cond, lhs, rhs);
1152
    return context.createConditionalExpr(location, cond, lhs, rhs);
1122
}
1153
}
1123
1154
1124
ALWAYS_INLINE static bool isUnaryOp(JSTokenType token)
1155
ALWAYS_INLINE static bool isUnaryOp(JSTokenType token)
Lines 1141-1146 template <class TreeBuilder> TreeExpression Parser<LexerType>::parseBinaryExpres a/Source/JavaScriptCore/parser/Parser.cpp_sec45
1141
    int operandStackDepth = 0;
1172
    int operandStackDepth = 0;
1142
    int operatorStackDepth = 0;
1173
    int operatorStackDepth = 0;
1143
    typename TreeBuilder::BinaryExprContext binaryExprContext(context);
1174
    typename TreeBuilder::BinaryExprContext binaryExprContext(context);
1175
    JSTokenLocation location(tokenLocation());
1144
    while (true) {
1176
    while (true) {
1145
        int exprStart = tokenStart();
1177
        int exprStart = tokenStart();
1146
        int initialAssignments = m_assignmentCount;
1178
        int initialAssignments = m_assignmentCount;
Lines 1162-1168 template <class TreeBuilder> TreeExpression Parser<LexerType>::parseBinaryExpres a/Source/JavaScriptCore/parser/Parser.cpp_sec46
1162
            typename TreeBuilder::BinaryOperand rhs = context.getFromOperandStack(-1);
1194
            typename TreeBuilder::BinaryOperand rhs = context.getFromOperandStack(-1);
1163
            typename TreeBuilder::BinaryOperand lhs = context.getFromOperandStack(-2);
1195
            typename TreeBuilder::BinaryOperand lhs = context.getFromOperandStack(-2);
1164
            context.shrinkOperandStackBy(operandStackDepth, 2);
1196
            context.shrinkOperandStackBy(operandStackDepth, 2);
1165
            context.appendBinaryOperation(m_lexer->lastLineNumber(), operandStackDepth, operatorStackDepth, lhs, rhs);
1197
            context.appendBinaryOperation(location, operandStackDepth, operatorStackDepth, lhs, rhs);
1166
            context.operatorStackPop(operatorStackDepth);
1198
            context.operatorStackPop(operatorStackDepth);
1167
        }
1199
        }
1168
        context.operatorStackAppend(operatorStackDepth, operatorToken, precedence);
1200
        context.operatorStackAppend(operatorStackDepth, operatorToken, precedence);
Lines 1173-1179 template <class TreeBuilder> TreeExpression Parser<LexerType>::parseBinaryExpres a/Source/JavaScriptCore/parser/Parser.cpp_sec47
1173
        typename TreeBuilder::BinaryOperand rhs = context.getFromOperandStack(-1);
1205
        typename TreeBuilder::BinaryOperand rhs = context.getFromOperandStack(-1);
1174
        typename TreeBuilder::BinaryOperand lhs = context.getFromOperandStack(-2);
1206
        typename TreeBuilder::BinaryOperand lhs = context.getFromOperandStack(-2);
1175
        context.shrinkOperandStackBy(operandStackDepth, 2);
1207
        context.shrinkOperandStackBy(operandStackDepth, 2);
1176
        context.appendBinaryOperation(m_lexer->lastLineNumber(), operandStackDepth, operatorStackDepth, lhs, rhs);
1208
        context.appendBinaryOperation(location, operandStackDepth, operatorStackDepth, lhs, rhs);
1177
        context.operatorStackPop(operatorStackDepth);
1209
        context.operatorStackPop(operatorStackDepth);
1178
    }
1210
    }
1179
    return context.popOperandStack(operandStackDepth);
1211
    return context.popOperandStack(operandStackDepth);
Lines 1222-1232 template <bool complete, class TreeBuilder> TreeProperty Parser<LexerType>::pars a/Source/JavaScriptCore/parser/Parser.cpp_sec48
1222
            numericPropertyName = m_token.m_data.doubleValue;
1254
            numericPropertyName = m_token.m_data.doubleValue;
1223
        else
1255
        else
1224
            fail();
1256
            fail();
1257
        JSTokenLocation location(tokenLocation());
1225
        next();
1258
        next();
1226
        failIfFalse((parseFunctionInfo<FunctionNoRequirements, false>(context, accessorName, parameters, body, openBracePos, closeBracePos, bodyStartLine)));
1259
        failIfFalse((parseFunctionInfo<FunctionNoRequirements, false>(context, accessorName, parameters, body, openBracePos, closeBracePos, bodyStartLine)));
1227
        if (stringPropertyName)
1260
        if (stringPropertyName)
1228
            return context.template createGetterOrSetterProperty<complete>(m_lexer->lastLineNumber(), type, stringPropertyName, parameters, body, openBracePos, closeBracePos, bodyStartLine, m_lastLine);
1261
            return context.template createGetterOrSetterProperty<complete>(location, type, stringPropertyName, parameters, body, openBracePos, closeBracePos, bodyStartLine, m_lastLine);
1229
        return context.template createGetterOrSetterProperty<complete>(const_cast<JSGlobalData*>(m_globalData), m_lexer->lastLineNumber(), type, numericPropertyName, parameters, body, openBracePos, closeBracePos, bodyStartLine, m_lastLine);
1262
        return context.template createGetterOrSetterProperty<complete>(const_cast<JSGlobalData*>(m_globalData), location, type, numericPropertyName, parameters, body, openBracePos, closeBracePos, bodyStartLine, m_lastLine);
1230
    }
1263
    }
1231
    case NUMBER: {
1264
    case NUMBER: {
1232
        double propertyName = m_token.m_data.doubleValue;
1265
        double propertyName = m_token.m_data.doubleValue;
Lines 1249-1260 template <class TreeBuilder> TreeExpression Parser<LexerType>::parseObjectLitera a/Source/JavaScriptCore/parser/Parser.cpp_sec49
1249
    unsigned oldLastLineNumber = m_lexer->lastLineNumber();
1282
    unsigned oldLastLineNumber = m_lexer->lastLineNumber();
1250
    unsigned oldLineNumber = m_lexer->lineNumber();
1283
    unsigned oldLineNumber = m_lexer->lineNumber();
1251
    consumeOrFailWithFlags(OPENBRACE, TreeBuilder::DontBuildStrings);
1284
    consumeOrFailWithFlags(OPENBRACE, TreeBuilder::DontBuildStrings);
1252
    
1285
    JSTokenLocation location(tokenLocation());
1286
1253
    int oldNonLHSCount = m_nonLHSCount;
1287
    int oldNonLHSCount = m_nonLHSCount;
1254
    
1288
    
1255
    if (match(CLOSEBRACE)) {
1289
    if (match(CLOSEBRACE)) {
1256
        next();
1290
        next();
1257
        return context.createObjectLiteral(m_lexer->lastLineNumber());
1291
        return context.createObjectLiteral(location);
1258
    }
1292
    }
1259
    
1293
    
1260
    TreeProperty property = parseProperty<false>(context);
1294
    TreeProperty property = parseProperty<false>(context);
Lines 1266-1278 template <class TreeBuilder> TreeExpression Parser<LexerType>::parseObjectLitera a/Source/JavaScriptCore/parser/Parser.cpp_sec50
1266
        m_lexer->setLineNumber(oldLineNumber);
1300
        m_lexer->setLineNumber(oldLineNumber);
1267
        return parseStrictObjectLiteral(context);
1301
        return parseStrictObjectLiteral(context);
1268
    }
1302
    }
1269
    TreePropertyList propertyList = context.createPropertyList(m_lexer->lastLineNumber(), property);
1303
    TreePropertyList propertyList = context.createPropertyList(location, property);
1270
    TreePropertyList tail = propertyList;
1304
    TreePropertyList tail = propertyList;
1271
    while (match(COMMA)) {
1305
    while (match(COMMA)) {
1272
        next(TreeBuilder::DontBuildStrings);
1306
        next(TreeBuilder::DontBuildStrings);
1273
        // allow extra comma, see http://bugs.webkit.org/show_bug.cgi?id=5939
1307
        // allow extra comma, see http://bugs.webkit.org/show_bug.cgi?id=5939
1274
        if (match(CLOSEBRACE))
1308
        if (match(CLOSEBRACE))
1275
            break;
1309
            break;
1310
        JSTokenLocation propertyLocation(tokenLocation());
1276
        property = parseProperty<false>(context);
1311
        property = parseProperty<false>(context);
1277
        failIfFalse(property);
1312
        failIfFalse(property);
1278
        if (!m_syntaxAlreadyValidated && context.getType(property) != PropertyNode::Constant) {
1313
        if (!m_syntaxAlreadyValidated && context.getType(property) != PropertyNode::Constant) {
Lines 1282-1295 template <class TreeBuilder> TreeExpression Parser<LexerType>::parseObjectLitera a/Source/JavaScriptCore/parser/Parser.cpp_sec51
1282
            m_lexer->setLineNumber(oldLineNumber);
1317
            m_lexer->setLineNumber(oldLineNumber);
1283
            return parseStrictObjectLiteral(context);
1318
            return parseStrictObjectLiteral(context);
1284
        }
1319
        }
1285
        tail = context.createPropertyList(m_lexer->lastLineNumber(), property, tail);
1320
        tail = context.createPropertyList(propertyLocation, property, tail);
1286
    }
1321
    }
1287
    
1322
1323
    location = tokenLocation();
1288
    consumeOrFail(CLOSEBRACE);
1324
    consumeOrFail(CLOSEBRACE);
1289
    
1325
    
1290
    m_nonLHSCount = oldNonLHSCount;
1326
    m_nonLHSCount = oldNonLHSCount;
1291
    
1327
    
1292
    return context.createObjectLiteral(m_lexer->lastLineNumber(), propertyList);
1328
    return context.createObjectLiteral(location, propertyList);
1293
}
1329
}
1294
1330
1295
template <typename LexerType>
1331
template <typename LexerType>
Lines 1299-1307 template <class TreeBuilder> TreeExpression Parser<LexerType>::parseStrictObject a/Source/JavaScriptCore/parser/Parser.cpp_sec52
1299
    
1335
    
1300
    int oldNonLHSCount = m_nonLHSCount;
1336
    int oldNonLHSCount = m_nonLHSCount;
1301
1337
1338
    JSTokenLocation location(tokenLocation());    
1302
    if (match(CLOSEBRACE)) {
1339
    if (match(CLOSEBRACE)) {
1303
        next();
1340
        next();
1304
        return context.createObjectLiteral(m_lexer->lastLineNumber());
1341
        return context.createObjectLiteral(location);
1305
    }
1342
    }
1306
    
1343
    
1307
    TreeProperty property = parseProperty<true>(context);
1344
    TreeProperty property = parseProperty<true>(context);
Lines 1313-1325 template <class TreeBuilder> TreeExpression Parser<LexerType>::parseStrictObject a/Source/JavaScriptCore/parser/Parser.cpp_sec53
1313
    if (!m_syntaxAlreadyValidated)
1350
    if (!m_syntaxAlreadyValidated)
1314
        objectValidator.add(context.getName(property).impl(), context.getType(property));
1351
        objectValidator.add(context.getName(property).impl(), context.getType(property));
1315
    
1352
    
1316
    TreePropertyList propertyList = context.createPropertyList(m_lexer->lastLineNumber(), property);
1353
    TreePropertyList propertyList = context.createPropertyList(location, property);
1317
    TreePropertyList tail = propertyList;
1354
    TreePropertyList tail = propertyList;
1318
    while (match(COMMA)) {
1355
    while (match(COMMA)) {
1319
        next();
1356
        next();
1320
        // allow extra comma, see http://bugs.webkit.org/show_bug.cgi?id=5939
1357
        // allow extra comma, see http://bugs.webkit.org/show_bug.cgi?id=5939
1321
        if (match(CLOSEBRACE))
1358
        if (match(CLOSEBRACE))
1322
            break;
1359
            break;
1360
        JSTokenLocation propertyLocation(tokenLocation());
1323
        property = parseProperty<true>(context);
1361
        property = parseProperty<true>(context);
1324
        failIfFalse(property);
1362
        failIfFalse(property);
1325
        if (!m_syntaxAlreadyValidated) {
1363
        if (!m_syntaxAlreadyValidated) {
Lines 1331-1344 template <class TreeBuilder> TreeExpression Parser<LexerType>::parseStrictObject a/Source/JavaScriptCore/parser/Parser.cpp_sec54
1331
                propertyEntry.iterator->second |= context.getType(property);
1369
                propertyEntry.iterator->second |= context.getType(property);
1332
            }
1370
            }
1333
        }
1371
        }
1334
        tail = context.createPropertyList(m_lexer->lastLineNumber(), property, tail);
1372
        tail = context.createPropertyList(propertyLocation, property, tail);
1335
    }
1373
    }
1336
    
1374
1375
    location = tokenLocation();
1337
    consumeOrFail(CLOSEBRACE);
1376
    consumeOrFail(CLOSEBRACE);
1338
1377
1339
    m_nonLHSCount = oldNonLHSCount;
1378
    m_nonLHSCount = oldNonLHSCount;
1340
1379
1341
    return context.createObjectLiteral(m_lexer->lastLineNumber(), propertyList);
1380
    return context.createObjectLiteral(location, propertyList);
1342
}
1381
}
1343
1382
1344
template <typename LexerType>
1383
template <typename LexerType>
Lines 1354-1361 template <class TreeBuilder> TreeExpression Parser<LexerType>::parseArrayLiteral a/Source/JavaScriptCore/parser/Parser.cpp_sec55
1354
        elisions++;
1393
        elisions++;
1355
    }
1394
    }
1356
    if (match(CLOSEBRACKET)) {
1395
    if (match(CLOSEBRACKET)) {
1396
        JSTokenLocation location(tokenLocation());
1357
        next(TreeBuilder::DontBuildStrings);
1397
        next(TreeBuilder::DontBuildStrings);
1358
        return context.createArray(m_lexer->lastLineNumber(), elisions);
1398
        return context.createArray(location, elisions);
1359
    }
1399
    }
1360
    
1400
    
1361
    TreeExpression elem = parseAssignmentExpression(context);
1401
    TreeExpression elem = parseAssignmentExpression(context);
Lines 1373-1391 template <class TreeBuilder> TreeExpression Parser<LexerType>::parseArrayLiteral a/Source/JavaScriptCore/parser/Parser.cpp_sec56
1373
        }
1413
        }
1374
        
1414
        
1375
        if (match(CLOSEBRACKET)) {
1415
        if (match(CLOSEBRACKET)) {
1416
            JSTokenLocation location(tokenLocation());
1376
            next(TreeBuilder::DontBuildStrings);
1417
            next(TreeBuilder::DontBuildStrings);
1377
            return context.createArray(m_lexer->lastLineNumber(), elisions, elementList);
1418
            return context.createArray(location, elisions, elementList);
1378
        }
1419
        }
1379
        TreeExpression elem = parseAssignmentExpression(context);
1420
        TreeExpression elem = parseAssignmentExpression(context);
1380
        failIfFalse(elem);
1421
        failIfFalse(elem);
1381
        tail = context.createElementList(tail, elisions, elem);
1422
        tail = context.createElementList(tail, elisions, elem);
1382
    }
1423
    }
1383
    
1424
1425
    JSTokenLocation location(tokenLocation());
1384
    consumeOrFail(CLOSEBRACKET);
1426
    consumeOrFail(CLOSEBRACKET);
1385
    
1427
    
1386
    m_nonLHSCount = oldNonLHSCount;
1428
    m_nonLHSCount = oldNonLHSCount;
1387
    
1429
    
1388
    return context.createArray(m_lexer->lastLineNumber(), elementList);
1430
    return context.createArray(location, elementList);
1389
}
1431
}
1390
1432
1391
template <typename LexerType>
1433
template <typename LexerType>
Lines 1409-1446 template <class TreeBuilder> TreeExpression Parser<LexerType>::parsePrimaryExpre a/Source/JavaScriptCore/parser/Parser.cpp_sec57
1409
        return result;
1451
        return result;
1410
    }
1452
    }
1411
    case THISTOKEN: {
1453
    case THISTOKEN: {
1454
        JSTokenLocation location(tokenLocation());
1412
        next();
1455
        next();
1413
        return context.thisExpr(m_lexer->lastLineNumber());
1456
        return context.thisExpr(location);
1414
    }
1457
    }
1415
    case IDENT: {
1458
    case IDENT: {
1416
        int start = tokenStart();
1459
        int start = tokenStart();
1417
        const Identifier* ident = m_token.m_data.ident;
1460
        const Identifier* ident = m_token.m_data.ident;
1461
        JSTokenLocation location(tokenLocation());
1418
        next();
1462
        next();
1419
        currentScope()->useVariable(ident, m_globalData->propertyNames->eval == *ident);
1463
        currentScope()->useVariable(ident, m_globalData->propertyNames->eval == *ident);
1420
        m_lastIdentifier = ident;
1464
        m_lastIdentifier = ident;
1421
        return context.createResolve(m_lexer->lastLineNumber(), ident, start);
1465
        return context.createResolve(location, ident, start);
1422
    }
1466
    }
1423
    case STRING: {
1467
    case STRING: {
1424
        const Identifier* ident = m_token.m_data.ident;
1468
        const Identifier* ident = m_token.m_data.ident;
1469
        JSTokenLocation location(tokenLocation());
1425
        next();
1470
        next();
1426
        return context.createString(m_lexer->lastLineNumber(), ident);
1471
        return context.createString(location, ident);
1427
    }
1472
    }
1428
    case NUMBER: {
1473
    case NUMBER: {
1429
        double d = m_token.m_data.doubleValue;
1474
        double d = m_token.m_data.doubleValue;
1475
        JSTokenLocation location(tokenLocation());
1430
        next();
1476
        next();
1431
        return context.createNumberExpr(m_lexer->lastLineNumber(), d);
1477
        return context.createNumberExpr(location, d);
1432
    }
1478
    }
1433
    case NULLTOKEN: {
1479
    case NULLTOKEN: {
1480
        JSTokenLocation location(tokenLocation());
1434
        next();
1481
        next();
1435
        return context.createNull(m_lexer->lastLineNumber());
1482
        return context.createNull(location);
1436
    }
1483
    }
1437
    case TRUETOKEN: {
1484
    case TRUETOKEN: {
1485
        JSTokenLocation location(tokenLocation());
1438
        next();
1486
        next();
1439
        return context.createBoolean(m_lexer->lastLineNumber(), true);
1487
        return context.createBoolean(location, true);
1440
    }
1488
    }
1441
    case FALSETOKEN: {
1489
    case FALSETOKEN: {
1490
        JSTokenLocation location(tokenLocation());
1442
        next();
1491
        next();
1443
        return context.createBoolean(m_lexer->lastLineNumber(), false);
1492
        return context.createBoolean(location, false);
1444
    }
1493
    }
1445
    case DIVEQUAL:
1494
    case DIVEQUAL:
1446
    case DIVIDE: {
1495
    case DIVIDE: {
Lines 1453-1460 template <class TreeBuilder> TreeExpression Parser<LexerType>::parsePrimaryExpre a/Source/JavaScriptCore/parser/Parser.cpp_sec58
1453
            failIfFalse(m_lexer->scanRegExp(pattern, flags));
1502
            failIfFalse(m_lexer->scanRegExp(pattern, flags));
1454
        
1503
        
1455
        int start = tokenStart();
1504
        int start = tokenStart();
1505
        JSTokenLocation location(tokenLocation());
1456
        next();
1506
        next();
1457
        TreeExpression re = context.createRegExp(m_lexer->lastLineNumber(), *pattern, *flags, start);
1507
        TreeExpression re = context.createRegExp(location, *pattern, *flags, start);
1458
        if (!re) {
1508
        if (!re) {
1459
            const char* yarrErrorMsg = Yarr::checkSyntax(pattern->ustring());
1509
            const char* yarrErrorMsg = Yarr::checkSyntax(pattern->ustring());
1460
            ASSERT(!m_errorMessage.isNull());
1510
            ASSERT(!m_errorMessage.isNull());
Lines 1471-1476 template <typename LexerType> a/Source/JavaScriptCore/parser/Parser.cpp_sec59
1471
template <class TreeBuilder> TreeArguments Parser<LexerType>::parseArguments(TreeBuilder& context)
1521
template <class TreeBuilder> TreeArguments Parser<LexerType>::parseArguments(TreeBuilder& context)
1472
{
1522
{
1473
    consumeOrFailWithFlags(OPENPAREN, TreeBuilder::DontBuildStrings);
1523
    consumeOrFailWithFlags(OPENPAREN, TreeBuilder::DontBuildStrings);
1524
    JSTokenLocation location(tokenLocation());
1474
    if (match(CLOSEPAREN)) {
1525
    if (match(CLOSEPAREN)) {
1475
        next(TreeBuilder::DontBuildStrings);
1526
        next(TreeBuilder::DontBuildStrings);
1476
        return context.createArguments();
1527
        return context.createArguments();
Lines 1478-1490 template <class TreeBuilder> TreeArguments Parser<LexerType>::parseArguments(Tre a/Source/JavaScriptCore/parser/Parser.cpp_sec60
1478
    TreeExpression firstArg = parseAssignmentExpression(context);
1529
    TreeExpression firstArg = parseAssignmentExpression(context);
1479
    failIfFalse(firstArg);
1530
    failIfFalse(firstArg);
1480
    
1531
    
1481
    TreeArgumentsList argList = context.createArgumentsList(m_lexer->lastLineNumber(), firstArg);
1532
    TreeArgumentsList argList = context.createArgumentsList(location, firstArg);
1482
    TreeArgumentsList tail = argList;
1533
    TreeArgumentsList tail = argList;
1483
    while (match(COMMA)) {
1534
    while (match(COMMA)) {
1535
        JSTokenLocation argumentLocation(tokenLocation());
1484
        next(TreeBuilder::DontBuildStrings);
1536
        next(TreeBuilder::DontBuildStrings);
1485
        TreeExpression arg = parseAssignmentExpression(context);
1537
        TreeExpression arg = parseAssignmentExpression(context);
1486
        failIfFalse(arg);
1538
        failIfFalse(arg);
1487
        tail = context.createArgumentsList(m_lexer->lastLineNumber(), tail, arg);
1539
        tail = context.createArgumentsList(argumentLocation, tail, arg);
1488
    }
1540
    }
1489
    consumeOrFail(CLOSEPAREN);
1541
    consumeOrFail(CLOSEPAREN);
1490
    return context.createArguments(argList);
1542
    return context.createArguments(argList);
Lines 1497-1502 template <class TreeBuilder> TreeExpression Parser<LexerType>::parseMemberExpres a/Source/JavaScriptCore/parser/Parser.cpp_sec61
1497
    int start = tokenStart();
1549
    int start = tokenStart();
1498
    int expressionStart = start;
1550
    int expressionStart = start;
1499
    int newCount = 0;
1551
    int newCount = 0;
1552
    JSTokenLocation location;
1500
    while (match(NEW)) {
1553
    while (match(NEW)) {
1501
        next();
1554
        next();
1502
        newCount++;
1555
        newCount++;
Lines 1509-1522 template <class TreeBuilder> TreeExpression Parser<LexerType>::parseMemberExpres a/Source/JavaScriptCore/parser/Parser.cpp_sec62
1509
        int openBracePos = 0;
1562
        int openBracePos = 0;
1510
        int closeBracePos = 0;
1563
        int closeBracePos = 0;
1511
        int bodyStartLine = 0;
1564
        int bodyStartLine = 0;
1565
        location = tokenLocation();
1512
        next();
1566
        next();
1513
        failIfFalse((parseFunctionInfo<FunctionNoRequirements, false>(context, name, parameters, body, openBracePos, closeBracePos, bodyStartLine)));
1567
        failIfFalse((parseFunctionInfo<FunctionNoRequirements, false>(context, name, parameters, body, openBracePos, closeBracePos, bodyStartLine)));
1514
        base = context.createFunctionExpr(m_lexer->lastLineNumber(), name, body, parameters, openBracePos, closeBracePos, bodyStartLine, m_lastLine);
1568
        base = context.createFunctionExpr(location, name, body, parameters, openBracePos, closeBracePos, bodyStartLine, m_lastLine);
1515
    } else
1569
    } else
1516
        base = parsePrimaryExpression(context);
1570
        base = parsePrimaryExpression(context);
1517
    
1571
    
1518
    failIfFalse(base);
1572
    failIfFalse(base);
1519
    while (true) {
1573
    while (true) {
1574
        location = tokenLocation();
1520
        switch (m_token.m_type) {
1575
        switch (m_token.m_type) {
1521
        case OPENBRACKET: {
1576
        case OPENBRACKET: {
1522
            m_nonTrivialExpressionCount++;
1577
            m_nonTrivialExpressionCount++;
Lines 1526-1532 template <class TreeBuilder> TreeExpression Parser<LexerType>::parseMemberExpres a/Source/JavaScriptCore/parser/Parser.cpp_sec63
1526
            int initialAssignments = m_assignmentCount;
1581
            int initialAssignments = m_assignmentCount;
1527
            TreeExpression property = parseExpression(context);
1582
            TreeExpression property = parseExpression(context);
1528
            failIfFalse(property);
1583
            failIfFalse(property);
1529
            base = context.createBracketAccess(m_lexer->lastLineNumber(), base, property, initialAssignments != m_assignmentCount, expressionStart, expressionEnd, tokenEnd());
1584
            base = context.createBracketAccess(location, base, property, initialAssignments != m_assignmentCount, expressionStart, expressionEnd, tokenEnd());
1530
            consumeOrFail(CLOSEBRACKET);
1585
            consumeOrFail(CLOSEBRACKET);
1531
            m_nonLHSCount = nonLHSCount;
1586
            m_nonLHSCount = nonLHSCount;
1532
            break;
1587
            break;
Lines 1539-1550 template <class TreeBuilder> TreeExpression Parser<LexerType>::parseMemberExpres a/Source/JavaScriptCore/parser/Parser.cpp_sec64
1539
                int exprEnd = lastTokenEnd();
1594
                int exprEnd = lastTokenEnd();
1540
                TreeArguments arguments = parseArguments(context);
1595
                TreeArguments arguments = parseArguments(context);
1541
                failIfFalse(arguments);
1596
                failIfFalse(arguments);
1542
                base = context.createNewExpr(m_lexer->lastLineNumber(), base, arguments, start, exprEnd, lastTokenEnd());           
1597
                base = context.createNewExpr(location, base, arguments, start, exprEnd, lastTokenEnd());
1543
            } else {
1598
            } else {
1544
                int expressionEnd = lastTokenEnd();
1599
                int expressionEnd = lastTokenEnd();
1545
                TreeArguments arguments = parseArguments(context);
1600
                TreeArguments arguments = parseArguments(context);
1546
                failIfFalse(arguments);
1601
                failIfFalse(arguments);
1547
                base = context.makeFunctionCallNode(m_lexer->lastLineNumber(), base, arguments, expressionStart, expressionEnd, lastTokenEnd());
1602
                base = context.makeFunctionCallNode(location, base, arguments, expressionStart, expressionEnd, lastTokenEnd());
1548
            }
1603
            }
1549
            m_nonLHSCount = nonLHSCount;
1604
            m_nonLHSCount = nonLHSCount;
1550
            break;
1605
            break;
Lines 1554-1560 template <class TreeBuilder> TreeExpression Parser<LexerType>::parseMemberExpres a/Source/JavaScriptCore/parser/Parser.cpp_sec65
1554
            int expressionEnd = lastTokenEnd();
1609
            int expressionEnd = lastTokenEnd();
1555
            nextExpectIdentifier(LexerFlagsIgnoreReservedWords | TreeBuilder::DontBuildKeywords);
1610
            nextExpectIdentifier(LexerFlagsIgnoreReservedWords | TreeBuilder::DontBuildKeywords);
1556
            matchOrFail(IDENT);
1611
            matchOrFail(IDENT);
1557
            base = context.createDotAccess(m_lexer->lastLineNumber(), base, m_token.m_data.ident, expressionStart, expressionEnd, tokenEnd());
1612
            base = context.createDotAccess(location, base, m_token.m_data.ident, expressionStart, expressionEnd, tokenEnd());
1558
            next();
1613
            next();
1559
            break;
1614
            break;
1560
        }
1615
        }
Lines 1564-1570 template <class TreeBuilder> TreeExpression Parser<LexerType>::parseMemberExpres a/Source/JavaScriptCore/parser/Parser.cpp_sec66
1564
    }
1619
    }
1565
endMemberExpression:
1620
endMemberExpression:
1566
    while (newCount--)
1621
    while (newCount--)
1567
        base = context.createNewExpr(m_lexer->lastLineNumber(), base, start, lastTokenEnd());
1622
        base = context.createNewExpr(location, base, start, lastTokenEnd());
1568
    return base;
1623
    return base;
1569
}
1624
}
1570
1625
Lines 1602-1607 template <class TreeBuilder> TreeExpression Parser<LexerType>::parseUnaryExpress a/Source/JavaScriptCore/parser/Parser.cpp_sec67
1602
        m_nonTrivialExpressionCount++;
1657
        m_nonTrivialExpressionCount++;
1603
    }
1658
    }
1604
    int subExprStart = tokenStart();
1659
    int subExprStart = tokenStart();
1660
    JSTokenLocation location(tokenLocation());
1605
    TreeExpression expr = parseMemberExpression(context);
1661
    TreeExpression expr = parseMemberExpression(context);
1606
    failIfFalse(expr);
1662
    failIfFalse(expr);
1607
    bool isEvalOrArguments = false;
1663
    bool isEvalOrArguments = false;
Lines 1614-1620 template <class TreeBuilder> TreeExpression Parser<LexerType>::parseUnaryExpress a/Source/JavaScriptCore/parser/Parser.cpp_sec68
1614
    case PLUSPLUS:
1670
    case PLUSPLUS:
1615
        m_nonTrivialExpressionCount++;
1671
        m_nonTrivialExpressionCount++;
1616
        m_nonLHSCount++;
1672
        m_nonLHSCount++;
1617
        expr = context.makePostfixNode(m_lexer->lastLineNumber(), expr, OpPlusPlus, subExprStart, lastTokenEnd(), tokenEnd());
1673
        expr = context.makePostfixNode(location, expr, OpPlusPlus, subExprStart, lastTokenEnd(), tokenEnd());
1618
        m_assignmentCount++;
1674
        m_assignmentCount++;
1619
        failIfTrueIfStrictWithNameAndMessage(isEvalOrArguments, "'", m_lastIdentifier->impl(), "' cannot be modified in strict mode");
1675
        failIfTrueIfStrictWithNameAndMessage(isEvalOrArguments, "'", m_lastIdentifier->impl(), "' cannot be modified in strict mode");
1620
        failIfTrueIfStrict(requiresLExpr);
1676
        failIfTrueIfStrict(requiresLExpr);
Lines 1623-1629 template <class TreeBuilder> TreeExpression Parser<LexerType>::parseUnaryExpress a/Source/JavaScriptCore/parser/Parser.cpp_sec69
1623
    case MINUSMINUS:
1679
    case MINUSMINUS:
1624
        m_nonTrivialExpressionCount++;
1680
        m_nonTrivialExpressionCount++;
1625
        m_nonLHSCount++;
1681
        m_nonLHSCount++;
1626
        expr = context.makePostfixNode(m_lexer->lastLineNumber(), expr, OpMinusMinus, subExprStart, lastTokenEnd(), tokenEnd());
1682
        expr = context.makePostfixNode(location, expr, OpMinusMinus, subExprStart, lastTokenEnd(), tokenEnd());
1627
        m_assignmentCount++;
1683
        m_assignmentCount++;
1628
        failIfTrueIfStrictWithNameAndMessage(isEvalOrArguments, "'", m_lastIdentifier->impl(), "' cannot be modified in strict mode");
1684
        failIfTrueIfStrictWithNameAndMessage(isEvalOrArguments, "'", m_lastIdentifier->impl(), "' cannot be modified in strict mode");
1629
        failIfTrueIfStrict(requiresLExpr);
1685
        failIfTrueIfStrict(requiresLExpr);
Lines 1637-1676 template <class TreeBuilder> TreeExpression Parser<LexerType>::parseUnaryExpress a/Source/JavaScriptCore/parser/Parser.cpp_sec70
1637
    
1693
    
1638
    if (!TreeBuilder::CreatesAST && (m_syntaxAlreadyValidated || !strictMode()))
1694
    if (!TreeBuilder::CreatesAST && (m_syntaxAlreadyValidated || !strictMode()))
1639
        return expr;
1695
        return expr;
1640
    
1696
1697
    location = tokenLocation();
1698
    location.line = m_lexer->lastLineNumber();
1641
    while (tokenStackDepth) {
1699
    while (tokenStackDepth) {
1642
        switch (context.unaryTokenStackLastType(tokenStackDepth)) {
1700
        switch (context.unaryTokenStackLastType(tokenStackDepth)) {
1643
        case EXCLAMATION:
1701
        case EXCLAMATION:
1644
            expr = context.createLogicalNot(m_lexer->lastLineNumber(), expr);
1702
            expr = context.createLogicalNot(location, expr);
1645
            break;
1703
            break;
1646
        case TILDE:
1704
        case TILDE:
1647
            expr = context.makeBitwiseNotNode(m_lexer->lastLineNumber(), expr);
1705
            expr = context.makeBitwiseNotNode(location, expr);
1648
            break;
1706
            break;
1649
        case MINUS:
1707
        case MINUS:
1650
            expr = context.makeNegateNode(m_lexer->lastLineNumber(), expr);
1708
            expr = context.makeNegateNode(location, expr);
1651
            break;
1709
            break;
1652
        case PLUS:
1710
        case PLUS:
1653
            expr = context.createUnaryPlus(m_lexer->lastLineNumber(), expr);
1711
            expr = context.createUnaryPlus(location, expr);
1654
            break;
1712
            break;
1655
        case PLUSPLUS:
1713
        case PLUSPLUS:
1656
        case AUTOPLUSPLUS:
1714
        case AUTOPLUSPLUS:
1657
            expr = context.makePrefixNode(m_lexer->lastLineNumber(), expr, OpPlusPlus, context.unaryTokenStackLastStart(tokenStackDepth), subExprStart + 1, end);
1715
            expr = context.makePrefixNode(location, expr, OpPlusPlus, context.unaryTokenStackLastStart(tokenStackDepth), subExprStart + 1, end);
1658
            m_assignmentCount++;
1716
            m_assignmentCount++;
1659
            break;
1717
            break;
1660
        case MINUSMINUS:
1718
        case MINUSMINUS:
1661
        case AUTOMINUSMINUS:
1719
        case AUTOMINUSMINUS:
1662
            expr = context.makePrefixNode(m_lexer->lastLineNumber(), expr, OpMinusMinus, context.unaryTokenStackLastStart(tokenStackDepth), subExprStart + 1, end);
1720
            expr = context.makePrefixNode(location, expr, OpMinusMinus, context.unaryTokenStackLastStart(tokenStackDepth), subExprStart + 1, end);
1663
            m_assignmentCount++;
1721
            m_assignmentCount++;
1664
            break;
1722
            break;
1665
        case TYPEOF:
1723
        case TYPEOF:
1666
            expr = context.makeTypeOfNode(m_lexer->lastLineNumber(), expr);
1724
            expr = context.makeTypeOfNode(location, expr);
1667
            break;
1725
            break;
1668
        case VOIDTOKEN:
1726
        case VOIDTOKEN:
1669
            expr = context.createVoid(m_lexer->lastLineNumber(), expr);
1727
            expr = context.createVoid(location, expr);
1670
            break;
1728
            break;
1671
        case DELETETOKEN:
1729
        case DELETETOKEN:
1672
            failIfTrueIfStrictWithNameAndMessage(context.isResolve(expr), "Cannot delete unqualified property", m_lastIdentifier->impl(), "in strict mode");
1730
            failIfTrueIfStrictWithNameAndMessage(context.isResolve(expr), "Cannot delete unqualified property", m_lastIdentifier->impl(), "in strict mode");
1673
            expr = context.makeDeleteNode(m_lexer->lastLineNumber(), expr, context.unaryTokenStackLastStart(tokenStackDepth), end, end);
1731
            expr = context.makeDeleteNode(location, expr, context.unaryTokenStackLastStart(tokenStackDepth), end, end);
1674
            break;
1732
            break;
1675
        default:
1733
        default:
1676
            // If we get here something has gone horribly horribly wrong
1734
            // If we get here something has gone horribly horribly wrong
- a/Source/JavaScriptCore/parser/Parser.h -12 / +20 lines
Lines 502-519 private: a/Source/JavaScriptCore/parser/Parser.h_sec1
502
502
503
    ALWAYS_INLINE void next(unsigned lexerFlags = 0)
503
    ALWAYS_INLINE void next(unsigned lexerFlags = 0)
504
    {
504
    {
505
        m_lastLine = m_token.m_info.line;
505
        m_lastLine = m_token.m_location.line;
506
        m_lastTokenEnd = m_token.m_info.endOffset;
506
        m_lastTokenEnd = m_token.m_location.endOffset;
507
        m_lexer->setLastLineNumber(m_lastLine);
507
        m_lexer->setLastLineNumber(m_lastLine);
508
        m_token.m_type = m_lexer->lex(&m_token.m_data, &m_token.m_info, lexerFlags, strictMode());
508
        m_token.m_type = m_lexer->lex(&m_token.m_data, &m_token.m_location, lexerFlags, strictMode());
509
    }
509
    }
510
510
511
    ALWAYS_INLINE void nextExpectIdentifier(unsigned lexerFlags = 0)
511
    ALWAYS_INLINE void nextExpectIdentifier(unsigned lexerFlags = 0)
512
    {
512
    {
513
        m_lastLine = m_token.m_info.line;
513
        m_lastLine = m_token.m_location.line;
514
        m_lastTokenEnd = m_token.m_info.endOffset;
514
        m_lastTokenEnd = m_token.m_location.endOffset;
515
        m_lexer->setLastLineNumber(m_lastLine);
515
        m_lexer->setLastLineNumber(m_lastLine);
516
        m_token.m_type = m_lexer->lexExpectIdentifier(&m_token.m_data, &m_token.m_info, lexerFlags, strictMode());
516
        m_token.m_type = m_lexer->lexExpectIdentifier(&m_token.m_data, &m_token.m_location, lexerFlags, strictMode());
517
    }
517
    }
518
518
519
    ALWAYS_INLINE bool nextTokenIsColon()
519
    ALWAYS_INLINE bool nextTokenIsColon()
Lines 541-560 private: a/Source/JavaScriptCore/parser/Parser.h_sec2
541
    
541
    
542
    ALWAYS_INLINE int tokenStart()
542
    ALWAYS_INLINE int tokenStart()
543
    {
543
    {
544
        return m_token.m_info.startOffset;
544
        return m_token.m_location.startOffset;
545
    }
545
    }
546
    
546
    
547
    ALWAYS_INLINE int tokenLine()
547
    ALWAYS_INLINE int tokenLine()
548
    {
548
    {
549
        return m_token.m_info.line;
549
        return m_token.m_location.line;
550
    }
550
    }
551
    
551
    
552
    ALWAYS_INLINE int tokenEnd()
552
    ALWAYS_INLINE int tokenEnd()
553
    {
553
    {
554
        return m_token.m_info.endOffset;
554
        return m_token.m_location.endOffset;
555
    }
555
    }
556
    
556
    
557
    const char* getTokenName(JSTokenType tok) 
557
    ALWAYS_INLINE const JSTokenLocation& tokenLocation()
558
    {
559
        return m_token.m_location;
560
    }
561
562
    const char* getTokenName(JSTokenType tok)
558
    {
563
    {
559
        switch (tok) {
564
        switch (tok) {
560
        case NULLTOKEN: 
565
        case NULLTOKEN: 
Lines 1003-1010 PassRefPtr<ParsedNode> Parser<LexerType>::parse(JSGlobalObject* lexicalGlobalObj a/Source/JavaScriptCore/parser/Parser.h_sec3
1003
1008
1004
    RefPtr<ParsedNode> result;
1009
    RefPtr<ParsedNode> result;
1005
    if (m_sourceElements) {
1010
    if (m_sourceElements) {
1011
        JSTokenLocation location;
1012
        location.line = m_lexer->lastLineNumber();
1013
        location.column = m_lexer->currentColumnNumber();
1006
        result = ParsedNode::create(&lexicalGlobalObject->globalData(),
1014
        result = ParsedNode::create(&lexicalGlobalObject->globalData(),
1007
                                    m_lexer->lastLineNumber(),
1015
                                    location,
1008
                                    m_sourceElements,
1016
                                    m_sourceElements,
1009
                                    m_varDeclarations ? &m_varDeclarations->data : 0,
1017
                                    m_varDeclarations ? &m_varDeclarations->data : 0,
1010
                                    m_funcDeclarations ? &m_funcDeclarations->data : 0,
1018
                                    m_funcDeclarations ? &m_funcDeclarations->data : 0,
Lines 1012-1018 PassRefPtr<ParsedNode> Parser<LexerType>::parse(JSGlobalObject* lexicalGlobalObj a/Source/JavaScriptCore/parser/Parser.h_sec4
1012
                                    *m_source,
1020
                                    *m_source,
1013
                                    m_features,
1021
                                    m_features,
1014
                                    m_numConstants);
1022
                                    m_numConstants);
1015
        result->setLoc(m_source->firstLine(), m_lastLine);
1023
        result->setLoc(m_source->firstLine(), m_lastLine, m_lexer->currentColumnNumber());
1016
    } else if (lexicalGlobalObject) {
1024
    } else if (lexicalGlobalObject) {
1017
        // We can never see a syntax error when reparsing a function, since we should have
1025
        // We can never see a syntax error when reparsing a function, since we should have
1018
        // reported the error when parsing the containing program or eval code. So if we're
1026
        // reported the error when parsing the containing program or eval code. So if we're
- a/Source/JavaScriptCore/parser/ParserTokens.h -3 / +11 lines
Lines 140-156 union JSTokenData { a/Source/JavaScriptCore/parser/ParserTokens.h_sec1
140
    const Identifier* ident;
140
    const Identifier* ident;
141
};
141
};
142
142
143
struct JSTokenInfo {
143
struct JSTokenLocation {
144
    JSTokenInfo() : line(0) { }
144
    JSTokenLocation() : line(0), column(0) { }
145
    JSTokenLocation(const JSTokenLocation& location)
146
    {
147
        line = location.line;
148
        startOffset = location.startOffset;
149
        endOffset = location.endOffset;
150
        column = location.column;
151
    }
145
    int line;
152
    int line;
146
    int startOffset;
153
    int startOffset;
147
    int endOffset;
154
    int endOffset;
155
    int column;
148
};
156
};
149
157
150
struct JSToken {
158
struct JSToken {
151
    JSTokenType m_type;
159
    JSTokenType m_type;
152
    JSTokenData m_data;
160
    JSTokenData m_data;
153
    JSTokenInfo m_info;
161
    JSTokenLocation m_location;
154
};
162
};
155
163
156
enum JSParserStrictness { JSParseNormal, JSParseStrict };
164
enum JSParserStrictness { JSParseNormal, JSParseStrict };
- a/Source/JavaScriptCore/parser/SourceProviderCacheItem.h -3 / +3 lines
Lines 53-61 public: a/Source/JavaScriptCore/parser/SourceProviderCacheItem.h_sec1
53
        JSToken token;
53
        JSToken token;
54
        token.m_type = CLOSEBRACE;
54
        token.m_type = CLOSEBRACE;
55
        token.m_data.intValue = closeBracePos;
55
        token.m_data.intValue = closeBracePos;
56
        token.m_info.startOffset = closeBracePos;
56
        token.m_location.startOffset = closeBracePos;
57
        token.m_info.endOffset = closeBracePos + 1;
57
        token.m_location.endOffset = closeBracePos + 1;
58
        token.m_info.line = closeBraceLine; 
58
        token.m_location.line = closeBraceLine; 
59
        return token;
59
        return token;
60
    }
60
    }
61
    
61
    
- a/Source/JavaScriptCore/parser/SyntaxChecker.h -65 / +65 lines
Lines 119-160 public: a/Source/JavaScriptCore/parser/SyntaxChecker.h_sec1
119
    static const unsigned DontBuildStrings = LexerFlagsDontBuildStrings;
119
    static const unsigned DontBuildStrings = LexerFlagsDontBuildStrings;
120
120
121
    int createSourceElements() { return 1; }
121
    int createSourceElements() { return 1; }
122
    ExpressionType makeFunctionCallNode(int, int, int, int, int, int) { return CallExpr; }
122
    ExpressionType makeFunctionCallNode(const JSTokenLocation&, int, int, int, int, int) { return CallExpr; }
123
    void appendToComma(ExpressionType& base, ExpressionType right) { base = right; }
123
    void appendToComma(ExpressionType& base, ExpressionType right) { base = right; }
124
    ExpressionType createCommaExpr(int, ExpressionType, ExpressionType right) { return right; }
124
    ExpressionType createCommaExpr(const JSTokenLocation&, ExpressionType, ExpressionType right) { return right; }
125
    ExpressionType makeAssignNode(int, ExpressionType, Operator, ExpressionType, bool, bool, int, int, int) { return AssignmentExpr; }
125
    ExpressionType makeAssignNode(const JSTokenLocation&, ExpressionType, Operator, ExpressionType, bool, bool, int, int, int) { return AssignmentExpr; }
126
    ExpressionType makePrefixNode(int, ExpressionType, Operator, int, int, int) { return PreExpr; }
126
    ExpressionType makePrefixNode(const JSTokenLocation&, ExpressionType, Operator, int, int, int) { return PreExpr; }
127
    ExpressionType makePostfixNode(int, ExpressionType, Operator, int, int, int) { return PostExpr; }
127
    ExpressionType makePostfixNode(const JSTokenLocation&, ExpressionType, Operator, int, int, int) { return PostExpr; }
128
    ExpressionType makeTypeOfNode(int, ExpressionType) { return TypeofExpr; }
128
    ExpressionType makeTypeOfNode(const JSTokenLocation&, ExpressionType) { return TypeofExpr; }
129
    ExpressionType makeDeleteNode(int, ExpressionType, int, int, int) { return DeleteExpr; }
129
    ExpressionType makeDeleteNode(const JSTokenLocation&, ExpressionType, int, int, int) { return DeleteExpr; }
130
    ExpressionType makeNegateNode(int, ExpressionType) { return UnaryExpr; }
130
    ExpressionType makeNegateNode(const JSTokenLocation&, ExpressionType) { return UnaryExpr; }
131
    ExpressionType makeBitwiseNotNode(int, ExpressionType) { return UnaryExpr; }
131
    ExpressionType makeBitwiseNotNode(const JSTokenLocation&, ExpressionType) { return UnaryExpr; }
132
    ExpressionType createLogicalNot(int, ExpressionType) { return UnaryExpr; }
132
    ExpressionType createLogicalNot(const JSTokenLocation&, ExpressionType) { return UnaryExpr; }
133
    ExpressionType createUnaryPlus(int, ExpressionType) { return UnaryExpr; }
133
    ExpressionType createUnaryPlus(const JSTokenLocation&, ExpressionType) { return UnaryExpr; }
134
    ExpressionType createVoid(int, ExpressionType) { return UnaryExpr; }
134
    ExpressionType createVoid(const JSTokenLocation&, ExpressionType) { return UnaryExpr; }
135
    ExpressionType thisExpr(int) { return ThisExpr; }
135
    ExpressionType thisExpr(const JSTokenLocation&) { return ThisExpr; }
136
    ExpressionType createResolve(int, const Identifier*, int) { return ResolveExpr; }
136
    ExpressionType createResolve(const JSTokenLocation&, const Identifier*, int) { return ResolveExpr; }
137
    ExpressionType createObjectLiteral(int) { return ObjectLiteralExpr; }
137
    ExpressionType createObjectLiteral(const JSTokenLocation&) { return ObjectLiteralExpr; }
138
    ExpressionType createObjectLiteral(int, int) { return ObjectLiteralExpr; }
138
    ExpressionType createObjectLiteral(const JSTokenLocation&, int) { return ObjectLiteralExpr; }
139
    ExpressionType createArray(int, int) { return ArrayLiteralExpr; }
139
    ExpressionType createArray(const JSTokenLocation&, int) { return ArrayLiteralExpr; }
140
    ExpressionType createArray(int, int, int) { return ArrayLiteralExpr; }
140
    ExpressionType createArray(const JSTokenLocation&, int, int) { return ArrayLiteralExpr; }
141
    ExpressionType createNumberExpr(int, double) { return NumberExpr; }
141
    ExpressionType createNumberExpr(const JSTokenLocation&, double) { return NumberExpr; }
142
    ExpressionType createString(int, const Identifier*) { return StringExpr; }
142
    ExpressionType createString(const JSTokenLocation&, const Identifier*) { return StringExpr; }
143
    ExpressionType createBoolean(int, bool) { return BoolExpr; }
143
    ExpressionType createBoolean(const JSTokenLocation&, bool) { return BoolExpr; }
144
    ExpressionType createNull(int) { return NullExpr; }
144
    ExpressionType createNull(const JSTokenLocation&) { return NullExpr; }
145
    ExpressionType createBracketAccess(int, ExpressionType, ExpressionType, bool, int, int, int) { return BracketExpr; }
145
    ExpressionType createBracketAccess(const JSTokenLocation&, ExpressionType, ExpressionType, bool, int, int, int) { return BracketExpr; }
146
    ExpressionType createDotAccess(int, ExpressionType, const Identifier*, int, int, int) { return DotExpr; }
146
    ExpressionType createDotAccess(const JSTokenLocation&, ExpressionType, const Identifier*, int, int, int) { return DotExpr; }
147
    ExpressionType createRegExp(int, const Identifier& pattern, const Identifier&, int) { return Yarr::checkSyntax(pattern.ustring()) ? 0 : RegExpExpr; }
147
    ExpressionType createRegExp(const JSTokenLocation&, const Identifier& pattern, const Identifier&, int) { return Yarr::checkSyntax(pattern.ustring()) ? 0 : RegExpExpr; }
148
    ExpressionType createNewExpr(int, ExpressionType, int, int, int, int) { return NewExpr; }
148
    ExpressionType createNewExpr(const JSTokenLocation&, ExpressionType, int, int, int, int) { return NewExpr; }
149
    ExpressionType createNewExpr(int, ExpressionType, int, int) { return NewExpr; }
149
    ExpressionType createNewExpr(const JSTokenLocation&, ExpressionType, int, int) { return NewExpr; }
150
    ExpressionType createConditionalExpr(int, ExpressionType, ExpressionType, ExpressionType) { return ConditionalExpr; }
150
    ExpressionType createConditionalExpr(const JSTokenLocation&, ExpressionType, ExpressionType, ExpressionType) { return ConditionalExpr; }
151
    ExpressionType createAssignResolve(int, const Identifier&, ExpressionType, int, int, int) { return AssignmentExpr; }
151
    ExpressionType createAssignResolve(const JSTokenLocation&, const Identifier&, ExpressionType, int, int, int) { return AssignmentExpr; }
152
    ExpressionType createFunctionExpr(int, const Identifier*, int, int, int, int, int, int) { return FunctionExpr; }
152
    ExpressionType createFunctionExpr(const JSTokenLocation&, const Identifier*, int, int, int, int, int, int) { return FunctionExpr; }
153
    int createFunctionBody(int, bool) { return 1; }
153
    int createFunctionBody(const JSTokenLocation&, bool) { return 1; }
154
    int createArguments() { return 1; }
154
    int createArguments() { return 1; }
155
    int createArguments(int) { return 1; }
155
    int createArguments(int) { return 1; }
156
    int createArgumentsList(int, int) { return 1; }
156
    int createArgumentsList(const JSTokenLocation&, int) { return 1; }
157
    int createArgumentsList(int, int, int) { return 1; }
157
    int createArgumentsList(const JSTokenLocation&, int, int) { return 1; }
158
    template <bool complete> Property createProperty(const Identifier* name, int, PropertyNode::Type type)
158
    template <bool complete> Property createProperty(const Identifier* name, int, PropertyNode::Type type)
159
    {
159
    {
160
        if (!complete)
160
        if (!complete)
Lines 168-175 public: a/Source/JavaScriptCore/parser/SyntaxChecker.h_sec2
168
            return Property(type);
168
            return Property(type);
169
        return Property(&globalData->parserArena->identifierArena().makeNumericIdentifier(globalData, name), type);
169
        return Property(&globalData->parserArena->identifierArena().makeNumericIdentifier(globalData, name), type);
170
    }
170
    }
171
    int createPropertyList(int, Property) { return 1; }
171
    int createPropertyList(const JSTokenLocation&, Property) { return 1; }
172
    int createPropertyList(int, Property, int) { return 1; }
172
    int createPropertyList(const JSTokenLocation&, Property, int) { return 1; }
173
    int createElementList(int, int) { return 1; }
173
    int createElementList(int, int) { return 1; }
174
    int createElementList(int, int, int) { return 1; }
174
    int createElementList(int, int, int) { return 1; }
175
    int createFormalParameterList(const Identifier&) { return 1; }
175
    int createFormalParameterList(const Identifier&) { return 1; }
Lines 178-216 public: a/Source/JavaScriptCore/parser/SyntaxChecker.h_sec3
178
    int createClauseList(int) { return 1; }
178
    int createClauseList(int) { return 1; }
179
    int createClauseList(int, int) { return 1; }
179
    int createClauseList(int, int) { return 1; }
180
    void setUsesArguments(int) { }
180
    void setUsesArguments(int) { }
181
    int createFuncDeclStatement(int, const Identifier*, int, int, int, int, int, int) { return 1; }
181
    int createFuncDeclStatement(const JSTokenLocation&, const Identifier*, int, int, int, int, int, int) { return 1; }
182
    int createBlockStatement(int, int, int, int) { return 1; }
182
    int createBlockStatement(const JSTokenLocation&, int, int, int) { return 1; }
183
    int createExprStatement(int, int, int, int) { return 1; }
183
    int createExprStatement(const JSTokenLocation&, int, int, int) { return 1; }
184
    int createIfStatement(int, int, int, int, int) { return 1; }
184
    int createIfStatement(const JSTokenLocation&, int, int, int, int) { return 1; }
185
    int createIfStatement(int, int, int, int, int, int) { return 1; }
185
    int createIfStatement(const JSTokenLocation&, int, int, int, int, int) { return 1; }
186
    int createForLoop(int, int, int, int, int, int, int) { return 1; }
186
    int createForLoop(const JSTokenLocation&, int, int, int, int, int, int) { return 1; }
187
    int createForInLoop(int, const Identifier*, int, int, int, int, int, int, int, int, int, int) { return 1; }
187
    int createForInLoop(const JSTokenLocation&, const Identifier*, int, int, int, int, int, int, int, int, int, int) { return 1; }
188
    int createForInLoop(int, int, int, int, int, int, int, int, int) { return 1; }
188
    int createForInLoop(const JSTokenLocation&, int, int, int, int, int, int, int, int) { return 1; }
189
    int createEmptyStatement(int) { return 1; }
189
    int createEmptyStatement(const JSTokenLocation&) { return 1; }
190
    int createVarStatement(int, int, int, int) { return 1; }
190
    int createVarStatement(const JSTokenLocation&, int, int, int) { return 1; }
191
    int createReturnStatement(int, int, int, int, int, int) { return 1; }
191
    int createReturnStatement(const JSTokenLocation&, int, int, int, int, int) { return 1; }
192
    int createBreakStatement(int, int, int, int, int) { return 1; }
192
    int createBreakStatement(const JSTokenLocation&, int, int, int, int) { return 1; }
193
    int createBreakStatement(int, const Identifier*, int, int, int, int) { return 1; }
193
    int createBreakStatement(const JSTokenLocation&, const Identifier*, int, int, int, int) { return 1; }
194
    int createContinueStatement(int, int, int, int, int) { return 1; }
194
    int createContinueStatement(const JSTokenLocation&, int, int, int, int) { return 1; }
195
    int createContinueStatement(int, const Identifier*, int, int, int, int) { return 1; }
195
    int createContinueStatement(const JSTokenLocation&, const Identifier*, int, int, int, int) { return 1; }
196
    int createTryStatement(int, int, const Identifier*, int, int, int, int) { return 1; }
196
    int createTryStatement(const JSTokenLocation&, int, const Identifier*, int, int, int, int) { return 1; }
197
    int createSwitchStatement(int, int, int, int, int, int, int) { return 1; }
197
    int createSwitchStatement(const JSTokenLocation&, int, int, int, int, int, int) { return 1; }
198
    int createWhileStatement(int, int, int, int, int) { return 1; }
198
    int createWhileStatement(const JSTokenLocation&, int, int, int, int) { return 1; }
199
    int createWithStatement(int, int, int, int, int, int, int) { return 1; }
199
    int createWithStatement(const JSTokenLocation&, int, int, int, int, int, int) { return 1; }
200
    int createDoWhileStatement(int, int, int, int, int) { return 1; }
200
    int createDoWhileStatement(const JSTokenLocation&, int, int, int, int) { return 1; }
201
    int createLabelStatement(int, const Identifier*, int, int, int) { return 1; }
201
    int createLabelStatement(const JSTokenLocation&, const Identifier*, int, int, int) { return 1; }
202
    int createThrowStatement(int, int, int, int, int, int) { return 1; }
202
    int createThrowStatement(const JSTokenLocation&, int, int, int, int, int) { return 1; }
203
    int createDebugger(int, int, int) { return 1; }
203
    int createDebugger(const JSTokenLocation&, int, int) { return 1; }
204
    int createConstStatement(int, int, int, int) { return 1; }
204
    int createConstStatement(const JSTokenLocation&, int, int, int) { return 1; }
205
    int appendConstDecl(int, int, const Identifier*, int) { return 1; }
205
    int appendConstDecl(const JSTokenLocation&, int, const Identifier*, int) { return 1; }
206
    template <bool strict> Property createGetterOrSetterProperty(int, PropertyNode::Type type, const Identifier* name, int, int, int, int, int, int)
206
    template <bool strict> Property createGetterOrSetterProperty(const JSTokenLocation&, PropertyNode::Type type, const Identifier* name, int, int, int, int, int, int)
207
    {
207
    {
208
        ASSERT(name);
208
        ASSERT(name);
209
        if (!strict)
209
        if (!strict)
210
            return Property(type);
210
            return Property(type);
211
        return Property(name, type);
211
        return Property(name, type);
212
    }
212
    }
213
    template <bool strict> Property createGetterOrSetterProperty(JSGlobalData* globalData, int, PropertyNode::Type type, double name, int, int, int, int, int, int)
213
    template <bool strict> Property createGetterOrSetterProperty(JSGlobalData* globalData, const JSTokenLocation&, PropertyNode::Type type, double name, int, int, int, int, int, int)
214
    {
214
    {
215
        if (!strict)
215
        if (!strict)
216
            return Property(type);
216
            return Property(type);
Lines 219-225 public: a/Source/JavaScriptCore/parser/SyntaxChecker.h_sec4
219
219
220
    void appendStatement(int, int) { }
220
    void appendStatement(int, int) { }
221
    void addVar(const Identifier*, bool) { }
221
    void addVar(const Identifier*, bool) { }
222
    int combineCommaNodes(int, int, int) { return 1; }
222
    int combineCommaNodes(const JSTokenLocation&, int, int) { return 1; }
223
    int evalCount() const { return 0; }
223
    int evalCount() const { return 0; }
224
    void appendBinaryExpressionInfo(int& operandStackDepth, int expr, int, int, int, bool)
224
    void appendBinaryExpressionInfo(int& operandStackDepth, int expr, int, int, int, bool)
225
    {
225
    {
Lines 235-241 public: a/Source/JavaScriptCore/parser/SyntaxChecker.h_sec5
235
    bool operatorStackHasHigherPrecedence(int&, int) { return true; }
235
    bool operatorStackHasHigherPrecedence(int&, int) { return true; }
236
    BinaryOperand getFromOperandStack(int) { return m_topBinaryExpr; }
236
    BinaryOperand getFromOperandStack(int) { return m_topBinaryExpr; }
237
    void shrinkOperandStackBy(int& operandStackDepth, int amount) { operandStackDepth -= amount; }
237
    void shrinkOperandStackBy(int& operandStackDepth, int amount) { operandStackDepth -= amount; }
238
    void appendBinaryOperation(int, int& operandStackDepth, int&, BinaryOperand, BinaryOperand) { operandStackDepth++; }
238
    void appendBinaryOperation(const JSTokenLocation&, int& operandStackDepth, int&, BinaryOperand, BinaryOperand) { operandStackDepth++; }
239
    void operatorStackAppend(int& operatorStackDepth, int, int) { operatorStackDepth++; }
239
    void operatorStackAppend(int& operatorStackDepth, int, int) { operatorStackDepth++; }
240
    int popOperandStack(int&) { int res = m_topBinaryExpr; m_topBinaryExpr = 0; return res; }
240
    int popOperandStack(int&) { int res = m_topBinaryExpr; m_topBinaryExpr = 0; return res; }
241
    
241
    
Lines 245-251 public: a/Source/JavaScriptCore/parser/SyntaxChecker.h_sec6
245
    void unaryTokenStackRemoveLast(int& stackDepth) { stackDepth = 0; }
245
    void unaryTokenStackRemoveLast(int& stackDepth) { stackDepth = 0; }
246
    
246
    
247
    void assignmentStackAppend(int, int, int, int, int, Operator) { }
247
    void assignmentStackAppend(int, int, int, int, int, Operator) { }
248
    int createAssignment(int, int, int, int, int, int) { ASSERT_NOT_REACHED(); return 1; }
248
    int createAssignment(const JSTokenLocation&, int, int, int, int, int) { ASSERT_NOT_REACHED(); return 1; }
249
    const Identifier& getName(const Property& property) const { ASSERT(property.name); return *property.name; }
249
    const Identifier& getName(const Property& property) const { ASSERT(property.name); return *property.name; }
250
    PropertyNode::Type getType(const Property& property) const { return property.type; }
250
    PropertyNode::Type getType(const Property& property) const { return property.type; }
251
    bool isResolve(ExpressionType expr) const { return expr == ResolveExpr || expr == ResolveEvalExpr; }
251
    bool isResolve(ExpressionType expr) const { return expr == ResolveExpr || expr == ResolveEvalExpr; }
- a/Source/WebCore/bindings/js/ScriptDebugServer.cpp -26 / +141 lines
Lines 75-94 String ScriptDebugServer::setBreakpoint(const String& sourceID, const ScriptBrea a/Source/WebCore/bindings/js/ScriptDebugServer.cpp_sec1
75
    SourceIdToBreakpointsMap::iterator it = m_sourceIdToBreakpoints.find(sourceIDValue);
75
    SourceIdToBreakpointsMap::iterator it = m_sourceIdToBreakpoints.find(sourceIDValue);
76
    if (it == m_sourceIdToBreakpoints.end())
76
    if (it == m_sourceIdToBreakpoints.end())
77
        it = m_sourceIdToBreakpoints.set(sourceIDValue, LineToBreakpointMap()).iterator;
77
        it = m_sourceIdToBreakpoints.set(sourceIDValue, LineToBreakpointMap()).iterator;
78
    if (it->second.contains(scriptBreakpoint.lineNumber + 1))
78
    LineToBreakpointMap::iterator breaksIt = it->second.find(scriptBreakpoint.lineNumber + 1);
79
        return "";
79
    if (breaksIt == it->second.end())
80
    it->second.set(scriptBreakpoint.lineNumber + 1, scriptBreakpoint);
80
        breaksIt = it->second.set(scriptBreakpoint.lineNumber + 1, BreakpointsInLine()).iterator;
81
82
    BreakpointsInLine& breaksVector = breaksIt->second;
83
    unsigned breaksCount = breaksVector.size();
84
    for (unsigned i = 0; i < breaksCount; i++) {
85
        if (breaksVector.at(i).columnNumber == scriptBreakpoint.columnNumber)
86
            return "";
87
    }
88
    breaksVector.append(scriptBreakpoint);
89
81
    *actualLineNumber = scriptBreakpoint.lineNumber;
90
    *actualLineNumber = scriptBreakpoint.lineNumber;
82
    // FIXME(WK53003): implement setting breakpoints by line:column.
91
    *actualColumnNumber = scriptBreakpoint.columnNumber;
83
    *actualColumnNumber = 0;
92
    return sourceID + ":" + String::number(scriptBreakpoint.lineNumber) + ":" + String::number(scriptBreakpoint.columnNumber);
84
    return sourceID + ":" + String::number(scriptBreakpoint.lineNumber);
85
}
93
}
86
94
87
void ScriptDebugServer::removeBreakpoint(const String& breakpointId)
95
void ScriptDebugServer::removeBreakpoint(const String& breakpointId)
88
{
96
{
89
    Vector<String> tokens;
97
    Vector<String> tokens;
90
    breakpointId.split(":", tokens);
98
    breakpointId.split(":", tokens);
91
    if (tokens.size() != 2)
99
    if (tokens.size() != 3)
92
        return;
100
        return;
93
    bool success;
101
    bool success;
94
    intptr_t sourceIDValue = tokens[0].toIntPtr(&success);
102
    intptr_t sourceIDValue = tokens[0].toIntPtr(&success);
Lines 97-105 void ScriptDebugServer::removeBreakpoint(const String& breakpointId) a/Source/WebCore/bindings/js/ScriptDebugServer.cpp_sec2
97
    unsigned lineNumber = tokens[1].toUInt(&success);
105
    unsigned lineNumber = tokens[1].toUInt(&success);
98
    if (!success)
106
    if (!success)
99
        return;
107
        return;
108
    unsigned columnNumber = tokens[2].toUInt(&success);
109
    if (!success)
110
        return;
111
100
    SourceIdToBreakpointsMap::iterator it = m_sourceIdToBreakpoints.find(sourceIDValue);
112
    SourceIdToBreakpointsMap::iterator it = m_sourceIdToBreakpoints.find(sourceIDValue);
101
    if (it != m_sourceIdToBreakpoints.end())
113
    if (it == m_sourceIdToBreakpoints.end())
102
        it->second.remove(lineNumber + 1);
114
        return;
115
    LineToBreakpointMap::iterator breaksIt = it->second.find(lineNumber + 1);
116
    if (breaksIt == it->second.end())
117
        return;
118
119
    BreakpointsInLine& breaksVector = breaksIt->second;
120
    unsigned breaksCount = breaksVector.size();
121
    for (unsigned i = 0; i < breaksCount; i++) {
122
        if (breaksVector.at(i).columnNumber == static_cast<int>(columnNumber)) {
123
            breaksVector.remove(i);
124
            break;
125
        }
126
    }
127
}
128
129
void ScriptDebugServer::updateCurrentStatementPosition(intptr_t sourceID, int line)
130
{
131
    if (line < 0)
132
        return;
133
134
    SourceProvider* source = reinterpret_cast<SourceProvider*>(sourceID);
135
136
    if (m_currentSourceID != sourceID) {
137
        String sourceCode = ustringToString(JSC::UString(const_cast<StringImpl*>(source->data())));
138
        m_currentSourceCode.clear();
139
        sourceCode.split("\n", true, m_currentSourceCode);
140
        m_currentSourceID = sourceID;
141
        m_currentStatementPosition.lineNumber = 0;
142
        m_currentStatementPosition.columnNumber = 0;
143
    }
144
145
    if (line != m_currentStatementPosition.lineNumber) {
146
        m_currentStatementPosition.lineNumber = line;
147
        m_currentStatementPosition.columnNumber = 0;
148
        return;
149
    }
150
151
    int startLine = source->startPosition().m_line.zeroBasedInt();
152
    if ((m_currentStatementPosition.lineNumber - startLine - 1) >= static_cast<int>(m_currentSourceCode.size()))
153
        return;
154
    const String& codeInLine = m_currentSourceCode[m_currentStatementPosition.lineNumber - startLine - 1];
155
    if (codeInLine.isEmpty())
156
        return;
157
    int nextColumn = codeInLine.find(";", m_currentStatementPosition.columnNumber);
158
    if (nextColumn != -1) {
159
        UChar c = codeInLine[nextColumn + 1];
160
        if (c == ' ' || c == '\t')
161
            nextColumn += 1;
162
        m_currentStatementPosition.columnNumber = nextColumn + 1;
163
    } else
164
        m_currentStatementPosition.columnNumber = 0;
103
}
165
}
104
166
105
bool ScriptDebugServer::hasBreakpoint(intptr_t sourceID, const TextPosition& position) const
167
bool ScriptDebugServer::hasBreakpoint(intptr_t sourceID, const TextPosition& position) const
Lines 110-128 bool ScriptDebugServer::hasBreakpoint(intptr_t sourceID, const TextPosition& pos a/Source/WebCore/bindings/js/ScriptDebugServer.cpp_sec3
110
    SourceIdToBreakpointsMap::const_iterator it = m_sourceIdToBreakpoints.find(sourceID);
172
    SourceIdToBreakpointsMap::const_iterator it = m_sourceIdToBreakpoints.find(sourceID);
111
    if (it == m_sourceIdToBreakpoints.end())
173
    if (it == m_sourceIdToBreakpoints.end())
112
        return false;
174
        return false;
113
    int lineNumber = position.m_line.oneBasedInt();
175
114
    if (lineNumber <= 0)
176
    int lineNumber = position.m_line.zeroBasedInt();
177
    int columnNumber = position.m_column.zeroBasedInt();
178
    if (lineNumber < 0 || columnNumber < 0)
179
        return false;
180
181
    LineToBreakpointMap::const_iterator breaksIt = it->second.find(lineNumber + 1);
182
    if (breaksIt == it->second.end())
115
        return false;
183
        return false;
116
    LineToBreakpointMap::const_iterator breakIt = it->second.find(lineNumber);
184
117
    if (breakIt == it->second.end())
185
    bool hit = false;
186
    const BreakpointsInLine& breaksVector = breaksIt->second;
187
    unsigned breaksCount = breaksVector.size();
188
    unsigned i;
189
    for (i = 0; i < breaksCount; i++) {
190
        int breakColumn = breaksVector.at(i).columnNumber;
191
        int breakLine = breaksVector.at(i).lineNumber;
192
        if (lineNumber == breakLine && columnNumber == breakColumn) {
193
            hit = true;
194
            break;
195
        }
196
    }
197
    if (!hit)
118
        return false;
198
        return false;
119
199
120
    // An empty condition counts as no condition which is equivalent to "true".
200
    // An empty condition counts as no condition which is equivalent to "true".
121
    if (breakIt->second.condition.isEmpty())
201
    if (breaksVector.at(i).condition.isEmpty())
122
        return true;
202
        return true;
123
203
124
    JSValue exception;
204
    JSValue exception;
125
    JSValue result = m_currentCallFrame->evaluate(stringToUString(breakIt->second.condition), exception);
205
    JSValue result = m_currentCallFrame->evaluate(stringToUString(breaksVector.at(i).condition), exception);
126
    if (exception) {
206
    if (exception) {
127
        // An erroneous condition counts as "false".
207
        // An erroneous condition counts as "false".
128
        return false;
208
        return false;
Lines 347-366 void ScriptDebugServer::dispatchFunctionToListeners(JavaScriptExecutionCallback a/Source/WebCore/bindings/js/ScriptDebugServer.cpp_sec4
347
    m_callingListeners = false;
427
    m_callingListeners = false;
348
}
428
}
349
429
350
void ScriptDebugServer::createCallFrameAndPauseIfNeeded(const DebuggerCallFrame& debuggerCallFrame, intptr_t sourceID, int lineNumber)
430
void ScriptDebugServer::createCallFrameAndPauseIfNeeded(const DebuggerCallFrame& debuggerCallFrame, intptr_t sourceID, int lineNumber, int columnNumber)
351
{
431
{
352
    TextPosition textPosition(OrdinalNumber::fromOneBasedInt(lineNumber), OrdinalNumber::first());
432
    TextPosition textPosition(OrdinalNumber::fromOneBasedInt(lineNumber), OrdinalNumber::fromZeroBasedInt(columnNumber));
353
    m_currentCallFrame = JavaScriptCallFrame::create(debuggerCallFrame, m_currentCallFrame, sourceID, textPosition);
433
    m_currentCallFrame = JavaScriptCallFrame::create(debuggerCallFrame, m_currentCallFrame, sourceID, textPosition);
354
    pauseIfNeeded(debuggerCallFrame.dynamicGlobalObject());
434
    pauseIfNeeded(debuggerCallFrame.dynamicGlobalObject());
355
}
435
}
356
436
357
void ScriptDebugServer::updateCallFrameAndPauseIfNeeded(const DebuggerCallFrame& debuggerCallFrame, intptr_t sourceID, int lineNumber)
437
void ScriptDebugServer::updateCallFrameAndPauseIfNeeded(const DebuggerCallFrame& debuggerCallFrame, intptr_t sourceID, int lineNumber, int columnNumber)
358
{
438
{
359
    ASSERT(m_currentCallFrame);
439
    ASSERT(m_currentCallFrame);
360
    if (!m_currentCallFrame)
440
    if (!m_currentCallFrame)
361
        return;
441
        return;
362
442
363
    TextPosition textPosition(OrdinalNumber::fromOneBasedInt(lineNumber), OrdinalNumber::first());
443
    TextPosition textPosition(OrdinalNumber::fromOneBasedInt(lineNumber), OrdinalNumber::fromZeroBasedInt(columnNumber));
364
    m_currentCallFrame->update(debuggerCallFrame, sourceID, textPosition);
444
    m_currentCallFrame->update(debuggerCallFrame, sourceID, textPosition);
365
    pauseIfNeeded(debuggerCallFrame.dynamicGlobalObject());
445
    pauseIfNeeded(debuggerCallFrame.dynamicGlobalObject());
366
}
446
}
Lines 401-422 void ScriptDebugServer::pauseIfNeeded(JSGlobalObject* dynamicGlobalObject) a/Source/WebCore/bindings/js/ScriptDebugServer.cpp_sec5
401
481
402
void ScriptDebugServer::callEvent(const DebuggerCallFrame& debuggerCallFrame, intptr_t sourceID, int lineNumber)
482
void ScriptDebugServer::callEvent(const DebuggerCallFrame& debuggerCallFrame, intptr_t sourceID, int lineNumber)
403
{
483
{
484
    callEvent(debuggerCallFrame, sourceID, lineNumber, 0);
485
}
486
487
void ScriptDebugServer::callEvent(const DebuggerCallFrame& debuggerCallFrame, intptr_t sourceID, int lineNumber, int columnNumber)
488
{
404
    if (!m_paused)
489
    if (!m_paused)
405
        createCallFrameAndPauseIfNeeded(debuggerCallFrame, sourceID, lineNumber);
490
        createCallFrameAndPauseIfNeeded(debuggerCallFrame, sourceID, lineNumber, columnNumber);
406
}
491
}
407
492
408
void ScriptDebugServer::atStatement(const DebuggerCallFrame& debuggerCallFrame, intptr_t sourceID, int lineNumber)
493
void ScriptDebugServer::atStatement(const DebuggerCallFrame& debuggerCallFrame, intptr_t sourceID, int lineNumber)
409
{
494
{
495
    atStatement(debuggerCallFrame, sourceID, lineNumber, 0);
496
}
497
498
void ScriptDebugServer::atStatement(const DebuggerCallFrame& debuggerCallFrame, intptr_t sourceID, int lineNumber, int columnNumber)
499
{
410
    if (!m_paused)
500
    if (!m_paused)
411
        updateCallFrameAndPauseIfNeeded(debuggerCallFrame, sourceID, lineNumber);
501
        updateCallFrameAndPauseIfNeeded(debuggerCallFrame, sourceID, lineNumber, columnNumber);
412
}
502
}
413
503
414
void ScriptDebugServer::returnEvent(const DebuggerCallFrame& debuggerCallFrame, intptr_t sourceID, int lineNumber)
504
void ScriptDebugServer::returnEvent(const DebuggerCallFrame& debuggerCallFrame, intptr_t sourceID, int lineNumber)
415
{
505
{
506
    returnEvent(debuggerCallFrame, sourceID, lineNumber, 0);
507
}
508
509
void ScriptDebugServer::returnEvent(const DebuggerCallFrame& debuggerCallFrame, intptr_t sourceID, int lineNumber, int columnNumber)
510
{
416
    if (m_paused)
511
    if (m_paused)
417
        return;
512
        return;
418
513
419
    updateCallFrameAndPauseIfNeeded(debuggerCallFrame, sourceID, lineNumber);
514
    updateCallFrameAndPauseIfNeeded(debuggerCallFrame, sourceID, lineNumber, columnNumber);
420
515
421
    // detach may have been called during pauseIfNeeded
516
    // detach may have been called during pauseIfNeeded
422
    if (!m_currentCallFrame)
517
    if (!m_currentCallFrame)
Lines 430-456 void ScriptDebugServer::returnEvent(const DebuggerCallFrame& debuggerCallFrame, a/Source/WebCore/bindings/js/ScriptDebugServer.cpp_sec6
430
525
431
void ScriptDebugServer::exception(const DebuggerCallFrame& debuggerCallFrame, intptr_t sourceID, int lineNumber, bool hasHandler)
526
void ScriptDebugServer::exception(const DebuggerCallFrame& debuggerCallFrame, intptr_t sourceID, int lineNumber, bool hasHandler)
432
{
527
{
528
    exception(debuggerCallFrame, sourceID, lineNumber, 0, hasHandler);
529
}
530
531
void ScriptDebugServer::exception(const DebuggerCallFrame& debuggerCallFrame, intptr_t sourceID, int lineNumber, int columnNumber, bool hasHandler)
532
{
433
    if (m_paused)
533
    if (m_paused)
434
        return;
534
        return;
435
535
436
    if (m_pauseOnExceptionsState == PauseOnAllExceptions || (m_pauseOnExceptionsState == PauseOnUncaughtExceptions && !hasHandler))
536
    if (m_pauseOnExceptionsState == PauseOnAllExceptions || (m_pauseOnExceptionsState == PauseOnUncaughtExceptions && !hasHandler))
437
        m_pauseOnNextStatement = true;
537
        m_pauseOnNextStatement = true;
438
538
439
    updateCallFrameAndPauseIfNeeded(debuggerCallFrame, sourceID, lineNumber);
539
    updateCallFrameAndPauseIfNeeded(debuggerCallFrame, sourceID, lineNumber, columnNumber);
440
}
540
}
441
541
442
void ScriptDebugServer::willExecuteProgram(const DebuggerCallFrame& debuggerCallFrame, intptr_t sourceID, int lineNumber)
542
void ScriptDebugServer::willExecuteProgram(const DebuggerCallFrame& debuggerCallFrame, intptr_t sourceID, int lineNumber)
443
{
543
{
544
    willExecuteProgram(debuggerCallFrame, sourceID, lineNumber, 0);
545
}
546
547
void ScriptDebugServer::willExecuteProgram(const DebuggerCallFrame& debuggerCallFrame, intptr_t sourceID, int lineNumber, int columnNumber)
548
{
444
    if (!m_paused)
549
    if (!m_paused)
445
        createCallFrameAndPauseIfNeeded(debuggerCallFrame, sourceID, lineNumber);
550
        createCallFrameAndPauseIfNeeded(debuggerCallFrame, sourceID, lineNumber, columnNumber);
446
}
551
}
447
552
448
void ScriptDebugServer::didExecuteProgram(const DebuggerCallFrame& debuggerCallFrame, intptr_t sourceID, int lineNumber)
553
void ScriptDebugServer::didExecuteProgram(const DebuggerCallFrame& debuggerCallFrame, intptr_t sourceID, int lineNumber)
449
{
554
{
555
    didExecuteProgram(debuggerCallFrame, sourceID, lineNumber, 0);
556
}
557
558
void ScriptDebugServer::didExecuteProgram(const DebuggerCallFrame& debuggerCallFrame, intptr_t sourceID, int lineNumber, int columnNumber)
559
{
450
    if (m_paused)
560
    if (m_paused)
451
        return;
561
        return;
452
562
453
    updateCallFrameAndPauseIfNeeded(debuggerCallFrame, sourceID, lineNumber);
563
    updateCallFrameAndPauseIfNeeded(debuggerCallFrame, sourceID, lineNumber, columnNumber);
454
564
455
    // Treat stepping over the end of a program like stepping out.
565
    // Treat stepping over the end of a program like stepping out.
456
    if (m_currentCallFrame == m_pauseOnCallFrame)
566
    if (m_currentCallFrame == m_pauseOnCallFrame)
Lines 460-470 void ScriptDebugServer::didExecuteProgram(const DebuggerCallFrame& debuggerCallF a/Source/WebCore/bindings/js/ScriptDebugServer.cpp_sec7
460
570
461
void ScriptDebugServer::didReachBreakpoint(const DebuggerCallFrame& debuggerCallFrame, intptr_t sourceID, int lineNumber)
571
void ScriptDebugServer::didReachBreakpoint(const DebuggerCallFrame& debuggerCallFrame, intptr_t sourceID, int lineNumber)
462
{
572
{
573
    didReachBreakpoint(debuggerCallFrame, sourceID, lineNumber, 0);
574
}
575
576
void ScriptDebugServer::didReachBreakpoint(const DebuggerCallFrame& debuggerCallFrame, intptr_t sourceID, int lineNumber, int columnNumber)
577
{
463
    if (m_paused)
578
    if (m_paused)
464
        return;
579
        return;
465
580
466
    m_pauseOnNextStatement = true;
581
    m_pauseOnNextStatement = true;
467
    updateCallFrameAndPauseIfNeeded(debuggerCallFrame, sourceID, lineNumber);
582
    updateCallFrameAndPauseIfNeeded(debuggerCallFrame, sourceID, lineNumber, columnNumber);
468
}
583
}
469
584
470
void ScriptDebugServer::recompileAllJSFunctionsSoon()
585
void ScriptDebugServer::recompileAllJSFunctionsSoon()
- a/Source/WebCore/bindings/js/ScriptDebugServer.h -3 / +19 lines
Lines 123-130 protected: a/Source/WebCore/bindings/js/ScriptDebugServer.h_sec1
123
    void dispatchDidParseSource(const ListenerSet& listeners, JSC::SourceProvider*, bool isContentScript);
123
    void dispatchDidParseSource(const ListenerSet& listeners, JSC::SourceProvider*, bool isContentScript);
124
    void dispatchFailedToParseSource(const ListenerSet& listeners, JSC::SourceProvider*, int errorLine, const String& errorMessage);
124
    void dispatchFailedToParseSource(const ListenerSet& listeners, JSC::SourceProvider*, int errorLine, const String& errorMessage);
125
125
126
    void createCallFrameAndPauseIfNeeded(const JSC::DebuggerCallFrame&, intptr_t sourceID, int lineNumber);
126
    void createCallFrameAndPauseIfNeeded(const JSC::DebuggerCallFrame&, intptr_t sourceID, int lineNumber, int columnNumber);
127
    void updateCallFrameAndPauseIfNeeded(const JSC::DebuggerCallFrame&, intptr_t sourceID, int lineNumber);
127
    void updateCallFrameAndPauseIfNeeded(const JSC::DebuggerCallFrame&, intptr_t sourceID, int lineNumber, int columnNumber);
128
    void pauseIfNeeded(JSC::JSGlobalObject* dynamicGlobalObject);
128
    void pauseIfNeeded(JSC::JSGlobalObject* dynamicGlobalObject);
129
129
130
    virtual void detach(JSC::JSGlobalObject*);
130
    virtual void detach(JSC::JSGlobalObject*);
Lines 138-144 protected: a/Source/WebCore/bindings/js/ScriptDebugServer.h_sec2
138
    virtual void didExecuteProgram(const JSC::DebuggerCallFrame&, intptr_t sourceID, int lineno);
138
    virtual void didExecuteProgram(const JSC::DebuggerCallFrame&, intptr_t sourceID, int lineno);
139
    virtual void didReachBreakpoint(const JSC::DebuggerCallFrame&, intptr_t sourceID, int lineno);
139
    virtual void didReachBreakpoint(const JSC::DebuggerCallFrame&, intptr_t sourceID, int lineno);
140
140
141
    typedef HashMap<long, ScriptBreakpoint> LineToBreakpointMap;
141
    virtual void callEvent(const JSC::DebuggerCallFrame&, intptr_t sourceID, int lineNumber, int columnNumber);
142
    virtual void atStatement(const JSC::DebuggerCallFrame&, intptr_t sourceID, int firstLine, int columnNumber);
143
    virtual void returnEvent(const JSC::DebuggerCallFrame&, intptr_t sourceID, int lineNumber, int columnNumber);
144
    virtual void exception(const JSC::DebuggerCallFrame&, intptr_t sourceID, int lineNumber, int columnNumber, bool hasHandler);
145
    virtual void willExecuteProgram(const JSC::DebuggerCallFrame&, intptr_t sourceID, int lineno, int columnNumber);
146
    virtual void didExecuteProgram(const JSC::DebuggerCallFrame&, intptr_t sourceID, int lineno, int columnNumber);
147
    virtual void didReachBreakpoint(const JSC::DebuggerCallFrame&, intptr_t sourceID, int lineno, int columnNumber);
148
149
150
    void updateCurrentStatementPosition(intptr_t, int);
151
152
    typedef Vector<ScriptBreakpoint> BreakpointsInLine;
153
    typedef HashMap<long, BreakpointsInLine> LineToBreakpointMap;
142
    typedef HashMap<intptr_t, LineToBreakpointMap> SourceIdToBreakpointsMap;
154
    typedef HashMap<intptr_t, LineToBreakpointMap> SourceIdToBreakpointsMap;
143
155
144
    bool m_callingListeners;
156
    bool m_callingListeners;
Lines 151-156 protected: a/Source/WebCore/bindings/js/ScriptDebugServer.h_sec3
151
    RefPtr<JavaScriptCallFrame> m_currentCallFrame;
163
    RefPtr<JavaScriptCallFrame> m_currentCallFrame;
152
    SourceIdToBreakpointsMap m_sourceIdToBreakpoints;
164
    SourceIdToBreakpointsMap m_sourceIdToBreakpoints;
153
    Timer<ScriptDebugServer> m_recompileTimer;
165
    Timer<ScriptDebugServer> m_recompileTimer;
166
167
    Vector<String> m_currentSourceCode;
168
    intptr_t m_currentSourceID;
169
    ScriptBreakpoint m_currentStatementPosition;
154
};
170
};
155
171
156
} // namespace WebCore
172
} // namespace WebCore

Return to Bug 53003