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

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

Issue 2311413002: Super property loads and stores should throw if [[Prototype]] is null (Closed)
Patch Set: 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 | « src/objects.cc ('k') | test/mjsunit/es6/super.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/runtime/runtime-classes.cc
diff --git a/src/runtime/runtime-classes.cc b/src/runtime/runtime-classes.cc
index 5448159513bda41508a1c8cd1f72e859be74197a..2ce830a710cc47eebca0007d87b70df2b95dbd40 100644
--- a/src/runtime/runtime-classes.cc
+++ b/src/runtime/runtime-classes.cc
@@ -187,52 +187,65 @@ RUNTIME_FUNCTION(Runtime_DefineClass) {
end_position));
}
+namespace {
-static MaybeHandle<Object> LoadFromSuper(Isolate* isolate,
- Handle<Object> receiver,
- Handle<JSObject> home_object,
- Handle<Name> name) {
+enum class SuperMode { kLoad, kStore };
+
+MaybeHandle<JSReceiver> GetSuperHolder(
+ Isolate* isolate, Handle<Object> receiver, Handle<JSObject> home_object,
+ SuperMode mode, MaybeHandle<Name> maybe_name, uint32_t index) {
if (home_object->IsAccessCheckNeeded() &&
!isolate->MayAccess(handle(isolate->context()), home_object)) {
isolate->ReportFailedAccessCheck(home_object);
- RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object);
+ RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, JSReceiver);
}
PrototypeIterator iter(isolate, home_object);
Handle<Object> proto = PrototypeIterator::GetCurrent(iter);
if (!proto->IsJSReceiver()) {
- return Object::ReadAbsentProperty(isolate, proto, name);
+ MessageTemplate::Template message =
+ mode == SuperMode::kLoad ? MessageTemplate::kNonObjectPropertyLoad
+ : MessageTemplate::kNonObjectPropertyStore;
+ Handle<Name> name;
+ if (!maybe_name.ToHandle(&name)) {
+ name = isolate->factory()->Uint32ToString(index);
+ }
+ THROW_NEW_ERROR(isolate, NewTypeError(message, name, proto), JSReceiver);
}
+ return Handle<JSReceiver>::cast(proto);
+}
- LookupIterator it(receiver, name, Handle<JSReceiver>::cast(proto));
+MaybeHandle<Object> LoadFromSuper(Isolate* isolate, Handle<Object> receiver,
+ Handle<JSObject> home_object,
+ Handle<Name> name) {
+ Handle<JSReceiver> holder;
+ ASSIGN_RETURN_ON_EXCEPTION(
+ isolate, holder,
+ GetSuperHolder(isolate, receiver, home_object, SuperMode::kLoad, name, 0),
+ Object);
+ LookupIterator it(receiver, name, holder);
Handle<Object> result;
ASSIGN_RETURN_ON_EXCEPTION(isolate, result, Object::GetProperty(&it), Object);
return result;
}
-static MaybeHandle<Object> LoadElementFromSuper(Isolate* isolate,
- Handle<Object> receiver,
- Handle<JSObject> home_object,
- uint32_t index) {
- if (home_object->IsAccessCheckNeeded() &&
- !isolate->MayAccess(handle(isolate->context()), home_object)) {
- isolate->ReportFailedAccessCheck(home_object);
- RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object);
- }
-
- PrototypeIterator iter(isolate, home_object);
- Handle<Object> proto = PrototypeIterator::GetCurrent(iter);
- if (!proto->IsJSReceiver()) {
- Handle<Object> name = isolate->factory()->NewNumberFromUint(index);
- return Object::ReadAbsentProperty(isolate, proto, name);
- }
-
- LookupIterator it(isolate, receiver, index, Handle<JSReceiver>::cast(proto));
+MaybeHandle<Object> LoadElementFromSuper(Isolate* isolate,
+ Handle<Object> receiver,
+ Handle<JSObject> home_object,
+ uint32_t index) {
+ Handle<JSReceiver> holder;
+ ASSIGN_RETURN_ON_EXCEPTION(
+ isolate, holder,
+ GetSuperHolder(isolate, receiver, home_object, SuperMode::kLoad,
+ MaybeHandle<Name>(), index),
+ Object);
+ LookupIterator it(isolate, receiver, index, holder);
Handle<Object> result;
ASSIGN_RETURN_ON_EXCEPTION(isolate, result, Object::GetProperty(&it), Object);
return result;
}
+} // anonymous namespace
RUNTIME_FUNCTION(Runtime_LoadFromSuper) {
HandleScope scope(isolate);
@@ -272,50 +285,43 @@ RUNTIME_FUNCTION(Runtime_LoadKeyedFromSuper) {
LoadFromSuper(isolate, receiver, home_object, name));
}
+namespace {
-static Object* StoreToSuper(Isolate* isolate, Handle<JSObject> home_object,
- Handle<Object> receiver, Handle<Name> name,
- Handle<Object> value, LanguageMode language_mode) {
- if (home_object->IsAccessCheckNeeded() &&
- !isolate->MayAccess(handle(isolate->context()), home_object)) {
- isolate->ReportFailedAccessCheck(home_object);
- RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate);
- }
-
- PrototypeIterator iter(isolate, home_object);
- Handle<Object> proto = PrototypeIterator::GetCurrent(iter);
- if (!proto->IsJSReceiver()) return isolate->heap()->undefined_value();
-
- LookupIterator it(receiver, name, Handle<JSReceiver>::cast(proto));
+MaybeHandle<Object> StoreToSuper(Isolate* isolate, Handle<JSObject> home_object,
+ Handle<Object> receiver, Handle<Name> name,
+ Handle<Object> value,
+ LanguageMode language_mode) {
+ Handle<JSReceiver> holder;
+ ASSIGN_RETURN_ON_EXCEPTION(isolate, holder,
+ GetSuperHolder(isolate, receiver, home_object,
+ SuperMode::kStore, name, 0),
+ Object);
+ LookupIterator it(receiver, name, holder);
MAYBE_RETURN(Object::SetSuperProperty(&it, value, language_mode,
Object::CERTAINLY_NOT_STORE_FROM_KEYED),
- isolate->heap()->exception());
- return *value;
+ MaybeHandle<Object>());
+ return value;
}
-
-static Object* StoreElementToSuper(Isolate* isolate,
- Handle<JSObject> home_object,
- Handle<Object> receiver, uint32_t index,
- Handle<Object> value,
- LanguageMode language_mode) {
- if (home_object->IsAccessCheckNeeded() &&
- !isolate->MayAccess(handle(isolate->context()), home_object)) {
- isolate->ReportFailedAccessCheck(home_object);
- RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate);
- }
-
- PrototypeIterator iter(isolate, home_object);
- Handle<Object> proto = PrototypeIterator::GetCurrent(iter);
- if (!proto->IsJSReceiver()) return isolate->heap()->undefined_value();
-
- LookupIterator it(isolate, receiver, index, Handle<JSReceiver>::cast(proto));
+MaybeHandle<Object> StoreElementToSuper(Isolate* isolate,
+ Handle<JSObject> home_object,
+ Handle<Object> receiver, uint32_t index,
+ Handle<Object> value,
+ LanguageMode language_mode) {
+ Handle<JSReceiver> holder;
+ ASSIGN_RETURN_ON_EXCEPTION(
+ isolate, holder,
+ GetSuperHolder(isolate, receiver, home_object, SuperMode::kStore,
+ MaybeHandle<Name>(), index),
+ Object);
+ LookupIterator it(isolate, receiver, index, holder);
MAYBE_RETURN(Object::SetSuperProperty(&it, value, language_mode,
Object::MAY_BE_STORE_FROM_KEYED),
- isolate->heap()->exception());
- return *value;
+ MaybeHandle<Object>());
+ return value;
}
+} // anonymous namespace
RUNTIME_FUNCTION(Runtime_StoreToSuper_Strict) {
HandleScope scope(isolate);
@@ -325,7 +331,8 @@ RUNTIME_FUNCTION(Runtime_StoreToSuper_Strict) {
CONVERT_ARG_HANDLE_CHECKED(Name, name, 2);
CONVERT_ARG_HANDLE_CHECKED(Object, value, 3);
- return StoreToSuper(isolate, home_object, receiver, name, value, STRICT);
+ RETURN_RESULT_OR_FAILURE(isolate, StoreToSuper(isolate, home_object, receiver,
+ name, value, STRICT));
}
@@ -337,14 +344,13 @@ RUNTIME_FUNCTION(Runtime_StoreToSuper_Sloppy) {
CONVERT_ARG_HANDLE_CHECKED(Name, name, 2);
CONVERT_ARG_HANDLE_CHECKED(Object, value, 3);
- return StoreToSuper(isolate, home_object, receiver, name, value, SLOPPY);
+ RETURN_RESULT_OR_FAILURE(isolate, StoreToSuper(isolate, home_object, receiver,
+ name, value, SLOPPY));
}
-
-static Object* StoreKeyedToSuper(Isolate* isolate, Handle<JSObject> home_object,
- Handle<Object> receiver, Handle<Object> key,
- Handle<Object> value,
- LanguageMode language_mode) {
+static MaybeHandle<Object> StoreKeyedToSuper(
+ Isolate* isolate, Handle<JSObject> home_object, Handle<Object> receiver,
+ Handle<Object> key, Handle<Object> value, LanguageMode language_mode) {
uint32_t index = 0;
if (key->ToArrayIndex(&index)) {
@@ -352,8 +358,8 @@ static Object* StoreKeyedToSuper(Isolate* isolate, Handle<JSObject> home_object,
language_mode);
}
Handle<Name> name;
- ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, name,
- Object::ToName(isolate, key));
+ ASSIGN_RETURN_ON_EXCEPTION(isolate, name, Object::ToName(isolate, key),
+ Object);
// TODO(verwaest): Unify using LookupIterator.
if (name->AsArrayIndex(&index)) {
return StoreElementToSuper(isolate, home_object, receiver, index, value,
@@ -372,7 +378,9 @@ RUNTIME_FUNCTION(Runtime_StoreKeyedToSuper_Strict) {
CONVERT_ARG_HANDLE_CHECKED(Object, key, 2);
CONVERT_ARG_HANDLE_CHECKED(Object, value, 3);
- return StoreKeyedToSuper(isolate, home_object, receiver, key, value, STRICT);
+ RETURN_RESULT_OR_FAILURE(
+ isolate,
+ StoreKeyedToSuper(isolate, home_object, receiver, key, value, STRICT));
}
@@ -384,7 +392,9 @@ RUNTIME_FUNCTION(Runtime_StoreKeyedToSuper_Sloppy) {
CONVERT_ARG_HANDLE_CHECKED(Object, key, 2);
CONVERT_ARG_HANDLE_CHECKED(Object, value, 3);
- return StoreKeyedToSuper(isolate, home_object, receiver, key, value, SLOPPY);
+ RETURN_RESULT_OR_FAILURE(
+ isolate,
+ StoreKeyedToSuper(isolate, home_object, receiver, key, value, SLOPPY));
}
« no previous file with comments | « src/objects.cc ('k') | test/mjsunit/es6/super.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698