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

Unified Diff: src/unscopables.h

Issue 384963002: ES6 Unscopables (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 5 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/runtime.cc ('k') | test/cctest/cctest.gyp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/unscopables.h
diff --git a/src/unscopables.h b/src/unscopables.h
new file mode 100644
index 0000000000000000000000000000000000000000..092a83fa7699a1e3f37264224f04bb3305c7730b
--- /dev/null
+++ b/src/unscopables.h
@@ -0,0 +1,79 @@
+// 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_UNSCOPABLES_H_
+#define V8_UNSCOPABLES_H_
+
+#include "src/isolate.h"
+#include "src/lookup.h"
+#include "src/objects.h"
+#include "src/prototype.h"
+
+namespace v8 {
+namespace internal {
+
+#define RETURN_ON_NO_VALUE_TYPE(isolate, type, name, __value__, return_type) \
+ type name; \
+ do { \
+ Maybe<type> __maybe__ = __value__; \
+ if (!__maybe__.has_value) { \
+ ASSERT((isolate)->has_pending_exception()); \
+ return Maybe<return_type>(); \
+ } \
+ name = __maybe__.value; \
+ } while (false)
Toon Verwaest 2014/07/29 15:12:39 Can you please move these macros next to the other
arv (Not doing code reviews) 2014/07/30 15:39:38 It feels kind of wrong to assume that all usages o
+
+#define RETURN_ON_NO_VALUE(isolate, type, name, __value__) \
+ RETURN_ON_NO_VALUE_TYPE(isolate, type, name, __value__, type)
+
+static Maybe<bool> BlockedByUnscopables(LookupIterator* it) {
+ Isolate* isolate = it->isolate();
+ Handle<Symbol> unscopables_symbol(
+ isolate->native_context()->unscopables_symbol(), isolate);
+
+ // TODO(arv): This should be GetNonHiddenHolder
+ Handle<JSReceiver> object = it->GetHolder<JSReceiver>();
+ RETURN_ON_NO_VALUE(isolate, bool, has_own,
+ JSReceiver::HasOwnProperty(object, unscopables_symbol));
+ if (!has_own) return Maybe<bool>(false);
+
+ Handle<Object> unscopables;
+ MaybeHandle<Object> maybe_unscopables =
+ Object::GetProperty(object, unscopables_symbol);
+ if (!maybe_unscopables.ToHandle(&unscopables)) {
+ return Maybe<bool>();
+ }
+ if (!unscopables->IsSpecObject()) return Maybe<bool>(false);
+ return JSReceiver::HasOwnProperty(Handle<JSReceiver>::cast(unscopables),
+ it->name());
+}
+
+
+/**
+ * Lookups a property in an object environment, taking the unscopables into
+ * account. This is used For HasBinding and GetBindingValue spec algorithms for
+ * ObjectEnvironment.
+ */
+static Maybe<PropertyAttributes> UnscopableLookup(LookupIterator* it) {
+ Isolate* isolate = it->isolate();
+ while (true) {
+ RETURN_ON_NO_VALUE(isolate, PropertyAttributes, attrs,
+ JSReceiver::GetPropertyAttributes(it));
+ if (attrs == ABSENT) break;
+ RETURN_ON_NO_VALUE_TYPE(isolate, bool, blocked, BlockedByUnscopables(it),
+ PropertyAttributes);
+ if (!blocked) return Maybe<PropertyAttributes>(attrs);
+ it->Next();
+ }
+
+ return Maybe<PropertyAttributes>(ABSENT);
+}
+
+
+#undef RETURN_ON_NO_VALUE
+#undef RETURN_ON_NO_VALUE_TYPE
+}
+} // namespace v8::internal
+
+#endif // V8_UNSCOPABLES_H_
« no previous file with comments | « src/runtime.cc ('k') | test/cctest/cctest.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698