Changeset 35245 in webkit for trunk/JavaScriptCore/kjs/nodes.cpp
- Timestamp:
- Jul 18, 2008, 6:44:24 PM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/kjs/nodes.cpp
r35230 r35245 163 163 } 164 164 165 RegisterID* Node::emitThrowError(CodeGenerator& generator, ErrorType e, const char* msg) 166 { 165 RegisterID* ThrowableExpressionData::emitThrowError(CodeGenerator& generator, ErrorType e, const char* msg) 166 { 167 generator.emitExpressionInfo(m_divot, m_startOffset, m_endOffset); 167 168 RegisterID* exception = generator.emitNewError(generator.newTemporary(), e, jsString(generator.globalExec(), msg)); 168 169 generator.emitThrow(exception); … … 170 171 } 171 172 172 RegisterID* Node::emitThrowError(CodeGenerator& generator, ErrorType e, const char* msg, const Identifier& label)173 RegisterID* ThrowableExpressionData::emitThrowError(CodeGenerator& generator, ErrorType e, const char* msg, const Identifier& label) 173 174 { 174 175 UString message = msg; 175 176 substitute(message, label.ustring()); 177 generator.emitExpressionInfo(m_divot, m_startOffset, m_endOffset); 176 178 RegisterID* exception = generator.emitNewError(generator.newTemporary(), e, jsString(generator.globalExec(), message)); 177 179 generator.emitThrow(exception); … … 185 187 , m_lastLine(-1) 186 188 { 187 m_line = -1;188 189 } 189 190 … … 289 290 return generator.moveToDestinationIfNeeded(dst, local); 290 291 } 291 292 293 generator.emitExpressionInfo(m_startOffset + m_ident.size(), m_ident.size(), 0); 292 294 return generator.emitResolve(generator.finalDestination(dst), m_ident); 293 295 } … … 376 378 RefPtr<RegisterID> base = generator.emitNodeForLeftHandSide(m_base.get(), m_subscriptHasAssignments, m_subscript->isPure(generator)); 377 379 RegisterID* property = generator.emitNode(m_subscript.get()); 378 380 generator.emitExpressionInfo(m_divot, m_startOffset, m_endOffset); 379 381 return generator.emitGetByVal(generator.finalDestination(dst), base.get(), property); 380 382 } … … 385 387 { 386 388 RegisterID* base = generator.emitNode(m_base.get()); 389 generator.emitExpressionInfo(m_divot, m_startOffset, m_endOffset); 387 390 return generator.emitGetById(generator.finalDestination(dst), base, m_ident); 388 391 } … … 401 404 { 402 405 RegisterID* r0 = generator.emitNode(m_expr.get()); 406 generator.emitExpressionInfo(m_divot, m_startOffset, m_endOffset); 403 407 return generator.emitConstruct(generator.finalDestination(dst), r0, m_args.get()); 404 408 } … … 409 413 RegisterID* func = generator.newTemporary(); 410 414 generator.emitResolveWithBase(base.get(), func, generator.propertyNames().eval); 411 return generator.emitCallEval(generator.finalDestination(dst, base.get()), func, base.get(), m_args.get() );415 return generator.emitCallEval(generator.finalDestination(dst, base.get()), func, base.get(), m_args.get(), m_divot, m_startOffset, m_endOffset); 412 416 } 413 417 … … 415 419 { 416 420 RegisterID* func = generator.emitNode(m_expr.get()); 417 return generator.emitCall(generator.finalDestination(dst), func, 0, m_args.get() );421 return generator.emitCall(generator.finalDestination(dst), func, 0, m_args.get(), m_divot, m_startOffset, m_endOffset); 418 422 } 419 423 … … 421 425 { 422 426 if (RegisterID* local = generator.registerForLocal(m_ident)) 423 return generator.emitCall(generator.finalDestination(dst), local, 0, m_args.get() );427 return generator.emitCall(generator.finalDestination(dst), local, 0, m_args.get(), m_divot, m_startOffset, m_endOffset); 424 428 425 429 int index = 0; … … 427 431 if (generator.findScopedProperty(m_ident, index, depth) && index != missingSymbolMarker()) { 428 432 RegisterID* func = generator.emitGetScopedVar(generator.newTemporary(), depth, index); 429 return generator.emitCall(generator.finalDestination(dst), func, 0, m_args.get() );433 return generator.emitCall(generator.finalDestination(dst), func, 0, m_args.get(), m_divot, m_startOffset, m_endOffset); 430 434 } 431 435 432 436 RefPtr<RegisterID> base = generator.tempDestination(dst); 433 437 RegisterID* func = generator.newTemporary(); 438 int identifierStart = m_divot - m_startOffset; 439 generator.emitExpressionInfo(identifierStart + m_ident.size(), m_ident.size(), 0); 434 440 generator.emitResolveFunction(base.get(), func, m_ident); 435 return generator.emitCall(generator.finalDestination(dst, base.get()), func, base.get(), m_args.get() );441 return generator.emitCall(generator.finalDestination(dst, base.get()), func, base.get(), m_args.get(), m_divot, m_startOffset, m_endOffset); 436 442 } 437 443 … … 440 446 RefPtr<RegisterID> base = generator.emitNode(m_base.get()); 441 447 RegisterID* property = generator.emitNode(m_subscript.get()); 448 generator.emitExpressionInfo(m_divot - m_subexpressionDivotOffset, m_startOffset - m_subexpressionDivotOffset, m_subexpressionEndOffset); 442 449 RegisterID* function = generator.emitGetByVal(generator.newTemporary(), base.get(), property); 443 return generator.emitCall(generator.finalDestination(dst, base.get()), function, base.get(), m_args.get() );450 return generator.emitCall(generator.finalDestination(dst, base.get()), function, base.get(), m_args.get(), m_divot, m_startOffset, m_endOffset); 444 451 } 445 452 … … 447 454 { 448 455 RefPtr<RegisterID> base = generator.emitNode(m_base.get()); 456 generator.emitExpressionInfo(m_divot - m_subexpressionDivotOffset, m_startOffset - m_subexpressionDivotOffset, m_subexpressionEndOffset); 449 457 RegisterID* function = generator.emitGetById(generator.newTemporary(), base.get(), m_ident); 450 return generator.emitCall(generator.finalDestination(dst, base.get()), function, base.get(), m_args.get() );458 return generator.emitCall(generator.finalDestination(dst, base.get()), function, base.get(), m_args.get(), m_divot, m_startOffset, m_endOffset); 451 459 } 452 460 … … 492 500 } 493 501 502 generator.emitExpressionInfo(m_divot, m_startOffset, m_endOffset); 494 503 RefPtr<RegisterID> value = generator.newTemporary(); 495 504 RefPtr<RegisterID> base = generator.emitResolveWithBase(generator.newTemporary(), value.get(), m_ident); … … 511 520 RefPtr<RegisterID> base = generator.emitNode(m_base.get()); 512 521 RefPtr<RegisterID> property = generator.emitNode(m_subscript.get()); 522 523 generator.emitExpressionInfo(m_divot - m_subexpressionDivotOffset, m_startOffset - m_subexpressionDivotOffset, m_subexpressionEndOffset); 513 524 RefPtr<RegisterID> value = generator.emitGetByVal(generator.newTemporary(), base.get(), property.get()); 514 525 RegisterID* oldValue; … … 522 533 oldValue = (m_operator == OpPlusPlus) ? generator.emitPostInc(generator.finalDestination(dst), value.get()) : generator.emitPostDec(generator.finalDestination(dst), value.get()); 523 534 } 535 generator.emitExpressionInfo(m_divot, m_startOffset, m_endOffset); 524 536 generator.emitPutByVal(base.get(), property.get(), value.get()); 525 537 return oldValue; … … 531 543 { 532 544 RefPtr<RegisterID> base = generator.emitNode(m_base.get()); 545 546 generator.emitExpressionInfo(m_divot - m_subexpressionDivotOffset, m_startOffset - m_subexpressionDivotOffset, m_subexpressionEndOffset); 533 547 RefPtr<RegisterID> value = generator.emitGetById(generator.newTemporary(), base.get(), m_ident); 534 548 RegisterID* oldValue; … … 542 556 oldValue = (m_operator == OpPlusPlus) ? generator.emitPostInc(generator.finalDestination(dst), value.get()) : generator.emitPostDec(generator.finalDestination(dst), value.get()); 543 557 } 558 generator.emitExpressionInfo(m_divot, m_startOffset, m_endOffset); 544 559 generator.emitPutById(base.get(), m_ident, value.get()); 545 560 return oldValue; … … 560 575 return generator.emitLoad(generator.finalDestination(dst), false); 561 576 577 generator.emitExpressionInfo(m_divot, m_startOffset, m_endOffset); 562 578 RegisterID* base = generator.emitResolveBase(generator.tempDestination(dst), m_ident); 563 579 return generator.emitDeleteById(generator.finalDestination(dst, base), base, m_ident); … … 570 586 RefPtr<RegisterID> r0 = generator.emitNode(m_base.get()); 571 587 RefPtr<RegisterID> r1 = generator.emitNode(m_subscript.get()); 588 589 generator.emitExpressionInfo(m_divot, m_startOffset, m_endOffset); 572 590 return generator.emitDeleteByVal(generator.finalDestination(dst), r0.get(), r1.get()); 573 591 } … … 578 596 { 579 597 RegisterID* r0 = generator.emitNode(m_base.get()); 598 599 generator.emitExpressionInfo(m_divot, m_startOffset, m_endOffset); 580 600 return generator.emitDeleteById(generator.finalDestination(dst), r0, m_ident); 581 601 } … … 657 677 } 658 678 679 generator.emitExpressionInfo(m_divot, m_startOffset, m_endOffset); 659 680 RefPtr<RegisterID> propDst = generator.tempDestination(dst); 660 681 RefPtr<RegisterID> base = generator.emitResolveWithBase(generator.newTemporary(), propDst.get(), m_ident); … … 671 692 RefPtr<RegisterID> property = generator.emitNode(m_subscript.get()); 672 693 RefPtr<RegisterID> propDst = generator.tempDestination(dst); 694 695 generator.emitExpressionInfo(m_divot + m_subexpressionDivotOffset, m_subexpressionStartOffset, m_endOffset - m_subexpressionDivotOffset); 673 696 RegisterID* value = generator.emitGetByVal(propDst.get(), base.get(), property.get()); 674 697 if (m_operator == OpPlusPlus) … … 676 699 else 677 700 generator.emitPreDec(value); 701 generator.emitExpressionInfo(m_divot, m_startOffset, m_endOffset); 678 702 generator.emitPutByVal(base.get(), property.get(), value); 679 703 return generator.moveToDestinationIfNeeded(dst, propDst.get()); … … 686 710 RefPtr<RegisterID> base = generator.emitNode(m_base.get()); 687 711 RefPtr<RegisterID> propDst = generator.tempDestination(dst); 712 713 generator.emitExpressionInfo(m_divot + m_subexpressionDivotOffset, m_subexpressionStartOffset, m_endOffset - m_subexpressionDivotOffset); 688 714 RegisterID* value = generator.emitGetById(propDst.get(), base.get(), m_ident); 689 715 if (m_operator == OpPlusPlus) … … 691 717 else 692 718 generator.emitPreDec(value); 719 generator.emitExpressionInfo(m_divot, m_startOffset, m_endOffset); 693 720 generator.emitPutById(base.get(), m_ident, value); 694 721 return generator.moveToDestinationIfNeeded(dst, propDst.get()); … … 724 751 RegisterID* src2 = generator.emitNode(m_term2.get()); 725 752 return generator.emitBinaryOp(opcode(), generator.finalDestination(dst, src1.get()), src2, src1.get()); 753 } 754 755 RegisterID* ThrowableBinaryOpNode::emitCode(CodeGenerator& generator, RegisterID* dst) 756 { 757 RefPtr<RegisterID> src1 = generator.emitNodeForLeftHandSide(m_term1.get(), m_rightHasAssignments, m_term2->isPure(generator)); 758 RegisterID* src2 = generator.emitNode(m_term2.get()); 759 generator.emitExpressionInfo(m_divot, m_startOffset, m_endOffset); 760 return generator.emitBinaryOp(opcode(), generator.finalDestination(dst, src1.get()), src1.get(), src2); 726 761 } 727 762 … … 847 882 848 883 RefPtr<RegisterID> src1 = generator.tempDestination(dst); 884 generator.emitExpressionInfo(m_divot - m_startOffset + m_ident.size(), m_ident.size(), 0); 849 885 RefPtr<RegisterID> base = generator.emitResolveWithBase(generator.newTemporary(), src1.get(), m_ident); 850 886 RegisterID* src2 = generator.emitNode(m_right.get()); 887 generator.emitExpressionInfo(m_divot, m_startOffset, m_endOffset); 851 888 RegisterID* result = emitReadModifyAssignment(generator, generator.finalDestination(dst, src1.get()), src1.get(), src2, m_operator); 852 889 return generator.emitPutById(base.get(), m_ident, result); … … 879 916 dst = 0; 880 917 RegisterID* value = generator.emitNode(dst, m_right.get()); 918 generator.emitExpressionInfo(m_divot, m_startOffset, m_endOffset); 881 919 return generator.emitPutById(base.get(), m_ident, value); 882 920 } … … 889 927 RefPtr<RegisterID> value = generator.destinationForAssignResult(dst); 890 928 RegisterID* result = generator.emitNode(value.get(), m_right.get()); 929 generator.emitExpressionInfo(m_divot, m_startOffset, m_endOffset); 891 930 generator.emitPutById(base.get(), m_ident, result); 892 931 return generator.moveToDestinationIfNeeded(dst, result); … … 898 937 { 899 938 RefPtr<RegisterID> base = generator.emitNodeForLeftHandSide(m_base.get(), m_rightHasAssignments, m_right->isPure(generator)); 939 940 generator.emitExpressionInfo(m_divot - m_subexpressionDivotOffset, m_startOffset - m_subexpressionDivotOffset, m_subexpressionEndOffset); 900 941 RefPtr<RegisterID> value = generator.emitGetById(generator.tempDestination(dst), base.get(), m_ident); 901 942 RegisterID* change = generator.emitNode(m_right.get()); 902 943 RegisterID* updatedValue = emitReadModifyAssignment(generator, generator.finalDestination(dst, value.get()), value.get(), change, m_operator); 944 945 generator.emitExpressionInfo(m_divot, m_startOffset, m_endOffset); 903 946 return generator.emitPutById(base.get(), m_ident, updatedValue); 904 947 } … … 919 962 RefPtr<RegisterID> value = generator.destinationForAssignResult(dst); 920 963 RegisterID* result = generator.emitNode(value.get(), m_right.get()); 964 965 generator.emitExpressionInfo(m_divot, m_startOffset, m_endOffset); 921 966 generator.emitPutByVal(base.get(), property.get(), result); 922 967 return generator.moveToDestinationIfNeeded(dst, result); … … 928 973 RefPtr<RegisterID> property = generator.emitNodeForLeftHandSide(m_subscript.get(), m_rightHasAssignments, m_right->isPure(generator)); 929 974 975 generator.emitExpressionInfo(m_divot - m_subexpressionDivotOffset, m_startOffset - m_subexpressionDivotOffset, m_subexpressionEndOffset); 930 976 RefPtr<RegisterID> value = generator.emitGetByVal(generator.tempDestination(dst), base.get(), property.get()); 931 977 RegisterID* change = generator.emitNode(m_right.get()); 932 978 RegisterID* updatedValue = emitReadModifyAssignment(generator, generator.finalDestination(dst, value.get()), value.get(), change, m_operator); 933 979 980 generator.emitExpressionInfo(m_divot, m_startOffset, m_endOffset); 934 981 generator.emitPutByVal(base.get(), property.get(), updatedValue); 935 982 … … 1197 1244 } 1198 1245 1199 ForInNode::ForInNode(JSGlobalData* globalData, const Identifier& ident, ExpressionNode* in, ExpressionNode* expr, StatementNode* statement )1246 ForInNode::ForInNode(JSGlobalData* globalData, const Identifier& ident, ExpressionNode* in, ExpressionNode* expr, StatementNode* statement, int divot, int startOffset, int endOffset) 1200 1247 : StatementNode(globalData) 1201 1248 , m_ident(ident) 1202 , m_lexpr(new ResolveNode(globalData, ident ))1249 , m_lexpr(new ResolveNode(globalData, ident, divot - startOffset)) 1203 1250 , m_expr(expr) 1204 1251 , m_statement(statement) 1205 1252 , m_identIsVarDecl(true) 1206 1253 { 1207 if (in) 1208 m_init = new AssignResolveNode(globalData, ident, in, true); 1254 if (in) { 1255 AssignResolveNode* node = new AssignResolveNode(globalData, ident, in, true); 1256 node->setExceptionSourceRange(divot, divot - startOffset, endOffset - divot); 1257 m_init = node; 1258 } 1209 1259 // for( var foo = bar in baz ) 1210 1260 } … … 1230 1280 RefPtr<RegisterID> protect = propertyName; 1231 1281 RegisterID* base = generator.emitResolveBase(generator.newTemporary(), ident); 1282 1283 generator.emitExpressionInfo(m_divot, m_startOffset, m_endOffset); 1232 1284 generator.emitPutById(base, ident, propertyName); 1233 1285 } … … 1238 1290 RefPtr<RegisterID> protect = propertyName; 1239 1291 RegisterID* base = generator.emitNode(assignNode->base()); 1292 1293 generator.emitExpressionInfo(assignNode->divot(), assignNode->startOffset(), assignNode->endOffset()); 1240 1294 generator.emitPutById(base, ident, propertyName); 1241 1295 } else { … … 1246 1300 RefPtr<RegisterID> base = generator.emitNode(assignNode->base()); 1247 1301 RegisterID* subscript = generator.emitNode(assignNode->subscript()); 1302 1303 generator.emitExpressionInfo(assignNode->divot(), assignNode->startOffset(), assignNode->endOffset()); 1248 1304 generator.emitPutByVal(base.get(), subscript, propertyName); 1249 1305 } … … 1330 1386 { 1331 1387 RefPtr<RegisterID> scope = generator.emitNode(m_expr.get()); // scope must be protected until popped 1388 generator.emitExpressionInfo(m_divot, m_expressionLength, 0); 1332 1389 generator.emitPushScope(scope.get()); 1333 1390 RegisterID* result = generator.emitNode(dst, m_statement.get()); … … 1410 1467 if (generator.jumpContextForBreak(m_label)) 1411 1468 return emitThrowError(generator, SyntaxError, "Duplicated label %s found.", m_label); 1412 1469 1413 1470 RefPtr<LabelID> l0 = generator.newLabel(); 1414 1471 m_labelStack.push(m_label); … … 1428 1485 RegisterID* ThrowNode::emitCode(CodeGenerator& generator, RegisterID* dst) 1429 1486 { 1430 generator.emitThrow(generator.emitNode(dst, m_expr.get())); 1487 RefPtr<RegisterID> expr = generator.emitNode(dst, m_expr.get()); 1488 generator.emitExpressionInfo(m_divot, m_startOffset, m_endOffset); 1489 generator.emitThrow(expr.get()); 1431 1490 return dst; 1432 1491 } … … 1507 1566 // ------------------------------ ProgramNode ----------------------------- 1508 1567 1509 ProgramNode::ProgramNode(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, bool usesEval, bool needsClosure)1568 ProgramNode::ProgramNode(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, SourceProvider* sourceProvider, bool usesEval, bool needsClosure) 1510 1569 : ScopeNode(globalData, children, varStack, funcStack, usesEval, needsClosure) 1511 { 1512 } 1513 1514 ProgramNode* ProgramNode::create(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, bool usesEval, bool needsClosure) 1515 { 1516 return new ProgramNode(globalData, children, varStack, funcStack, usesEval, needsClosure); 1570 , m_sourceProvider(sourceProvider) 1571 { 1572 } 1573 1574 ProgramNode* ProgramNode::create(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, SourceProvider* sourceProvider, bool usesEval, bool needsClosure) 1575 { 1576 return new ProgramNode(globalData, children, varStack, funcStack, sourceProvider, usesEval, needsClosure); 1517 1577 } 1518 1578 1519 1579 // ------------------------------ EvalNode ----------------------------- 1520 1580 1521 EvalNode::EvalNode(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, bool usesEval, bool needsClosure)1581 EvalNode::EvalNode(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, SourceProvider* sourceProvider, bool usesEval, bool needsClosure) 1522 1582 : ScopeNode(globalData, children, varStack, funcStack, usesEval, needsClosure) 1583 , m_sourceProvider(sourceProvider) 1523 1584 { 1524 1585 } … … 1543 1604 1544 1605 SymbolTable symbolTable; 1545 1546 m_code.set(new EvalCodeBlock(this, globalObject ));1606 ASSERT(m_sourceProvider); 1607 m_code.set(new EvalCodeBlock(this, globalObject, m_sourceProvider)); 1547 1608 1548 1609 CodeGenerator generator(this, globalObject->debugger(), scopeChain, &symbolTable, m_code.get()); … … 1550 1611 } 1551 1612 1552 EvalNode* EvalNode::create(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, bool usesEval, bool needsClosure)1553 { 1554 return new EvalNode(globalData, children, varStack, funcStack, usesEval, needsClosure);1613 EvalNode* EvalNode::create(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, SourceProvider* sourceProvider, bool usesEval, bool needsClosure) 1614 { 1615 return new EvalNode(globalData, children, varStack, funcStack, sourceProvider, usesEval, needsClosure); 1555 1616 } 1556 1617 … … 1573 1634 } 1574 1635 1636 FunctionBodyNode* FunctionBodyNode::create(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, SourceProvider*, bool usesEval, bool needsClosure) 1637 { 1638 return new FunctionBodyNode(globalData, children, varStack, funcStack, usesEval, needsClosure); 1639 } 1640 1575 1641 void FunctionBodyNode::generateCode(ScopeChainNode* sc) 1576 1642 { … … 1578 1644 JSGlobalObject* globalObject = scopeChain.globalObject(); 1579 1645 1580 m_code.set(new CodeBlock(this, FunctionCode)); 1646 ASSERT(m_source.sourceProvider()); 1647 m_code.set(new CodeBlock(this, FunctionCode, m_source.sourceProvider(), m_source.startOffset())); 1581 1648 1582 1649 CodeGenerator generator(this, globalObject->debugger(), scopeChain, &m_symbolTable, m_code.get()); … … 1614 1681 JSGlobalObject* globalObject = scopeChain.globalObject(); 1615 1682 1616 m_code.set(new ProgramCodeBlock(this, GlobalCode, globalObject)); 1683 ASSERT(m_sourceProvider); 1684 m_code.set(new ProgramCodeBlock(this, GlobalCode, globalObject, m_sourceProvider)); 1617 1685 1618 1686 CodeGenerator generator(this, globalObject->debugger(), scopeChain, &globalObject->symbolTable(), m_code.get(), m_varStack, m_functionStack);
Note:
See TracChangeset
for help on using the changeset viewer.