Index: src/code-stubs.cc |
=================================================================== |
--- src/code-stubs.cc (revision 9531) |
+++ src/code-stubs.cc (working copy) |
@@ -52,11 +52,12 @@ |
// Update the static counter each time a new code stub is generated. |
masm->isolate()->counters()->code_stubs()->Increment(); |
- // Nested stubs are not allowed for leafs. |
- AllowStubCallsScope allow_scope(masm, AllowsStubCalls()); |
+ // Nested stubs are not allowed for leaves. |
+ AllowStubCallsScope allow_scope(masm, false); |
// Generate the code for the stub. |
masm->set_generating_stub(true); |
+ NoCurrentFrameScope scope(masm); |
Generate(masm); |
} |
@@ -127,8 +128,10 @@ |
GetKey(), |
new_object); |
heap->public_set_code_stubs(*dict); |
- |
code = *new_object; |
+ Activate(code); |
+ } else { |
+ CHECK(IsPregenerated() == code->is_pregenerated()); |
} |
ASSERT(!NeedsImmovableCode() || heap->lo_space()->Contains(code)); |
@@ -166,7 +169,11 @@ |
heap->code_stubs()->AtNumberPut(GetKey(), code); |
if (maybe_new_object->ToObject(&new_object)) { |
heap->public_set_code_stubs(NumberDictionary::cast(new_object)); |
+ } else if (MustBeInStubCache()) { |
+ return maybe_new_object; |
} |
+ |
+ Activate(code); |
} |
return code; |
@@ -188,6 +195,11 @@ |
} |
+void CodeStub::PrintName(StringStream* stream) { |
+ stream->Add("%s", MajorName(MajorKey(), false)); |
+} |
+ |
+ |
int ICCompareStub::MinorKey() { |
return OpField::encode(op_ - Token::EQ) | StateField::encode(state_); |
} |
@@ -245,6 +257,7 @@ |
void KeyedLoadElementStub::Generate(MacroAssembler* masm) { |
switch (elements_kind_) { |
case FAST_ELEMENTS: |
+ case FAST_SMI_ONLY_ELEMENTS: |
KeyedLoadStubCompiler::GenerateLoadFastElement(masm); |
break; |
case FAST_DOUBLE_ELEMENTS: |
@@ -274,7 +287,11 @@ |
void KeyedStoreElementStub::Generate(MacroAssembler* masm) { |
switch (elements_kind_) { |
case FAST_ELEMENTS: |
- KeyedStoreStubCompiler::GenerateStoreFastElement(masm, is_js_array_); |
+ case FAST_SMI_ONLY_ELEMENTS: { |
+ KeyedStoreStubCompiler::GenerateStoreFastElement(masm, |
+ is_js_array_, |
+ elements_kind_); |
+ } |
break; |
case FAST_DOUBLE_ELEMENTS: |
KeyedStoreStubCompiler::GenerateStoreFastDoubleElement(masm, |
@@ -302,24 +319,20 @@ |
void ArgumentsAccessStub::PrintName(StringStream* stream) { |
- const char* type_name = NULL; // Make g++ happy. |
+ stream->Add("ArgumentsAccessStub_"); |
switch (type_) { |
- case READ_ELEMENT: type_name = "ReadElement"; break; |
- case NEW_NON_STRICT_FAST: type_name = "NewNonStrictFast"; break; |
- case NEW_NON_STRICT_SLOW: type_name = "NewNonStrictSlow"; break; |
- case NEW_STRICT: type_name = "NewStrict"; break; |
+ case READ_ELEMENT: stream->Add("ReadElement"); break; |
+ case NEW_NON_STRICT_FAST: stream->Add("NewNonStrictFast"); break; |
+ case NEW_NON_STRICT_SLOW: stream->Add("NewNonStrictSlow"); break; |
+ case NEW_STRICT: stream->Add("NewStrict"); break; |
} |
- stream->Add("ArgumentsAccessStub_%s", type_name); |
} |
void CallFunctionStub::PrintName(StringStream* stream) { |
- const char* flags_name = NULL; // Make g++ happy. |
- switch (flags_) { |
- case NO_CALL_FUNCTION_FLAGS: flags_name = ""; break; |
- case RECEIVER_MIGHT_BE_IMPLICIT: flags_name = "_Implicit"; break; |
- } |
- stream->Add("CallFunctionStub_Args%d%s", argc_, flags_name); |
+ stream->Add("CallFunctionStub_Args%d", argc_); |
+ if (ReceiverMightBeImplicit()) stream->Add("_Implicit"); |
+ if (RecordCallTarget()) stream->Add("_Recording"); |
} |