Index: src/prototype.h |
diff --git a/src/prototype.h b/src/prototype.h |
index 4df1114c7705780ef2a97ae677b734857c9dbf90..75569dc827719acf9df91f19b295ef7e5fd1cb78 100644 |
--- a/src/prototype.h |
+++ b/src/prototype.h |
@@ -39,6 +39,7 @@ class PrototypeIterator { |
Advance(); |
} |
} |
+ |
PrototypeIterator(Isolate* isolate, Object* receiver, |
WhereToStart where_to_start = START_AT_PROTOTYPE) |
: did_jump_to_prototype_chain_(false), |
@@ -48,25 +49,37 @@ class PrototypeIterator { |
Advance(); |
} |
} |
+ |
explicit PrototypeIterator(Map* receiver_map) |
: did_jump_to_prototype_chain_(true), |
object_(receiver_map->prototype()), |
isolate_(receiver_map->GetIsolate()) {} |
+ |
explicit PrototypeIterator(Handle<Map> receiver_map) |
: did_jump_to_prototype_chain_(true), |
object_(NULL), |
handle_(handle(receiver_map->prototype(), receiver_map->GetIsolate())), |
isolate_(receiver_map->GetIsolate()) {} |
+ |
~PrototypeIterator() {} |
- Object* GetCurrent() const { |
+ template <typename T = Object> |
+ T* GetCurrent() const { |
DCHECK(handle_.is_null()); |
- return object_; |
+ return T::cast(object_); |
} |
+ |
static Handle<Object> GetCurrent(const PrototypeIterator& iterator) { |
Jakob Kummerow
2015/09/09 14:29:55
Why do we still need this?
Camillo Bruni
2015/09/10 10:53:59
removed
|
DCHECK(!iterator.handle_.is_null()); |
return iterator.handle_; |
} |
+ |
+ template <typename T> |
+ static Handle<T> GetCurrent(const PrototypeIterator& iterator) { |
+ DCHECK(!iterator.handle_.is_null()); |
+ return Handle<T>::cast(iterator.handle_); |
+ } |
+ |
void Advance() { |
if (handle_.is_null() && object_->IsJSProxy()) { |
did_jump_to_prototype_chain_ = true; |
@@ -79,6 +92,7 @@ class PrototypeIterator { |
} |
AdvanceIgnoringProxies(); |
} |
+ |
void AdvanceIgnoringProxies() { |
if (!did_jump_to_prototype_chain_) { |
did_jump_to_prototype_chain_ = true; |
@@ -96,6 +110,7 @@ class PrototypeIterator { |
} |
} |
} |
+ |
bool IsAtEnd(WhereToEnd where_to_end = END_AT_NULL) const { |
if (handle_.is_null()) { |
return object_->IsNull() || |
@@ -109,10 +124,12 @@ class PrototypeIterator { |
!Handle<HeapObject>::cast(handle_)->map()->is_hidden_prototype()); |
} |
} |
+ |
bool IsAtEnd(Object* final_object) { |
DCHECK(handle_.is_null()); |
return object_->IsNull() || object_ == final_object; |
} |
+ |
bool IsAtEnd(Handle<Object> final_object) { |
DCHECK(!handle_.is_null()); |
return handle_->IsNull() || *handle_ == *final_object; |