Index: src/code-stubs.h |
diff --git a/src/code-stubs.h b/src/code-stubs.h |
index 56b595583df03aea829cf81dc3ece9319bf5150a..55d7e5d809d12227531bded89766b17576d1e3e4 100644 |
--- a/src/code-stubs.h |
+++ b/src/code-stubs.h |
@@ -29,6 +29,7 @@ |
#define V8_CODE_STUBS_H_ |
#include "allocation.h" |
+#include "assembler.h" |
#include "globals.h" |
#include "codegen.h" |
@@ -260,17 +261,15 @@ class PlatformCodeStub : public CodeStub { |
enum StubFunctionMode { NOT_JS_FUNCTION_STUB_MODE, JS_FUNCTION_STUB_MODE }; |
+ |
struct CodeStubInterfaceDescriptor { |
- CodeStubInterfaceDescriptor() |
- : register_param_count_(-1), |
- stack_parameter_count_(NULL), |
- function_mode_(NOT_JS_FUNCTION_STUB_MODE), |
- register_params_(NULL) { } |
+ CodeStubInterfaceDescriptor(); |
int register_param_count_; |
const Register* stack_parameter_count_; |
StubFunctionMode function_mode_; |
Register* register_params_; |
Address deoptimization_handler_; |
+ ExternalReference miss_handler_; |
int environment_length() const { |
if (stack_parameter_count_ != NULL) { |
@@ -283,8 +282,14 @@ struct CodeStubInterfaceDescriptor { |
class HydrogenCodeStub : public CodeStub { |
public: |
- // Retrieve the code for the stub. Generate the code if needed. |
- virtual Handle<Code> GenerateCode() = 0; |
+ enum InitializationState { |
+ CODE_STUB_IS_NOT_MISS, |
+ CODE_STUB_IS_MISS |
+ }; |
+ |
+ explicit HydrogenCodeStub(InitializationState state) { |
+ is_miss_ = (state == CODE_STUB_IS_MISS); |
+ } |
virtual Code::Kind GetCodeKind() const { return Code::STUB; } |
@@ -292,9 +297,36 @@ class HydrogenCodeStub : public CodeStub { |
return isolate->code_stub_interface_descriptor(MajorKey()); |
} |
+ bool IsMiss() { return is_miss_; } |
+ |
+ template<class SubClass> |
+ static Handle<Code> GetUninitialized(Isolate* isolate) { |
+ SubClass::GenerateAheadOfTime(isolate); |
+ return SubClass().GetCode(isolate); |
+ } |
+ |
virtual void InitializeInterfaceDescriptor( |
Isolate* isolate, |
CodeStubInterfaceDescriptor* descriptor) = 0; |
+ |
+ // Retrieve the code for the stub. Generate the code if needed. |
+ virtual Handle<Code> GenerateCode() = 0; |
+ |
+ virtual int NotMissMinorKey() = 0; |
+ |
+ Handle<Code> GenerateLightweightMissCode(Isolate* isolate); |
+ |
+ private: |
+ class MinorKeyBits: public BitField<int, 0, kStubMinorKeyBits - 1> {}; |
+ class IsMissBits: public BitField<bool, kStubMinorKeyBits - 1, 1> {}; |
+ |
+ void GenerateLightweightMiss(MacroAssembler* masm); |
+ virtual int MinorKey() { |
+ return IsMissBits::encode(is_miss_) | |
+ MinorKeyBits::encode(NotMissMinorKey()); |
+ } |
+ |
+ bool is_miss_; |
}; |
@@ -467,7 +499,8 @@ class FastCloneShallowArrayStub : public HydrogenCodeStub { |
FastCloneShallowArrayStub(Mode mode, |
AllocationSiteMode allocation_site_mode, |
int length) |
- : mode_(mode), |
+ : HydrogenCodeStub(CODE_STUB_IS_NOT_MISS), |
+ mode_(mode), |
allocation_site_mode_(allocation_site_mode), |
length_((mode == COPY_ON_WRITE_ELEMENTS) ? 0 : length) { |
ASSERT_GE(length_, 0); |
@@ -513,7 +546,7 @@ class FastCloneShallowArrayStub : public HydrogenCodeStub { |
STATIC_ASSERT(kFastCloneModeCount < 16); |
STATIC_ASSERT(kMaximumClonedLength < 16); |
Major MajorKey() { return FastCloneShallowArray; } |
- int MinorKey() { |
+ int NotMissMinorKey() { |
return AllocationSiteModeBits::encode(allocation_site_mode_) |
| ModeBits::encode(mode_) |
| LengthBits::encode(length_); |
@@ -526,7 +559,9 @@ class FastCloneShallowObjectStub : public HydrogenCodeStub { |
// Maximum number of properties in copied object. |
static const int kMaximumClonedProperties = 6; |
- explicit FastCloneShallowObjectStub(int length) : length_(length) { |
+ explicit FastCloneShallowObjectStub(int length) |
+ : HydrogenCodeStub(CODE_STUB_IS_NOT_MISS), |
+ length_(length) { |
ASSERT_GE(length_, 0); |
ASSERT_LE(length_, kMaximumClonedProperties); |
} |
@@ -543,7 +578,7 @@ class FastCloneShallowObjectStub : public HydrogenCodeStub { |
int length_; |
Major MajorKey() { return FastCloneShallowObject; } |
- int MinorKey() { return length_; } |
+ int NotMissMinorKey() { return length_; } |
DISALLOW_COPY_AND_ASSIGN(FastCloneShallowObjectStub); |
}; |
@@ -1291,19 +1326,20 @@ class KeyedLoadDictionaryElementStub : public PlatformCodeStub { |
public: |
KeyedLoadDictionaryElementStub() {} |
- Major MajorKey() { return KeyedLoadElement; } |
- int MinorKey() { return DICTIONARY_ELEMENTS; } |
- |
void Generate(MacroAssembler* masm); |
private: |
+ Major MajorKey() { return KeyedLoadElement; } |
+ int MinorKey() { return DICTIONARY_ELEMENTS; } |
+ |
DISALLOW_COPY_AND_ASSIGN(KeyedLoadDictionaryElementStub); |
}; |
class KeyedLoadFastElementStub : public HydrogenCodeStub { |
public: |
- KeyedLoadFastElementStub(bool is_js_array, ElementsKind elements_kind) { |
+ KeyedLoadFastElementStub(bool is_js_array, ElementsKind elements_kind) |
+ : HydrogenCodeStub(CODE_STUB_IS_NOT_MISS) { |
bit_field_ = ElementsKindBits::encode(elements_kind) | |
IsJSArrayBits::encode(is_js_array); |
} |
@@ -1323,12 +1359,12 @@ class KeyedLoadFastElementStub : public HydrogenCodeStub { |
CodeStubInterfaceDescriptor* descriptor); |
private: |
- class IsJSArrayBits: public BitField<bool, 8, 1> {}; |
class ElementsKindBits: public BitField<ElementsKind, 0, 8> {}; |
+ class IsJSArrayBits: public BitField<bool, 8, 1> {}; |
uint32_t bit_field_; |
Major MajorKey() { return KeyedLoadElement; } |
- int MinorKey() { return bit_field_; } |
+ int NotMissMinorKey() { return bit_field_; } |
DISALLOW_COPY_AND_ASSIGN(KeyedLoadFastElementStub); |
}; |
@@ -1338,15 +1374,13 @@ class KeyedStoreFastElementStub : public HydrogenCodeStub { |
public: |
KeyedStoreFastElementStub(bool is_js_array, |
ElementsKind elements_kind, |
- KeyedAccessStoreMode mode) { |
+ KeyedAccessStoreMode mode) |
+ : HydrogenCodeStub(CODE_STUB_IS_NOT_MISS) { |
bit_field_ = ElementsKindBits::encode(elements_kind) | |
IsJSArrayBits::encode(is_js_array) | |
StoreModeBits::encode(mode); |
} |
- Major MajorKey() { return KeyedStoreElement; } |
- int MinorKey() { return bit_field_; } |
- |
bool is_js_array() const { |
return IsJSArrayBits::decode(bit_field_); |
} |
@@ -1371,6 +1405,9 @@ class KeyedStoreFastElementStub : public HydrogenCodeStub { |
class IsJSArrayBits: public BitField<bool, 12, 1> {}; |
uint32_t bit_field_; |
+ Major MajorKey() { return KeyedStoreElement; } |
+ int NotMissMinorKey() { return bit_field_; } |
+ |
DISALLOW_COPY_AND_ASSIGN(KeyedStoreFastElementStub); |
}; |
@@ -1378,7 +1415,8 @@ class KeyedStoreFastElementStub : public HydrogenCodeStub { |
class TransitionElementsKindStub : public HydrogenCodeStub { |
public: |
TransitionElementsKindStub(ElementsKind from_kind, |
- ElementsKind to_kind) { |
+ ElementsKind to_kind) |
+ : HydrogenCodeStub(CODE_STUB_IS_NOT_MISS) { |
bit_field_ = FromKindBits::encode(from_kind) | |
ToKindBits::encode(to_kind); |
} |
@@ -1403,7 +1441,7 @@ class TransitionElementsKindStub : public HydrogenCodeStub { |
uint32_t bit_field_; |
Major MajorKey() { return TransitionElementsKind; } |
- int MinorKey() { return bit_field_; } |
+ int NotMissMinorKey() { return bit_field_; } |
DISALLOW_COPY_AND_ASSIGN(TransitionElementsKindStub); |
}; |
@@ -1411,12 +1449,10 @@ class TransitionElementsKindStub : public HydrogenCodeStub { |
class ArrayNoArgumentConstructorStub : public HydrogenCodeStub { |
public: |
- ArrayNoArgumentConstructorStub() { |
+ ArrayNoArgumentConstructorStub() |
+ : HydrogenCodeStub(CODE_STUB_IS_NOT_MISS) { |
} |
- Major MajorKey() { return ArrayNoArgumentConstructor; } |
- int MinorKey() { return 0; } |
- |
virtual Handle<Code> GenerateCode(); |
virtual void InitializeInterfaceDescriptor( |
@@ -1424,17 +1460,17 @@ class ArrayNoArgumentConstructorStub : public HydrogenCodeStub { |
CodeStubInterfaceDescriptor* descriptor); |
private: |
+ Major MajorKey() { return ArrayNoArgumentConstructor; } |
+ int NotMissMinorKey() { return 0; } |
+ |
DISALLOW_COPY_AND_ASSIGN(ArrayNoArgumentConstructorStub); |
}; |
class ArraySingleArgumentConstructorStub : public HydrogenCodeStub { |
public: |
- ArraySingleArgumentConstructorStub() { |
- } |
- |
- Major MajorKey() { return ArraySingleArgumentConstructor; } |
- int MinorKey() { return 0; } |
+ ArraySingleArgumentConstructorStub() |
+ : HydrogenCodeStub(CODE_STUB_IS_NOT_MISS) {} |
virtual Handle<Code> GenerateCode(); |
@@ -1443,17 +1479,17 @@ class ArraySingleArgumentConstructorStub : public HydrogenCodeStub { |
CodeStubInterfaceDescriptor* descriptor); |
private: |
+ Major MajorKey() { return ArraySingleArgumentConstructor; } |
+ int NotMissMinorKey() { return 0; } |
+ |
DISALLOW_COPY_AND_ASSIGN(ArraySingleArgumentConstructorStub); |
}; |
class ArrayNArgumentsConstructorStub : public HydrogenCodeStub { |
public: |
- ArrayNArgumentsConstructorStub() { |
- } |
- |
- Major MajorKey() { return ArrayNArgumentsConstructor; } |
- int MinorKey() { return 0; } |
+ ArrayNArgumentsConstructorStub() |
+ : HydrogenCodeStub(CODE_STUB_IS_NOT_MISS) {} |
virtual Handle<Code> GenerateCode(); |
@@ -1462,6 +1498,9 @@ class ArrayNArgumentsConstructorStub : public HydrogenCodeStub { |
CodeStubInterfaceDescriptor* descriptor); |
private: |
+ Major MajorKey() { return ArrayNArgumentsConstructor; } |
+ int NotMissMinorKey() { return 0; } |
+ |
DISALLOW_COPY_AND_ASSIGN(ArrayNArgumentsConstructorStub); |
}; |