| Index: src/ic.h
|
| ===================================================================
|
| --- src/ic.h (revision 9808)
|
| +++ src/ic.h (working copy)
|
| @@ -198,47 +198,60 @@
|
| class Contextual: public BitField<bool, 0, 1> {};
|
| class StringStubState: public BitField<StringStubFeedback, 1, 1> {};
|
|
|
| - protected:
|
| - CallICBase(Code::Kind kind, Isolate* isolate)
|
| - : IC(EXTRA_CALL_FRAME, isolate), kind_(kind) {}
|
| -
|
| - public:
|
| + // Returns a JSFunction or a Failure.
|
| MUST_USE_RESULT MaybeObject* LoadFunction(State state,
|
| Code::ExtraICState extra_ic_state,
|
| Handle<Object> object,
|
| Handle<String> name);
|
|
|
| protected:
|
| - Code::Kind kind_;
|
| + CallICBase(Code::Kind kind, Isolate* isolate)
|
| + : IC(EXTRA_CALL_FRAME, isolate), kind_(kind) {}
|
|
|
| bool TryUpdateExtraICState(LookupResult* lookup,
|
| Handle<Object> object,
|
| Code::ExtraICState* extra_ic_state);
|
|
|
| - MUST_USE_RESULT MaybeObject* ComputeMonomorphicStub(
|
| - LookupResult* lookup,
|
| - State state,
|
| - Code::ExtraICState extra_ic_state,
|
| - Handle<Object> object,
|
| - Handle<String> name);
|
| + // Compute a monomorphic stub if possible, otherwise return a null handle.
|
| + Handle<Code> ComputeMonomorphicStub(LookupResult* lookup,
|
| + State state,
|
| + Code::ExtraICState extra_state,
|
| + Handle<Object> object,
|
| + Handle<String> name);
|
|
|
| - // Update the inline cache and the global stub cache based on the
|
| - // lookup result.
|
| + // Update the inline cache and the global stub cache based on the lookup
|
| + // result.
|
| void UpdateCaches(LookupResult* lookup,
|
| State state,
|
| Code::ExtraICState extra_ic_state,
|
| Handle<Object> object,
|
| Handle<String> name);
|
|
|
| - // Returns a JSFunction if the object can be called as a function,
|
| - // and patches the stack to be ready for the call.
|
| - // Otherwise, it returns the undefined value.
|
| - Object* TryCallAsFunction(Object* object);
|
| + // Returns a JSFunction if the object can be called as a function, and
|
| + // patches the stack to be ready for the call. Otherwise, it returns the
|
| + // undefined value.
|
| + Handle<Object> TryCallAsFunction(Handle<Object> object);
|
|
|
| void ReceiverToObjectIfRequired(Handle<Object> callee, Handle<Object> object);
|
|
|
| static void Clear(Address address, Code* target);
|
|
|
| + // Platform-specific code generation functions used by both call and
|
| + // keyed call.
|
| + static void GenerateMiss(MacroAssembler* masm,
|
| + int argc,
|
| + IC::UtilityId id,
|
| + Code::ExtraICState extra_state);
|
| +
|
| + static void GenerateNormal(MacroAssembler* masm, int argc);
|
| +
|
| + static void GenerateMonomorphicCacheProbe(MacroAssembler* masm,
|
| + int argc,
|
| + Code::Kind kind,
|
| + Code::ExtraICState extra_state);
|
| +
|
| + Code::Kind kind_;
|
| +
|
| friend class IC;
|
| };
|
|
|
| @@ -252,16 +265,24 @@
|
| // Code generator routines.
|
| static void GenerateInitialize(MacroAssembler* masm,
|
| int argc,
|
| - Code::ExtraICState extra_ic_state) {
|
| - GenerateMiss(masm, argc, extra_ic_state);
|
| + Code::ExtraICState extra_state) {
|
| + GenerateMiss(masm, argc, extra_state);
|
| }
|
| +
|
| static void GenerateMiss(MacroAssembler* masm,
|
| int argc,
|
| - Code::ExtraICState extra_ic_state);
|
| + Code::ExtraICState extra_state) {
|
| + CallICBase::GenerateMiss(masm, argc, IC::kCallIC_Miss, extra_state);
|
| + }
|
| +
|
| static void GenerateMegamorphic(MacroAssembler* masm,
|
| int argc,
|
| Code::ExtraICState extra_ic_state);
|
| - static void GenerateNormal(MacroAssembler* masm, int argc);
|
| +
|
| + static void GenerateNormal(MacroAssembler* masm, int argc) {
|
| + CallICBase::GenerateNormal(masm, argc);
|
| + GenerateMiss(masm, argc, Code::kNoExtraICState);
|
| + }
|
| };
|
|
|
|
|
| @@ -280,7 +301,12 @@
|
| static void GenerateInitialize(MacroAssembler* masm, int argc) {
|
| GenerateMiss(masm, argc);
|
| }
|
| - static void GenerateMiss(MacroAssembler* masm, int argc);
|
| +
|
| + static void GenerateMiss(MacroAssembler* masm, int argc) {
|
| + CallICBase::GenerateMiss(masm, argc, IC::kKeyedCallIC_Miss,
|
| + Code::kNoExtraICState);
|
| + }
|
| +
|
| static void GenerateMegamorphic(MacroAssembler* masm, int argc);
|
| static void GenerateNormal(MacroAssembler* masm, int argc);
|
| static void GenerateNonStrictArguments(MacroAssembler* masm, int argc);
|
| @@ -321,17 +347,15 @@
|
| Handle<String> name);
|
|
|
| // Stub accessors.
|
| - Code* megamorphic_stub() {
|
| - return isolate()->builtins()->builtin(
|
| - Builtins::kLoadIC_Megamorphic);
|
| + Handle<Code> megamorphic_stub() {
|
| + return isolate()->builtins()->LoadIC_Megamorphic();
|
| }
|
| static Code* initialize_stub() {
|
| return Isolate::Current()->builtins()->builtin(
|
| Builtins::kLoadIC_Initialize);
|
| }
|
| - Code* pre_monomorphic_stub() {
|
| - return isolate()->builtins()->builtin(
|
| - Builtins::kLoadIC_PreMonomorphic);
|
| + Handle<Code> pre_monomorphic_stub() {
|
| + return isolate()->builtins()->LoadIC_PreMonomorphic();
|
| }
|
|
|
| static void Clear(Address address, Code* target);
|
| @@ -352,38 +376,39 @@
|
| explicit KeyedIC(Isolate* isolate) : IC(NO_EXTRA_FRAME, isolate) {}
|
| virtual ~KeyedIC() {}
|
|
|
| - virtual MaybeObject* GetElementStubWithoutMapCheck(
|
| + virtual Handle<Code> GetElementStubWithoutMapCheck(
|
| bool is_js_array,
|
| ElementsKind elements_kind) = 0;
|
|
|
| protected:
|
| - virtual Code* string_stub() {
|
| - return NULL;
|
| + virtual Handle<Code> string_stub() {
|
| + return Handle<Code>::null();
|
| }
|
|
|
| virtual Code::Kind kind() const = 0;
|
|
|
| - MaybeObject* ComputeStub(JSObject* receiver,
|
| + Handle<Code> ComputeStub(Handle<JSObject> receiver,
|
| StubKind stub_kind,
|
| StrictModeFlag strict_mode,
|
| - Code* default_stub);
|
| + Handle<Code> default_stub);
|
|
|
| - virtual MaybeObject* ComputePolymorphicStub(MapList* receiver_maps,
|
| + virtual Handle<Code> ComputePolymorphicStub(MapHandleList* receiver_maps,
|
| StrictModeFlag strict_mode) = 0;
|
|
|
| - MaybeObject* ComputeMonomorphicStubWithoutMapCheck(
|
| - Map* receiver_map,
|
| + Handle<Code> ComputeMonomorphicStubWithoutMapCheck(
|
| + Handle<Map> receiver_map,
|
| StrictModeFlag strict_mode);
|
|
|
| private:
|
| - void GetReceiverMapsForStub(Code* stub, MapList* result);
|
| + void GetReceiverMapsForStub(Handle<Code> stub, MapHandleList* result);
|
|
|
| - MaybeObject* ComputeMonomorphicStub(JSObject* receiver,
|
| + Handle<Code> ComputeMonomorphicStub(Handle<JSObject> receiver,
|
| StubKind stub_kind,
|
| StrictModeFlag strict_mode,
|
| - Code* default_stub);
|
| + Handle<Code> default_stub);
|
|
|
| - MaybeObject* ComputeTransitionedMap(JSObject* receiver, StubKind stub_kind);
|
| + Handle<Map> ComputeTransitionedMap(Handle<JSObject> receiver,
|
| + StubKind stub_kind);
|
|
|
| static bool IsTransitionStubKind(StubKind stub_kind) {
|
| return stub_kind > STORE_NO_TRANSITION;
|
| @@ -423,20 +448,18 @@
|
| static const int kSlowCaseBitFieldMask =
|
| (1 << Map::kIsAccessCheckNeeded) | (1 << Map::kHasIndexedInterceptor);
|
|
|
| - virtual MaybeObject* GetElementStubWithoutMapCheck(
|
| + virtual Handle<Code> GetElementStubWithoutMapCheck(
|
| bool is_js_array,
|
| ElementsKind elements_kind);
|
|
|
| protected:
|
| virtual Code::Kind kind() const { return Code::KEYED_LOAD_IC; }
|
|
|
| - virtual MaybeObject* ComputePolymorphicStub(
|
| - MapList* receiver_maps,
|
| - StrictModeFlag strict_mode);
|
| + virtual Handle<Code> ComputePolymorphicStub(MapHandleList* receiver_maps,
|
| + StrictModeFlag strict_mode);
|
|
|
| - virtual Code* string_stub() {
|
| - return isolate()->builtins()->builtin(
|
| - Builtins::kKeyedLoadIC_String);
|
| + virtual Handle<Code> string_stub() {
|
| + return isolate()->builtins()->KeyedLoadIC_String();
|
| }
|
|
|
| private:
|
| @@ -451,25 +474,20 @@
|
| return Isolate::Current()->builtins()->builtin(
|
| Builtins::kKeyedLoadIC_Initialize);
|
| }
|
| - Code* megamorphic_stub() {
|
| - return isolate()->builtins()->builtin(
|
| - Builtins::kKeyedLoadIC_Generic);
|
| + Handle<Code> megamorphic_stub() {
|
| + return isolate()->builtins()->KeyedLoadIC_Generic();
|
| }
|
| - Code* generic_stub() {
|
| - return isolate()->builtins()->builtin(
|
| - Builtins::kKeyedLoadIC_Generic);
|
| + Handle<Code> generic_stub() {
|
| + return isolate()->builtins()->KeyedLoadIC_Generic();
|
| }
|
| - Code* pre_monomorphic_stub() {
|
| - return isolate()->builtins()->builtin(
|
| - Builtins::kKeyedLoadIC_PreMonomorphic);
|
| + Handle<Code> pre_monomorphic_stub() {
|
| + return isolate()->builtins()->KeyedLoadIC_PreMonomorphic();
|
| }
|
| - Code* indexed_interceptor_stub() {
|
| - return isolate()->builtins()->builtin(
|
| - Builtins::kKeyedLoadIC_IndexedInterceptor);
|
| + Handle<Code> indexed_interceptor_stub() {
|
| + return isolate()->builtins()->KeyedLoadIC_IndexedInterceptor();
|
| }
|
| - Code* non_strict_arguments_stub() {
|
| - return isolate()->builtins()->builtin(
|
| - Builtins::kKeyedLoadIC_NonStrictArguments);
|
| + Handle<Code> non_strict_arguments_stub() {
|
| + return isolate()->builtins()->KeyedLoadIC_NonStrictArguments();
|
| }
|
|
|
| static void Clear(Address address, Code* target);
|
| @@ -534,13 +552,11 @@
|
| return Isolate::Current()->builtins()->builtin(
|
| Builtins::kStoreIC_Initialize_Strict);
|
| }
|
| - Code* global_proxy_stub() {
|
| - return isolate()->builtins()->builtin(
|
| - Builtins::kStoreIC_GlobalProxy);
|
| + Handle<Code> global_proxy_stub() {
|
| + return isolate()->builtins()->StoreIC_GlobalProxy();
|
| }
|
| - Code* global_proxy_stub_strict() {
|
| - return isolate()->builtins()->builtin(
|
| - Builtins::kStoreIC_GlobalProxy_Strict);
|
| + Handle<Code> global_proxy_stub_strict() {
|
| + return isolate()->builtins()->StoreIC_GlobalProxy_Strict();
|
| }
|
|
|
| static void Clear(Address address, Code* target);
|
| @@ -572,17 +588,18 @@
|
| StrictModeFlag strict_mode);
|
| static void GenerateGeneric(MacroAssembler* masm, StrictModeFlag strict_mode);
|
| static void GenerateNonStrictArguments(MacroAssembler* masm);
|
| + static void GenerateTransitionElementsSmiToDouble(MacroAssembler* masm);
|
| + static void GenerateTransitionElementsDoubleToObject(MacroAssembler* masm);
|
|
|
| - virtual MaybeObject* GetElementStubWithoutMapCheck(
|
| + virtual Handle<Code> GetElementStubWithoutMapCheck(
|
| bool is_js_array,
|
| ElementsKind elements_kind);
|
|
|
| protected:
|
| virtual Code::Kind kind() const { return Code::KEYED_STORE_IC; }
|
|
|
| - virtual MaybeObject* ComputePolymorphicStub(
|
| - MapList* receiver_maps,
|
| - StrictModeFlag strict_mode);
|
| + virtual Handle<Code> ComputePolymorphicStub(MapHandleList* receiver_maps,
|
| + StrictModeFlag strict_mode);
|
|
|
| private:
|
| // Update the inline cache.
|
| @@ -605,30 +622,25 @@
|
| return Isolate::Current()->builtins()->builtin(
|
| Builtins::kKeyedStoreIC_Initialize);
|
| }
|
| - Code* megamorphic_stub() {
|
| - return isolate()->builtins()->builtin(
|
| - Builtins::kKeyedStoreIC_Generic);
|
| - }
|
| static Code* initialize_stub_strict() {
|
| return Isolate::Current()->builtins()->builtin(
|
| Builtins::kKeyedStoreIC_Initialize_Strict);
|
| }
|
| - Code* megamorphic_stub_strict() {
|
| - return isolate()->builtins()->builtin(
|
| - Builtins::kKeyedStoreIC_Generic_Strict);
|
| + Handle<Code> megamorphic_stub() {
|
| + return isolate()->builtins()->KeyedStoreIC_Generic();
|
| }
|
| - Code* generic_stub() {
|
| - return isolate()->builtins()->builtin(
|
| - Builtins::kKeyedStoreIC_Generic);
|
| + Handle<Code> megamorphic_stub_strict() {
|
| + return isolate()->builtins()->KeyedStoreIC_Generic_Strict();
|
| }
|
| - Code* generic_stub_strict() {
|
| - return isolate()->builtins()->builtin(
|
| - Builtins::kKeyedStoreIC_Generic_Strict);
|
| + Handle<Code> generic_stub() {
|
| + return isolate()->builtins()->KeyedStoreIC_Generic();
|
| }
|
| - Code* non_strict_arguments_stub() {
|
| - return isolate()->builtins()->builtin(
|
| - Builtins::kKeyedStoreIC_NonStrictArguments);
|
| + Handle<Code> generic_stub_strict() {
|
| + return isolate()->builtins()->KeyedStoreIC_Generic_Strict();
|
| }
|
| + Handle<Code> non_strict_arguments_stub() {
|
| + return isolate()->builtins()->KeyedStoreIC_NonStrictArguments();
|
| + }
|
|
|
| static void Clear(Address address, Code* target);
|
|
|
|
|