Changeset 153477 in webkit for trunk/Source/JavaScriptCore/bytecompiler
- Timestamp:
- Jul 30, 2013, 10:01:40 AM (12 years ago)
- Location:
- trunk/Source/JavaScriptCore/bytecompiler
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp
r153237 r153477 1547 1547 } 1548 1548 1549 RegisterID* BytecodeGenerator::emitCall(RegisterID* dst, RegisterID* func, ExpectedFunction expectedFunction, CallArguments& callArguments, unsigned divot, unsigned startOffset, unsigned endOffset, unsigned line, unsigned lineStart)1550 { 1551 return emitCall(op_call, dst, func, expectedFunction, callArguments, divot, startOffset, endOffset, line, lineStart);1549 RegisterID* BytecodeGenerator::emitCall(RegisterID* dst, RegisterID* func, ExpectedFunction expectedFunction, CallArguments& callArguments, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd) 1550 { 1551 return emitCall(op_call, dst, func, expectedFunction, callArguments, divot, divotStart, divotEnd); 1552 1552 } 1553 1553 … … 1580 1580 } 1581 1581 1582 RegisterID* BytecodeGenerator::emitCallEval(RegisterID* dst, RegisterID* func, CallArguments& callArguments, unsigned divot, unsigned startOffset, unsigned endOffset, unsigned line, unsigned lineStart)1583 { 1584 return emitCall(op_call_eval, dst, func, NoExpectedFunction, callArguments, divot, startOffset, endOffset, line, lineStart);1582 RegisterID* BytecodeGenerator::emitCallEval(RegisterID* dst, RegisterID* func, CallArguments& callArguments, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd) 1583 { 1584 return emitCall(op_call_eval, dst, func, NoExpectedFunction, callArguments, divot, divotStart, divotEnd); 1585 1585 } 1586 1586 … … 1660 1660 } 1661 1661 1662 RegisterID* BytecodeGenerator::emitCall(OpcodeID opcodeID, RegisterID* dst, RegisterID* func, ExpectedFunction expectedFunction, CallArguments& callArguments, unsigned divot, unsigned startOffset, unsigned endOffset, unsigned line, unsigned lineStart)1662 RegisterID* BytecodeGenerator::emitCall(OpcodeID opcodeID, RegisterID* dst, RegisterID* func, ExpectedFunction expectedFunction, CallArguments& callArguments, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd) 1663 1663 { 1664 1664 ASSERT(opcodeID == op_call || opcodeID == op_call_eval); … … 1683 1683 } 1684 1684 1685 emitExpressionInfo(divot, startOffset, endOffset, line, lineStart);1685 emitExpressionInfo(divot, divotStart, divotEnd); 1686 1686 1687 1687 RefPtr<Label> done = newLabel(); … … 1716 1716 } 1717 1717 1718 RegisterID* BytecodeGenerator::emitCallVarargs(RegisterID* dst, RegisterID* func, RegisterID* thisRegister, RegisterID* arguments, RegisterID* firstFreeRegister, RegisterID* profileHookRegister, unsigned divot, unsigned startOffset, unsigned endOffset, unsigned line, unsigned lineStart)1718 RegisterID* BytecodeGenerator::emitCallVarargs(RegisterID* dst, RegisterID* func, RegisterID* thisRegister, RegisterID* arguments, RegisterID* firstFreeRegister, RegisterID* profileHookRegister, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd) 1719 1719 { 1720 1720 if (m_shouldEmitProfileHooks) { … … 1724 1724 } 1725 1725 1726 emitExpressionInfo(divot, startOffset, endOffset, line, lineStart);1726 emitExpressionInfo(divot, divotStart, divotEnd); 1727 1727 1728 1728 // Emit call. … … 1775 1775 } 1776 1776 1777 RegisterID* BytecodeGenerator::emitConstruct(RegisterID* dst, RegisterID* func, ExpectedFunction expectedFunction, CallArguments& callArguments, unsigned divot, unsigned startOffset, unsigned endOffset, unsigned line, unsigned lineStart)1777 RegisterID* BytecodeGenerator::emitConstruct(RegisterID* dst, RegisterID* func, ExpectedFunction expectedFunction, CallArguments& callArguments, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd) 1778 1778 { 1779 1779 ASSERT(func->refCount()); … … 1799 1799 callFrame.append(newTemporary()); 1800 1800 1801 emitExpressionInfo(divot, startOffset, endOffset, line, lineStart);1801 emitExpressionInfo(divot, divotStart, divotEnd); 1802 1802 1803 1803 RefPtr<Label> done = newLabel(); … … 1876 1876 return; 1877 1877 #endif 1878 emitExpressionInfo(charOffset, 0, 0, firstLine, lineStart); 1878 JSTextPosition divot(firstLine, charOffset, lineStart); 1879 emitExpressionInfo(divot, divot, divot); 1879 1880 unsigned charPosition = charOffset - m_scopeNode->source().startOffset(); 1880 1881 emitOpcode(op_debug); -
trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h
r153221 r153477 266 266 } 267 267 268 void emitExpressionInfo(int divot, int startOffset, int endOffset, unsigned line, int lineStart) 269 { 268 void emitExpressionInfo(const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd) 269 { 270 ASSERT(divot.offset >= divotStart.offset); 271 ASSERT(divotEnd.offset >= divot.offset); 272 270 273 int sourceOffset = m_scopeNode->source().startOffset(); 271 274 unsigned firstLine = m_scopeNode->source().firstLine(); 272 275 273 ASSERT(divot >= lineStart); 274 ASSERT(divot >= sourceOffset); 275 divot -= sourceOffset; 276 276 int divotOffset = divot.offset - sourceOffset; 277 int startOffset = divot.offset - divotStart.offset; 278 int endOffset = divotEnd.offset - divot.offset; 279 280 unsigned line = divot.line; 281 ASSERT(line >= firstLine); 282 line -= firstLine; 283 284 int lineStart = divot.lineStartOffset; 277 285 if (lineStart > sourceOffset) 278 286 lineStart -= sourceOffset; 279 287 else 280 288 lineStart = 0; 281 282 ASSERT(line >= firstLine); 283 line -= firstLine; 289 ASSERT(divotOffset >= lineStart); 290 unsigned column = divotOffset - lineStart; 284 291 285 292 unsigned instructionOffset = instructions().size(); 286 ASSERT(divot >= lineStart); 287 unsigned column = divot - lineStart; 288 m_codeBlock->addExpressionInfo(instructionOffset, divot, startOffset, endOffset, line, column); 293 m_codeBlock->addExpressionInfo(instructionOffset, divotOffset, startOffset, endOffset, line, column); 289 294 } 290 295 … … 352 357 353 358 ExpectedFunction expectedFunctionForIdentifier(const Identifier&); 354 RegisterID* emitCall(RegisterID* dst, RegisterID* func, ExpectedFunction, CallArguments&, unsigned divot, unsigned startOffset, unsigned endOffset, unsigned line, unsigned lineStart);355 RegisterID* emitCallEval(RegisterID* dst, RegisterID* func, CallArguments&, unsigned divot, unsigned startOffset, unsigned endOffset, unsigned line, unsigned lineStart);356 RegisterID* emitCallVarargs(RegisterID* dst, RegisterID* func, RegisterID* thisRegister, RegisterID* arguments, RegisterID* firstFreeRegister, RegisterID* profileHookRegister, unsigned divot, unsigned startOffset, unsigned endOffset, unsigned line, unsigned lineStart);359 RegisterID* emitCall(RegisterID* dst, RegisterID* func, ExpectedFunction, CallArguments&, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd); 360 RegisterID* emitCallEval(RegisterID* dst, RegisterID* func, CallArguments&, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd); 361 RegisterID* emitCallVarargs(RegisterID* dst, RegisterID* func, RegisterID* thisRegister, RegisterID* arguments, RegisterID* firstFreeRegister, RegisterID* profileHookRegister, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd); 357 362 RegisterID* emitLoadVarargs(RegisterID* argCountDst, RegisterID* thisRegister, RegisterID* args); 358 363 … … 360 365 RegisterID* emitEnd(RegisterID* src) { return emitUnaryNoDstOp(op_end, src); } 361 366 362 RegisterID* emitConstruct(RegisterID* dst, RegisterID* func, ExpectedFunction, CallArguments&, unsigned divot, unsigned startOffset, unsigned endOffset, unsigned line, unsigned lineStart);367 RegisterID* emitConstruct(RegisterID* dst, RegisterID* func, ExpectedFunction, CallArguments&, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd); 363 368 RegisterID* emitStrcat(RegisterID* dst, RegisterID* src, int count); 364 369 void emitToPrimitive(RegisterID* dst, RegisterID* src); … … 463 468 ExpectedFunction emitExpectedFunctionSnippet(RegisterID* dst, RegisterID* func, ExpectedFunction, CallArguments&, Label* done); 464 469 465 RegisterID* emitCall(OpcodeID, RegisterID* dst, RegisterID* func, ExpectedFunction, CallArguments&, unsigned divot, unsigned startOffset, unsigned endOffset, unsigned line, unsigned lineStart);470 RegisterID* emitCall(OpcodeID, RegisterID* dst, RegisterID* func, ExpectedFunction, CallArguments&, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd); 466 471 467 472 RegisterID* newRegister(); -
trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
r153221 r153477 88 88 RegisterID* ThrowableExpressionData::emitThrowReferenceError(BytecodeGenerator& generator, const String& message) 89 89 { 90 generator.emitExpressionInfo(divot(), divotStart Offset(), divotEndOffset(), divotLine(), divotLineStart());90 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 91 91 generator.emitThrowReferenceError(message); 92 92 return generator.newTemporary(); … … 153 153 } 154 154 155 unsigned divot = m_startOffset + m_ident.length();156 generator.emitExpressionInfo(divot, m_ ident.length(), 0, m_divotLine, m_divotLineStart);155 JSTextPosition divot = m_start + m_ident.length(); 156 generator.emitExpressionInfo(divot, m_start, divot); 157 157 RefPtr<RegisterID> scope = generator.emitResolveScope(generator.tempDestination(dst), m_ident); 158 158 return generator.emitGetFromScope(generator.finalDestination(dst), scope.get(), m_ident, ThrowIfNotFound); … … 326 326 && !generator.symbolTable().slowArguments()) { 327 327 RegisterID* property = generator.emitNode(m_subscript); 328 generator.emitExpressionInfo(divot(), divotStart Offset(), divotEndOffset(), divotLine(), divotLineStart());328 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 329 329 return generator.emitGetArgumentByVal(generator.finalDestination(dst), generator.uncheckedRegisterForArguments(), property); 330 330 } … … 332 332 RefPtr<RegisterID> base = generator.emitNodeForLeftHandSide(m_base, m_subscriptHasAssignments, m_subscript->isPure(generator)); 333 333 RegisterID* property = generator.emitNode(m_subscript); 334 generator.emitExpressionInfo(divot(), divotStart Offset(), divotEndOffset(), divotLine(), divotLineStart());334 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 335 335 return generator.emitGetByVal(generator.finalDestination(dst), base.get(), property); 336 336 } … … 346 346 if (!generator.willResolveToArguments(resolveNode->identifier())) 347 347 goto nonArgumentsPath; 348 generator.emitExpressionInfo(divot(), divotStart Offset(), divotEndOffset(), divotLine(), divotLineStart());348 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 349 349 return generator.emitGetArgumentsLength(generator.finalDestination(dst), generator.uncheckedRegisterForArguments()); 350 350 } … … 352 352 nonArgumentsPath: 353 353 RegisterID* base = generator.emitNode(m_base); 354 generator.emitExpressionInfo(divot(), divotStart Offset(), divotEndOffset(), divotLine(), divotLineStart());354 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 355 355 return generator.emitGetById(generator.finalDestination(dst), base, m_ident); 356 356 } … … 376 376 RefPtr<RegisterID> returnValue = generator.finalDestination(dst, func.get()); 377 377 CallArguments callArguments(generator, m_args); 378 return generator.emitConstruct(returnValue.get(), func.get(), expectedFunction, callArguments, divot(), divotStart Offset(), divotEndOffset(), divotLine(), divotLineStart());378 return generator.emitConstruct(returnValue.get(), func.get(), expectedFunction, callArguments, divot(), divotStart(), divotEnd()); 379 379 } 380 380 … … 413 413 CallArguments callArguments(generator, m_args); 414 414 generator.emitLoad(callArguments.thisRegister(), jsUndefined()); 415 return generator.emitCallEval(generator.finalDestination(dst, func.get()), func.get(), callArguments, divot(), startOffset(), divotEndOffset(), divotLine(), divotLineStart());415 return generator.emitCallEval(generator.finalDestination(dst, func.get()), func.get(), callArguments, divot(), divotStart(), divotEnd()); 416 416 } 417 417 418 418 RefPtr<RegisterID> func = generator.newTemporary(); 419 419 CallArguments callArguments(generator, m_args); 420 generator.emitExpressionInfo(divot() - divotStartOffset() + 4, 4, 0, divotLine(), divotLineStart()); 420 JSTextPosition newDivot = divotStart() + 4; 421 generator.emitExpressionInfo(newDivot, divotStart(), newDivot); 421 422 generator.emitResolveScope(callArguments.thisRegister(), generator.propertyNames().eval); 422 423 generator.emitGetFromScope(func.get(), callArguments.thisRegister(), generator.propertyNames().eval, ThrowIfNotFound); 423 return generator.emitCallEval(generator.finalDestination(dst, func.get()), func.get(), callArguments, divot(), startOffset(), divotEndOffset(), divotLine(), divotLineStart());424 return generator.emitCallEval(generator.finalDestination(dst, func.get()), func.get(), callArguments, divot(), divotStart(), divotEnd()); 424 425 } 425 426 … … 432 433 CallArguments callArguments(generator, m_args); 433 434 generator.emitLoad(callArguments.thisRegister(), jsUndefined()); 434 return generator.emitCall(returnValue.get(), func.get(), NoExpectedFunction, callArguments, divot(), divotStart Offset(), divotEndOffset(), divotLine(), divotLineStart());435 return generator.emitCall(returnValue.get(), func.get(), NoExpectedFunction, callArguments, divot(), divotStart(), divotEnd()); 435 436 } 436 437 … … 448 449 // This passes NoExpectedFunction because we expect that if the function is in a 449 450 // local variable, then it's not one of our built-in constructors. 450 return generator.emitCall(returnValue.get(), func.get(), NoExpectedFunction, callArguments, divot(), divotStart Offset(), divotEndOffset(), divotLine(), divotLineStart());451 return generator.emitCall(returnValue.get(), func.get(), NoExpectedFunction, callArguments, divot(), divotStart(), divotEnd()); 451 452 } 452 453 … … 454 455 RefPtr<RegisterID> returnValue = generator.finalDestination(dst, func.get()); 455 456 CallArguments callArguments(generator, m_args); 456 int identifierStart = divot() - divotStartOffset(); 457 458 generator.emitExpressionInfo( identifierStart + m_ident.length(), m_ident.length(), 0, divotLine(), divotLineStart());457 458 JSTextPosition newDivot = divotStart() + m_ident.length(); 459 generator.emitExpressionInfo(newDivot, divotStart(), newDivot); 459 460 generator.emitResolveScope(callArguments.thisRegister(), m_ident); 460 461 generator.emitGetFromScope(func.get(), callArguments.thisRegister(), m_ident, ThrowIfNotFound); 461 return generator.emitCall(returnValue.get(), func.get(), expectedFunction, callArguments, divot(), divotStart Offset(), divotEndOffset(), divotLine(), divotLineStart());462 return generator.emitCall(returnValue.get(), func.get(), expectedFunction, callArguments, divot(), divotStart(), divotEnd()); 462 463 } 463 464 … … 468 469 RefPtr<RegisterID> base = generator.emitNode(m_base); 469 470 RegisterID* property = generator.emitNode(m_subscript); 470 generator.emitExpressionInfo(subexpressionDivot(), subexpressionStart Offset(), subexpressionEndOffset(), subexpressionLine(), subexpressionLineStart());471 generator.emitExpressionInfo(subexpressionDivot(), subexpressionStart(), subexpressionEnd()); 471 472 RefPtr<RegisterID> function = generator.emitGetByVal(generator.tempDestination(dst), base.get(), property); 472 473 RefPtr<RegisterID> returnValue = generator.finalDestination(dst, function.get()); 473 474 CallArguments callArguments(generator, m_args); 474 475 generator.emitMove(callArguments.thisRegister(), base.get()); 475 return generator.emitCall(returnValue.get(), function.get(), NoExpectedFunction, callArguments, divot(), divotStart Offset(), divotEndOffset(), divotLine(), divotLineStart());476 return generator.emitCall(returnValue.get(), function.get(), NoExpectedFunction, callArguments, divot(), divotStart(), divotEnd()); 476 477 } 477 478 … … 484 485 CallArguments callArguments(generator, m_args); 485 486 generator.emitNode(callArguments.thisRegister(), m_base); 486 generator.emitExpressionInfo(subexpressionDivot(), subexpressionStart Offset(), subexpressionEndOffset(), subexpressionLine(), subexpressionLineStart());487 generator.emitExpressionInfo(subexpressionDivot(), subexpressionStart(), subexpressionEnd()); 487 488 generator.emitGetById(function.get(), callArguments.thisRegister(), m_ident); 488 return generator.emitCall(returnValue.get(), function.get(), NoExpectedFunction, callArguments, divot(), divotStart Offset(), divotEndOffset(), divotLine(), divotLineStart());489 return generator.emitCall(returnValue.get(), function.get(), NoExpectedFunction, callArguments, divot(), divotStart(), divotEnd()); 489 490 } 490 491 … … 494 495 RefPtr<Label> end = generator.newLabel(); 495 496 RefPtr<RegisterID> base = generator.emitNode(m_base); 496 generator.emitExpressionInfo(subexpressionDivot(), subexpressionStart Offset(), subexpressionEndOffset(), subexpressionLine(), subexpressionLineStart());497 generator.emitExpressionInfo(subexpressionDivot(), subexpressionStart(), subexpressionEnd()); 497 498 RefPtr<RegisterID> function = generator.emitGetById(generator.tempDestination(dst), base.get(), m_ident); 498 499 RefPtr<RegisterID> returnValue = generator.finalDestination(dst, function.get()); … … 506 507 CallArguments callArguments(generator, m_args); 507 508 generator.emitNode(callArguments.thisRegister(), oldList->m_expr); 508 generator.emitCall(returnValue.get(), realFunction.get(), NoExpectedFunction, callArguments, divot(), divotStart Offset(), divotEndOffset(), divotLine(), divotLineStart());509 generator.emitCall(returnValue.get(), realFunction.get(), NoExpectedFunction, callArguments, divot(), divotStart(), divotEnd()); 509 510 generator.emitJump(end.get()); 510 511 … … 514 515 CallArguments callArguments(generator, m_args); 515 516 generator.emitLoad(callArguments.thisRegister(), jsUndefined()); 516 generator.emitCall(returnValue.get(), realFunction.get(), NoExpectedFunction, callArguments, divot(), divotStart Offset(), divotEndOffset(), divotLine(), divotLineStart());517 generator.emitCall(returnValue.get(), realFunction.get(), NoExpectedFunction, callArguments, divot(), divotStart(), divotEnd()); 517 518 generator.emitJump(end.get()); 518 519 } … … 522 523 CallArguments callArguments(generator, m_args); 523 524 generator.emitMove(callArguments.thisRegister(), base.get()); 524 generator.emitCall(returnValue.get(), function.get(), NoExpectedFunction, callArguments, divot(), divotStart Offset(), divotEndOffset(), divotLine(), divotLineStart());525 generator.emitCall(returnValue.get(), function.get(), NoExpectedFunction, callArguments, divot(), divotStart(), divotEnd()); 525 526 } 526 527 generator.emitLabel(end.get()); … … 544 545 RefPtr<Label> end = generator.newLabel(); 545 546 RefPtr<RegisterID> base = generator.emitNode(m_base); 546 generator.emitExpressionInfo(subexpressionDivot(), subexpressionStart Offset(), subexpressionEndOffset(), subexpressionLine(), subexpressionLineStart());547 generator.emitExpressionInfo(subexpressionDivot(), subexpressionStart(), subexpressionEnd()); 547 548 RefPtr<RegisterID> function = generator.emitGetById(generator.tempDestination(dst), base.get(), m_ident); 548 549 RefPtr<RegisterID> returnValue = generator.finalDestination(dst, function.get()); … … 559 560 CallArguments callArguments(generator, m_args); 560 561 generator.emitNode(callArguments.thisRegister(), oldList->m_expr); 561 generator.emitCall(returnValue.get(), realFunction.get(), NoExpectedFunction, callArguments, divot(), divotStart Offset(), divotEndOffset(), divotLine(), divotLineStart());562 generator.emitCall(returnValue.get(), realFunction.get(), NoExpectedFunction, callArguments, divot(), divotStart(), divotEnd()); 562 563 } else { 563 564 m_args->m_listNode = m_args->m_listNode->m_next; … … 565 566 CallArguments callArguments(generator, m_args); 566 567 generator.emitNode(callArguments.thisRegister(), oldList->m_expr); 567 generator.emitCall(returnValue.get(), realFunction.get(), NoExpectedFunction, callArguments, divot(), divotStart Offset(), divotEndOffset(), divotLine(), divotLineStart());568 generator.emitCall(returnValue.get(), realFunction.get(), NoExpectedFunction, callArguments, divot(), divotStart(), divotEnd()); 568 569 } 569 570 m_args->m_listNode = oldList; … … 572 573 CallArguments callArguments(generator, m_args); 573 574 generator.emitLoad(callArguments.thisRegister(), jsUndefined()); 574 generator.emitCall(returnValue.get(), realFunction.get(), NoExpectedFunction, callArguments, divot(), divotStart Offset(), divotEndOffset(), divotLine(), divotLineStart());575 generator.emitCall(returnValue.get(), realFunction.get(), NoExpectedFunction, callArguments, divot(), divotStart(), divotEnd()); 575 576 } 576 577 } else { … … 593 594 generator.emitNode(args->m_expr); 594 595 595 generator.emitCallVarargs(returnValue.get(), realFunction.get(), thisRegister.get(), argsRegister.get(), generator.newTemporary(), profileHookRegister.get(), divot(), divotStart Offset(), divotEndOffset(), divotLine(), divotLineStart());596 generator.emitCallVarargs(returnValue.get(), realFunction.get(), thisRegister.get(), argsRegister.get(), generator.newTemporary(), profileHookRegister.get(), divot(), divotStart(), divotEnd()); 596 597 } 597 598 generator.emitJump(end.get()); … … 601 602 CallArguments callArguments(generator, m_args); 602 603 generator.emitMove(callArguments.thisRegister(), base.get()); 603 generator.emitCall(returnValue.get(), function.get(), NoExpectedFunction, callArguments, divot(), divotStart Offset(), divotEndOffset(), divotLine(), divotLineStart());604 generator.emitCall(returnValue.get(), function.get(), NoExpectedFunction, callArguments, divot(), divotStart(), divotEnd()); 604 605 } 605 606 generator.emitLabel(end.get()); … … 640 641 } 641 642 642 generator.emitExpressionInfo(divot(), divotStart Offset(), divotEndOffset(), divotLine(), divotLineStart());643 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 643 644 RefPtr<RegisterID> scope = generator.emitResolveScope(generator.newTemporary(), ident); 644 645 RefPtr<RegisterID> value = generator.emitGetFromScope(generator.newTemporary(), scope.get(), ident, ThrowIfNotFound); … … 661 662 RefPtr<RegisterID> property = generator.emitNode(subscript); 662 663 663 generator.emitExpressionInfo(bracketAccessor->divot(), bracketAccessor->divotStart Offset(), bracketAccessor->divotEndOffset(), bracketAccessor->divotLine(), bracketAccessor->divotLineStart());664 generator.emitExpressionInfo(bracketAccessor->divot(), bracketAccessor->divotStart(), bracketAccessor->divotEnd()); 664 665 RefPtr<RegisterID> value = generator.emitGetByVal(generator.newTemporary(), base.get(), property.get()); 665 666 RegisterID* oldValue = emitPostIncOrDec(generator, generator.tempDestination(dst), value.get(), m_operator); 666 generator.emitExpressionInfo(divot(), divotStart Offset(), divotEndOffset(), divotLine(), divotLineStart());667 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 667 668 generator.emitPutByVal(base.get(), property.get(), value.get()); 668 669 return generator.moveToDestinationIfNeeded(dst, oldValue); … … 681 682 RefPtr<RegisterID> base = generator.emitNode(baseNode); 682 683 683 generator.emitExpressionInfo(dotAccessor->divot(), dotAccessor->divotStart Offset(), dotAccessor->divotEndOffset(), dotAccessor->divotLine(), dotAccessor->divotLineStart());684 generator.emitExpressionInfo(dotAccessor->divot(), dotAccessor->divotStart(), dotAccessor->divotEnd()); 684 685 RefPtr<RegisterID> value = generator.emitGetById(generator.newTemporary(), base.get(), ident); 685 686 RegisterID* oldValue = emitPostIncOrDec(generator, generator.tempDestination(dst), value.get(), m_operator); 686 generator.emitExpressionInfo(divot(), divotStart Offset(), divotEndOffset(), divotLine(), divotLineStart());687 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 687 688 generator.emitPutById(base.get(), ident, value.get()); 688 689 return generator.moveToDestinationIfNeeded(dst, oldValue); … … 712 713 return generator.emitLoad(generator.finalDestination(dst), false); 713 714 714 generator.emitExpressionInfo(divot(), divotStart Offset(), divotEndOffset(), divotLine(), divotLineStart());715 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 715 716 RefPtr<RegisterID> base = generator.emitResolveScope(generator.tempDestination(dst), m_ident); 716 717 return generator.emitDeleteById(generator.finalDestination(dst, base.get()), base.get(), m_ident); … … 724 725 RegisterID* r1 = generator.emitNode(m_subscript); 725 726 726 generator.emitExpressionInfo(divot(), divotStart Offset(), divotEndOffset(), divotLine(), divotLineStart());727 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 727 728 return generator.emitDeleteByVal(generator.finalDestination(dst), r0.get(), r1); 728 729 } … … 734 735 RegisterID* r0 = generator.emitNode(m_base); 735 736 736 generator.emitExpressionInfo(divot(), divotStart Offset(), divotEndOffset(), divotLine(), divotLineStart());737 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 737 738 return generator.emitDeleteById(generator.finalDestination(dst), r0, m_ident); 738 739 } … … 806 807 } 807 808 808 generator.emitExpressionInfo(divot(), divotStart Offset(), divotEndOffset(), divotLine(), divotLineStart());809 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 809 810 RefPtr<RegisterID> scope = generator.emitResolveScope(generator.tempDestination(dst), ident); 810 811 RefPtr<RegisterID> value = generator.emitGetFromScope(generator.newTemporary(), scope.get(), ident, ThrowIfNotFound); … … 825 826 RefPtr<RegisterID> propDst = generator.tempDestination(dst); 826 827 827 generator.emitExpressionInfo(bracketAccessor->divot(), bracketAccessor->divotStart Offset(), bracketAccessor->divotEndOffset(), bracketAccessor->divotLine(), bracketAccessor->divotLineStart());828 generator.emitExpressionInfo(bracketAccessor->divot(), bracketAccessor->divotStart(), bracketAccessor->divotEnd()); 828 829 RegisterID* value = generator.emitGetByVal(propDst.get(), base.get(), property.get()); 829 830 emitIncOrDec(generator, value, m_operator); 830 generator.emitExpressionInfo(divot(), divotStart Offset(), divotEndOffset(), divotLine(), divotLineStart());831 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 831 832 generator.emitPutByVal(base.get(), property.get(), value); 832 833 return generator.moveToDestinationIfNeeded(dst, propDst.get()); … … 843 844 RefPtr<RegisterID> propDst = generator.tempDestination(dst); 844 845 845 generator.emitExpressionInfo(dotAccessor->divot(), dotAccessor->divotStart Offset(), dotAccessor->divotEndOffset(), dotAccessor->divotLine(), dotAccessor->divotLineStart());846 generator.emitExpressionInfo(dotAccessor->divot(), dotAccessor->divotStart(), dotAccessor->divotEnd()); 846 847 RegisterID* value = generator.emitGetById(propDst.get(), base.get(), ident); 847 848 emitIncOrDec(generator, value, m_operator); 848 generator.emitExpressionInfo(divot(), divotStart Offset(), divotEndOffset(), divotLine(), divotLineStart());849 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 849 850 generator.emitPutById(base.get(), ident, value); 850 851 return generator.moveToDestinationIfNeeded(dst, propDst.get()); … … 872 873 { 873 874 RegisterID* src = generator.emitNode(m_expr); 874 generator.emitExpressionInfo( startOffset(), 0, 0, lineNo(), lineStartOffset());875 generator.emitExpressionInfo(position(), position(), position()); 875 876 return generator.emitUnaryOp(opcodeID(), generator.finalDestination(dst), src); 876 877 } … … 1004 1005 // If this is required the node is passed as 'emitExpressionInfoForMe'; do so now. 1005 1006 if (emitExpressionInfoForMe) 1006 generator.emitExpressionInfo(emitExpressionInfoForMe->divot(), emitExpressionInfoForMe->divotStartOffset(), emitExpressionInfoForMe->divotEndOffset(), emitExpressionInfoForMe->divotLine(), emitExpressionInfoForMe->divotLineStart()); 1007 1007 generator.emitExpressionInfo(emitExpressionInfoForMe->divot(), emitExpressionInfoForMe->divotStart(), emitExpressionInfoForMe->divotEnd()); 1008 1008 // If there is an assignment convert the lhs now. This will also copy lhs to 1009 1009 // the temporary register we allocated for it. … … 1077 1077 1078 1078 if (opcodeID == op_add && m_expr1->isAdd() && m_expr1->resultDescriptor().definitelyIsString()) { 1079 generator.emitExpressionInfo( startOffset(), 0, 0, lineNo(), lineStartOffset());1079 generator.emitExpressionInfo(position(), position(), position()); 1080 1080 return emitStrcat(generator, dst); 1081 1081 } … … 1099 1099 bool wasTypeof = generator.m_lastOpcodeID == op_typeof; 1100 1100 RegisterID* src2 = generator.emitNode(right); 1101 generator.emitExpressionInfo( startOffset(), 0, 0, lineNo(), lineStartOffset());1101 generator.emitExpressionInfo(position(), position(), position()); 1102 1102 if (wasTypeof && (opcodeID == op_neq || opcodeID == op_nstricteq)) { 1103 1103 RefPtr<RegisterID> tmp = generator.tempDestination(dst); … … 1147 1147 RefPtr<RegisterID> src1 = generator.emitNodeForLeftHandSide(m_expr1, m_rightHasAssignments, m_expr2->isPure(generator)); 1148 1148 RegisterID* src2 = generator.emitNode(m_expr2); 1149 generator.emitExpressionInfo(divot(), divotStart Offset(), divotEndOffset(), divotLine(), divotLineStart());1149 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 1150 1150 return generator.emitBinaryOp(opcodeID(), generator.finalDestination(dst, src1.get()), src1.get(), src2, OperandTypes(m_expr1->resultDescriptor(), m_expr2->resultDescriptor())); 1151 1151 } … … 1159 1159 RefPtr<Label> target = generator.newLabel(); 1160 1160 1161 generator.emitExpressionInfo(divot(), divotStart Offset(), divotEndOffset(), divotLine(), divotLineStart());1161 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 1162 1162 generator.emitCheckHasInstance(dstReg.get(), src1.get(), src2.get(), target.get()); 1163 1163 1164 generator.emitExpressionInfo(divot(), divotStart Offset(), divotEndOffset(), divotLine(), divotLineStart());1164 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 1165 1165 generator.emitGetById(prototype.get(), src2.get(), generator.vm()->propertyNames->prototype); 1166 1166 1167 generator.emitExpressionInfo(divot(), divotStart Offset(), divotEndOffset(), divotLine(), divotLineStart());1167 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 1168 1168 RegisterID* result = generator.emitInstanceOf(dstReg.get(), src1.get(), prototype.get()); 1169 1169 generator.emitLabel(target.get()); … … 1276 1276 // If this is required the node is passed as 'emitExpressionInfoForMe'; do so now. 1277 1277 if (emitExpressionInfoForMe) 1278 generator.emitExpressionInfo(emitExpressionInfoForMe->divot(), emitExpressionInfoForMe->divotStartOffset(), emitExpressionInfoForMe->divotEndOffset(), emitExpressionInfoForMe->divotLine(), emitExpressionInfoForMe->divotLineStart()); 1279 1278 generator.emitExpressionInfo(emitExpressionInfoForMe->divot(), emitExpressionInfoForMe->divotStart(), emitExpressionInfoForMe->divotEnd()); 1280 1279 return generator.emitBinaryOp(opcodeID, dst, src1, src2, types); 1281 1280 } … … 1301 1300 } 1302 1301 1303 generator.emitExpressionInfo(divot() - divotStartOffset() + m_ident.length(), m_ident.length(), 0, divotLine(), divotLineStart()); 1302 JSTextPosition newDivot = divotStart() + m_ident.length(); 1303 generator.emitExpressionInfo(newDivot, divotStart(), newDivot); 1304 1304 RefPtr<RegisterID> scope = generator.emitResolveScope(generator.newTemporary(), m_ident); 1305 1305 RefPtr<RegisterID> value = generator.emitGetFromScope(generator.newTemporary(), scope.get(), m_ident, ThrowIfNotFound); … … 1321 1321 } 1322 1322 1323 if (generator.isStrictMode()) 1324 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 1323 1325 RefPtr<RegisterID> scope = generator.emitResolveScope(generator.newTemporary(), m_ident); 1324 1326 if (dst == generator.ignoredResult()) 1325 1327 dst = 0; 1326 1328 RefPtr<RegisterID> result = generator.emitNode(dst, m_right); 1327 generator.emitExpressionInfo(divot(), divotStart Offset(), divotEndOffset(), divotLine(), divotLineStart());1329 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 1328 1330 return generator.emitPutToScope(scope.get(), m_ident, result.get(), generator.isStrictMode() ? ThrowIfNotFound : DoNotThrowIfNotFound); 1329 1331 } … … 1336 1338 RefPtr<RegisterID> value = generator.destinationForAssignResult(dst); 1337 1339 RegisterID* result = generator.emitNode(value.get(), m_right); 1338 generator.emitExpressionInfo(divot(), divotStart Offset(), divotEndOffset(), divotLine(), divotLineStart());1340 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 1339 1341 RegisterID* forwardResult = (dst == generator.ignoredResult()) ? result : generator.moveToDestinationIfNeeded(generator.tempDestination(result), result); 1340 1342 generator.emitPutById(base.get(), m_ident, forwardResult); … … 1348 1350 RefPtr<RegisterID> base = generator.emitNodeForLeftHandSide(m_base, m_rightHasAssignments, m_right->isPure(generator)); 1349 1351 1350 generator.emitExpressionInfo(subexpressionDivot(), subexpressionStart Offset(), subexpressionEndOffset(), subexpressionLine(), subexpressionLineStart());1352 generator.emitExpressionInfo(subexpressionDivot(), subexpressionStart(), subexpressionEnd()); 1351 1353 RefPtr<RegisterID> value = generator.emitGetById(generator.tempDestination(dst), base.get(), m_ident); 1352 1354 RegisterID* updatedValue = emitReadModifyAssignment(generator, generator.finalDestination(dst, value.get()), value.get(), m_right, m_operator, OperandTypes(ResultType::unknownType(), m_right->resultDescriptor())); 1353 1355 1354 generator.emitExpressionInfo(divot(), divotStart Offset(), divotEndOffset(), divotLine(), divotLineStart());1356 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 1355 1357 return generator.emitPutById(base.get(), m_ident, updatedValue); 1356 1358 } … … 1372 1374 RegisterID* result = generator.emitNode(value.get(), m_right); 1373 1375 1374 generator.emitExpressionInfo(divot(), divotStart Offset(), divotEndOffset(), divotLine(), divotLineStart());1376 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 1375 1377 RegisterID* forwardResult = (dst == generator.ignoredResult()) ? result : generator.moveToDestinationIfNeeded(generator.tempDestination(result), result); 1376 1378 generator.emitPutByVal(base.get(), property.get(), forwardResult); … … 1385 1387 RefPtr<RegisterID> property = generator.emitNodeForLeftHandSide(m_subscript, m_rightHasAssignments, m_right->isPure(generator)); 1386 1388 1387 generator.emitExpressionInfo(subexpressionDivot(), subexpressionStart Offset(), subexpressionEndOffset(), subexpressionLine(), subexpressionLineStart());1389 generator.emitExpressionInfo(subexpressionDivot(), subexpressionStart(), subexpressionEnd()); 1388 1390 RefPtr<RegisterID> value = generator.emitGetByVal(generator.tempDestination(dst), base.get(), property.get()); 1389 1391 RegisterID* updatedValue = emitReadModifyAssignment(generator, generator.finalDestination(dst, value.get()), value.get(), m_right, m_operator, OperandTypes(ResultType::unknownType(), m_right->resultDescriptor())); 1390 1392 1391 generator.emitExpressionInfo(divot(), divotStart Offset(), divotEndOffset(), divotLine(), divotLineStart());1393 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 1392 1394 generator.emitPutByVal(base.get(), property.get(), updatedValue); 1393 1395 … … 1696 1698 propertyName = generator.newTemporary(); 1697 1699 RefPtr<RegisterID> protect = propertyName; 1700 if (generator.isStrictMode()) 1701 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 1698 1702 RegisterID* scope = generator.emitResolveScope(generator.newTemporary(), ident); 1699 generator.emitExpressionInfo(divot(), divotStart Offset(), divotEndOffset(), divotLine(), divotLineStart());1703 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 1700 1704 generator.emitPutToScope(scope, ident, propertyName, generator.isStrictMode() ? ThrowIfNotFound : DoNotThrowIfNotFound); 1701 1705 } else { … … 1711 1715 RegisterID* base = generator.emitNode(assignNode->base()); 1712 1716 1713 generator.emitExpressionInfo(assignNode->divot(), assignNode->divotStart Offset(), assignNode->divotEndOffset(), assignNode->divotLine(), assignNode->divotLineStart());1717 generator.emitExpressionInfo(assignNode->divot(), assignNode->divotStart(), assignNode->divotEnd()); 1714 1718 generator.emitPutById(base, ident, propertyName); 1715 1719 } else { … … 1721 1725 RegisterID* subscript = generator.emitNode(assignNode->subscript()); 1722 1726 1723 generator.emitExpressionInfo(assignNode->divot(), assignNode->divotStart Offset(), assignNode->divotEndOffset(), assignNode->divotLine(), assignNode->divotLineStart());1727 generator.emitExpressionInfo(assignNode->divot(), assignNode->divotStart(), assignNode->divotEnd()); 1724 1728 generator.emitPutByVal(base.get(), subscript, propertyName); 1725 1729 } … … 1817 1821 1818 1822 RefPtr<RegisterID> scope = generator.emitNode(m_expr); 1819 generator.emitExpressionInfo(m_divot, m_ expressionLength, 0, m_divotLine, m_divotLineStart);1823 generator.emitExpressionInfo(m_divot, m_divot - m_expressionLength, m_divot); 1820 1824 generator.emitPushWithScope(scope.get()); 1821 1825 generator.emitNode(dst, m_statement); … … 2021 2025 dst = 0; 2022 2026 RefPtr<RegisterID> expr = generator.emitNode(m_expr); 2023 generator.emitExpressionInfo(divot(), divotStart Offset(), divotEndOffset(), divotLine(), divotLineStart());2027 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 2024 2028 generator.emitThrow(expr.get()); 2025 2029 }
Note:
See TracChangeset
for help on using the changeset viewer.