Reviewers: adamk, jochen, Toon Verwaest,
Message:
Hi,
this is one approach which should maintain legacy behaviour when dealing
with
objects from a different origin. If the @@isConcatSpreadable symbol is
present,
Chromium can probably emit a warning as to why its value is ignored
Description:
[es6] ignore @@isConcatSpreadable if access check fails
Performs the [[Get]] normally, but rather than throwing on an access
check failure, just ignores the value by returning undefined instead.
BUG=v8:4289, 507553
LOG=N
[email protected], [email protected], [email protected]
Please review this at https://codereview.chromium.org/1230793002/
Base URL: https://chromium.googlesource.com/v8/v8.git@master
Affected files (+40, -6 lines):
M src/objects.h
M src/objects.cc
M src/objects-inl.h
M src/runtime/runtime-array.cc
Index: src/objects-inl.h
diff --git a/src/objects-inl.h b/src/objects-inl.h
index
120ca988431a99dde0471883cd51b172573e77d6..42de1fb17be2fc8aee34768971897795c6853bc3
100644
--- a/src/objects-inl.h
+++ b/src/objects-inl.h
@@ -1157,6 +1157,16 @@ bool Object::HasSpecificClassOf(String* name) {
}
+MaybeHandle<Object> Object::GetProperty(LookupIterator* it,
+ LanguageMode language_mode) {
+ bool failedAccessCheck = false;
+ MaybeHandle<Object> result =
+ GetPropertyInternal(it, &failedAccessCheck, language_mode);
+ if (failedAccessCheck) return
JSObject::GetPropertyWithFailedAccessCheck(it);
+ return result;
+}
+
+
MaybeHandle<Object> Object::GetProperty(Handle<Object> object,
Handle<Name> name,
LanguageMode language_mode) {
@@ -1165,6 +1175,20 @@ MaybeHandle<Object>
Object::GetProperty(Handle<Object> object,
}
+MaybeHandle<Object> Object::GetPropertyOrFallbackValue(
+ Handle<Object> object, Handle<Name> name, Handle<Object> fallbackValue,
+ LanguageMode language_mode) {
+ LookupIterator it(object, name);
+ bool failedAccessCheck = false;
+ MaybeHandle<Object> result =
+ GetPropertyInternal(&it, &failedAccessCheck, language_mode);
+ if (V8_UNLIKELY(failedAccessCheck)) {
+ result = fallbackValue;
+ }
+ return result;
+}
+
+
MaybeHandle<Object> Object::GetElement(Isolate* isolate, Handle<Object>
object,
uint32_t index,
LanguageMode language_mode) {
Index: src/objects.cc
diff --git a/src/objects.cc b/src/objects.cc
index
874c775180de335ef7d8b816dc469e0a3699ece9..96d2b54f4e00c02f5cc48b2a3d4f3f98446ac7c5
100644
--- a/src/objects.cc
+++ b/src/objects.cc
@@ -127,8 +127,9 @@ bool Object::IsPromise(Handle<Object> object) {
}
-MaybeHandle<Object> Object::GetProperty(LookupIterator* it,
- LanguageMode language_mode) {
+MaybeHandle<Object> Object::GetPropertyInternal(LookupIterator* it,
+ bool* failedAccessCheck,
+ LanguageMode
language_mode) {
for (; it->IsFound(); it->Next()) {
switch (it->state()) {
case LookupIterator::NOT_FOUND:
@@ -148,7 +149,8 @@ MaybeHandle<Object> Object::GetProperty(LookupIterator*
it,
}
case LookupIterator::ACCESS_CHECK:
if (it->HasAccess()) break;
- return JSObject::GetPropertyWithFailedAccessCheck(it);
+ *failedAccessCheck = true;
+ return MaybeHandle<Object>();
case LookupIterator::ACCESSOR:
return GetPropertyWithAccessor(it, language_mode);
case LookupIterator::INTEGER_INDEXED_EXOTIC:
Index: src/objects.h
diff --git a/src/objects.h b/src/objects.h
index
12eba2ba25f4468a172436daf03d85ac8a252f10..1db043ec64aed51519a4a7902b157ddcd8ace230
100644
--- a/src/objects.h
+++ b/src/objects.h
@@ -1167,7 +1167,11 @@ class Object {
MUST_USE_RESULT static inline MaybeHandle<Smi> ToSmi(Isolate* isolate,
Handle<Object>
object);
- MUST_USE_RESULT static MaybeHandle<Object> GetProperty(
+ MUST_USE_RESULT static MaybeHandle<Object> GetPropertyInternal(
+ LookupIterator* it, bool* failedAccessCheck,
+ LanguageMode language_mode = SLOPPY);
+
+ MUST_USE_RESULT static inline MaybeHandle<Object> GetProperty(
LookupIterator* it, LanguageMode language_mode = SLOPPY);
// Implementation of [[Put]], ECMA-262 5th edition, section 8.12.5.
@@ -1212,6 +1216,10 @@ class Object {
Handle<Object> object, Handle<Name> name,
LanguageMode language_mode = SLOPPY);
+ MUST_USE_RESULT static inline MaybeHandle<Object>
GetPropertyOrFallbackValue(
+ Handle<Object> object, Handle<Name> name, Handle<Object>
fallbackValue,
+ LanguageMode language_mode = SLOPPY);
+
MUST_USE_RESULT static MaybeHandle<Object> GetPropertyWithAccessor(
LookupIterator* it, LanguageMode language_mode);
MUST_USE_RESULT static MaybeHandle<Object> SetPropertyWithAccessor(
Index: src/runtime/runtime-array.cc
diff --git a/src/runtime/runtime-array.cc b/src/runtime/runtime-array.cc
index
d00df71576bf27edcee2131a8c0cd5656e314d8c..0a64c94d884d53950b4a9f3cab4331c0abb8e48f
100644
--- a/src/runtime/runtime-array.cc
+++ b/src/runtime/runtime-array.cc
@@ -732,8 +732,8 @@ static bool IsConcatSpreadable(Isolate* isolate,
Handle<Object> obj) {
if (FLAG_harmony_concat_spreadable) {
Handle<Symbol> key(isolate->factory()->is_concat_spreadable_symbol());
Handle<Object> value;
- MaybeHandle<Object> maybeValue =
- i::Runtime::GetObjectProperty(isolate, obj, key);
+ MaybeHandle<Object> maybeValue = i::Object::GetPropertyOrFallbackValue(
+ obj, key,
Handle<Object>::cast(isolate->factory()->undefined_value()));
if (maybeValue.ToHandle(&value)) {
if (!value->IsUndefined()) {
return value->BooleanValue();
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.