Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(27)

Side by Side Diff: src/prototype.h

Issue 1330153003: Adding template parameter to PrototypeIterator GetCurrent for casting (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: simplifications Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/objects.cc ('k') | src/runtime/runtime-array.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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_PROTOTYPE_H_ 5 #ifndef V8_PROTOTYPE_H_
6 #define V8_PROTOTYPE_H_ 6 #define V8_PROTOTYPE_H_
7 7
8 #include "src/isolate.h" 8 #include "src/isolate.h"
9 #include "src/objects.h" 9 #include "src/objects.h"
10 10
(...skipping 21 matching lines...) Expand all
32 WhereToStart where_to_start = START_AT_PROTOTYPE) 32 WhereToStart where_to_start = START_AT_PROTOTYPE)
33 : did_jump_to_prototype_chain_(false), 33 : did_jump_to_prototype_chain_(false),
34 object_(NULL), 34 object_(NULL),
35 handle_(receiver), 35 handle_(receiver),
36 isolate_(isolate) { 36 isolate_(isolate) {
37 CHECK(!handle_.is_null()); 37 CHECK(!handle_.is_null());
38 if (where_to_start == START_AT_PROTOTYPE) { 38 if (where_to_start == START_AT_PROTOTYPE) {
39 Advance(); 39 Advance();
40 } 40 }
41 } 41 }
42
42 PrototypeIterator(Isolate* isolate, Object* receiver, 43 PrototypeIterator(Isolate* isolate, Object* receiver,
43 WhereToStart where_to_start = START_AT_PROTOTYPE) 44 WhereToStart where_to_start = START_AT_PROTOTYPE)
44 : did_jump_to_prototype_chain_(false), 45 : did_jump_to_prototype_chain_(false),
45 object_(receiver), 46 object_(receiver),
46 isolate_(isolate) { 47 isolate_(isolate) {
47 if (where_to_start == START_AT_PROTOTYPE) { 48 if (where_to_start == START_AT_PROTOTYPE) {
48 Advance(); 49 Advance();
49 } 50 }
50 } 51 }
52
51 explicit PrototypeIterator(Map* receiver_map) 53 explicit PrototypeIterator(Map* receiver_map)
52 : did_jump_to_prototype_chain_(true), 54 : did_jump_to_prototype_chain_(true),
53 object_(receiver_map->prototype()), 55 object_(receiver_map->prototype()),
54 isolate_(receiver_map->GetIsolate()) {} 56 isolate_(receiver_map->GetIsolate()) {}
57
55 explicit PrototypeIterator(Handle<Map> receiver_map) 58 explicit PrototypeIterator(Handle<Map> receiver_map)
56 : did_jump_to_prototype_chain_(true), 59 : did_jump_to_prototype_chain_(true),
57 object_(NULL), 60 object_(NULL),
58 handle_(handle(receiver_map->prototype(), receiver_map->GetIsolate())), 61 handle_(handle(receiver_map->prototype(), receiver_map->GetIsolate())),
59 isolate_(receiver_map->GetIsolate()) {} 62 isolate_(receiver_map->GetIsolate()) {}
63
60 ~PrototypeIterator() {} 64 ~PrototypeIterator() {}
61 65
62 Object* GetCurrent() const { 66 template <typename T = Object>
67 T* GetCurrent() const {
63 DCHECK(handle_.is_null()); 68 DCHECK(handle_.is_null());
64 return object_; 69 return T::cast(object_);
65 } 70 }
66 static Handle<Object> GetCurrent(const PrototypeIterator& iterator) { 71
72 template <typename T = Object>
73 static Handle<T> GetCurrent(const PrototypeIterator& iterator) {
67 DCHECK(!iterator.handle_.is_null()); 74 DCHECK(!iterator.handle_.is_null());
68 return iterator.handle_; 75 return Handle<T>::cast(iterator.handle_);
69 } 76 }
77
70 void Advance() { 78 void Advance() {
71 if (handle_.is_null() && object_->IsJSProxy()) { 79 if (handle_.is_null() && object_->IsJSProxy()) {
72 did_jump_to_prototype_chain_ = true; 80 did_jump_to_prototype_chain_ = true;
73 object_ = isolate_->heap()->null_value(); 81 object_ = isolate_->heap()->null_value();
74 return; 82 return;
75 } else if (!handle_.is_null() && handle_->IsJSProxy()) { 83 } else if (!handle_.is_null() && handle_->IsJSProxy()) {
76 did_jump_to_prototype_chain_ = true; 84 did_jump_to_prototype_chain_ = true;
77 handle_ = handle(isolate_->heap()->null_value(), isolate_); 85 handle_ = handle(isolate_->heap()->null_value(), isolate_);
78 return; 86 return;
79 } 87 }
80 AdvanceIgnoringProxies(); 88 AdvanceIgnoringProxies();
81 } 89 }
90
82 void AdvanceIgnoringProxies() { 91 void AdvanceIgnoringProxies() {
83 if (!did_jump_to_prototype_chain_) { 92 if (!did_jump_to_prototype_chain_) {
84 did_jump_to_prototype_chain_ = true; 93 did_jump_to_prototype_chain_ = true;
85 if (handle_.is_null()) { 94 if (handle_.is_null()) {
86 object_ = object_->GetRootMap(isolate_)->prototype(); 95 object_ = object_->GetRootMap(isolate_)->prototype();
87 } else { 96 } else {
88 handle_ = handle(handle_->GetRootMap(isolate_)->prototype(), isolate_); 97 handle_ = handle(handle_->GetRootMap(isolate_)->prototype(), isolate_);
89 } 98 }
90 } else { 99 } else {
91 if (handle_.is_null()) { 100 if (handle_.is_null()) {
92 object_ = HeapObject::cast(object_)->map()->prototype(); 101 object_ = HeapObject::cast(object_)->map()->prototype();
93 } else { 102 } else {
94 handle_ = 103 handle_ =
95 handle(HeapObject::cast(*handle_)->map()->prototype(), isolate_); 104 handle(HeapObject::cast(*handle_)->map()->prototype(), isolate_);
96 } 105 }
97 } 106 }
98 } 107 }
108
99 bool IsAtEnd(WhereToEnd where_to_end = END_AT_NULL) const { 109 bool IsAtEnd(WhereToEnd where_to_end = END_AT_NULL) const {
100 if (handle_.is_null()) { 110 if (handle_.is_null()) {
101 return object_->IsNull() || 111 return object_->IsNull() ||
102 (did_jump_to_prototype_chain_ && 112 (did_jump_to_prototype_chain_ &&
103 where_to_end == END_AT_NON_HIDDEN && 113 where_to_end == END_AT_NON_HIDDEN &&
104 !HeapObject::cast(object_)->map()->is_hidden_prototype()); 114 !HeapObject::cast(object_)->map()->is_hidden_prototype());
105 } else { 115 } else {
106 return handle_->IsNull() || 116 return handle_->IsNull() ||
107 (did_jump_to_prototype_chain_ && 117 (did_jump_to_prototype_chain_ &&
108 where_to_end == END_AT_NON_HIDDEN && 118 where_to_end == END_AT_NON_HIDDEN &&
109 !Handle<HeapObject>::cast(handle_)->map()->is_hidden_prototype()); 119 !Handle<HeapObject>::cast(handle_)->map()->is_hidden_prototype());
110 } 120 }
111 } 121 }
122
112 bool IsAtEnd(Object* final_object) { 123 bool IsAtEnd(Object* final_object) {
113 DCHECK(handle_.is_null()); 124 DCHECK(handle_.is_null());
114 return object_->IsNull() || object_ == final_object; 125 return object_->IsNull() || object_ == final_object;
115 } 126 }
127
116 bool IsAtEnd(Handle<Object> final_object) { 128 bool IsAtEnd(Handle<Object> final_object) {
117 DCHECK(!handle_.is_null()); 129 DCHECK(!handle_.is_null());
118 return handle_->IsNull() || *handle_ == *final_object; 130 return handle_->IsNull() || *handle_ == *final_object;
119 } 131 }
120 132
121 private: 133 private:
122 bool did_jump_to_prototype_chain_; 134 bool did_jump_to_prototype_chain_;
123 Object* object_; 135 Object* object_;
124 Handle<Object> handle_; 136 Handle<Object> handle_;
125 Isolate* isolate_; 137 Isolate* isolate_;
126 138
127 DISALLOW_COPY_AND_ASSIGN(PrototypeIterator); 139 DISALLOW_COPY_AND_ASSIGN(PrototypeIterator);
128 }; 140 };
129 141
130 142
131 } // namespace internal 143 } // namespace internal
132 144
133 } // namespace v8 145 } // namespace v8
134 146
135 #endif // V8_PROTOTYPE_H_ 147 #endif // V8_PROTOTYPE_H_
OLDNEW
« no previous file with comments | « src/objects.cc ('k') | src/runtime/runtime-array.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698