protected:
virtual HValue* BuildCodeStub() {
- if (casted_stub()->IsMiss()) {
- return BuildCodeInitializedStub();
- } else {
+ if (casted_stub()->IsUninitialized()) {
return BuildCodeUninitializedStub();
+ } else {
+ return BuildCodeInitializedStub();
}
}
if (descriptor->register_param_count_ < 0) {
stub->InitializeInterfaceDescriptor(isolate, descriptor);
}
- // The miss case without stack parameters can use a light-weight stub to enter
+
+ // If we are uninitialized we can use a light-weight stub to enter
// the runtime that is significantly faster than using the standard
// stub-failure deopt mechanism.
- if (stub->IsMiss() && descriptor->stack_parameter_count_ == NULL) {
+ if (stub->IsUninitialized() && descriptor->has_miss_handler()) {
+ ASSERT(descriptor->stack_parameter_count_ == NULL);
return stub->GenerateLightweightMissCode(isolate);
- } else {
- CodeStubGraphBuilder<Stub> builder(stub);
- LChunk* chunk = OptimizeGraph(builder.CreateGraph());
- return chunk->Codegen();
}
+ CodeStubGraphBuilder<Stub> builder(stub);
+ LChunk* chunk = OptimizeGraph(builder.CreateGraph());
+ return chunk->Codegen();
}
template <>
-HValue* CodeStubGraphBuilder<CompareNilICStub>::BuildCodeUninitializedStub() {
+HValue* CodeStubGraphBuilder<CompareNilICStub>::BuildCodeInitializedStub() {
CompareNilICStub* stub = casted_stub();
HIfContinuation continuation;
Handle<Map> sentinel_map(graph()->isolate()->heap()->meta_map());
StubFunctionMode function_mode_;
Register* register_params_;
Address deoptimization_handler_;
- ExternalReference miss_handler_;
int environment_length() const {
if (stack_parameter_count_ != NULL) {
}
bool initialized() const { return register_param_count_ >= 0; }
+
+ void SetMissHandler(ExternalReference handler) {
+ miss_handler_ = handler;
+ has_miss_handler_ = true;
+ }
+
+ ExternalReference miss_handler() {
+ ASSERT(has_miss_handler_);
+ return miss_handler_;
+ }
+
+ bool has_miss_handler() {
+ return has_miss_handler_;
+ }
+
+ private:
+ ExternalReference miss_handler_;
+ bool has_miss_handler_;
};
// A helper to make up for the fact that type Register is not fully
class HydrogenCodeStub : public CodeStub {
public:
enum InitializationState {
- CODE_STUB_IS_NOT_MISS,
- CODE_STUB_IS_MISS
+ UNINITIALIZED,
+ INITIALIZED
};
- explicit HydrogenCodeStub(InitializationState state) {
- is_miss_ = (state == CODE_STUB_IS_MISS);
+ explicit HydrogenCodeStub(InitializationState state = INITIALIZED) {
+ is_uninitialized_ = (state == UNINITIALIZED);
}
virtual Code::Kind GetCodeKind() const { return Code::STUB; }
return isolate->code_stub_interface_descriptor(MajorKey());
}
- bool IsMiss() { return is_miss_; }
+ bool IsUninitialized() { return is_uninitialized_; }
template<class SubClass>
static Handle<Code> GetUninitialized(Isolate* isolate) {
void GenerateLightweightMiss(MacroAssembler* masm);
virtual int MinorKey() {
- return IsMissBits::encode(is_miss_) |
+ return IsMissBits::encode(is_uninitialized_) |
MinorKeyBits::encode(NotMissMinorKey());
}
- bool is_miss_;
+ bool is_uninitialized_;
};
FastCloneShallowArrayStub(Mode mode,
AllocationSiteMode allocation_site_mode,
int length)
- : HydrogenCodeStub(CODE_STUB_IS_NOT_MISS),
- mode_(mode),
+ : mode_(mode),
allocation_site_mode_(allocation_site_mode),
length_((mode == COPY_ON_WRITE_ELEMENTS) ? 0 : length) {
ASSERT_GE(length_, 0);
static const int kMaximumClonedProperties = 6;
explicit FastCloneShallowObjectStub(int length)
- : HydrogenCodeStub(CODE_STUB_IS_NOT_MISS),
- length_(length) {
+ : length_(length) {
ASSERT_GE(length_, 0);
ASSERT_LE(length_, kMaximumClonedProperties);
}
virtual InlineCacheState GetICState() { return MONOMORPHIC; }
protected:
- HICStub() : HydrogenCodeStub(CODE_STUB_IS_NOT_MISS) { }
+ HICStub() { }
class KindBits: public BitField<Code::Kind, 0, 4> {};
virtual Code::Kind kind() const = 0;
};
// boolean flags we need to store. :-P
STATIC_ASSERT(NUMBER_OF_TYPES <= 6);
- CompareNilICStub(EqualityKind kind, NilValue nil, Types types)
- : HydrogenCodeStub(CODE_STUB_IS_NOT_MISS), types_(types) {
+ CompareNilICStub(EqualityKind kind, NilValue nil, Types types = Types())
+ : types_(types) {
equality_kind_ = kind;
nil_value_ = nil;
}
- explicit CompareNilICStub(Code::ExtraICState ic_state)
- : HydrogenCodeStub(CODE_STUB_IS_NOT_MISS) {
+ CompareNilICStub(Code::ExtraICState ic_state,
+ InitializationState init_state = INITIALIZED)
+ : HydrogenCodeStub(init_state) {
equality_kind_ = EqualityKindField::decode(ic_state);
nil_value_ = NilValueField::decode(ic_state);
types_ = Types(ExtractTypesFromExtraICState(ic_state));
static Handle<Code> GetUninitialized(Isolate* isolate,
EqualityKind kind,
NilValue nil) {
- return CompareNilICStub(kind, nil, CODE_STUB_IS_MISS).GetCode(isolate);
+ return CompareNilICStub(kind, nil, UNINITIALIZED).GetCode(isolate);
}
virtual void InitializeInterfaceDescriptor(
CodeStubInterfaceDescriptor* descriptor);
static void InitializeForIsolate(Isolate* isolate) {
- CompareNilICStub compare_stub(kStrictEquality, kNullValue,
- CODE_STUB_IS_MISS);
+ CompareNilICStub compare_stub(kStrictEquality, kNullValue, UNINITIALIZED);
compare_stub.InitializeInterfaceDescriptor(
isolate,
isolate->code_stub_interface_descriptor(CodeStub::CompareNilIC));
CompareNilICStub(EqualityKind kind, NilValue nil,
InitializationState init_state)
- : HydrogenCodeStub(init_state), types_(0) {
+ : HydrogenCodeStub(init_state) {
equality_kind_ = kind;
nil_value_ = nil;
}
- CompareNilICStub(Code::ExtraICState ic_state, InitializationState init_state)
- : HydrogenCodeStub(init_state) {
- equality_kind_ = EqualityKindField::decode(ic_state);
- nil_value_ = NilValueField::decode(ic_state);
- types_ = Types(ExtractTypesFromExtraICState(ic_state));
- }
-
class EqualityKindField : public BitField<EqualityKind, NUMBER_OF_TYPES, 1> {
};
class NilValueField : public BitField<NilValue, NUMBER_OF_TYPES+1, 1> {};
class KeyedLoadFastElementStub : public HydrogenCodeStub {
public:
- KeyedLoadFastElementStub(bool is_js_array, ElementsKind elements_kind)
- : HydrogenCodeStub(CODE_STUB_IS_NOT_MISS) {
+ KeyedLoadFastElementStub(bool is_js_array, ElementsKind elements_kind) {
bit_field_ = ElementsKindBits::encode(elements_kind) |
IsJSArrayBits::encode(is_js_array);
}
public:
KeyedStoreFastElementStub(bool is_js_array,
ElementsKind elements_kind,
- KeyedAccessStoreMode mode)
- : HydrogenCodeStub(CODE_STUB_IS_NOT_MISS) {
+ KeyedAccessStoreMode mode) {
bit_field_ = ElementsKindBits::encode(elements_kind) |
IsJSArrayBits::encode(is_js_array) |
StoreModeBits::encode(mode);
class TransitionElementsKindStub : public HydrogenCodeStub {
public:
TransitionElementsKindStub(ElementsKind from_kind,
- ElementsKind to_kind)
- : HydrogenCodeStub(CODE_STUB_IS_NOT_MISS) {
+ ElementsKind to_kind) {
bit_field_ = FromKindBits::encode(from_kind) |
ToKindBits::encode(to_kind);
}
class ArrayConstructorStubBase : public HydrogenCodeStub {
public:
- ArrayConstructorStubBase(ElementsKind kind, AllocationSiteMode mode)
- : HydrogenCodeStub(CODE_STUB_IS_NOT_MISS) {
+ ArrayConstructorStubBase(ElementsKind kind, AllocationSiteMode mode) {
bit_field_ = ElementsKindBits::encode(kind) |
AllocationSiteModeBits::encode(mode == TRACK_ALLOCATION_SITE);
}