| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 1970 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1981 if (key != NULL && key->handle()->IsSymbol()) { | 1981 if (key != NULL && key->handle()->IsSymbol()) { |
| 1982 // Call to a named property, use call IC. | 1982 // Call to a named property, use call IC. |
| 1983 { PreservePositionScope scope(masm()->positions_recorder()); | 1983 { PreservePositionScope scope(masm()->positions_recorder()); |
| 1984 VisitForStackValue(prop->obj()); | 1984 VisitForStackValue(prop->obj()); |
| 1985 } | 1985 } |
| 1986 EmitCallWithIC(expr, key->handle(), RelocInfo::CODE_TARGET); | 1986 EmitCallWithIC(expr, key->handle(), RelocInfo::CODE_TARGET); |
| 1987 } else { | 1987 } else { |
| 1988 // Call to a keyed property. | 1988 // Call to a keyed property. |
| 1989 // For a synthetic property use keyed load IC followed by function call, | 1989 // For a synthetic property use keyed load IC followed by function call, |
| 1990 // for a regular property use keyed CallIC. | 1990 // for a regular property use keyed CallIC. |
| 1991 { PreservePositionScope scope(masm()->positions_recorder()); | |
| 1992 VisitForStackValue(prop->obj()); | |
| 1993 } | |
| 1994 if (prop->is_synthetic()) { | 1991 if (prop->is_synthetic()) { |
| 1995 { PreservePositionScope scope(masm()->positions_recorder()); | 1992 // Do not visit the object and key subexpressions (they are shared |
| 1996 VisitForAccumulatorValue(prop->key()); | 1993 // by all occurrences of the same rewritten parameter). |
| 1997 } | 1994 ASSERT(prop->obj()->AsVariableProxy() != NULL); |
| 1995 ASSERT(prop->obj()->AsVariableProxy()->var()->AsSlot() != NULL); |
| 1996 Slot* slot = prop->obj()->AsVariableProxy()->var()->AsSlot(); |
| 1997 MemOperand operand = EmitSlotSearch(slot, r1); |
| 1998 __ ldr(r1, operand); |
| 1999 |
| 2000 ASSERT(prop->key()->AsLiteral() != NULL); |
| 2001 ASSERT(prop->key()->AsLiteral()->handle()->IsSmi()); |
| 2002 __ mov(r0, Operand(prop->key()->AsLiteral()->handle())); |
| 2003 |
| 1998 // Record source code position for IC call. | 2004 // Record source code position for IC call. |
| 1999 SetSourcePosition(prop->position()); | 2005 SetSourcePosition(prop->position()); |
| 2000 __ pop(r1); // We do not need to keep the receiver. | |
| 2001 | 2006 |
| 2002 Handle<Code> ic(Builtins::builtin(Builtins::KeyedLoadIC_Initialize)); | 2007 Handle<Code> ic(Builtins::builtin(Builtins::KeyedLoadIC_Initialize)); |
| 2003 EmitCallIC(ic, RelocInfo::CODE_TARGET); | 2008 EmitCallIC(ic, RelocInfo::CODE_TARGET); |
| 2004 __ ldr(r1, GlobalObjectOperand()); | 2009 __ ldr(r1, GlobalObjectOperand()); |
| 2005 __ ldr(r1, FieldMemOperand(r1, GlobalObject::kGlobalReceiverOffset)); | 2010 __ ldr(r1, FieldMemOperand(r1, GlobalObject::kGlobalReceiverOffset)); |
| 2006 __ Push(r0, r1); // Function, receiver. | 2011 __ Push(r0, r1); // Function, receiver. |
| 2007 EmitCallWithStub(expr); | 2012 EmitCallWithStub(expr); |
| 2008 } else { | 2013 } else { |
| 2014 { PreservePositionScope scope(masm()->positions_recorder()); |
| 2015 VisitForStackValue(prop->obj()); |
| 2016 } |
| 2009 EmitKeyedCallWithIC(expr, prop->key(), RelocInfo::CODE_TARGET); | 2017 EmitKeyedCallWithIC(expr, prop->key(), RelocInfo::CODE_TARGET); |
| 2010 } | 2018 } |
| 2011 } | 2019 } |
| 2012 } else { | 2020 } else { |
| 2013 // Call to some other expression. If the expression is an anonymous | 2021 // Call to some other expression. If the expression is an anonymous |
| 2014 // function literal not called in a loop, mark it as one that should | 2022 // function literal not called in a loop, mark it as one that should |
| 2015 // also use the fast code generator. | 2023 // also use the fast code generator. |
| 2016 FunctionLiteral* lit = fun->AsFunctionLiteral(); | 2024 FunctionLiteral* lit = fun->AsFunctionLiteral(); |
| 2017 if (lit != NULL && | 2025 if (lit != NULL && |
| 2018 lit->name()->Equals(Heap::empty_string()) && | 2026 lit->name()->Equals(Heap::empty_string()) && |
| (...skipping 1586 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3605 __ mov(r1, Operand(r1, ASR, 1)); // Un-smi-tag value. | 3613 __ mov(r1, Operand(r1, ASR, 1)); // Un-smi-tag value. |
| 3606 __ add(pc, r1, Operand(masm_->CodeObject())); | 3614 __ add(pc, r1, Operand(masm_->CodeObject())); |
| 3607 } | 3615 } |
| 3608 | 3616 |
| 3609 | 3617 |
| 3610 #undef __ | 3618 #undef __ |
| 3611 | 3619 |
| 3612 } } // namespace v8::internal | 3620 } } // namespace v8::internal |
| 3613 | 3621 |
| 3614 #endif // V8_TARGET_ARCH_ARM | 3622 #endif // V8_TARGET_ARCH_ARM |
| OLD | NEW |