| 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 2097 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2108 ZoneList<Expression*>* args = expr->arguments(); | 2108 ZoneList<Expression*>* args = expr->arguments(); |
| 2109 int arg_count = args->length(); | 2109 int arg_count = args->length(); |
| 2110 { PreservePositionScope scope(masm()->positions_recorder()); | 2110 { PreservePositionScope scope(masm()->positions_recorder()); |
| 2111 for (int i = 0; i < arg_count; i++) { | 2111 for (int i = 0; i < arg_count; i++) { |
| 2112 VisitForStackValue(args->at(i)); | 2112 VisitForStackValue(args->at(i)); |
| 2113 } | 2113 } |
| 2114 } | 2114 } |
| 2115 // Record source position for debugger. | 2115 // Record source position for debugger. |
| 2116 SetSourcePosition(expr->position()); | 2116 SetSourcePosition(expr->position()); |
| 2117 CallFunctionStub stub(arg_count, flags); | 2117 CallFunctionStub stub(arg_count, flags); |
| 2118 __ ldr(r1, MemOperand(sp, (arg_count + 1) * kPointerSize)); |
| 2118 __ CallStub(&stub); | 2119 __ CallStub(&stub); |
| 2119 RecordJSReturnSite(expr); | 2120 RecordJSReturnSite(expr); |
| 2120 // Restore context register. | 2121 // Restore context register. |
| 2121 __ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); | 2122 __ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); |
| 2122 context()->DropAndPlug(1, r0); | 2123 context()->DropAndPlug(1, r0); |
| 2123 } | 2124 } |
| 2124 | 2125 |
| 2125 | 2126 |
| 2126 void FullCodeGenerator::EmitResolvePossiblyDirectEval(ResolveEvalFlag flag, | 2127 void FullCodeGenerator::EmitResolvePossiblyDirectEval(ResolveEvalFlag flag, |
| 2127 int arg_count) { | 2128 int arg_count) { |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2205 | 2206 |
| 2206 // The runtime call returns a pair of values in r0 (function) and | 2207 // The runtime call returns a pair of values in r0 (function) and |
| 2207 // r1 (receiver). Touch up the stack with the right values. | 2208 // r1 (receiver). Touch up the stack with the right values. |
| 2208 __ str(r0, MemOperand(sp, (arg_count + 1) * kPointerSize)); | 2209 __ str(r0, MemOperand(sp, (arg_count + 1) * kPointerSize)); |
| 2209 __ str(r1, MemOperand(sp, arg_count * kPointerSize)); | 2210 __ str(r1, MemOperand(sp, arg_count * kPointerSize)); |
| 2210 } | 2211 } |
| 2211 | 2212 |
| 2212 // Record source position for debugger. | 2213 // Record source position for debugger. |
| 2213 SetSourcePosition(expr->position()); | 2214 SetSourcePosition(expr->position()); |
| 2214 CallFunctionStub stub(arg_count, RECEIVER_MIGHT_BE_IMPLICIT); | 2215 CallFunctionStub stub(arg_count, RECEIVER_MIGHT_BE_IMPLICIT); |
| 2216 __ ldr(r1, MemOperand(sp, (arg_count + 1) * kPointerSize)); |
| 2215 __ CallStub(&stub); | 2217 __ CallStub(&stub); |
| 2216 RecordJSReturnSite(expr); | 2218 RecordJSReturnSite(expr); |
| 2217 // Restore context register. | 2219 // Restore context register. |
| 2218 __ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); | 2220 __ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); |
| 2219 context()->DropAndPlug(1, r0); | 2221 context()->DropAndPlug(1, r0); |
| 2220 } else if (proxy != NULL && proxy->var()->IsUnallocated()) { | 2222 } else if (proxy != NULL && proxy->var()->IsUnallocated()) { |
| 2221 // Push global object as receiver for the call IC. | 2223 // Push global object as receiver for the call IC. |
| 2222 __ ldr(r0, GlobalObjectOperand()); | 2224 __ ldr(r0, GlobalObjectOperand()); |
| 2223 __ push(r0); | 2225 __ push(r0); |
| 2224 EmitCallWithIC(expr, proxy->name(), RelocInfo::CODE_TARGET_CONTEXT); | 2226 EmitCallWithIC(expr, proxy->name(), RelocInfo::CODE_TARGET_CONTEXT); |
| (...skipping 865 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3090 | 3092 |
| 3091 void FullCodeGenerator::EmitCallFunction(ZoneList<Expression*>* args) { | 3093 void FullCodeGenerator::EmitCallFunction(ZoneList<Expression*>* args) { |
| 3092 ASSERT(args->length() >= 2); | 3094 ASSERT(args->length() >= 2); |
| 3093 | 3095 |
| 3094 int arg_count = args->length() - 2; // 2 ~ receiver and function. | 3096 int arg_count = args->length() - 2; // 2 ~ receiver and function. |
| 3095 for (int i = 0; i < arg_count + 1; i++) { | 3097 for (int i = 0; i < arg_count + 1; i++) { |
| 3096 VisitForStackValue(args->at(i)); | 3098 VisitForStackValue(args->at(i)); |
| 3097 } | 3099 } |
| 3098 VisitForAccumulatorValue(args->last()); // Function. | 3100 VisitForAccumulatorValue(args->last()); // Function. |
| 3099 | 3101 |
| 3102 // Check for proxy. |
| 3103 Label proxy, done; |
| 3104 __ CompareObjectType(r0, r1, r1, JS_FUNCTION_PROXY_TYPE); |
| 3105 __ b(eq, &proxy); |
| 3106 |
| 3100 // InvokeFunction requires the function in r1. Move it in there. | 3107 // InvokeFunction requires the function in r1. Move it in there. |
| 3101 __ mov(r1, result_register()); | 3108 __ mov(r1, result_register()); |
| 3102 ParameterCount count(arg_count); | 3109 ParameterCount count(arg_count); |
| 3103 __ InvokeFunction(r1, count, CALL_FUNCTION, | 3110 __ InvokeFunction(r1, count, CALL_FUNCTION, |
| 3104 NullCallWrapper(), CALL_AS_METHOD); | 3111 NullCallWrapper(), CALL_AS_METHOD); |
| 3105 __ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); | 3112 __ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); |
| 3113 __ jmp(&done); |
| 3114 |
| 3115 __ bind(&proxy); |
| 3116 __ push(r0); |
| 3117 __ CallRuntime(Runtime::kCall, args->length()); |
| 3118 __ bind(&done); |
| 3119 |
| 3106 context()->Plug(r0); | 3120 context()->Plug(r0); |
| 3107 } | 3121 } |
| 3108 | 3122 |
| 3109 | 3123 |
| 3110 void FullCodeGenerator::EmitRegExpConstructResult(ZoneList<Expression*>* args) { | 3124 void FullCodeGenerator::EmitRegExpConstructResult(ZoneList<Expression*>* args) { |
| 3111 RegExpConstructResultStub stub; | 3125 RegExpConstructResultStub stub; |
| 3112 ASSERT(args->length() == 3); | 3126 ASSERT(args->length() == 3); |
| 3113 VisitForStackValue(args->at(0)); | 3127 VisitForStackValue(args->at(0)); |
| 3114 VisitForStackValue(args->at(1)); | 3128 VisitForStackValue(args->at(1)); |
| 3115 VisitForStackValue(args->at(2)); | 3129 VisitForStackValue(args->at(2)); |
| (...skipping 1144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4260 *context_length = 0; | 4274 *context_length = 0; |
| 4261 return previous_; | 4275 return previous_; |
| 4262 } | 4276 } |
| 4263 | 4277 |
| 4264 | 4278 |
| 4265 #undef __ | 4279 #undef __ |
| 4266 | 4280 |
| 4267 } } // namespace v8::internal | 4281 } } // namespace v8::internal |
| 4268 | 4282 |
| 4269 #endif // V8_TARGET_ARCH_ARM | 4283 #endif // V8_TARGET_ARCH_ARM |
| OLD | NEW |