Skip to content

Commit a558cd0

Browse files
committed
deps: revert v8 abi change
Undo the ABI (but not API) change to NamedPropertyHandlerConfiguration. This avoids a NODE_MODULE_VERSION bump and forcing everyone to recompile their add-ons, at the cost of increasing the delta with upstream V8. This commit effectively backs out 4.1.0.16, the release that introduced the ABI change (and nothing else.) PR-URL: #952 Reviewed-By: Fedor Indutny <[email protected]> Reviewed-By: Rod Vagg <[email protected]>
1 parent 54532a9 commit a558cd0

File tree

7 files changed

+46
-148
lines changed

7 files changed

+46
-148
lines changed

deps/v8/include/v8.h

+4-13
Original file line numberDiff line numberDiff line change
@@ -3899,9 +3899,6 @@ class V8_EXPORT FunctionTemplate : public Template {
38993899
};
39003900

39013901

3902-
enum class PropertyHandlerFlags { kNone = 0, kAllCanRead = 1 };
3903-
3904-
39053902
struct NamedPropertyHandlerConfiguration {
39063903
NamedPropertyHandlerConfiguration(
39073904
/** Note: getter is required **/
@@ -3910,23 +3907,20 @@ struct NamedPropertyHandlerConfiguration {
39103907
GenericNamedPropertyQueryCallback query = 0,
39113908
GenericNamedPropertyDeleterCallback deleter = 0,
39123909
GenericNamedPropertyEnumeratorCallback enumerator = 0,
3913-
Handle<Value> data = Handle<Value>(),
3914-
PropertyHandlerFlags flags = PropertyHandlerFlags::kNone)
3910+
Handle<Value> data = Handle<Value>())
39153911
: getter(getter),
39163912
setter(setter),
39173913
query(query),
39183914
deleter(deleter),
39193915
enumerator(enumerator),
3920-
data(data),
3921-
flags(flags) {}
3916+
data(data) {}
39223917

39233918
GenericNamedPropertyGetterCallback getter;
39243919
GenericNamedPropertySetterCallback setter;
39253920
GenericNamedPropertyQueryCallback query;
39263921
GenericNamedPropertyDeleterCallback deleter;
39273922
GenericNamedPropertyEnumeratorCallback enumerator;
39283923
Handle<Value> data;
3929-
PropertyHandlerFlags flags;
39303924
};
39313925

39323926

@@ -3938,23 +3932,20 @@ struct IndexedPropertyHandlerConfiguration {
39383932
IndexedPropertyQueryCallback query = 0,
39393933
IndexedPropertyDeleterCallback deleter = 0,
39403934
IndexedPropertyEnumeratorCallback enumerator = 0,
3941-
Handle<Value> data = Handle<Value>(),
3942-
PropertyHandlerFlags flags = PropertyHandlerFlags::kNone)
3935+
Handle<Value> data = Handle<Value>())
39433936
: getter(getter),
39443937
setter(setter),
39453938
query(query),
39463939
deleter(deleter),
39473940
enumerator(enumerator),
3948-
data(data),
3949-
flags(flags) {}
3941+
data(data) {}
39503942

39513943
IndexedPropertyGetterCallback getter;
39523944
IndexedPropertySetterCallback setter;
39533945
IndexedPropertyQueryCallback query;
39543946
IndexedPropertyDeleterCallback deleter;
39553947
IndexedPropertyEnumeratorCallback enumerator;
39563948
Handle<Value> data;
3957-
PropertyHandlerFlags flags;
39583949
};
39593950

39603951

deps/v8/src/api.cc

+18-17
Original file line numberDiff line numberDiff line change
@@ -1306,19 +1306,23 @@ void ObjectTemplate::SetAccessor(v8::Handle<Name> name,
13061306

13071307
template <typename Getter, typename Setter, typename Query, typename Deleter,
13081308
typename Enumerator>
1309-
static void ObjectTemplateSetNamedPropertyHandler(
1310-
ObjectTemplate* templ, Getter getter, Setter setter, Query query,
1311-
Deleter remover, Enumerator enumerator, Handle<Value> data,
1312-
bool can_intercept_symbols, PropertyHandlerFlags flags) {
1309+
static void ObjectTemplateSetNamedPropertyHandler(ObjectTemplate* templ,
1310+
Getter getter, Setter setter,
1311+
Query query, Deleter remover,
1312+
Enumerator enumerator,
1313+
Handle<Value> data,
1314+
bool can_intercept_symbols) {
13131315
i::Isolate* isolate = Utils::OpenHandle(templ)->GetIsolate();
13141316
ENTER_V8(isolate);
13151317
i::HandleScope scope(isolate);
13161318
EnsureConstructor(isolate, templ);
13171319
i::FunctionTemplateInfo* constructor =
13181320
i::FunctionTemplateInfo::cast(Utils::OpenHandle(templ)->constructor());
13191321
i::Handle<i::FunctionTemplateInfo> cons(constructor);
1320-
auto obj = i::Handle<i::InterceptorInfo>::cast(
1321-
isolate->factory()->NewStruct(i::INTERCEPTOR_INFO_TYPE));
1322+
i::Handle<i::Struct> struct_obj =
1323+
isolate->factory()->NewStruct(i::INTERCEPTOR_INFO_TYPE);
1324+
i::Handle<i::InterceptorInfo> obj =
1325+
i::Handle<i::InterceptorInfo>::cast(struct_obj);
13221326

13231327
if (getter != 0) SET_FIELD_WRAPPED(obj, set_getter, getter);
13241328
if (setter != 0) SET_FIELD_WRAPPED(obj, set_setter, setter);
@@ -1327,8 +1331,6 @@ static void ObjectTemplateSetNamedPropertyHandler(
13271331
if (enumerator != 0) SET_FIELD_WRAPPED(obj, set_enumerator, enumerator);
13281332
obj->set_flags(0);
13291333
obj->set_can_intercept_symbols(can_intercept_symbols);
1330-
obj->set_all_can_read(static_cast<int>(flags) &
1331-
static_cast<int>(PropertyHandlerFlags::kAllCanRead));
13321334

13331335
if (data.IsEmpty()) {
13341336
data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate));
@@ -1343,16 +1345,15 @@ void ObjectTemplate::SetNamedPropertyHandler(
13431345
NamedPropertyQueryCallback query, NamedPropertyDeleterCallback remover,
13441346
NamedPropertyEnumeratorCallback enumerator, Handle<Value> data) {
13451347
ObjectTemplateSetNamedPropertyHandler(this, getter, setter, query, remover,
1346-
enumerator, data, false,
1347-
PropertyHandlerFlags::kNone);
1348+
enumerator, data, false);
13481349
}
13491350

13501351

13511352
void ObjectTemplate::SetHandler(
13521353
const NamedPropertyHandlerConfiguration& config) {
1353-
ObjectTemplateSetNamedPropertyHandler(
1354-
this, config.getter, config.setter, config.query, config.deleter,
1355-
config.enumerator, config.data, true, config.flags);
1354+
ObjectTemplateSetNamedPropertyHandler(this, config.getter, config.setter,
1355+
config.query, config.deleter,
1356+
config.enumerator, config.data, true);
13561357
}
13571358

13581359

@@ -1408,8 +1409,10 @@ void ObjectTemplate::SetHandler(
14081409
i::FunctionTemplateInfo* constructor = i::FunctionTemplateInfo::cast(
14091410
Utils::OpenHandle(this)->constructor());
14101411
i::Handle<i::FunctionTemplateInfo> cons(constructor);
1411-
auto obj = i::Handle<i::InterceptorInfo>::cast(
1412-
isolate->factory()->NewStruct(i::INTERCEPTOR_INFO_TYPE));
1412+
i::Handle<i::Struct> struct_obj =
1413+
isolate->factory()->NewStruct(i::INTERCEPTOR_INFO_TYPE);
1414+
i::Handle<i::InterceptorInfo> obj =
1415+
i::Handle<i::InterceptorInfo>::cast(struct_obj);
14131416

14141417
if (config.getter != 0) SET_FIELD_WRAPPED(obj, set_getter, config.getter);
14151418
if (config.setter != 0) SET_FIELD_WRAPPED(obj, set_setter, config.setter);
@@ -1419,8 +1422,6 @@ void ObjectTemplate::SetHandler(
14191422
SET_FIELD_WRAPPED(obj, set_enumerator, config.enumerator);
14201423
}
14211424
obj->set_flags(0);
1422-
obj->set_all_can_read(static_cast<int>(config.flags) &
1423-
static_cast<int>(PropertyHandlerFlags::kAllCanRead));
14241425

14251426
v8::Local<v8::Value> data = config.data;
14261427
if (data.IsEmpty()) {

deps/v8/src/ic/ic.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -2924,7 +2924,7 @@ RUNTIME_FUNCTION(LoadElementWithInterceptor) {
29242924
Handle<Object> result;
29252925
ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
29262926
isolate, result,
2927-
JSObject::GetElementWithInterceptor(receiver, receiver, index, true));
2927+
JSObject::GetElementWithInterceptor(receiver, receiver, index));
29282928
return *result;
29292929
}
29302930

deps/v8/src/objects-inl.h

-1
Original file line numberDiff line numberDiff line change
@@ -5517,7 +5517,6 @@ ACCESSORS(InterceptorInfo, data, Object, kDataOffset)
55175517
SMI_ACCESSORS(InterceptorInfo, flags, kFlagsOffset)
55185518
BOOL_ACCESSORS(InterceptorInfo, flags, can_intercept_symbols,
55195519
kCanInterceptSymbolsBit)
5520-
BOOL_ACCESSORS(InterceptorInfo, flags, all_can_read, kAllCanReadBit)
55215520

55225521
ACCESSORS(CallHandlerInfo, callback, Object, kCallbackOffset)
55235522
ACCESSORS(CallHandlerInfo, data, Object, kDataOffset)

deps/v8/src/objects.cc

+19-102
Original file line numberDiff line numberDiff line change
@@ -572,19 +572,12 @@ MaybeHandle<Object> Object::SetPropertyWithDefinedSetter(
572572

573573

574574
static bool FindAllCanReadHolder(LookupIterator* it) {
575-
// Skip current iteration, it's in state ACCESS_CHECK or INTERCEPTOR, both of
576-
// which have already been checked.
577-
DCHECK(it->state() == LookupIterator::ACCESS_CHECK ||
578-
it->state() == LookupIterator::INTERCEPTOR);
579-
for (it->Next(); it->IsFound(); it->Next()) {
575+
for (; it->IsFound(); it->Next()) {
580576
if (it->state() == LookupIterator::ACCESSOR) {
581-
auto accessors = it->GetAccessors();
577+
Handle<Object> accessors = it->GetAccessors();
582578
if (accessors->IsAccessorInfo()) {
583579
if (AccessorInfo::cast(*accessors)->all_can_read()) return true;
584580
}
585-
} else if (it->state() == LookupIterator::INTERCEPTOR) {
586-
auto holder = it->GetHolder<JSObject>();
587-
if (holder->GetNamedInterceptor()->all_can_read()) return true;
588581
}
589582
}
590583
return false;
@@ -594,18 +587,10 @@ static bool FindAllCanReadHolder(LookupIterator* it) {
594587
MaybeHandle<Object> JSObject::GetPropertyWithFailedAccessCheck(
595588
LookupIterator* it) {
596589
Handle<JSObject> checked = it->GetHolder<JSObject>();
597-
while (FindAllCanReadHolder(it)) {
598-
if (it->state() == LookupIterator::ACCESSOR) {
599-
return GetPropertyWithAccessor(it->GetReceiver(), it->name(),
600-
it->GetHolder<JSObject>(),
601-
it->GetAccessors());
602-
}
603-
DCHECK_EQ(LookupIterator::INTERCEPTOR, it->state());
604-
auto receiver = Handle<JSObject>::cast(it->GetReceiver());
605-
auto result = GetPropertyWithInterceptor(it->GetHolder<JSObject>(),
606-
receiver, it->name());
607-
if (it->isolate()->has_scheduled_exception()) break;
608-
if (!result.is_null()) return result;
590+
if (FindAllCanReadHolder(it)) {
591+
return GetPropertyWithAccessor(it->GetReceiver(), it->name(),
592+
it->GetHolder<JSObject>(),
593+
it->GetAccessors());
609594
}
610595
it->isolate()->ReportFailedAccessCheck(checked, v8::ACCESS_GET);
611596
RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(it->isolate(), Object);
@@ -616,16 +601,8 @@ MaybeHandle<Object> JSObject::GetPropertyWithFailedAccessCheck(
616601
Maybe<PropertyAttributes> JSObject::GetPropertyAttributesWithFailedAccessCheck(
617602
LookupIterator* it) {
618603
Handle<JSObject> checked = it->GetHolder<JSObject>();
619-
while (FindAllCanReadHolder(it)) {
620-
if (it->state() == LookupIterator::ACCESSOR) {
621-
return maybe(it->property_details().attributes());
622-
}
623-
DCHECK_EQ(LookupIterator::INTERCEPTOR, it->state());
624-
auto result = GetPropertyAttributesWithInterceptor(
625-
it->GetHolder<JSObject>(), it->GetReceiver(), it->name());
626-
if (it->isolate()->has_scheduled_exception()) break;
627-
if (result.has_value && result.value != ABSENT) return result;
628-
}
604+
if (FindAllCanReadHolder(it))
605+
return maybe(it->property_details().attributes());
629606
it->isolate()->ReportFailedAccessCheck(checked, v8::ACCESS_HAS);
630607
RETURN_VALUE_IF_SCHEDULED_EXCEPTION(it->isolate(),
631608
Maybe<PropertyAttributes>());
@@ -759,65 +736,6 @@ Handle<Object> JSObject::DeleteNormalizedProperty(Handle<JSObject> object,
759736
}
760737

761738

762-
static MaybeHandle<JSObject> FindIndexedAllCanReadHolder(
763-
Isolate* isolate, Handle<JSObject> js_object,
764-
PrototypeIterator::WhereToStart where_to_start) {
765-
for (PrototypeIterator iter(isolate, js_object, where_to_start);
766-
!iter.IsAtEnd(); iter.Advance()) {
767-
auto curr = PrototypeIterator::GetCurrent(iter);
768-
if (!curr->IsJSObject()) break;
769-
auto obj = Handle<JSObject>::cast(curr);
770-
if (!obj->HasIndexedInterceptor()) continue;
771-
if (obj->GetIndexedInterceptor()->all_can_read()) return obj;
772-
}
773-
return MaybeHandle<JSObject>();
774-
}
775-
776-
777-
MaybeHandle<Object> JSObject::GetElementWithFailedAccessCheck(
778-
Isolate* isolate, Handle<JSObject> object, Handle<Object> receiver,
779-
uint32_t index) {
780-
Handle<JSObject> holder = object;
781-
PrototypeIterator::WhereToStart where_to_start =
782-
PrototypeIterator::START_AT_RECEIVER;
783-
while (true) {
784-
auto all_can_read_holder =
785-
FindIndexedAllCanReadHolder(isolate, holder, where_to_start);
786-
if (!all_can_read_holder.ToHandle(&holder)) break;
787-
auto result =
788-
JSObject::GetElementWithInterceptor(holder, receiver, index, false);
789-
if (isolate->has_scheduled_exception()) break;
790-
if (!result.is_null()) return result;
791-
where_to_start = PrototypeIterator::START_AT_PROTOTYPE;
792-
}
793-
isolate->ReportFailedAccessCheck(object, v8::ACCESS_GET);
794-
RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object);
795-
return isolate->factory()->undefined_value();
796-
}
797-
798-
799-
Maybe<PropertyAttributes> JSObject::GetElementAttributesWithFailedAccessCheck(
800-
Isolate* isolate, Handle<JSObject> object, Handle<Object> receiver,
801-
uint32_t index) {
802-
Handle<JSObject> holder = object;
803-
PrototypeIterator::WhereToStart where_to_start =
804-
PrototypeIterator::START_AT_RECEIVER;
805-
while (true) {
806-
auto all_can_read_holder =
807-
FindIndexedAllCanReadHolder(isolate, holder, where_to_start);
808-
if (!all_can_read_holder.ToHandle(&holder)) break;
809-
auto result =
810-
JSObject::GetElementAttributeFromInterceptor(object, receiver, index);
811-
if (isolate->has_scheduled_exception()) break;
812-
if (result.has_value && result.value != ABSENT) return result;
813-
where_to_start = PrototypeIterator::START_AT_PROTOTYPE;
814-
}
815-
isolate->ReportFailedAccessCheck(object, v8::ACCESS_HAS);
816-
RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, Maybe<PropertyAttributes>());
817-
return maybe(ABSENT);
818-
}
819-
820-
821739
MaybeHandle<Object> Object::GetElementWithReceiver(Isolate* isolate,
822740
Handle<Object> object,
823741
Handle<Object> receiver,
@@ -850,14 +768,14 @@ MaybeHandle<Object> Object::GetElementWithReceiver(Isolate* isolate,
850768
// Check access rights if needed.
851769
if (js_object->IsAccessCheckNeeded()) {
852770
if (!isolate->MayIndexedAccess(js_object, index, v8::ACCESS_GET)) {
853-
return JSObject::GetElementWithFailedAccessCheck(isolate, js_object,
854-
receiver, index);
771+
isolate->ReportFailedAccessCheck(js_object, v8::ACCESS_GET);
772+
RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object);
773+
return isolate->factory()->undefined_value();
855774
}
856775
}
857776

858777
if (js_object->HasIndexedInterceptor()) {
859-
return JSObject::GetElementWithInterceptor(js_object, receiver, index,
860-
true);
778+
return JSObject::GetElementWithInterceptor(js_object, receiver, index);
861779
}
862780

863781
if (js_object->elements() != isolate->heap()->empty_fixed_array()) {
@@ -4266,8 +4184,9 @@ Maybe<PropertyAttributes> JSObject::GetElementAttributeWithReceiver(
42664184
// Check access rights if needed.
42674185
if (object->IsAccessCheckNeeded()) {
42684186
if (!isolate->MayIndexedAccess(object, index, v8::ACCESS_HAS)) {
4269-
return GetElementAttributesWithFailedAccessCheck(isolate, object,
4270-
receiver, index);
4187+
isolate->ReportFailedAccessCheck(object, v8::ACCESS_HAS);
4188+
RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, Maybe<PropertyAttributes>());
4189+
return maybe(ABSENT);
42714190
}
42724191
}
42734192

@@ -13464,10 +13383,10 @@ MaybeHandle<Object> JSArray::ReadOnlyLengthError(Handle<JSArray> array) {
1346413383
}
1346513384

1346613385

13467-
MaybeHandle<Object> JSObject::GetElementWithInterceptor(Handle<JSObject> object,
13468-
Handle<Object> receiver,
13469-
uint32_t index,
13470-
bool check_prototype) {
13386+
MaybeHandle<Object> JSObject::GetElementWithInterceptor(
13387+
Handle<JSObject> object,
13388+
Handle<Object> receiver,
13389+
uint32_t index) {
1347113390
Isolate* isolate = object->GetIsolate();
1347213391

1347313392
// Make sure that the top context does not change when doing
@@ -13492,8 +13411,6 @@ MaybeHandle<Object> JSObject::GetElementWithInterceptor(Handle<JSObject> object,
1349213411
}
1349313412
}
1349413413

13495-
if (!check_prototype) return MaybeHandle<Object>();
13496-
1349713414
ElementsAccessor* handler = object->GetElementsAccessor();
1349813415
Handle<Object> result;
1349913416
ASSIGN_RETURN_ON_EXCEPTION(

deps/v8/src/objects.h

+3-12
Original file line numberDiff line numberDiff line change
@@ -1971,8 +1971,9 @@ class JSObject: public JSReceiver {
19711971
// Returns the index'th element.
19721972
// The undefined object if index is out of bounds.
19731973
MUST_USE_RESULT static MaybeHandle<Object> GetElementWithInterceptor(
1974-
Handle<JSObject> object, Handle<Object> receiver, uint32_t index,
1975-
bool check_prototype);
1974+
Handle<JSObject> object,
1975+
Handle<Object> receiver,
1976+
uint32_t index);
19761977

19771978
enum SetFastElementsCapacitySmiMode {
19781979
kAllowSmiElements,
@@ -2335,14 +2336,6 @@ class JSObject: public JSReceiver {
23352336
Handle<Object> value,
23362337
StrictMode strict_mode,
23372338
bool check_prototype = true);
2338-
MUST_USE_RESULT static MaybeHandle<Object> GetElementWithFailedAccessCheck(
2339-
Isolate* isolate, Handle<JSObject> object, Handle<Object> receiver,
2340-
uint32_t index);
2341-
MUST_USE_RESULT static Maybe<PropertyAttributes>
2342-
GetElementAttributesWithFailedAccessCheck(Isolate* isolate,
2343-
Handle<JSObject> object,
2344-
Handle<Object> receiver,
2345-
uint32_t index);
23462339

23472340
MUST_USE_RESULT static MaybeHandle<Object> SetPropertyWithFailedAccessCheck(
23482341
LookupIterator* it, Handle<Object> value, StrictMode strict_mode);
@@ -10649,7 +10642,6 @@ class InterceptorInfo: public Struct {
1064910642
DECL_ACCESSORS(enumerator, Object)
1065010643
DECL_ACCESSORS(data, Object)
1065110644
DECL_BOOLEAN_ACCESSORS(can_intercept_symbols)
10652-
DECL_BOOLEAN_ACCESSORS(all_can_read)
1065310645

1065410646
inline int flags() const;
1065510647
inline void set_flags(int flags);
@@ -10670,7 +10662,6 @@ class InterceptorInfo: public Struct {
1067010662
static const int kSize = kFlagsOffset + kPointerSize;
1067110663

1067210664
static const int kCanInterceptSymbolsBit = 0;
10673-
static const int kAllCanReadBit = 1;
1067410665

1067510666
private:
1067610667
DISALLOW_IMPLICIT_CONSTRUCTORS(InterceptorInfo);

deps/v8/src/runtime/runtime-debug.cc

+1-2
Original file line numberDiff line numberDiff line change
@@ -246,8 +246,7 @@ RUNTIME_FUNCTION(Runtime_DebugIndexedInterceptorElementValue) {
246246
CONVERT_NUMBER_CHECKED(uint32_t, index, Uint32, args[1]);
247247
Handle<Object> result;
248248
ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
249-
isolate, result,
250-
JSObject::GetElementWithInterceptor(obj, obj, index, true));
249+
isolate, result, JSObject::GetElementWithInterceptor(obj, obj, index));
251250
return *result;
252251
}
253252

0 commit comments

Comments
 (0)