Index: src/lookup.h |
diff --git a/src/lookup.h b/src/lookup.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..fb91b4e51f55c149afdd17ea964e095cb2495635 |
--- /dev/null |
+++ b/src/lookup.h |
@@ -0,0 +1,167 @@ |
+// Copyright 2014 the V8 project authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef V8_LOOKUP_H_ |
+#define V8_LOOKUP_H_ |
+ |
+#include "src/factory.h" |
+#include "src/isolate.h" |
+#include "src/objects.h" |
+ |
+namespace v8 { |
+namespace internal { |
+ |
+class LookupIterator V8_FINAL BASE_EMBEDDED { |
+ public: |
+ enum Type { |
rossberg
2014/06/11 15:37:00
Can we not call this Type?
Toon Verwaest
2014/06/11 17:32:18
Renamed to Configuration
On 2014/06/11 15:37:00,
|
+ CHECK_DERIVED = 1 << 0, |
+ CHECK_INTERCEPTOR = 1 << 1, |
+ CHECK_ACCESS_CHECK = 1 << 2, |
+ CHECK_OWN_REAL = 0, |
+ CHECK_ALL = CHECK_DERIVED | CHECK_INTERCEPTOR | CHECK_ACCESS_CHECK, |
+ SKIP_INTERCEPTOR = CHECK_ALL ^ CHECK_INTERCEPTOR |
+ }; |
+ |
+ enum State { |
+ NOT_FOUND, |
+ PROPERTY, |
+ INTERCEPTOR, |
+ ACCESS_CHECK, |
+ JSPROXY |
+ }; |
+ |
+ enum PropertyType { |
rossberg
2014/06/11 15:37:00
PropertyKind, perhaps?
Toon Verwaest
2014/06/11 17:32:18
Done.
|
+ DATA, |
+ ACCESSORS |
rossberg
2014/06/11 15:37:00
Spec says "accessor property", so I'd drop the plu
Toon Verwaest
2014/06/11 17:32:18
Done.
|
+ }; |
+ |
+ enum PropertyEncoding { |
+ DICTIONARY, |
+ DESCRIPTOR |
+ }; |
+ |
+ LookupIterator(Handle<Object> receiver, |
+ Handle<Name> name, |
+ Type type = CHECK_ALL) |
+ : type_(type), |
+ state_(NOT_FOUND), |
+ property_type_(DATA), |
+ property_encoding_(DESCRIPTOR), |
+ property_details_(NONE, NONEXISTENT, Representation::None()), |
+ isolate_(name->GetIsolate()), |
+ name_(name), |
+ maybe_receiver_(receiver), |
+ number_(DescriptorArray::kNotFound) { |
+ Handle<JSReceiver> origin = GetOrigin(); |
+ holder_map_ = handle(origin->map()); |
+ maybe_holder_ = origin; |
+ Next(); |
+ } |
+ |
+ LookupIterator(Handle<Object> receiver, |
+ Handle<Name> name, |
+ Handle<JSReceiver> holder, |
+ Type type = CHECK_ALL) |
+ : type_(type), |
+ state_(NOT_FOUND), |
+ property_type_(DATA), |
+ property_encoding_(DESCRIPTOR), |
+ property_details_(NONE, NONEXISTENT, Representation::None()), |
+ isolate_(name->GetIsolate()), |
+ name_(name), |
+ holder_map_(holder->map()), |
+ maybe_receiver_(receiver), |
+ maybe_holder_(holder), |
+ number_(DescriptorArray::kNotFound) { |
+ Next(); |
+ } |
+ |
+ Isolate* isolate() const { return isolate_; } |
+ State state() const { return state_; } |
+ Handle<Name> name() const { return name_; } |
+ |
+ bool IsFound() const { return state_ != NOT_FOUND; } |
+ void Next(); |
+ |
+ Heap* heap() const { return isolate_->heap(); } |
+ Factory* factory() const { return isolate_->factory(); } |
+ Handle<Object> GetReceiver() const { |
+ return Handle<Object>::cast(maybe_receiver_.ToHandleChecked()); |
+ } |
+ Handle<JSObject> GetHolder() const { |
+ ASSERT(IsFound() && state_ != JSPROXY); |
+ return Handle<JSObject>::cast(maybe_holder_.ToHandleChecked()); |
+ } |
+ Handle<JSReceiver> GetOrigin() const; |
rossberg
2014/06/11 15:37:00
Hm, origin is a bit confusing as well, as it alrea
rossberg
2014/06/11 16:28:47
Perhaps Root might do?
Toon Verwaest
2014/06/11 17:32:18
Done.
|
+ |
+ /* ACCESS_CHECK */ |
+ bool HasAccess(v8::AccessType access_type) const; |
+ |
+ /* PROPERTY */ |
+ // HasProperty needs to be called before any of the other PROPERTY methods |
+ // below can be used. It ensures that we are able to provide a definite |
+ // answer, and loads extra information about the property. |
+ bool HasProperty(); |
+ PropertyType property_type() const { |
+ ASSERT(has_property_); |
+ return property_type_; |
+ } |
+ PropertyDetails property_details() const { |
+ ASSERT(has_property_); |
+ return property_details_; |
+ } |
+ Handle<Object> GetAccessors() const; |
+ Handle<Object> GetDataValue() const; |
+ |
+ /* JSPROXY */ |
+ |
+ Handle<JSProxy> GetJSProxy() const { |
+ return Handle<JSProxy>::cast(maybe_holder_.ToHandleChecked()); |
+ } |
+ |
+ private: |
+ Handle<Map> GetReceiverMap() const; |
+ |
+ MUST_USE_RESULT bool NextHolder(); |
+ void LookupInHolder(); |
+ Handle<Object> FetchValue() const; |
+ |
+ bool IsBootstrapping() const; |
+ |
+ // Methods that fetch data from the holder ensure they always have a holder. |
+ // This means the receiver needs to be present as opposed to just the receiver |
+ // map. Other objects in the prototype chain are transitively guaranteed to be |
+ // present via the receiver map. |
+ bool is_guaranteed_to_have_holder() const { |
+ return !maybe_receiver_.is_null(); |
+ } |
+ bool check_interceptor() const { |
+ return !IsBootstrapping() && (type_ & CHECK_INTERCEPTOR) != 0; |
+ } |
+ bool check_derived() const { |
+ return (type_ & CHECK_DERIVED) != 0; |
+ } |
+ bool check_access_check() const { |
+ return (type_ & CHECK_ACCESS_CHECK) != 0; |
+ } |
+ |
+ Type type_; |
+ State state_; |
+ bool has_property_; |
+ PropertyType property_type_; |
+ PropertyEncoding property_encoding_; |
+ PropertyDetails property_details_; |
+ Isolate* isolate_; |
+ Handle<Name> name_; |
+ Handle<Map> holder_map_; |
+ MaybeHandle<Object> maybe_receiver_; |
+ MaybeHandle<JSReceiver> maybe_holder_; |
+ |
+ int number_; |
+}; |
+ |
+ |
+} } // namespace v8::internal |
+ |
+#endif // V8_LOOKUP_H_ |