Index: src/ia32/stub-cache-ia32.cc |
=================================================================== |
--- src/ia32/stub-cache-ia32.cc (revision 3943) |
+++ src/ia32/stub-cache-ia32.cc (working copy) |
@@ -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_ = NULL; |
+ is_simple_api_call_ = false; |
+ expected_receiver_type_ = NULL; |
+ api_call_info_ = NULL; |
+ if (function == NULL || !function->is_compiled()) return; |
+ |
constant_function_ = function; |
- is_simple_api_call_ = false; |
- |
AnalyzePossibleApiFunction(function); |
} |
@@ -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); |