| Index: src/ia32/stub-cache-ia32.cc
|
| ===================================================================
|
| --- src/ia32/stub-cache-ia32.cc (revision 3964)
|
| +++ src/ia32/stub-cache-ia32.cc (working copy)
|
| @@ -446,7 +446,7 @@
|
|
|
| ExternalReference ref =
|
| ExternalReference(IC_Utility(IC::kLoadCallbackProperty));
|
| - __ TailCallRuntime(ref, 5, 1);
|
| + __ TailCallExternalReference(ref, 5, 1);
|
|
|
| __ bind(&cleanup);
|
| __ pop(scratch1);
|
| @@ -468,7 +468,7 @@
|
|
|
| ExternalReference ref = ExternalReference(
|
| IC_Utility(IC::kLoadPropertyWithInterceptorForLoad));
|
| - __ TailCallRuntime(ref, 5, 1);
|
| + __ TailCallExternalReference(ref, 5, 1);
|
| }
|
|
|
| private:
|
| @@ -479,17 +479,14 @@
|
| // Holds information about possible function call optimizations.
|
| class CallOptimization BASE_EMBEDDED {
|
| public:
|
| - explicit CallOptimization(LookupResult* lookup)
|
| - : constant_function_(NULL),
|
| - is_simple_api_call_(false),
|
| - expected_receiver_type_(NULL),
|
| - api_call_info_(NULL) {
|
| - if (!lookup->IsProperty() || !lookup->IsCacheable()) return;
|
| -
|
| - // We only optimize constant function calls.
|
| - if (lookup->type() != CONSTANT_FUNCTION) return;
|
| -
|
| - Initialize(lookup->GetConstantFunction());
|
| + explicit CallOptimization(LookupResult* lookup) {
|
| + if (!lookup->IsProperty() || !lookup->IsCacheable() ||
|
| + lookup->type() != CONSTANT_FUNCTION) {
|
| + Initialize(NULL);
|
| + } else {
|
| + // We only optimize constant function calls.
|
| + Initialize(lookup->GetConstantFunction());
|
| + }
|
| }
|
|
|
| explicit CallOptimization(JSFunction* function) {
|
| @@ -537,11 +534,14 @@
|
|
|
| private:
|
| void Initialize(JSFunction* function) {
|
| - if (!function->is_compiled()) return;
|
| -
|
| - constant_function_ = function;
|
| + constant_function_ = NULL;
|
| is_simple_api_call_ = false;
|
| + expected_receiver_type_ = NULL;
|
| + api_call_info_ = NULL;
|
|
|
| + if (function == NULL || !function->is_compiled()) return;
|
| +
|
| + constant_function_ = function;
|
| AnalyzePossibleApiFunction(function);
|
| }
|
|
|
| @@ -907,7 +907,7 @@
|
| __ push(Immediate(Handle<Map>(transition)));
|
| __ push(eax);
|
| __ push(scratch);
|
| - __ TailCallRuntime(
|
| + __ TailCallExternalReference(
|
| ExternalReference(IC_Utility(IC::kSharedStoreIC_ExtendStorage)), 3, 1);
|
| return;
|
| }
|
| @@ -1223,7 +1223,7 @@
|
| // -- ...
|
| // -- esp[(argc + 1) * 4] : receiver
|
| // -----------------------------------
|
| - Label miss;
|
| + Label miss_in_smi_check;
|
|
|
| // Get the receiver from the stack.
|
| const int argc = arguments().immediate();
|
| @@ -1232,7 +1232,7 @@
|
| // Check that the receiver isn't a smi.
|
| if (check != NUMBER_CHECK) {
|
| __ test(edx, Immediate(kSmiTagMask));
|
| - __ j(zero, &miss, not_taken);
|
| + __ j(zero, &miss_in_smi_check, not_taken);
|
| }
|
|
|
| // Make sure that it's okay not to patch the on stack receiver
|
| @@ -1241,6 +1241,7 @@
|
|
|
| CallOptimization optimization(function);
|
| int depth = kInvalidProtoDepth;
|
| + Label miss;
|
|
|
| switch (check) {
|
| case RECEIVER_MAP_CHECK:
|
| @@ -1359,6 +1360,7 @@
|
| if (depth != kInvalidProtoDepth) {
|
| FreeSpaceForFastApiCall(masm(), eax);
|
| }
|
| + __ bind(&miss_in_smi_check);
|
| Handle<Code> ic = ComputeCallMiss(arguments().immediate());
|
| __ jmp(ic, RelocInfo::CODE_TARGET);
|
|
|
| @@ -1587,7 +1589,7 @@
|
| // Do tail-call to the runtime system.
|
| ExternalReference store_callback_property =
|
| ExternalReference(IC_Utility(IC::kStoreCallbackProperty));
|
| - __ TailCallRuntime(store_callback_property, 4, 1);
|
| + __ TailCallExternalReference(store_callback_property, 4, 1);
|
|
|
| // Handle store cache miss.
|
| __ bind(&miss);
|
| @@ -1636,7 +1638,7 @@
|
| // Do tail-call to the runtime system.
|
| ExternalReference store_ic_property =
|
| ExternalReference(IC_Utility(IC::kStoreInterceptorProperty));
|
| - __ TailCallRuntime(store_ic_property, 3, 1);
|
| + __ TailCallExternalReference(store_ic_property, 3, 1);
|
|
|
| // Handle store cache miss.
|
| __ bind(&miss);
|
| @@ -1689,23 +1691,18 @@
|
| String* name) {
|
| // ----------- S t a t e -------------
|
| // -- eax : value
|
| + // -- ecx : key
|
| + // -- edx : receiver
|
| // -- esp[0] : return address
|
| - // -- esp[4] : key
|
| - // -- esp[8] : receiver
|
| // -----------------------------------
|
| Label miss;
|
|
|
| __ IncrementCounter(&Counters::keyed_store_field, 1);
|
|
|
| - // Get the name from the stack.
|
| - __ mov(ecx, Operand(esp, 1 * kPointerSize));
|
| // Check that the name has not changed.
|
| __ cmp(Operand(ecx), Immediate(Handle<String>(name)));
|
| __ j(not_equal, &miss, not_taken);
|
|
|
| - // Get the object from the stack.
|
| - __ mov(edx, Operand(esp, 2 * kPointerSize));
|
| -
|
| // Generate store field code. Trashes the name register.
|
| GenerateStoreField(masm(),
|
| object,
|
|
|