| 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 468 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 479 return masm->TryCallApiFunctionAndReturn(&fun, | 479 return masm->TryCallApiFunctionAndReturn(&fun, |
| 480 argc + kFastApiCallArguments + 1); | 480 argc + kFastApiCallArguments + 1); |
| 481 } | 481 } |
| 482 | 482 |
| 483 | 483 |
| 484 class CallInterceptorCompiler BASE_EMBEDDED { | 484 class CallInterceptorCompiler BASE_EMBEDDED { |
| 485 public: | 485 public: |
| 486 CallInterceptorCompiler(StubCompiler* stub_compiler, | 486 CallInterceptorCompiler(StubCompiler* stub_compiler, |
| 487 const ParameterCount& arguments, | 487 const ParameterCount& arguments, |
| 488 Register name, | 488 Register name, |
| 489 Code::ExtraICState extra_ic_state) | 489 Code::ExtraICState extra_state) |
| 490 : stub_compiler_(stub_compiler), | 490 : stub_compiler_(stub_compiler), |
| 491 arguments_(arguments), | 491 arguments_(arguments), |
| 492 name_(name), | 492 name_(name), |
| 493 extra_ic_state_(extra_ic_state) {} | 493 extra_state_(extra_state) {} |
| 494 | 494 |
| 495 MaybeObject* Compile(MacroAssembler* masm, | 495 MaybeObject* Compile(MacroAssembler* masm, |
| 496 JSObject* object, | 496 JSObject* object, |
| 497 JSObject* holder, | 497 JSObject* holder, |
| 498 String* name, | 498 String* name, |
| 499 LookupResult* lookup, | 499 LookupResult* lookup, |
| 500 Register receiver, | 500 Register receiver, |
| 501 Register scratch1, | 501 Register scratch1, |
| 502 Register scratch2, | 502 Register scratch2, |
| 503 Register scratch3, | 503 Register scratch3, |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 607 // by the previous CheckPrototypes. | 607 // by the previous CheckPrototypes. |
| 608 ASSERT(depth2 == kInvalidProtoDepth); | 608 ASSERT(depth2 == kInvalidProtoDepth); |
| 609 } | 609 } |
| 610 | 610 |
| 611 // Invoke function. | 611 // Invoke function. |
| 612 if (can_do_fast_api_call) { | 612 if (can_do_fast_api_call) { |
| 613 MaybeObject* result = | 613 MaybeObject* result = |
| 614 GenerateFastApiCall(masm, optimization, arguments_.immediate()); | 614 GenerateFastApiCall(masm, optimization, arguments_.immediate()); |
| 615 if (result->IsFailure()) return result; | 615 if (result->IsFailure()) return result; |
| 616 } else { | 616 } else { |
| 617 CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state_) | 617 CallKind call_kind = CallICBase::Contextual::decode(extra_state_) |
| 618 ? CALL_AS_FUNCTION | 618 ? CALL_AS_FUNCTION |
| 619 : CALL_AS_METHOD; | 619 : CALL_AS_METHOD; |
| 620 __ InvokeFunction(optimization.constant_function(), arguments_, | 620 __ InvokeFunction(optimization.constant_function(), arguments_, |
| 621 JUMP_FUNCTION, NullCallWrapper(), call_kind); | 621 JUMP_FUNCTION, NullCallWrapper(), call_kind); |
| 622 } | 622 } |
| 623 | 623 |
| 624 // Deferred code for fast API call case---clean preallocated space. | 624 // Deferred code for fast API call case---clean preallocated space. |
| 625 if (can_do_fast_api_call) { | 625 if (can_do_fast_api_call) { |
| 626 __ bind(&miss_cleanup); | 626 __ bind(&miss_cleanup); |
| 627 FreeSpaceForFastApiCall(masm, scratch1); | 627 FreeSpaceForFastApiCall(masm, scratch1); |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 693 // Leave the internal frame. | 693 // Leave the internal frame. |
| 694 } | 694 } |
| 695 | 695 |
| 696 __ cmp(eax, masm->isolate()->factory()->no_interceptor_result_sentinel()); | 696 __ cmp(eax, masm->isolate()->factory()->no_interceptor_result_sentinel()); |
| 697 __ j(not_equal, interceptor_succeeded); | 697 __ j(not_equal, interceptor_succeeded); |
| 698 } | 698 } |
| 699 | 699 |
| 700 StubCompiler* stub_compiler_; | 700 StubCompiler* stub_compiler_; |
| 701 const ParameterCount& arguments_; | 701 const ParameterCount& arguments_; |
| 702 Register name_; | 702 Register name_; |
| 703 Code::ExtraICState extra_ic_state_; | 703 Code::ExtraICState extra_state_; |
| 704 }; | 704 }; |
| 705 | 705 |
| 706 | 706 |
| 707 void StubCompiler::GenerateLoadMiss(MacroAssembler* masm, Code::Kind kind) { | 707 void StubCompiler::GenerateLoadMiss(MacroAssembler* masm, Code::Kind kind) { |
| 708 ASSERT(kind == Code::LOAD_IC || kind == Code::KEYED_LOAD_IC); | 708 ASSERT(kind == Code::LOAD_IC || kind == Code::KEYED_LOAD_IC); |
| 709 Code* code = NULL; | 709 Code* code = NULL; |
| 710 if (kind == Code::LOAD_IC) { | 710 if (kind == Code::LOAD_IC) { |
| 711 code = masm->isolate()->builtins()->builtin(Builtins::kLoadIC_Miss); | 711 code = masm->isolate()->builtins()->builtin(Builtins::kLoadIC_Miss); |
| 712 } else { | 712 } else { |
| 713 code = masm->isolate()->builtins()->builtin(Builtins::kKeyedLoadIC_Miss); | 713 code = masm->isolate()->builtins()->builtin(Builtins::kKeyedLoadIC_Miss); |
| (...skipping 616 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1330 __ j(not_equal, miss); | 1330 __ j(not_equal, miss); |
| 1331 } else { | 1331 } else { |
| 1332 __ cmp(edi, Immediate(Handle<JSFunction>(function))); | 1332 __ cmp(edi, Immediate(Handle<JSFunction>(function))); |
| 1333 __ j(not_equal, miss); | 1333 __ j(not_equal, miss); |
| 1334 } | 1334 } |
| 1335 } | 1335 } |
| 1336 | 1336 |
| 1337 | 1337 |
| 1338 MaybeObject* CallStubCompiler::GenerateMissBranch() { | 1338 MaybeObject* CallStubCompiler::GenerateMissBranch() { |
| 1339 MaybeObject* maybe_obj = | 1339 MaybeObject* maybe_obj = |
| 1340 isolate()->stub_cache()->ComputeCallMiss(arguments().immediate(), | 1340 isolate()->stub_cache()->TryComputeCallMiss(arguments().immediate(), |
| 1341 kind_, | 1341 kind_, |
| 1342 extra_ic_state_); | 1342 extra_state_); |
| 1343 Object* obj; | 1343 Object* obj; |
| 1344 if (!maybe_obj->ToObject(&obj)) return maybe_obj; | 1344 if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
| 1345 __ jmp(Handle<Code>(Code::cast(obj)), RelocInfo::CODE_TARGET); | 1345 __ jmp(Handle<Code>(Code::cast(obj)), RelocInfo::CODE_TARGET); |
| 1346 return obj; | 1346 return obj; |
| 1347 } | 1347 } |
| 1348 | 1348 |
| 1349 | 1349 |
| 1350 MUST_USE_RESULT MaybeObject* CallStubCompiler::CompileCallField( | 1350 MUST_USE_RESULT MaybeObject* CallStubCompiler::CompileCallField( |
| 1351 JSObject* object, | 1351 JSObject* object, |
| 1352 JSObject* holder, | 1352 JSObject* holder, |
| (...skipping 29 matching lines...) Expand all Loading... |
| 1382 __ j(not_equal, &miss); | 1382 __ j(not_equal, &miss); |
| 1383 | 1383 |
| 1384 // Patch the receiver on the stack with the global proxy if | 1384 // Patch the receiver on the stack with the global proxy if |
| 1385 // necessary. | 1385 // necessary. |
| 1386 if (object->IsGlobalObject()) { | 1386 if (object->IsGlobalObject()) { |
| 1387 __ mov(edx, FieldOperand(edx, GlobalObject::kGlobalReceiverOffset)); | 1387 __ mov(edx, FieldOperand(edx, GlobalObject::kGlobalReceiverOffset)); |
| 1388 __ mov(Operand(esp, (argc + 1) * kPointerSize), edx); | 1388 __ mov(Operand(esp, (argc + 1) * kPointerSize), edx); |
| 1389 } | 1389 } |
| 1390 | 1390 |
| 1391 // Invoke the function. | 1391 // Invoke the function. |
| 1392 CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state_) | 1392 CallKind call_kind = CallICBase::Contextual::decode(extra_state_) |
| 1393 ? CALL_AS_FUNCTION | 1393 ? CALL_AS_FUNCTION |
| 1394 : CALL_AS_METHOD; | 1394 : CALL_AS_METHOD; |
| 1395 __ InvokeFunction(edi, arguments(), JUMP_FUNCTION, | 1395 __ InvokeFunction(edi, arguments(), JUMP_FUNCTION, |
| 1396 NullCallWrapper(), call_kind); | 1396 NullCallWrapper(), call_kind); |
| 1397 | 1397 |
| 1398 // Handle call cache miss. | 1398 // Handle call cache miss. |
| 1399 __ bind(&miss); | 1399 __ bind(&miss); |
| 1400 MaybeObject* maybe_result = GenerateMissBranch(); | 1400 MaybeObject* maybe_result = GenerateMissBranch(); |
| 1401 if (maybe_result->IsFailure()) return maybe_result; | 1401 if (maybe_result->IsFailure()) return maybe_result; |
| 1402 | 1402 |
| (...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1693 } | 1693 } |
| 1694 | 1694 |
| 1695 const int argc = arguments().immediate(); | 1695 const int argc = arguments().immediate(); |
| 1696 | 1696 |
| 1697 Label miss; | 1697 Label miss; |
| 1698 Label name_miss; | 1698 Label name_miss; |
| 1699 Label index_out_of_range; | 1699 Label index_out_of_range; |
| 1700 Label* index_out_of_range_label = &index_out_of_range; | 1700 Label* index_out_of_range_label = &index_out_of_range; |
| 1701 | 1701 |
| 1702 if (kind_ == Code::CALL_IC && | 1702 if (kind_ == Code::CALL_IC && |
| 1703 (CallICBase::StringStubState::decode(extra_ic_state_) == | 1703 (CallICBase::StringStubState::decode(extra_state_) == |
| 1704 DEFAULT_STRING_STUB)) { | 1704 DEFAULT_STRING_STUB)) { |
| 1705 index_out_of_range_label = &miss; | 1705 index_out_of_range_label = &miss; |
| 1706 } | 1706 } |
| 1707 | 1707 |
| 1708 GenerateNameCheck(name, &name_miss); | 1708 GenerateNameCheck(name, &name_miss); |
| 1709 | 1709 |
| 1710 // Check that the maps starting from the prototype haven't changed. | 1710 // Check that the maps starting from the prototype haven't changed. |
| 1711 GenerateDirectLoadGlobalFunctionPrototype(masm(), | 1711 GenerateDirectLoadGlobalFunctionPrototype(masm(), |
| 1712 Context::STRING_FUNCTION_INDEX, | 1712 Context::STRING_FUNCTION_INDEX, |
| 1713 eax, | 1713 eax, |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1779 } | 1779 } |
| 1780 | 1780 |
| 1781 const int argc = arguments().immediate(); | 1781 const int argc = arguments().immediate(); |
| 1782 | 1782 |
| 1783 Label miss; | 1783 Label miss; |
| 1784 Label name_miss; | 1784 Label name_miss; |
| 1785 Label index_out_of_range; | 1785 Label index_out_of_range; |
| 1786 Label* index_out_of_range_label = &index_out_of_range; | 1786 Label* index_out_of_range_label = &index_out_of_range; |
| 1787 | 1787 |
| 1788 if (kind_ == Code::CALL_IC && | 1788 if (kind_ == Code::CALL_IC && |
| 1789 (CallICBase::StringStubState::decode(extra_ic_state_) == | 1789 (CallICBase::StringStubState::decode(extra_state_) == |
| 1790 DEFAULT_STRING_STUB)) { | 1790 DEFAULT_STRING_STUB)) { |
| 1791 index_out_of_range_label = &miss; | 1791 index_out_of_range_label = &miss; |
| 1792 } | 1792 } |
| 1793 | 1793 |
| 1794 GenerateNameCheck(name, &name_miss); | 1794 GenerateNameCheck(name, &name_miss); |
| 1795 | 1795 |
| 1796 // Check that the maps starting from the prototype haven't changed. | 1796 // Check that the maps starting from the prototype haven't changed. |
| 1797 GenerateDirectLoadGlobalFunctionPrototype(masm(), | 1797 GenerateDirectLoadGlobalFunctionPrototype(masm(), |
| 1798 Context::STRING_FUNCTION_INDEX, | 1798 Context::STRING_FUNCTION_INDEX, |
| 1799 eax, | 1799 eax, |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1901 StringCharFromCodeGenerator char_from_code_generator(code, eax); | 1901 StringCharFromCodeGenerator char_from_code_generator(code, eax); |
| 1902 char_from_code_generator.GenerateFast(masm()); | 1902 char_from_code_generator.GenerateFast(masm()); |
| 1903 __ ret(2 * kPointerSize); | 1903 __ ret(2 * kPointerSize); |
| 1904 | 1904 |
| 1905 StubRuntimeCallHelper call_helper; | 1905 StubRuntimeCallHelper call_helper; |
| 1906 char_from_code_generator.GenerateSlow(masm(), call_helper); | 1906 char_from_code_generator.GenerateSlow(masm(), call_helper); |
| 1907 | 1907 |
| 1908 // Tail call the full function. We do not have to patch the receiver | 1908 // Tail call the full function. We do not have to patch the receiver |
| 1909 // because the function makes no use of it. | 1909 // because the function makes no use of it. |
| 1910 __ bind(&slow); | 1910 __ bind(&slow); |
| 1911 CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state_) | 1911 CallKind call_kind = CallICBase::Contextual::decode(extra_state_) |
| 1912 ? CALL_AS_FUNCTION | 1912 ? CALL_AS_FUNCTION |
| 1913 : CALL_AS_METHOD; | 1913 : CALL_AS_METHOD; |
| 1914 __ InvokeFunction(function, arguments(), JUMP_FUNCTION, | 1914 __ InvokeFunction(function, arguments(), JUMP_FUNCTION, |
| 1915 NullCallWrapper(), call_kind); | 1915 NullCallWrapper(), call_kind); |
| 1916 | 1916 |
| 1917 __ bind(&miss); | 1917 __ bind(&miss); |
| 1918 // ecx: function name. | 1918 // ecx: function name. |
| 1919 MaybeObject* maybe_result = GenerateMissBranch(); | 1919 MaybeObject* maybe_result = GenerateMissBranch(); |
| 1920 if (maybe_result->IsFailure()) return maybe_result; | 1920 if (maybe_result->IsFailure()) return maybe_result; |
| 1921 | 1921 |
| (...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2332 CheckPrototypes(JSObject::cast(object->GetPrototype()), eax, holder, | 2332 CheckPrototypes(JSObject::cast(object->GetPrototype()), eax, holder, |
| 2333 ebx, edx, edi, name, &miss); | 2333 ebx, edx, edi, name, &miss); |
| 2334 } | 2334 } |
| 2335 break; | 2335 break; |
| 2336 } | 2336 } |
| 2337 | 2337 |
| 2338 default: | 2338 default: |
| 2339 UNREACHABLE(); | 2339 UNREACHABLE(); |
| 2340 } | 2340 } |
| 2341 | 2341 |
| 2342 CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state_) | 2342 CallKind call_kind = CallICBase::Contextual::decode(extra_state_) |
| 2343 ? CALL_AS_FUNCTION | 2343 ? CALL_AS_FUNCTION |
| 2344 : CALL_AS_METHOD; | 2344 : CALL_AS_METHOD; |
| 2345 __ InvokeFunction(function, arguments(), JUMP_FUNCTION, | 2345 __ InvokeFunction(function, arguments(), JUMP_FUNCTION, |
| 2346 NullCallWrapper(), call_kind); | 2346 NullCallWrapper(), call_kind); |
| 2347 | 2347 |
| 2348 // Handle call cache miss. | 2348 // Handle call cache miss. |
| 2349 __ bind(&miss); | 2349 __ bind(&miss); |
| 2350 MaybeObject* maybe_result = GenerateMissBranch(); | 2350 MaybeObject* maybe_result = GenerateMissBranch(); |
| 2351 if (maybe_result->IsFailure()) return maybe_result; | 2351 if (maybe_result->IsFailure()) return maybe_result; |
| 2352 | 2352 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 2371 | 2371 |
| 2372 // Get the number of arguments. | 2372 // Get the number of arguments. |
| 2373 const int argc = arguments().immediate(); | 2373 const int argc = arguments().immediate(); |
| 2374 | 2374 |
| 2375 LookupResult lookup(isolate()); | 2375 LookupResult lookup(isolate()); |
| 2376 LookupPostInterceptor(holder, name, &lookup); | 2376 LookupPostInterceptor(holder, name, &lookup); |
| 2377 | 2377 |
| 2378 // Get the receiver from the stack. | 2378 // Get the receiver from the stack. |
| 2379 __ mov(edx, Operand(esp, (argc + 1) * kPointerSize)); | 2379 __ mov(edx, Operand(esp, (argc + 1) * kPointerSize)); |
| 2380 | 2380 |
| 2381 CallInterceptorCompiler compiler(this, arguments(), ecx, extra_ic_state_); | 2381 CallInterceptorCompiler compiler(this, arguments(), ecx, extra_state_); |
| 2382 MaybeObject* result = compiler.Compile(masm(), | 2382 MaybeObject* result = compiler.Compile(masm(), |
| 2383 object, | 2383 object, |
| 2384 holder, | 2384 holder, |
| 2385 name, | 2385 name, |
| 2386 &lookup, | 2386 &lookup, |
| 2387 edx, | 2387 edx, |
| 2388 ebx, | 2388 ebx, |
| 2389 edi, | 2389 edi, |
| 2390 eax, | 2390 eax, |
| 2391 &miss); | 2391 &miss); |
| 2392 if (result->IsFailure()) return result; | 2392 if (result->IsFailure()) return result; |
| 2393 | 2393 |
| 2394 // Restore receiver. | 2394 // Restore receiver. |
| 2395 __ mov(edx, Operand(esp, (argc + 1) * kPointerSize)); | 2395 __ mov(edx, Operand(esp, (argc + 1) * kPointerSize)); |
| 2396 | 2396 |
| 2397 // Check that the function really is a function. | 2397 // Check that the function really is a function. |
| 2398 __ JumpIfSmi(eax, &miss); | 2398 __ JumpIfSmi(eax, &miss); |
| 2399 __ CmpObjectType(eax, JS_FUNCTION_TYPE, ebx); | 2399 __ CmpObjectType(eax, JS_FUNCTION_TYPE, ebx); |
| 2400 __ j(not_equal, &miss); | 2400 __ j(not_equal, &miss); |
| 2401 | 2401 |
| 2402 // Patch the receiver on the stack with the global proxy if | 2402 // Patch the receiver on the stack with the global proxy if |
| 2403 // necessary. | 2403 // necessary. |
| 2404 if (object->IsGlobalObject()) { | 2404 if (object->IsGlobalObject()) { |
| 2405 __ mov(edx, FieldOperand(edx, GlobalObject::kGlobalReceiverOffset)); | 2405 __ mov(edx, FieldOperand(edx, GlobalObject::kGlobalReceiverOffset)); |
| 2406 __ mov(Operand(esp, (argc + 1) * kPointerSize), edx); | 2406 __ mov(Operand(esp, (argc + 1) * kPointerSize), edx); |
| 2407 } | 2407 } |
| 2408 | 2408 |
| 2409 // Invoke the function. | 2409 // Invoke the function. |
| 2410 __ mov(edi, eax); | 2410 __ mov(edi, eax); |
| 2411 CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state_) | 2411 CallKind call_kind = CallICBase::Contextual::decode(extra_state_) |
| 2412 ? CALL_AS_FUNCTION | 2412 ? CALL_AS_FUNCTION |
| 2413 : CALL_AS_METHOD; | 2413 : CALL_AS_METHOD; |
| 2414 __ InvokeFunction(edi, arguments(), JUMP_FUNCTION, | 2414 __ InvokeFunction(edi, arguments(), JUMP_FUNCTION, |
| 2415 NullCallWrapper(), call_kind); | 2415 NullCallWrapper(), call_kind); |
| 2416 | 2416 |
| 2417 // Handle load cache miss. | 2417 // Handle load cache miss. |
| 2418 __ bind(&miss); | 2418 __ bind(&miss); |
| 2419 MaybeObject* maybe_result = GenerateMissBranch(); | 2419 MaybeObject* maybe_result = GenerateMissBranch(); |
| 2420 if (maybe_result->IsFailure()) return maybe_result; | 2420 if (maybe_result->IsFailure()) return maybe_result; |
| 2421 | 2421 |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2463 __ mov(edx, FieldOperand(edx, GlobalObject::kGlobalReceiverOffset)); | 2463 __ mov(edx, FieldOperand(edx, GlobalObject::kGlobalReceiverOffset)); |
| 2464 __ mov(Operand(esp, (argc + 1) * kPointerSize), edx); | 2464 __ mov(Operand(esp, (argc + 1) * kPointerSize), edx); |
| 2465 } | 2465 } |
| 2466 | 2466 |
| 2467 // Setup the context (function already in edi). | 2467 // Setup the context (function already in edi). |
| 2468 __ mov(esi, FieldOperand(edi, JSFunction::kContextOffset)); | 2468 __ mov(esi, FieldOperand(edi, JSFunction::kContextOffset)); |
| 2469 | 2469 |
| 2470 // Jump to the cached code (tail call). | 2470 // Jump to the cached code (tail call). |
| 2471 Counters* counters = isolate()->counters(); | 2471 Counters* counters = isolate()->counters(); |
| 2472 __ IncrementCounter(counters->call_global_inline(), 1); | 2472 __ IncrementCounter(counters->call_global_inline(), 1); |
| 2473 ASSERT(function->is_compiled()); | |
| 2474 ParameterCount expected(function->shared()->formal_parameter_count()); | 2473 ParameterCount expected(function->shared()->formal_parameter_count()); |
| 2475 CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state_) | 2474 CallKind call_kind = CallICBase::Contextual::decode(extra_state_) |
| 2476 ? CALL_AS_FUNCTION | 2475 ? CALL_AS_FUNCTION |
| 2477 : CALL_AS_METHOD; | 2476 : CALL_AS_METHOD; |
| 2478 if (V8::UseCrankshaft()) { | 2477 // We call indirectly through the code field in the function to |
| 2479 // TODO(kasperl): For now, we always call indirectly through the | 2478 // allow recompilation to take effect without changing any of the |
| 2480 // code field in the function to allow recompilation to take effect | 2479 // call sites. |
| 2481 // without changing any of the call sites. | 2480 __ InvokeCode(FieldOperand(edi, JSFunction::kCodeEntryOffset), |
| 2482 __ InvokeCode(FieldOperand(edi, JSFunction::kCodeEntryOffset), | 2481 expected, arguments(), JUMP_FUNCTION, |
| 2483 expected, arguments(), JUMP_FUNCTION, | 2482 NullCallWrapper(), call_kind); |
| 2484 NullCallWrapper(), call_kind); | |
| 2485 } else { | |
| 2486 Handle<Code> code(function->code()); | |
| 2487 __ InvokeCode(code, expected, arguments(), | |
| 2488 RelocInfo::CODE_TARGET, JUMP_FUNCTION, | |
| 2489 NullCallWrapper(), call_kind); | |
| 2490 } | |
| 2491 | 2483 |
| 2492 // Handle call cache miss. | 2484 // Handle call cache miss. |
| 2493 __ bind(&miss); | 2485 __ bind(&miss); |
| 2494 __ IncrementCounter(counters->call_global_inline_miss(), 1); | 2486 __ IncrementCounter(counters->call_global_inline_miss(), 1); |
| 2495 MaybeObject* maybe_result = GenerateMissBranch(); | 2487 MaybeObject* maybe_result = GenerateMissBranch(); |
| 2496 if (maybe_result->IsFailure()) return maybe_result; | 2488 if (maybe_result->IsFailure()) return maybe_result; |
| 2497 | 2489 |
| 2498 // Return the generated code. | 2490 // Return the generated code. |
| 2499 return GetCode(NORMAL, name); | 2491 return GetCode(NORMAL, name); |
| 2500 } | 2492 } |
| (...skipping 1525 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4026 Handle<Code> ic_miss = masm->isolate()->builtins()->KeyedStoreIC_Miss(); | 4018 Handle<Code> ic_miss = masm->isolate()->builtins()->KeyedStoreIC_Miss(); |
| 4027 __ jmp(ic_miss, RelocInfo::CODE_TARGET); | 4019 __ jmp(ic_miss, RelocInfo::CODE_TARGET); |
| 4028 } | 4020 } |
| 4029 | 4021 |
| 4030 | 4022 |
| 4031 #undef __ | 4023 #undef __ |
| 4032 | 4024 |
| 4033 } } // namespace v8::internal | 4025 } } // namespace v8::internal |
| 4034 | 4026 |
| 4035 #endif // V8_TARGET_ARCH_IA32 | 4027 #endif // V8_TARGET_ARCH_IA32 |
| OLD | NEW |