OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
226 #define DECLARE_CONCRETE_INSTRUCTION(type) \ | 226 #define DECLARE_CONCRETE_INSTRUCTION(type) \ |
227 virtual LInstruction* CompileToLithium(LChunkBuilder* builder); \ | 227 virtual LInstruction* CompileToLithium(LChunkBuilder* builder); \ |
228 static H##type* cast(HValue* value) { \ | 228 static H##type* cast(HValue* value) { \ |
229 ASSERT(value->Is##type()); \ | 229 ASSERT(value->Is##type()); \ |
230 return reinterpret_cast<H##type*>(value); \ | 230 return reinterpret_cast<H##type*>(value); \ |
231 } \ | 231 } \ |
232 virtual Opcode opcode() const { return HValue::k##type; } | 232 virtual Opcode opcode() const { return HValue::k##type; } |
233 | 233 |
234 | 234 |
235 #ifdef DEBUG | 235 #ifdef DEBUG |
236 #define ASSERT_ALLOCATION_DISABLED do { \ | 236 #define ASSERT_ALLOCATION_DISABLED \ |
237 OptimizingCompilerThread* thread = \ | 237 ASSERT(isolate()->optimizing_compiler_thread()->IsOptimizerThread() || \ |
238 ISOLATE->optimizing_compiler_thread(); \ | 238 !isolate()->heap()->IsAllocationAllowed()) |
239 ASSERT(thread->IsOptimizerThread() || !HEAP->IsAllocationAllowed()); \ | |
240 } while (0) | |
241 #else | 239 #else |
242 #define ASSERT_ALLOCATION_DISABLED do {} while (0) | 240 #define ASSERT_ALLOCATION_DISABLED do {} while (0) |
243 #endif | 241 #endif |
244 | 242 |
245 class Range: public ZoneObject { | 243 class Range: public ZoneObject { |
246 public: | 244 public: |
247 Range() | 245 Range() |
248 : lower_(kMinInt), | 246 : lower_(kMinInt), |
249 upper_(kMaxInt), | 247 upper_(kMaxInt), |
250 next_(NULL), | 248 next_(NULL), |
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
445 | 443 |
446 bool IsUninitialized() { | 444 bool IsUninitialized() { |
447 return type_ == kUninitialized; | 445 return type_ == kUninitialized; |
448 } | 446 } |
449 | 447 |
450 bool IsHeapObject() { | 448 bool IsHeapObject() { |
451 ASSERT(type_ != kUninitialized); | 449 ASSERT(type_ != kUninitialized); |
452 return IsHeapNumber() || IsString() || IsNonPrimitive(); | 450 return IsHeapNumber() || IsString() || IsNonPrimitive(); |
453 } | 451 } |
454 | 452 |
455 static HType TypeFromValue(Handle<Object> value); | 453 static HType TypeFromValue(Isolate* isolate, Handle<Object> value); |
456 | 454 |
457 const char* ToString(); | 455 const char* ToString(); |
458 | 456 |
459 private: | 457 private: |
460 enum Type { | 458 enum Type { |
461 kTagged = 0x1, // 0000 0000 0000 0001 | 459 kTagged = 0x1, // 0000 0000 0000 0001 |
462 kTaggedPrimitive = 0x5, // 0000 0000 0000 0101 | 460 kTaggedPrimitive = 0x5, // 0000 0000 0000 0101 |
463 kTaggedNumber = 0xd, // 0000 0000 0000 1101 | 461 kTaggedNumber = 0xd, // 0000 0000 0000 1101 |
464 kSmi = 0x1d, // 0000 0000 0001 1101 | 462 kSmi = 0x1d, // 0000 0000 0001 1101 |
465 kHeapNumber = 0x2d, // 0000 0000 0010 1101 | 463 kHeapNumber = 0x2d, // 0000 0000 0010 1101 |
(...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
757 type_(HType::Tagged()), | 755 type_(HType::Tagged()), |
758 use_list_(NULL), | 756 use_list_(NULL), |
759 range_(NULL), | 757 range_(NULL), |
760 flags_(0) {} | 758 flags_(0) {} |
761 virtual ~HValue() {} | 759 virtual ~HValue() {} |
762 | 760 |
763 HBasicBlock* block() const { return block_; } | 761 HBasicBlock* block() const { return block_; } |
764 void SetBlock(HBasicBlock* block); | 762 void SetBlock(HBasicBlock* block); |
765 int LoopWeight() const; | 763 int LoopWeight() const; |
766 | 764 |
| 765 // Note: Never call this method for an unlinked value. |
| 766 Isolate* isolate() const; |
| 767 |
767 int id() const { return id_; } | 768 int id() const { return id_; } |
768 void set_id(int id) { id_ = id; } | 769 void set_id(int id) { id_ = id; } |
769 | 770 |
770 HUseIterator uses() const { return HUseIterator(use_list_); } | 771 HUseIterator uses() const { return HUseIterator(use_list_); } |
771 | 772 |
772 virtual bool EmitAtUses() { return false; } | 773 virtual bool EmitAtUses() { return false; } |
773 Representation representation() const { return representation_; } | 774 Representation representation() const { return representation_; } |
774 void ChangeRepresentation(Representation r) { | 775 void ChangeRepresentation(Representation r) { |
775 ASSERT(CheckFlag(kFlexibleRepresentation)); | 776 ASSERT(CheckFlag(kFlexibleRepresentation)); |
776 RepresentationChanged(r); | 777 RepresentationChanged(r); |
(...skipping 1982 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2759 | 2760 |
2760 virtual Representation RequiredInputRepresentation(int index) { | 2761 virtual Representation RequiredInputRepresentation(int index) { |
2761 return Representation::None(); | 2762 return Representation::None(); |
2762 } | 2763 } |
2763 | 2764 |
2764 virtual void PrintDataTo(StringStream* stream); | 2765 virtual void PrintDataTo(StringStream* stream); |
2765 | 2766 |
2766 virtual intptr_t Hashcode() { | 2767 virtual intptr_t Hashcode() { |
2767 ASSERT_ALLOCATION_DISABLED; | 2768 ASSERT_ALLOCATION_DISABLED; |
2768 // Dereferencing to use the object's raw address for hashing is safe. | 2769 // Dereferencing to use the object's raw address for hashing is safe. |
2769 AllowHandleDereference allow_handle_deref; | 2770 AllowHandleDereference allow_handle_deref(isolate()); |
2770 intptr_t hash = 0; | 2771 intptr_t hash = 0; |
2771 for (int i = 0; i < prototypes_.length(); i++) { | 2772 for (int i = 0; i < prototypes_.length(); i++) { |
2772 hash = 17 * hash + reinterpret_cast<intptr_t>(*prototypes_[i]); | 2773 hash = 17 * hash + reinterpret_cast<intptr_t>(*prototypes_[i]); |
2773 hash = 17 * hash + reinterpret_cast<intptr_t>(*maps_[i]); | 2774 hash = 17 * hash + reinterpret_cast<intptr_t>(*maps_[i]); |
2774 } | 2775 } |
2775 return hash; | 2776 return hash; |
2776 } | 2777 } |
2777 | 2778 |
2778 bool CanOmitPrototypeChecks() { | 2779 bool CanOmitPrototypeChecks() { |
2779 for (int i = 0; i < maps()->length(); i++) { | 2780 for (int i = 0; i < maps()->length(); i++) { |
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3063 } | 3064 } |
3064 if (has_double_value_) { | 3065 if (has_double_value_) { |
3065 if (BitCast<int64_t>(double_value_) == BitCast<int64_t>(-0.0) || | 3066 if (BitCast<int64_t>(double_value_) == BitCast<int64_t>(-0.0) || |
3066 isnan(double_value_)) { | 3067 isnan(double_value_)) { |
3067 return true; | 3068 return true; |
3068 } | 3069 } |
3069 return false; | 3070 return false; |
3070 } | 3071 } |
3071 | 3072 |
3072 ASSERT(!handle_.is_null()); | 3073 ASSERT(!handle_.is_null()); |
3073 Heap* heap = HEAP; | 3074 Heap* heap = isolate()->heap(); |
3074 // We should have handled minus_zero_value and nan_value in the | 3075 // We should have handled minus_zero_value and nan_value in the |
3075 // has_double_value_ clause above. | 3076 // has_double_value_ clause above. |
3076 // Dereferencing is safe to compare against singletons. | 3077 // Dereferencing is safe to compare against singletons. |
3077 AllowHandleDereference allow_handle_deref; | 3078 AllowHandleDereference allow_handle_deref(isolate()); |
3078 ASSERT(*handle_ != heap->minus_zero_value()); | 3079 ASSERT(*handle_ != heap->minus_zero_value()); |
3079 ASSERT(*handle_ != heap->nan_value()); | 3080 ASSERT(*handle_ != heap->nan_value()); |
3080 return *handle_ == heap->undefined_value() || | 3081 return *handle_ == heap->undefined_value() || |
3081 *handle_ == heap->null_value() || | 3082 *handle_ == heap->null_value() || |
3082 *handle_ == heap->true_value() || | 3083 *handle_ == heap->true_value() || |
3083 *handle_ == heap->false_value() || | 3084 *handle_ == heap->false_value() || |
3084 *handle_ == heap->the_hole_value() || | 3085 *handle_ == heap->the_hole_value() || |
3085 *handle_ == heap->empty_string(); | 3086 *handle_ == heap->empty_string(); |
3086 } | 3087 } |
3087 | 3088 |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3140 ASSERT_ALLOCATION_DISABLED; | 3141 ASSERT_ALLOCATION_DISABLED; |
3141 intptr_t hash; | 3142 intptr_t hash; |
3142 | 3143 |
3143 if (has_int32_value_) { | 3144 if (has_int32_value_) { |
3144 hash = static_cast<intptr_t>(int32_value_); | 3145 hash = static_cast<intptr_t>(int32_value_); |
3145 } else if (has_double_value_) { | 3146 } else if (has_double_value_) { |
3146 hash = static_cast<intptr_t>(BitCast<int64_t>(double_value_)); | 3147 hash = static_cast<intptr_t>(BitCast<int64_t>(double_value_)); |
3147 } else { | 3148 } else { |
3148 ASSERT(!handle_.is_null()); | 3149 ASSERT(!handle_.is_null()); |
3149 // Dereferencing to use the object's raw address for hashing is safe. | 3150 // Dereferencing to use the object's raw address for hashing is safe. |
3150 AllowHandleDereference allow_handle_deref; | 3151 AllowHandleDereference allow_handle_deref(isolate()); |
3151 hash = reinterpret_cast<intptr_t>(*handle_); | 3152 hash = reinterpret_cast<intptr_t>(*handle_); |
3152 } | 3153 } |
3153 | 3154 |
3154 return hash; | 3155 return hash; |
3155 } | 3156 } |
3156 | 3157 |
3157 #ifdef DEBUG | 3158 #ifdef DEBUG |
3158 virtual void Verify() { } | 3159 virtual void Verify() { } |
3159 #endif | 3160 #endif |
3160 | 3161 |
(...skipping 1310 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4471 } | 4472 } |
4472 | 4473 |
4473 Handle<JSGlobalPropertyCell> cell() const { return cell_; } | 4474 Handle<JSGlobalPropertyCell> cell() const { return cell_; } |
4474 bool RequiresHoleCheck() const; | 4475 bool RequiresHoleCheck() const; |
4475 | 4476 |
4476 virtual void PrintDataTo(StringStream* stream); | 4477 virtual void PrintDataTo(StringStream* stream); |
4477 | 4478 |
4478 virtual intptr_t Hashcode() { | 4479 virtual intptr_t Hashcode() { |
4479 ASSERT_ALLOCATION_DISABLED; | 4480 ASSERT_ALLOCATION_DISABLED; |
4480 // Dereferencing to use the object's raw address for hashing is safe. | 4481 // Dereferencing to use the object's raw address for hashing is safe. |
4481 AllowHandleDereference allow_handle_deref; | 4482 AllowHandleDereference allow_handle_deref(isolate()); |
4482 return reinterpret_cast<intptr_t>(*cell_); | 4483 return reinterpret_cast<intptr_t>(*cell_); |
4483 } | 4484 } |
4484 | 4485 |
4485 virtual Representation RequiredInputRepresentation(int index) { | 4486 virtual Representation RequiredInputRepresentation(int index) { |
4486 return Representation::None(); | 4487 return Representation::None(); |
4487 } | 4488 } |
4488 | 4489 |
4489 DECLARE_CONCRETE_INSTRUCTION(LoadGlobalCell) | 4490 DECLARE_CONCRETE_INSTRUCTION(LoadGlobalCell) |
4490 | 4491 |
4491 protected: | 4492 protected: |
(...skipping 1626 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6118 virtual bool IsDeletable() const { return true; } | 6119 virtual bool IsDeletable() const { return true; } |
6119 }; | 6120 }; |
6120 | 6121 |
6121 | 6122 |
6122 #undef DECLARE_INSTRUCTION | 6123 #undef DECLARE_INSTRUCTION |
6123 #undef DECLARE_CONCRETE_INSTRUCTION | 6124 #undef DECLARE_CONCRETE_INSTRUCTION |
6124 | 6125 |
6125 } } // namespace v8::internal | 6126 } } // namespace v8::internal |
6126 | 6127 |
6127 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ | 6128 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ |
OLD | NEW |