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.

Reply via email to