OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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_CODE_STUBS_H_ | 5 #ifndef V8_CODE_STUBS_H_ |
6 #define V8_CODE_STUBS_H_ | 6 #define V8_CODE_STUBS_H_ |
7 | 7 |
8 #include "src/allocation.h" | 8 #include "src/allocation.h" |
9 #include "src/assembler.h" | 9 #include "src/assembler.h" |
10 #include "src/codegen.h" | 10 #include "src/codegen.h" |
(...skipping 2297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2308 BOOLEAN, | 2308 BOOLEAN, |
2309 NULL_TYPE, | 2309 NULL_TYPE, |
2310 SMI, | 2310 SMI, |
2311 SPEC_OBJECT, | 2311 SPEC_OBJECT, |
2312 STRING, | 2312 STRING, |
2313 SYMBOL, | 2313 SYMBOL, |
2314 HEAP_NUMBER, | 2314 HEAP_NUMBER, |
2315 NUMBER_OF_TYPES | 2315 NUMBER_OF_TYPES |
2316 }; | 2316 }; |
2317 | 2317 |
| 2318 enum ResultMode { |
| 2319 RESULT_AS_SMI, // For Smi(1) on truthy value, Smi(0) otherwise. |
| 2320 RESULT_AS_ODDBALL, // For {true} on truthy value, {false} otherwise. |
| 2321 RESULT_AS_INVERSE_ODDBALL // For {false} on truthy value, {true} otherwise. |
| 2322 }; |
| 2323 |
2318 // At most 8 different types can be distinguished, because the Code object | 2324 // At most 8 different types can be distinguished, because the Code object |
2319 // only has room for a single byte to hold a set of these types. :-P | 2325 // only has room for a single byte to hold a set of these types. :-P |
2320 STATIC_ASSERT(NUMBER_OF_TYPES <= 8); | 2326 STATIC_ASSERT(NUMBER_OF_TYPES <= 8); |
2321 | 2327 |
2322 class Types : public EnumSet<Type, byte> { | 2328 class Types : public EnumSet<Type, byte> { |
2323 public: | 2329 public: |
2324 Types() : EnumSet<Type, byte>(0) {} | 2330 Types() : EnumSet<Type, byte>(0) {} |
2325 explicit Types(byte bits) : EnumSet<Type, byte>(bits) {} | 2331 explicit Types(byte bits) : EnumSet<Type, byte>(bits) {} |
2326 | 2332 |
2327 byte ToByte() const { return ToIntegral(); } | 2333 byte ToByte() const { return ToIntegral(); } |
2328 bool UpdateStatus(Handle<Object> object); | 2334 bool UpdateStatus(Handle<Object> object); |
2329 bool NeedsMap() const; | 2335 bool NeedsMap() const; |
2330 bool CanBeUndetectable() const; | 2336 bool CanBeUndetectable() const; |
2331 bool IsGeneric() const { return ToIntegral() == Generic().ToIntegral(); } | 2337 bool IsGeneric() const { return ToIntegral() == Generic().ToIntegral(); } |
2332 | 2338 |
2333 static Types Generic() { return Types((1 << NUMBER_OF_TYPES) - 1); } | 2339 static Types Generic() { return Types((1 << NUMBER_OF_TYPES) - 1); } |
2334 }; | 2340 }; |
2335 | 2341 |
2336 ToBooleanStub(Isolate* isolate, Types types = Types()) | 2342 ToBooleanStub(Isolate* isolate, ResultMode mode, Types types = Types()) |
2337 : HydrogenCodeStub(isolate), types_(types) { } | 2343 : HydrogenCodeStub(isolate), types_(types), mode_(mode) {} |
2338 ToBooleanStub(Isolate* isolate, ExtraICState state) | 2344 ToBooleanStub(Isolate* isolate, ExtraICState state) |
2339 : HydrogenCodeStub(isolate), types_(static_cast<byte>(state)) { } | 2345 : HydrogenCodeStub(isolate), |
| 2346 types_(static_cast<byte>(state)), |
| 2347 mode_(RESULT_AS_SMI) {} |
2340 | 2348 |
2341 bool UpdateStatus(Handle<Object> object); | 2349 bool UpdateStatus(Handle<Object> object); |
2342 Types GetTypes() { return types_; } | 2350 Types GetTypes() { return types_; } |
| 2351 ResultMode GetMode() { return mode_; } |
2343 | 2352 |
2344 virtual Handle<Code> GenerateCode() V8_OVERRIDE; | 2353 virtual Handle<Code> GenerateCode() V8_OVERRIDE; |
2345 virtual void InitializeInterfaceDescriptor( | 2354 virtual void InitializeInterfaceDescriptor( |
2346 CodeStubInterfaceDescriptor* descriptor) V8_OVERRIDE; | 2355 CodeStubInterfaceDescriptor* descriptor) V8_OVERRIDE; |
2347 | 2356 |
2348 virtual Code::Kind GetCodeKind() const { return Code::TO_BOOLEAN_IC; } | 2357 virtual Code::Kind GetCodeKind() const { return Code::TO_BOOLEAN_IC; } |
2349 virtual void PrintState(OStream& os) const V8_OVERRIDE; // NOLINT | 2358 virtual void PrintState(OStream& os) const V8_OVERRIDE; // NOLINT |
2350 | 2359 |
2351 virtual bool SometimesSetsUpAFrame() { return false; } | 2360 virtual bool SometimesSetsUpAFrame() { return false; } |
2352 | 2361 |
2353 static void InstallDescriptors(Isolate* isolate) { | 2362 static void InstallDescriptors(Isolate* isolate) { |
2354 ToBooleanStub stub(isolate); | 2363 ToBooleanStub stub(isolate, RESULT_AS_SMI); |
2355 stub.InitializeInterfaceDescriptor( | 2364 stub.InitializeInterfaceDescriptor( |
2356 isolate->code_stub_interface_descriptor(CodeStub::ToBoolean)); | 2365 isolate->code_stub_interface_descriptor(CodeStub::ToBoolean)); |
2357 } | 2366 } |
2358 | 2367 |
2359 static Handle<Code> GetUninitialized(Isolate* isolate) { | 2368 static Handle<Code> GetUninitialized(Isolate* isolate) { |
2360 return ToBooleanStub(isolate, UNINITIALIZED).GetCode(); | 2369 return ToBooleanStub(isolate, UNINITIALIZED).GetCode(); |
2361 } | 2370 } |
2362 | 2371 |
2363 virtual ExtraICState GetExtraICState() const { return types_.ToIntegral(); } | 2372 virtual ExtraICState GetExtraICState() const { return types_.ToIntegral(); } |
2364 | 2373 |
2365 virtual InlineCacheState GetICState() const { | 2374 virtual InlineCacheState GetICState() const { |
2366 if (types_.IsEmpty()) { | 2375 if (types_.IsEmpty()) { |
2367 return ::v8::internal::UNINITIALIZED; | 2376 return ::v8::internal::UNINITIALIZED; |
2368 } else { | 2377 } else { |
2369 return MONOMORPHIC; | 2378 return MONOMORPHIC; |
2370 } | 2379 } |
2371 } | 2380 } |
2372 | 2381 |
2373 private: | 2382 private: |
| 2383 class TypesBits : public BitField<byte, 0, NUMBER_OF_TYPES> {}; |
| 2384 class ResultModeBits : public BitField<ResultMode, NUMBER_OF_TYPES, 2> {}; |
| 2385 |
2374 Major MajorKey() const { return ToBoolean; } | 2386 Major MajorKey() const { return ToBoolean; } |
2375 int NotMissMinorKey() const { return GetExtraICState(); } | 2387 int NotMissMinorKey() const { |
| 2388 return TypesBits::encode(types_.ToByte()) | ResultModeBits::encode(mode_); |
| 2389 } |
2376 | 2390 |
2377 ToBooleanStub(Isolate* isolate, InitializationState init_state) : | 2391 ToBooleanStub(Isolate* isolate, InitializationState init_state) |
2378 HydrogenCodeStub(isolate, init_state) {} | 2392 : HydrogenCodeStub(isolate, init_state), mode_(RESULT_AS_SMI) {} |
2379 | 2393 |
2380 Types types_; | 2394 Types types_; |
| 2395 ResultMode mode_; |
2381 }; | 2396 }; |
2382 | 2397 |
2383 | 2398 |
2384 OStream& operator<<(OStream& os, const ToBooleanStub::Types& t); | 2399 OStream& operator<<(OStream& os, const ToBooleanStub::Types& t); |
2385 | 2400 |
2386 | 2401 |
2387 class ElementsTransitionAndStoreStub : public HydrogenCodeStub { | 2402 class ElementsTransitionAndStoreStub : public HydrogenCodeStub { |
2388 public: | 2403 public: |
2389 ElementsTransitionAndStoreStub(Isolate* isolate, | 2404 ElementsTransitionAndStoreStub(Isolate* isolate, |
2390 ElementsKind from_kind, | 2405 ElementsKind from_kind, |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2510 | 2525 |
2511 | 2526 |
2512 class CallDescriptors { | 2527 class CallDescriptors { |
2513 public: | 2528 public: |
2514 static void InitializeForIsolate(Isolate* isolate); | 2529 static void InitializeForIsolate(Isolate* isolate); |
2515 }; | 2530 }; |
2516 | 2531 |
2517 } } // namespace v8::internal | 2532 } } // namespace v8::internal |
2518 | 2533 |
2519 #endif // V8_CODE_STUBS_H_ | 2534 #endif // V8_CODE_STUBS_H_ |
OLD | NEW |