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

Unified Diff: src/lookup.h

Issue 314953006: Implement LookupIterator designed to replace LookupResult (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Adding to BUILD.gn Created 6 years, 6 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/json-stringifier.h ('k') | src/lookup.cc » ('j') | src/lookup.cc » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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_
« no previous file with comments | « src/json-stringifier.h ('k') | src/lookup.cc » ('j') | src/lookup.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698