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

Unified Diff: src/runtime/runtime-scopes.cc

Issue 2334733002: [runtime] Intercept function declarations. (Closed)
Patch Set: Fix test. Created 4 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | test/cctest/test-api-interceptors.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/runtime/runtime-scopes.cc
diff --git a/src/runtime/runtime-scopes.cc b/src/runtime/runtime-scopes.cc
index c0b7efe1dca13d53843a6a3d5423764817baf381..92dfcad66ec78a9c55e143663434e5140fdd2509 100644
--- a/src/runtime/runtime-scopes.cc
+++ b/src/runtime/runtime-scopes.cc
@@ -44,7 +44,7 @@ Object* ThrowRedeclarationError(Isolate* isolate, Handle<String> name,
Object* DeclareGlobal(
Isolate* isolate, Handle<JSGlobalObject> global, Handle<String> name,
Handle<Object> value, PropertyAttributes attr, bool is_var,
- bool is_function, RedeclarationType redeclaration_type,
+ bool is_function_declaration, RedeclarationType redeclaration_type,
Handle<TypeFeedbackVector> feedback_vector = Handle<TypeFeedbackVector>(),
FeedbackVectorSlot slot = FeedbackVectorSlot::Invalid()) {
Handle<ScriptContextTable> script_contexts(
@@ -60,7 +60,14 @@ Object* DeclareGlobal(
}
// Do the lookup own properties only, see ES5 erratum.
- LookupIterator it(global, name, global, LookupIterator::OWN_SKIP_INTERCEPTOR);
+ LookupIterator::Configuration lookup_config(
+ LookupIterator::Configuration::OWN_SKIP_INTERCEPTOR);
+ if (is_function_declaration) {
+ // For function declarations, use the interceptor on the declaration. For
+ // non-functions, use it only on initialization.
+ lookup_config = LookupIterator::Configuration::OWN;
+ }
+ LookupIterator it(global, name, global, lookup_config);
Maybe<PropertyAttributes> maybe = JSReceiver::GetPropertyAttributes(&it);
if (!maybe.IsJust()) return isolate->heap()->exception();
@@ -71,7 +78,7 @@ Object* DeclareGlobal(
// Skip var re-declarations.
if (is_var) return isolate->heap()->undefined_value();
- DCHECK(is_function);
+ DCHECK(is_function_declaration);
if ((old_attributes & DONT_DELETE) != 0) {
// Only allow reconfiguring globals to functions in user code (no
// natives, which are marked as read-only).
@@ -83,9 +90,9 @@ Object* DeclareGlobal(
if (old_details.IsReadOnly() || old_details.IsDontEnum() ||
(it.state() == LookupIterator::ACCESSOR &&
it.GetAccessors()->IsAccessorPair())) {
- // ES#sec-globaldeclarationinstantiation 5.d:
+ // ECMA-262 section 15.1.11 GlobalDeclarationInstantiation 5.d:
// If hasRestrictedGlobal is true, throw a SyntaxError exception.
- // ES#sec-evaldeclarationinstantiation 8.a.iv.1.b:
+ // ECMA-262 section 18.2.1.3 EvalDeclarationInstantiation 8.a.iv.1.b:
// If fnDefinable is false, throw a TypeError exception.
return ThrowRedeclarationError(isolate, name, redeclaration_type);
}
@@ -102,6 +109,10 @@ Object* DeclareGlobal(
if (it.state() == LookupIterator::ACCESSOR) it.Delete();
}
+ if (is_function_declaration) {
+ it.Restart();
+ }
+
// Define or redefine own property.
RETURN_FAILURE_ON_EXCEPTION(
isolate, JSObject::DefineOwnPropertyIgnoreAttributes(&it, value, attr));
« no previous file with comments | « no previous file | test/cctest/test-api-interceptors.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698