OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 1999-2002 Harri Porten (porten@kde.org) | 2 * Copyright (C) 1999-2002 Harri Porten (porten@kde.org) |
3 * Copyright (C) 2001 Peter Kelly (pmk@post.com) | 3 * Copyright (C) 2001 Peter Kelly (pmk@post.com) |
4 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserv
ed. | 4 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserv
ed. |
5 * Copyright (C) 2007 Cameron Zwarich (cwzwarich@uwaterloo.ca) | 5 * Copyright (C) 2007 Cameron Zwarich (cwzwarich@uwaterloo.ca) |
6 * Copyright (C) 2007 Maks Orlovich | 6 * Copyright (C) 2007 Maks Orlovich |
7 * Copyright (C) 2007 Eric Seidel <eric@webkit.org> | 7 * Copyright (C) 2007 Eric Seidel <eric@webkit.org> |
8 * | 8 * |
9 * This library is free software; you can redistribute it and/or | 9 * This library is free software; you can redistribute it and/or |
10 * modify it under the terms of the GNU Library General Public | 10 * modify it under the terms of the GNU Library General Public |
(...skipping 567 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
578 NodeReleaser::releaseAllNodes(this); | 578 NodeReleaser::releaseAllNodes(this); |
579 } | 579 } |
580 | 580 |
581 void EvalFunctionCallNode::releaseNodes(NodeReleaser& releaser) | 581 void EvalFunctionCallNode::releaseNodes(NodeReleaser& releaser) |
582 { | 582 { |
583 releaser.release(m_args); | 583 releaser.release(m_args); |
584 } | 584 } |
585 | 585 |
586 RegisterID* EvalFunctionCallNode::emitCode(CodeGenerator& generator, RegisterID*
dst) | 586 RegisterID* EvalFunctionCallNode::emitCode(CodeGenerator& generator, RegisterID*
dst) |
587 { | 587 { |
588 RefPtr<RegisterID> base = generator.tempDestination(dst); | 588 RefPtr<RegisterID> func = generator.tempDestination(dst); |
589 RefPtr<RegisterID> func = generator.newTemporary(); | 589 RefPtr<RegisterID> thisRegister = generator.newTemporary(); |
590 generator.emitResolveWithBase(base.get(), func.get(), generator.propertyName
s().eval); | 590 generator.emitResolveWithBase(thisRegister.get(), func.get(), generator.prop
ertyNames().eval); |
591 return generator.emitCallEval(generator.finalDestination(dst, base.get()), f
unc.get(), base.get(), m_args.get(), divot(), startOffset(), endOffset()); | 591 return generator.emitCallEval(generator.finalDestination(dst, func.get()), f
unc.get(), thisRegister.get(), m_args.get(), divot(), startOffset(), endOffset()
); |
592 } | 592 } |
593 | 593 |
594 // ------------------------------ FunctionCallValueNode ------------------------
---------- | 594 // ------------------------------ FunctionCallValueNode ------------------------
---------- |
595 | 595 |
596 FunctionCallValueNode::~FunctionCallValueNode() | 596 FunctionCallValueNode::~FunctionCallValueNode() |
597 { | 597 { |
598 NodeReleaser::releaseAllNodes(this); | 598 NodeReleaser::releaseAllNodes(this); |
599 } | 599 } |
600 | 600 |
601 void FunctionCallValueNode::releaseNodes(NodeReleaser& releaser) | 601 void FunctionCallValueNode::releaseNodes(NodeReleaser& releaser) |
602 { | 602 { |
603 releaser.release(m_expr); | 603 releaser.release(m_expr); |
604 releaser.release(m_args); | 604 releaser.release(m_args); |
605 } | 605 } |
606 | 606 |
607 RegisterID* FunctionCallValueNode::emitCode(CodeGenerator& generator, RegisterID
* dst) | 607 RegisterID* FunctionCallValueNode::emitCode(CodeGenerator& generator, RegisterID
* dst) |
608 { | 608 { |
609 RefPtr<RegisterID> func = generator.emitNode(m_expr.get()); | 609 RefPtr<RegisterID> func = generator.emitNode(m_expr.get()); |
610 return generator.emitCall(generator.finalDestination(dst), func.get(), 0, m_
args.get(), divot(), startOffset(), endOffset()); | 610 RefPtr<RegisterID> thisRegister = generator.emitLoad(generator.newTemporary(
), jsNull()); |
| 611 return generator.emitCall(generator.finalDestination(dst, func.get()), func.
get(), thisRegister.get(), m_args.get(), divot(), startOffset(), endOffset()); |
611 } | 612 } |
612 | 613 |
613 // ------------------------------ FunctionCallResolveNode ----------------------
------------ | 614 // ------------------------------ FunctionCallResolveNode ----------------------
------------ |
614 | 615 |
615 FunctionCallResolveNode::~FunctionCallResolveNode() | 616 FunctionCallResolveNode::~FunctionCallResolveNode() |
616 { | 617 { |
617 NodeReleaser::releaseAllNodes(this); | 618 NodeReleaser::releaseAllNodes(this); |
618 } | 619 } |
619 | 620 |
620 void FunctionCallResolveNode::releaseNodes(NodeReleaser& releaser) | 621 void FunctionCallResolveNode::releaseNodes(NodeReleaser& releaser) |
621 { | 622 { |
622 releaser.release(m_args); | 623 releaser.release(m_args); |
623 } | 624 } |
624 | 625 |
625 RegisterID* FunctionCallResolveNode::emitCode(CodeGenerator& generator, Register
ID* dst) | 626 RegisterID* FunctionCallResolveNode::emitCode(CodeGenerator& generator, Register
ID* dst) |
626 { | 627 { |
627 if (RefPtr<RegisterID> local = generator.registerFor(m_ident)) | 628 if (RefPtr<RegisterID> local = generator.registerFor(m_ident)) { |
628 return generator.emitCall(generator.finalDestination(dst), local.get(),
0, m_args.get(), divot(), startOffset(), endOffset()); | 629 RefPtr<RegisterID> thisRegister = generator.emitLoad(generator.newTempor
ary(), jsNull()); |
| 630 return generator.emitCall(generator.finalDestination(dst, thisRegister.g
et()), local.get(), thisRegister.get(), m_args.get(), divot(), startOffset(), en
dOffset()); |
| 631 } |
629 | 632 |
630 int index = 0; | 633 int index = 0; |
631 size_t depth = 0; | 634 size_t depth = 0; |
632 JSObject* globalObject = 0; | 635 JSObject* globalObject = 0; |
633 if (generator.findScopedProperty(m_ident, index, depth, false, globalObject)
&& index != missingSymbolMarker()) { | 636 if (generator.findScopedProperty(m_ident, index, depth, false, globalObject)
&& index != missingSymbolMarker()) { |
634 RefPtr<RegisterID> func = generator.emitGetScopedVar(generator.newTempor
ary(), depth, index, globalObject); | 637 RefPtr<RegisterID> func = generator.emitGetScopedVar(generator.newTempor
ary(), depth, index, globalObject); |
635 return generator.emitCall(generator.finalDestination(dst), func.get(), 0
, m_args.get(), divot(), startOffset(), endOffset()); | 638 RefPtr<RegisterID> thisRegister = generator.emitLoad(generator.newTempor
ary(), jsNull()); |
| 639 return generator.emitCall(generator.finalDestination(dst, func.get()), f
unc.get(), thisRegister.get(), m_args.get(), divot(), startOffset(), endOffset()
); |
636 } | 640 } |
637 | 641 |
638 RefPtr<RegisterID> base = generator.tempDestination(dst); | 642 RefPtr<RegisterID> func = generator.tempDestination(dst); |
639 RefPtr<RegisterID> func = generator.newTemporary(); | 643 RefPtr<RegisterID> thisRegister = generator.newTemporary(); |
640 int identifierStart = divot() - startOffset(); | 644 int identifierStart = divot() - startOffset(); |
641 generator.emitExpressionInfo(identifierStart + m_ident.size(), m_ident.size(
), 0); | 645 generator.emitExpressionInfo(identifierStart + m_ident.size(), m_ident.size(
), 0); |
642 generator.emitResolveFunction(base.get(), func.get(), m_ident); | 646 generator.emitResolveFunction(thisRegister.get(), func.get(), m_ident); |
643 return generator.emitCall(generator.finalDestination(dst, base.get()), func.
get(), base.get(), m_args.get(), divot(), startOffset(), endOffset()); | 647 return generator.emitCall(generator.finalDestination(dst, func.get()), func.
get(), thisRegister.get(), m_args.get(), divot(), startOffset(), endOffset()); |
644 } | 648 } |
645 | 649 |
646 // ------------------------------ FunctionCallBracketNode ----------------------
------------ | 650 // ------------------------------ FunctionCallBracketNode ----------------------
------------ |
647 | 651 |
648 FunctionCallBracketNode::~FunctionCallBracketNode() | 652 FunctionCallBracketNode::~FunctionCallBracketNode() |
649 { | 653 { |
650 NodeReleaser::releaseAllNodes(this); | 654 NodeReleaser::releaseAllNodes(this); |
651 } | 655 } |
652 | 656 |
653 void FunctionCallBracketNode::releaseNodes(NodeReleaser& releaser) | 657 void FunctionCallBracketNode::releaseNodes(NodeReleaser& releaser) |
654 { | 658 { |
655 releaser.release(m_base); | 659 releaser.release(m_base); |
656 releaser.release(m_subscript); | 660 releaser.release(m_subscript); |
657 releaser.release(m_args); | 661 releaser.release(m_args); |
658 } | 662 } |
659 | 663 |
660 RegisterID* FunctionCallBracketNode::emitCode(CodeGenerator& generator, Register
ID* dst) | 664 RegisterID* FunctionCallBracketNode::emitCode(CodeGenerator& generator, Register
ID* dst) |
661 { | 665 { |
662 RefPtr<RegisterID> base = generator.emitNode(m_base.get()); | 666 RefPtr<RegisterID> base = generator.emitNode(m_base.get()); |
663 RegisterID* property = generator.emitNode(m_subscript.get()); | 667 RegisterID* property = generator.emitNode(m_subscript.get()); |
664 generator.emitExpressionInfo(divot() - m_subexpressionDivotOffset, startOffs
et() - m_subexpressionDivotOffset, m_subexpressionEndOffset); | 668 generator.emitExpressionInfo(divot() - m_subexpressionDivotOffset, startOffs
et() - m_subexpressionDivotOffset, m_subexpressionEndOffset); |
665 RefPtr<RegisterID> function = generator.emitGetByVal(generator.newTemporary(
), base.get(), property); | 669 RefPtr<RegisterID> function = generator.emitGetByVal(generator.tempDestinati
on(dst), base.get(), property); |
666 return generator.emitCall(generator.finalDestination(dst, base.get()), funct
ion.get(), base.get(), m_args.get(), divot(), startOffset(), endOffset()); | 670 RefPtr<RegisterID> thisRegister = generator.emitMove(generator.newTemporary(
), base.get()); |
| 671 return generator.emitCall(generator.finalDestination(dst, function.get()), f
unction.get(), thisRegister.get(), m_args.get(), divot(), startOffset(), endOffs
et()); |
667 } | 672 } |
668 | 673 |
669 // ------------------------------ FunctionCallDotNode --------------------------
-------- | 674 // ------------------------------ FunctionCallDotNode --------------------------
-------- |
670 | 675 |
671 FunctionCallDotNode::~FunctionCallDotNode() | 676 FunctionCallDotNode::~FunctionCallDotNode() |
672 { | 677 { |
673 NodeReleaser::releaseAllNodes(this); | 678 NodeReleaser::releaseAllNodes(this); |
674 } | 679 } |
675 | 680 |
676 void FunctionCallDotNode::releaseNodes(NodeReleaser& releaser) | 681 void FunctionCallDotNode::releaseNodes(NodeReleaser& releaser) |
677 { | 682 { |
678 releaser.release(m_base); | 683 releaser.release(m_base); |
679 releaser.release(m_args); | 684 releaser.release(m_args); |
680 } | 685 } |
681 | 686 |
682 RegisterID* FunctionCallDotNode::emitCode(CodeGenerator& generator, RegisterID*
dst) | 687 RegisterID* FunctionCallDotNode::emitCode(CodeGenerator& generator, RegisterID*
dst) |
683 { | 688 { |
684 RefPtr<RegisterID> base = generator.emitNode(m_base.get()); | 689 RefPtr<RegisterID> base = generator.emitNode(m_base.get()); |
685 generator.emitExpressionInfo(divot() - m_subexpressionDivotOffset, startOffs
et() - m_subexpressionDivotOffset, m_subexpressionEndOffset); | 690 generator.emitExpressionInfo(divot() - m_subexpressionDivotOffset, startOffs
et() - m_subexpressionDivotOffset, m_subexpressionEndOffset); |
686 RefPtr<RegisterID> function = generator.emitGetById(generator.newTemporary()
, base.get(), m_ident); | 691 RefPtr<RegisterID> function = generator.emitGetById(generator.tempDestinatio
n(dst), base.get(), m_ident); |
687 return generator.emitCall(generator.finalDestination(dst, base.get()), funct
ion.get(), base.get(), m_args.get(), divot(), startOffset(), endOffset()); | 692 RefPtr<RegisterID> thisRegister = generator.emitMove(generator.newTemporary(
), base.get()); |
| 693 return generator.emitCall(generator.finalDestination(dst, function.get()), f
unction.get(), thisRegister.get(), m_args.get(), divot(), startOffset(), endOffs
et()); |
688 } | 694 } |
689 | 695 |
690 // ------------------------------ PostfixResolveNode ---------------------------
------- | 696 // ------------------------------ PostfixResolveNode ---------------------------
------- |
691 | 697 |
692 static RegisterID* emitPreIncOrDec(CodeGenerator& generator, RegisterID* srcDst,
Operator oper) | 698 static RegisterID* emitPreIncOrDec(CodeGenerator& generator, RegisterID* srcDst,
Operator oper) |
693 { | 699 { |
694 return (oper == OpPlusPlus) ? generator.emitPreInc(srcDst) : generator.emitP
reDec(srcDst); | 700 return (oper == OpPlusPlus) ? generator.emitPreInc(srcDst) : generator.emitP
reDec(srcDst); |
695 } | 701 } |
696 | 702 |
697 static RegisterID* emitPostIncOrDec(CodeGenerator& generator, RegisterID* dst, R
egisterID* srcDst, Operator oper) | 703 static RegisterID* emitPostIncOrDec(CodeGenerator& generator, RegisterID* dst, R
egisterID* srcDst, Operator oper) |
(...skipping 1910 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2608 | 2614 |
2609 if (!m_ident.isNull()) { | 2615 if (!m_ident.isNull()) { |
2610 JSStaticScopeObject* functionScopeObject = new (exec) JSStaticScopeObjec
t(exec, m_ident, func, ReadOnly | DontDelete); | 2616 JSStaticScopeObject* functionScopeObject = new (exec) JSStaticScopeObjec
t(exec, m_ident, func, ReadOnly | DontDelete); |
2611 func->scope().push(functionScopeObject); | 2617 func->scope().push(functionScopeObject); |
2612 } | 2618 } |
2613 | 2619 |
2614 return func; | 2620 return func; |
2615 } | 2621 } |
2616 | 2622 |
2617 } // namespace JSC | 2623 } // namespace JSC |
OLD | NEW |