| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef V8_IC_HANDLER_COMPILER_H_ | 5 #ifndef V8_IC_HANDLER_COMPILER_H_ |
| 6 #define V8_IC_HANDLER_COMPILER_H_ | 6 #define V8_IC_HANDLER_COMPILER_H_ |
| 7 | 7 |
| 8 #include "src/ic/access-compiler.h" | 8 #include "src/ic/access-compiler.h" |
| 9 #include "src/ic/ic-state.h" | 9 #include "src/ic/ic-state.h" |
| 10 | 10 |
| 11 namespace v8 { | 11 namespace v8 { |
| 12 namespace internal { | 12 namespace internal { |
| 13 | 13 |
| 14 class CallOptimization; | 14 class CallOptimization; |
| 15 | 15 |
| 16 enum PrototypeCheckType { CHECK_ALL_MAPS, SKIP_RECEIVER }; | 16 enum PrototypeCheckType { CHECK_ALL_MAPS, SKIP_RECEIVER }; |
| 17 enum ReturnHolder { RETURN_HOLDER, DONT_RETURN_ANYTHING }; |
| 17 | 18 |
| 18 class PropertyHandlerCompiler : public PropertyAccessCompiler { | 19 class PropertyHandlerCompiler : public PropertyAccessCompiler { |
| 19 public: | 20 public: |
| 20 static Handle<Code> Find(Handle<Name> name, Handle<Map> map, Code::Kind kind, | 21 static Handle<Code> Find(Handle<Name> name, Handle<Map> map, Code::Kind kind, |
| 21 CacheHolderFlag cache_holder, Code::StubType type); | 22 CacheHolderFlag cache_holder, Code::StubType type); |
| 22 | 23 |
| 23 protected: | 24 protected: |
| 24 PropertyHandlerCompiler(Isolate* isolate, Code::Kind kind, Handle<Map> map, | 25 PropertyHandlerCompiler(Isolate* isolate, Code::Kind kind, Handle<Map> map, |
| 25 Handle<JSObject> holder, CacheHolderFlag cache_holder) | 26 Handle<JSObject> holder, CacheHolderFlag cache_holder) |
| 26 : PropertyAccessCompiler(isolate, kind, cache_holder), | 27 : PropertyAccessCompiler(isolate, kind, cache_holder), |
| 27 map_(map), | 28 map_(map), |
| 28 holder_(holder) {} | 29 holder_(holder) {} |
| 29 | 30 |
| 30 virtual ~PropertyHandlerCompiler() {} | 31 virtual ~PropertyHandlerCompiler() {} |
| 31 | 32 |
| 32 virtual Register FrontendHeader(Register object_reg, Handle<Name> name, | 33 virtual Register FrontendHeader(Register object_reg, Handle<Name> name, |
| 33 Label* miss) { | 34 Label* miss, ReturnHolder return_what) { |
| 34 UNREACHABLE(); | 35 UNREACHABLE(); |
| 35 return receiver(); | 36 return receiver(); |
| 36 } | 37 } |
| 37 | 38 |
| 38 virtual void FrontendFooter(Handle<Name> name, Label* miss) { UNREACHABLE(); } | 39 virtual void FrontendFooter(Handle<Name> name, Label* miss) { UNREACHABLE(); } |
| 39 | 40 |
| 40 // Frontend loads from receiver(), returns holder register which may be | 41 // Frontend loads from receiver(), returns holder register which may be |
| 41 // different. | 42 // different. |
| 42 Register Frontend(Handle<Name> name); | 43 Register Frontend(Handle<Name> name); |
| 43 void NonexistentFrontendHeader(Handle<Name> name, Label* miss, | 44 void NonexistentFrontendHeader(Handle<Name> name, Label* miss, |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 88 // code for security check in case of global object holders. Helps to make | 89 // code for security check in case of global object holders. Helps to make |
| 89 // sure that the current IC is still valid. | 90 // sure that the current IC is still valid. |
| 90 // | 91 // |
| 91 // The scratch and holder registers are always clobbered, but the object | 92 // The scratch and holder registers are always clobbered, but the object |
| 92 // register is only clobbered if it the same as the holder register. The | 93 // register is only clobbered if it the same as the holder register. The |
| 93 // function returns a register containing the holder - either object_reg or | 94 // function returns a register containing the holder - either object_reg or |
| 94 // holder_reg. | 95 // holder_reg. |
| 95 Register CheckPrototypes(Register object_reg, Register holder_reg, | 96 Register CheckPrototypes(Register object_reg, Register holder_reg, |
| 96 Register scratch1, Register scratch2, | 97 Register scratch1, Register scratch2, |
| 97 Handle<Name> name, Label* miss, | 98 Handle<Name> name, Label* miss, |
| 98 PrototypeCheckType check = CHECK_ALL_MAPS); | 99 PrototypeCheckType check, ReturnHolder return_what); |
| 99 | 100 |
| 100 Handle<Code> GetCode(Code::Kind kind, Code::StubType type, Handle<Name> name); | 101 Handle<Code> GetCode(Code::Kind kind, Code::StubType type, Handle<Name> name); |
| 101 void set_holder(Handle<JSObject> holder) { holder_ = holder; } | 102 void set_holder(Handle<JSObject> holder) { holder_ = holder; } |
| 102 Handle<Map> map() const { return map_; } | 103 Handle<Map> map() const { return map_; } |
| 103 void set_map(Handle<Map> map) { map_ = map; } | 104 void set_map(Handle<Map> map) { map_ = map; } |
| 104 Handle<JSObject> holder() const { return holder_; } | 105 Handle<JSObject> holder() const { return holder_; } |
| 105 | 106 |
| 106 private: | 107 private: |
| 107 Handle<Map> map_; | 108 Handle<Map> map_; |
| 108 Handle<JSObject> holder_; | 109 Handle<JSObject> holder_; |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 165 // stack. The arguments are pushed by the (platform-specific) | 166 // stack. The arguments are pushed by the (platform-specific) |
| 166 // PushInterceptorArguments and read by LoadPropertyWithInterceptorOnly and | 167 // PushInterceptorArguments and read by LoadPropertyWithInterceptorOnly and |
| 167 // LoadWithInterceptor. | 168 // LoadWithInterceptor. |
| 168 static const int kInterceptorArgsNameIndex = 0; | 169 static const int kInterceptorArgsNameIndex = 0; |
| 169 static const int kInterceptorArgsThisIndex = 1; | 170 static const int kInterceptorArgsThisIndex = 1; |
| 170 static const int kInterceptorArgsHolderIndex = 2; | 171 static const int kInterceptorArgsHolderIndex = 2; |
| 171 static const int kInterceptorArgsLength = 3; | 172 static const int kInterceptorArgsLength = 3; |
| 172 | 173 |
| 173 protected: | 174 protected: |
| 174 virtual Register FrontendHeader(Register object_reg, Handle<Name> name, | 175 virtual Register FrontendHeader(Register object_reg, Handle<Name> name, |
| 175 Label* miss); | 176 Label* miss, ReturnHolder return_what); |
| 176 | 177 |
| 177 virtual void FrontendFooter(Handle<Name> name, Label* miss); | 178 virtual void FrontendFooter(Handle<Name> name, Label* miss); |
| 178 | 179 |
| 179 private: | 180 private: |
| 180 Handle<Code> CompileLoadNonexistent(Handle<Name> name); | 181 Handle<Code> CompileLoadNonexistent(Handle<Name> name); |
| 181 void GenerateLoadConstant(Handle<Object> value); | 182 void GenerateLoadConstant(Handle<Object> value); |
| 182 void GenerateLoadCallback(Register reg, | 183 void GenerateLoadCallback(Register reg, |
| 183 Handle<ExecutableAccessorInfo> callback); | 184 Handle<ExecutableAccessorInfo> callback); |
| 184 void GenerateLoadCallback(const CallOptimization& call_optimization, | 185 void GenerateLoadCallback(const CallOptimization& call_optimization, |
| 185 Handle<Map> receiver_map); | 186 Handle<Map> receiver_map); |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 239 | 240 |
| 240 static void GenerateStoreViaSetterForDeopt(MacroAssembler* masm) { | 241 static void GenerateStoreViaSetterForDeopt(MacroAssembler* masm) { |
| 241 GenerateStoreViaSetter(masm, Handle<Map>::null(), no_reg, no_reg, -1, -1, | 242 GenerateStoreViaSetter(masm, Handle<Map>::null(), no_reg, no_reg, -1, -1, |
| 242 no_reg); | 243 no_reg); |
| 243 } | 244 } |
| 244 | 245 |
| 245 static void GenerateSlow(MacroAssembler* masm); | 246 static void GenerateSlow(MacroAssembler* masm); |
| 246 | 247 |
| 247 protected: | 248 protected: |
| 248 virtual Register FrontendHeader(Register object_reg, Handle<Name> name, | 249 virtual Register FrontendHeader(Register object_reg, Handle<Name> name, |
| 249 Label* miss); | 250 Label* miss, ReturnHolder return_what); |
| 250 | 251 |
| 251 virtual void FrontendFooter(Handle<Name> name, Label* miss); | 252 virtual void FrontendFooter(Handle<Name> name, Label* miss); |
| 252 void GenerateRestoreName(Label* label, Handle<Name> name); | 253 void GenerateRestoreName(Label* label, Handle<Name> name); |
| 253 | 254 |
| 254 private: | 255 private: |
| 255 void GenerateRestoreName(Handle<Name> name); | 256 void GenerateRestoreName(Handle<Name> name); |
| 256 void GenerateRestoreMap(Handle<Map> transition, Register scratch, | 257 void GenerateRestoreMap(Handle<Map> transition, Register scratch, |
| 257 Label* miss); | 258 Label* miss); |
| 258 | 259 |
| 259 void GenerateConstantCheck(Register map_reg, int descriptor, | 260 void GenerateConstantCheck(Register map_reg, int descriptor, |
| (...skipping 30 matching lines...) Expand all Loading... |
| 290 | 291 |
| 291 void CompileElementHandlers(MapHandleList* receiver_maps, | 292 void CompileElementHandlers(MapHandleList* receiver_maps, |
| 292 CodeHandleList* handlers); | 293 CodeHandleList* handlers); |
| 293 | 294 |
| 294 static void GenerateStoreSlow(MacroAssembler* masm); | 295 static void GenerateStoreSlow(MacroAssembler* masm); |
| 295 }; | 296 }; |
| 296 } | 297 } |
| 297 } // namespace v8::internal | 298 } // namespace v8::internal |
| 298 | 299 |
| 299 #endif // V8_IC_HANDLER_COMPILER_H_ | 300 #endif // V8_IC_HANDLER_COMPILER_H_ |
| OLD | NEW |