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_HYDROGEN_H_ | 5 #ifndef V8_HYDROGEN_H_ |
6 #define V8_HYDROGEN_H_ | 6 #define V8_HYDROGEN_H_ |
7 | 7 |
8 #include "src/accessors.h" | 8 #include "src/accessors.h" |
9 #include "src/allocation.h" | 9 #include "src/allocation.h" |
10 #include "src/ast.h" | 10 #include "src/ast.h" |
(...skipping 2525 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2536 void BuildInlinedCallArray(Expression* expression, int argument_count, | 2536 void BuildInlinedCallArray(Expression* expression, int argument_count, |
2537 Handle<AllocationSite> site); | 2537 Handle<AllocationSite> site); |
2538 | 2538 |
2539 void BuildInitializeInobjectProperties(HValue* receiver, | 2539 void BuildInitializeInobjectProperties(HValue* receiver, |
2540 Handle<Map> initial_map); | 2540 Handle<Map> initial_map); |
2541 | 2541 |
2542 class PropertyAccessInfo { | 2542 class PropertyAccessInfo { |
2543 public: | 2543 public: |
2544 PropertyAccessInfo(HOptimizedGraphBuilder* builder, | 2544 PropertyAccessInfo(HOptimizedGraphBuilder* builder, |
2545 PropertyAccessType access_type, Handle<Map> map, | 2545 PropertyAccessType access_type, Handle<Map> map, |
2546 Handle<String> name) | 2546 Handle<Name> name) |
2547 : builder_(builder), | 2547 : builder_(builder), |
2548 access_type_(access_type), | 2548 access_type_(access_type), |
2549 map_(map), | 2549 map_(map), |
2550 name_(name), | 2550 name_(name), |
2551 field_type_(HType::Tagged()), | 2551 field_type_(HType::Tagged()), |
2552 access_(HObjectAccess::ForMap()), | 2552 access_(HObjectAccess::ForMap()), |
2553 lookup_type_(NOT_FOUND), | 2553 lookup_type_(NOT_FOUND), |
2554 details_(NONE, DATA, Representation::None()) {} | 2554 details_(NONE, DATA, Representation::None()) {} |
2555 | 2555 |
2556 // Checkes whether this PropertyAccessInfo can be handled as a monomorphic | 2556 // Checkes whether this PropertyAccessInfo can be handled as a monomorphic |
2557 // load named. It additionally fills in the fields necessary to generate the | 2557 // load named. It additionally fills in the fields necessary to generate the |
2558 // lookup code. | 2558 // lookup code. |
2559 bool CanAccessMonomorphic(); | 2559 bool CanAccessMonomorphic(); |
2560 | 2560 |
2561 // Checks whether all types behave uniform when loading name. If all maps | 2561 // Checks whether all types behave uniform when loading name. If all maps |
2562 // behave the same, a single monomorphic load instruction can be emitted, | 2562 // behave the same, a single monomorphic load instruction can be emitted, |
2563 // guarded by a single map-checks instruction that whether the receiver is | 2563 // guarded by a single map-checks instruction that whether the receiver is |
2564 // an instance of any of the types. | 2564 // an instance of any of the types. |
2565 // This method skips the first type in types, assuming that this | 2565 // This method skips the first type in types, assuming that this |
2566 // PropertyAccessInfo is built for types->first(). | 2566 // PropertyAccessInfo is built for types->first(). |
2567 bool CanAccessAsMonomorphic(SmallMapList* types); | 2567 bool CanAccessAsMonomorphic(SmallMapList* types); |
2568 | 2568 |
2569 bool NeedsWrappingFor(Handle<JSFunction> target) const; | 2569 bool NeedsWrappingFor(Handle<JSFunction> target) const; |
2570 | 2570 |
2571 Handle<Map> map(); | 2571 Handle<Map> map(); |
2572 Handle<String> name() const { return name_; } | 2572 Handle<Name> name() const { return name_; } |
2573 | 2573 |
2574 bool IsJSObjectFieldAccessor() { | 2574 bool IsJSObjectFieldAccessor() { |
2575 int offset; // unused | 2575 int offset; // unused |
2576 return Accessors::IsJSObjectFieldAccessor(map_, name_, &offset); | 2576 return Accessors::IsJSObjectFieldAccessor(map_, name_, &offset); |
2577 } | 2577 } |
2578 | 2578 |
2579 bool GetJSObjectFieldAccess(HObjectAccess* access) { | 2579 bool GetJSObjectFieldAccess(HObjectAccess* access) { |
2580 int offset; | 2580 int offset; |
2581 if (Accessors::IsJSObjectFieldAccessor(map_, name_, &offset)) { | 2581 if (Accessors::IsJSObjectFieldAccessor(map_, name_, &offset)) { |
2582 if (IsStringType()) { | 2582 if (IsStringType()) { |
2583 DCHECK(String::Equals(isolate()->factory()->length_string(), name_)); | 2583 DCHECK(Name::Equals(isolate()->factory()->length_string(), name_)); |
2584 *access = HObjectAccess::ForStringLength(); | 2584 *access = HObjectAccess::ForStringLength(); |
2585 } else if (IsArrayType()) { | 2585 } else if (IsArrayType()) { |
2586 DCHECK(String::Equals(isolate()->factory()->length_string(), name_)); | 2586 DCHECK(Name::Equals(isolate()->factory()->length_string(), name_)); |
2587 *access = HObjectAccess::ForArrayLength(map_->elements_kind()); | 2587 *access = HObjectAccess::ForArrayLength(map_->elements_kind()); |
2588 } else { | 2588 } else { |
2589 *access = HObjectAccess::ForMapAndOffset(map_, offset); | 2589 *access = HObjectAccess::ForMapAndOffset(map_, offset); |
2590 } | 2590 } |
2591 return true; | 2591 return true; |
2592 } | 2592 } |
2593 return false; | 2593 return false; |
2594 } | 2594 } |
2595 | 2595 |
2596 bool IsJSArrayBufferViewFieldAccessor() { | 2596 bool IsJSArrayBufferViewFieldAccessor() { |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2709 bool IsCompatible(PropertyAccessInfo* other); | 2709 bool IsCompatible(PropertyAccessInfo* other); |
2710 | 2710 |
2711 void GeneralizeRepresentation(Representation r) { | 2711 void GeneralizeRepresentation(Representation r) { |
2712 access_ = access_.WithRepresentation( | 2712 access_ = access_.WithRepresentation( |
2713 access_.representation().generalize(r)); | 2713 access_.representation().generalize(r)); |
2714 } | 2714 } |
2715 | 2715 |
2716 HOptimizedGraphBuilder* builder_; | 2716 HOptimizedGraphBuilder* builder_; |
2717 PropertyAccessType access_type_; | 2717 PropertyAccessType access_type_; |
2718 Handle<Map> map_; | 2718 Handle<Map> map_; |
2719 Handle<String> name_; | 2719 Handle<Name> name_; |
2720 Handle<JSObject> holder_; | 2720 Handle<JSObject> holder_; |
2721 Handle<JSFunction> accessor_; | 2721 Handle<JSFunction> accessor_; |
2722 Handle<JSObject> api_holder_; | 2722 Handle<JSObject> api_holder_; |
2723 Handle<Object> constant_; | 2723 Handle<Object> constant_; |
2724 SmallMapList field_maps_; | 2724 SmallMapList field_maps_; |
2725 HType field_type_; | 2725 HType field_type_; |
2726 HObjectAccess access_; | 2726 HObjectAccess access_; |
2727 | 2727 |
2728 enum { NOT_FOUND, DESCRIPTOR_TYPE, TRANSITION_TYPE } lookup_type_; | 2728 enum { NOT_FOUND, DESCRIPTOR_TYPE, TRANSITION_TYPE } lookup_type_; |
2729 Handle<Map> transition_; | 2729 Handle<Map> transition_; |
(...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3067 } | 3067 } |
3068 | 3068 |
3069 private: | 3069 private: |
3070 HGraphBuilder* builder_; | 3070 HGraphBuilder* builder_; |
3071 }; | 3071 }; |
3072 | 3072 |
3073 | 3073 |
3074 } } // namespace v8::internal | 3074 } } // namespace v8::internal |
3075 | 3075 |
3076 #endif // V8_HYDROGEN_H_ | 3076 #endif // V8_HYDROGEN_H_ |
OLD | NEW |