| OLD | NEW |
| 1 // Copyright 2009 the V8 project authors. All rights reserved. | 1 // Copyright 2009 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 1630 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1641 // Call the IC initialization code. | 1641 // Call the IC initialization code. |
| 1642 InLoopFlag in_loop = (loop_depth() > 0) ? IN_LOOP : NOT_IN_LOOP; | 1642 InLoopFlag in_loop = (loop_depth() > 0) ? IN_LOOP : NOT_IN_LOOP; |
| 1643 Handle<Code> ic = CodeGenerator::ComputeCallInitialize(arg_count, in_loop); | 1643 Handle<Code> ic = CodeGenerator::ComputeCallInitialize(arg_count, in_loop); |
| 1644 __ Call(ic, mode); | 1644 __ Call(ic, mode); |
| 1645 // Restore context register. | 1645 // Restore context register. |
| 1646 __ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); | 1646 __ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); |
| 1647 Apply(context_, r0); | 1647 Apply(context_, r0); |
| 1648 } | 1648 } |
| 1649 | 1649 |
| 1650 | 1650 |
| 1651 void FullCodeGenerator::EmitKeyedCallWithIC(Call* expr, |
| 1652 Expression* key, |
| 1653 RelocInfo::Mode mode) { |
| 1654 // Code common for calls using the IC. |
| 1655 ZoneList<Expression*>* args = expr->arguments(); |
| 1656 int arg_count = args->length(); |
| 1657 for (int i = 0; i < arg_count; i++) { |
| 1658 VisitForValue(args->at(i), kStack); |
| 1659 } |
| 1660 VisitForValue(key, kAccumulator); |
| 1661 __ mov(r2, r0); |
| 1662 // Record source position for debugger. |
| 1663 SetSourcePosition(expr->position()); |
| 1664 // Call the IC initialization code. |
| 1665 InLoopFlag in_loop = (loop_depth() > 0) ? IN_LOOP : NOT_IN_LOOP; |
| 1666 Handle<Code> ic = CodeGenerator::ComputeKeyedCallInitialize(arg_count, |
| 1667 in_loop); |
| 1668 __ Call(ic, mode); |
| 1669 // Restore context register. |
| 1670 __ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); |
| 1671 Apply(context_, r0); |
| 1672 } |
| 1673 |
| 1674 |
| 1651 void FullCodeGenerator::EmitCallWithStub(Call* expr) { | 1675 void FullCodeGenerator::EmitCallWithStub(Call* expr) { |
| 1652 // Code common for calls using the call stub. | 1676 // Code common for calls using the call stub. |
| 1653 ZoneList<Expression*>* args = expr->arguments(); | 1677 ZoneList<Expression*>* args = expr->arguments(); |
| 1654 int arg_count = args->length(); | 1678 int arg_count = args->length(); |
| 1655 for (int i = 0; i < arg_count; i++) { | 1679 for (int i = 0; i < arg_count; i++) { |
| 1656 VisitForValue(args->at(i), kStack); | 1680 VisitForValue(args->at(i), kStack); |
| 1657 } | 1681 } |
| 1658 // Record source position for debugger. | 1682 // Record source position for debugger. |
| 1659 SetSourcePosition(expr->position()); | 1683 SetSourcePosition(expr->position()); |
| 1660 InLoopFlag in_loop = (loop_depth() > 0) ? IN_LOOP : NOT_IN_LOOP; | 1684 InLoopFlag in_loop = (loop_depth() > 0) ? IN_LOOP : NOT_IN_LOOP; |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1736 EmitCallWithStub(expr); | 1760 EmitCallWithStub(expr); |
| 1737 } else if (fun->AsProperty() != NULL) { | 1761 } else if (fun->AsProperty() != NULL) { |
| 1738 // Call to an object property. | 1762 // Call to an object property. |
| 1739 Property* prop = fun->AsProperty(); | 1763 Property* prop = fun->AsProperty(); |
| 1740 Literal* key = prop->key()->AsLiteral(); | 1764 Literal* key = prop->key()->AsLiteral(); |
| 1741 if (key != NULL && key->handle()->IsSymbol()) { | 1765 if (key != NULL && key->handle()->IsSymbol()) { |
| 1742 // Call to a named property, use call IC. | 1766 // Call to a named property, use call IC. |
| 1743 VisitForValue(prop->obj(), kStack); | 1767 VisitForValue(prop->obj(), kStack); |
| 1744 EmitCallWithIC(expr, key->handle(), RelocInfo::CODE_TARGET); | 1768 EmitCallWithIC(expr, key->handle(), RelocInfo::CODE_TARGET); |
| 1745 } else { | 1769 } else { |
| 1746 // Call to a keyed property, use keyed load IC followed by function | 1770 // Call to a keyed property. |
| 1747 // call. | 1771 // For a synthetic property use keyed load IC followed by function call, |
| 1772 // for a regular property use keyed CallIC. |
| 1748 VisitForValue(prop->obj(), kStack); | 1773 VisitForValue(prop->obj(), kStack); |
| 1749 VisitForValue(prop->key(), kAccumulator); | |
| 1750 // Record source code position for IC call. | |
| 1751 SetSourcePosition(prop->position()); | |
| 1752 if (prop->is_synthetic()) { | 1774 if (prop->is_synthetic()) { |
| 1775 VisitForValue(prop->key(), kAccumulator); |
| 1776 // Record source code position for IC call. |
| 1777 SetSourcePosition(prop->position()); |
| 1753 __ pop(r1); // We do not need to keep the receiver. | 1778 __ pop(r1); // We do not need to keep the receiver. |
| 1754 } else { | |
| 1755 __ ldr(r1, MemOperand(sp, 0)); // Keep receiver, to call function on. | |
| 1756 } | |
| 1757 | 1779 |
| 1758 Handle<Code> ic(Builtins::builtin(Builtins::KeyedLoadIC_Initialize)); | 1780 Handle<Code> ic(Builtins::builtin(Builtins::KeyedLoadIC_Initialize)); |
| 1759 __ Call(ic, RelocInfo::CODE_TARGET); | 1781 __ Call(ic, RelocInfo::CODE_TARGET); |
| 1760 if (prop->is_synthetic()) { | |
| 1761 // Push result (function). | 1782 // Push result (function). |
| 1762 __ push(r0); | 1783 __ push(r0); |
| 1763 // Push Global receiver. | 1784 // Push Global receiver. |
| 1764 __ ldr(r1, CodeGenerator::GlobalObject()); | 1785 __ ldr(r1, CodeGenerator::GlobalObject()); |
| 1765 __ ldr(r1, FieldMemOperand(r1, GlobalObject::kGlobalReceiverOffset)); | 1786 __ ldr(r1, FieldMemOperand(r1, GlobalObject::kGlobalReceiverOffset)); |
| 1766 __ push(r1); | 1787 __ push(r1); |
| 1788 EmitCallWithStub(expr); |
| 1767 } else { | 1789 } else { |
| 1768 // Pop receiver. | 1790 EmitKeyedCallWithIC(expr, prop->key(), RelocInfo::CODE_TARGET); |
| 1769 __ pop(r1); | |
| 1770 // Push result (function). | |
| 1771 __ push(r0); | |
| 1772 __ push(r1); | |
| 1773 } | 1791 } |
| 1774 EmitCallWithStub(expr); | |
| 1775 } | 1792 } |
| 1776 } else { | 1793 } else { |
| 1777 // Call to some other expression. If the expression is an anonymous | 1794 // Call to some other expression. If the expression is an anonymous |
| 1778 // function literal not called in a loop, mark it as one that should | 1795 // function literal not called in a loop, mark it as one that should |
| 1779 // also use the fast code generator. | 1796 // also use the fast code generator. |
| 1780 FunctionLiteral* lit = fun->AsFunctionLiteral(); | 1797 FunctionLiteral* lit = fun->AsFunctionLiteral(); |
| 1781 if (lit != NULL && | 1798 if (lit != NULL && |
| 1782 lit->name()->Equals(Heap::empty_string()) && | 1799 lit->name()->Equals(Heap::empty_string()) && |
| 1783 loop_depth() == 0) { | 1800 loop_depth() == 0) { |
| 1784 lit->set_try_full_codegen(true); | 1801 lit->set_try_full_codegen(true); |
| (...skipping 1350 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3135 __ mov(r1, Operand(r1, ASR, 1)); // Un-smi-tag value. | 3152 __ mov(r1, Operand(r1, ASR, 1)); // Un-smi-tag value. |
| 3136 __ add(pc, r1, Operand(masm_->CodeObject())); | 3153 __ add(pc, r1, Operand(masm_->CodeObject())); |
| 3137 } | 3154 } |
| 3138 | 3155 |
| 3139 | 3156 |
| 3140 #undef __ | 3157 #undef __ |
| 3141 | 3158 |
| 3142 } } // namespace v8::internal | 3159 } } // namespace v8::internal |
| 3143 | 3160 |
| 3144 #endif // V8_TARGET_ARCH_ARM | 3161 #endif // V8_TARGET_ARCH_ARM |
| OLD | NEW |