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 2142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2153 isolate()->stub_cache()->ComputeKeyedCallInitialize(arg_count, in_loop); | 2153 isolate()->stub_cache()->ComputeKeyedCallInitialize(arg_count, in_loop); |
2154 __ ldr(r2, MemOperand(sp, (arg_count + 1) * kPointerSize)); // Key. | 2154 __ ldr(r2, MemOperand(sp, (arg_count + 1) * kPointerSize)); // Key. |
2155 EmitCallIC(ic, mode, expr->id()); | 2155 EmitCallIC(ic, mode, expr->id()); |
2156 RecordJSReturnSite(expr); | 2156 RecordJSReturnSite(expr); |
2157 // Restore context register. | 2157 // Restore context register. |
2158 __ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); | 2158 __ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); |
2159 context()->DropAndPlug(1, r0); // Drop the key still on the stack. | 2159 context()->DropAndPlug(1, r0); // Drop the key still on the stack. |
2160 } | 2160 } |
2161 | 2161 |
2162 | 2162 |
2163 void FullCodeGenerator::EmitCallWithStub(Call* expr) { | 2163 void FullCodeGenerator::EmitCallWithStub(Call* expr, CallFunctionFlags flags) { |
2164 // Code common for calls using the call stub. | 2164 // Code common for calls using the call stub. |
2165 ZoneList<Expression*>* args = expr->arguments(); | 2165 ZoneList<Expression*>* args = expr->arguments(); |
2166 int arg_count = args->length(); | 2166 int arg_count = args->length(); |
2167 { PreservePositionScope scope(masm()->positions_recorder()); | 2167 { PreservePositionScope scope(masm()->positions_recorder()); |
2168 for (int i = 0; i < arg_count; i++) { | 2168 for (int i = 0; i < arg_count; i++) { |
2169 VisitForStackValue(args->at(i)); | 2169 VisitForStackValue(args->at(i)); |
2170 } | 2170 } |
2171 } | 2171 } |
2172 // Record source position for debugger. | 2172 // Record source position for debugger. |
2173 SetSourcePosition(expr->position()); | 2173 SetSourcePosition(expr->position()); |
2174 InLoopFlag in_loop = (loop_depth() > 0) ? IN_LOOP : NOT_IN_LOOP; | 2174 InLoopFlag in_loop = (loop_depth() > 0) ? IN_LOOP : NOT_IN_LOOP; |
2175 CallFunctionStub stub(arg_count, in_loop, RECEIVER_MIGHT_BE_VALUE); | 2175 CallFunctionStub stub(arg_count, in_loop, flags); |
2176 __ CallStub(&stub); | 2176 __ CallStub(&stub); |
2177 RecordJSReturnSite(expr); | 2177 RecordJSReturnSite(expr); |
2178 // Restore context register. | 2178 // Restore context register. |
2179 __ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); | 2179 __ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); |
2180 context()->DropAndPlug(1, r0); | 2180 context()->DropAndPlug(1, r0); |
2181 } | 2181 } |
2182 | 2182 |
2183 | 2183 |
2184 void FullCodeGenerator::EmitResolvePossiblyDirectEval(ResolveEvalFlag flag, | 2184 void FullCodeGenerator::EmitResolvePossiblyDirectEval(ResolveEvalFlag flag, |
2185 int arg_count) { | 2185 int arg_count) { |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2311 __ bind(&done); | 2311 __ bind(&done); |
2312 // Push function. | 2312 // Push function. |
2313 __ push(r0); | 2313 __ push(r0); |
2314 // Push global receiver. | 2314 // Push global receiver. |
2315 __ ldr(r1, GlobalObjectOperand()); | 2315 __ ldr(r1, GlobalObjectOperand()); |
2316 __ ldr(r1, FieldMemOperand(r1, GlobalObject::kGlobalReceiverOffset)); | 2316 __ ldr(r1, FieldMemOperand(r1, GlobalObject::kGlobalReceiverOffset)); |
2317 __ push(r1); | 2317 __ push(r1); |
2318 __ bind(&call); | 2318 __ bind(&call); |
2319 } | 2319 } |
2320 | 2320 |
2321 EmitCallWithStub(expr); | 2321 // The receiver is either the global receiver or a JSObject found by |
| 2322 // LoadContextSlot. |
| 2323 EmitCallWithStub(expr, NO_CALL_FUNCTION_FLAGS); |
2322 } else if (fun->AsProperty() != NULL) { | 2324 } else if (fun->AsProperty() != NULL) { |
2323 // Call to an object property. | 2325 // Call to an object property. |
2324 Property* prop = fun->AsProperty(); | 2326 Property* prop = fun->AsProperty(); |
2325 Literal* key = prop->key()->AsLiteral(); | 2327 Literal* key = prop->key()->AsLiteral(); |
2326 if (key != NULL && key->handle()->IsSymbol()) { | 2328 if (key != NULL && key->handle()->IsSymbol()) { |
2327 // Call to a named property, use call IC. | 2329 // Call to a named property, use call IC. |
2328 { PreservePositionScope scope(masm()->positions_recorder()); | 2330 { PreservePositionScope scope(masm()->positions_recorder()); |
2329 VisitForStackValue(prop->obj()); | 2331 VisitForStackValue(prop->obj()); |
2330 } | 2332 } |
2331 EmitCallWithIC(expr, key->handle(), RelocInfo::CODE_TARGET_WITH_ID); | 2333 EmitCallWithIC(expr, key->handle(), RelocInfo::CODE_TARGET_WITH_ID); |
(...skipping 15 matching lines...) Expand all Loading... |
2347 __ mov(r0, Operand(prop->key()->AsLiteral()->handle())); | 2349 __ mov(r0, Operand(prop->key()->AsLiteral()->handle())); |
2348 | 2350 |
2349 // Record source code position for IC call. | 2351 // Record source code position for IC call. |
2350 SetSourcePosition(prop->position()); | 2352 SetSourcePosition(prop->position()); |
2351 | 2353 |
2352 Handle<Code> ic = isolate()->builtins()->KeyedLoadIC_Initialize(); | 2354 Handle<Code> ic = isolate()->builtins()->KeyedLoadIC_Initialize(); |
2353 EmitCallIC(ic, RelocInfo::CODE_TARGET, AstNode::kNoNumber); | 2355 EmitCallIC(ic, RelocInfo::CODE_TARGET, AstNode::kNoNumber); |
2354 __ ldr(r1, GlobalObjectOperand()); | 2356 __ ldr(r1, GlobalObjectOperand()); |
2355 __ ldr(r1, FieldMemOperand(r1, GlobalObject::kGlobalReceiverOffset)); | 2357 __ ldr(r1, FieldMemOperand(r1, GlobalObject::kGlobalReceiverOffset)); |
2356 __ Push(r0, r1); // Function, receiver. | 2358 __ Push(r0, r1); // Function, receiver. |
2357 EmitCallWithStub(expr); | 2359 EmitCallWithStub(expr, NO_CALL_FUNCTION_FLAGS); |
2358 } else { | 2360 } else { |
2359 { PreservePositionScope scope(masm()->positions_recorder()); | 2361 { PreservePositionScope scope(masm()->positions_recorder()); |
2360 VisitForStackValue(prop->obj()); | 2362 VisitForStackValue(prop->obj()); |
2361 } | 2363 } |
2362 EmitKeyedCallWithIC(expr, prop->key(), RelocInfo::CODE_TARGET_WITH_ID); | 2364 EmitKeyedCallWithIC(expr, prop->key(), RelocInfo::CODE_TARGET_WITH_ID); |
2363 } | 2365 } |
2364 } | 2366 } |
2365 } else { | 2367 } else { |
2366 { PreservePositionScope scope(masm()->positions_recorder()); | 2368 { PreservePositionScope scope(masm()->positions_recorder()); |
2367 VisitForStackValue(fun); | 2369 VisitForStackValue(fun); |
2368 } | 2370 } |
2369 // Load global receiver object. | 2371 // Load global receiver object. |
2370 __ ldr(r1, GlobalObjectOperand()); | 2372 __ ldr(r1, GlobalObjectOperand()); |
2371 __ ldr(r1, FieldMemOperand(r1, GlobalObject::kGlobalReceiverOffset)); | 2373 __ ldr(r1, FieldMemOperand(r1, GlobalObject::kGlobalReceiverOffset)); |
2372 __ push(r1); | 2374 __ push(r1); |
2373 // Emit function call. | 2375 // Emit function call. |
2374 EmitCallWithStub(expr); | 2376 EmitCallWithStub(expr, NO_CALL_FUNCTION_FLAGS); |
2375 } | 2377 } |
2376 | 2378 |
2377 #ifdef DEBUG | 2379 #ifdef DEBUG |
2378 // RecordJSReturnSite should have been called. | 2380 // RecordJSReturnSite should have been called. |
2379 ASSERT(expr->return_is_recorded_); | 2381 ASSERT(expr->return_is_recorded_); |
2380 #endif | 2382 #endif |
2381 } | 2383 } |
2382 | 2384 |
2383 | 2385 |
2384 void FullCodeGenerator::VisitCallNew(CallNew* expr) { | 2386 void FullCodeGenerator::VisitCallNew(CallNew* expr) { |
(...skipping 2005 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4390 __ mov(r1, Operand(r1, ASR, 1)); // Un-smi-tag value. | 4392 __ mov(r1, Operand(r1, ASR, 1)); // Un-smi-tag value. |
4391 __ add(pc, r1, Operand(masm_->CodeObject())); | 4393 __ add(pc, r1, Operand(masm_->CodeObject())); |
4392 } | 4394 } |
4393 | 4395 |
4394 | 4396 |
4395 #undef __ | 4397 #undef __ |
4396 | 4398 |
4397 } } // namespace v8::internal | 4399 } } // namespace v8::internal |
4398 | 4400 |
4399 #endif // V8_TARGET_ARCH_ARM | 4401 #endif // V8_TARGET_ARCH_ARM |
OLD | NEW |