Commit 900f3a5d authored by Simon Zünd's avatar Simon Zünd Committed by Commit Bot

Change AccessorPair::GetComponent to require an explicit native_context

This CL changes the signature of AccessorPair::GetComponent to take
an additional parameter {native_context}. The current native_context
does not always match the native context of the holder, resulting in
JSFunctions that have the wrong native context for lazy instantiated
AccessorPairs.

Bug: chromium:989909, v8:6495
Change-Id: I45bfcb27ac367858dd6788736eba1a2e1302e802
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1735311Reviewed-by: 's avatarToon Verwaest <verwaest@chromium.org>
Commit-Queue: Simon Zünd <szuend@chromium.org>
Cr-Commit-Position: refs/heads/master@{#63078}
parent 9d4a2ae1
...@@ -156,8 +156,11 @@ Object ObjectLookupAccessor(Isolate* isolate, Handle<Object> object, ...@@ -156,8 +156,11 @@ Object ObjectLookupAccessor(Isolate* isolate, Handle<Object> object,
case LookupIterator::ACCESSOR: { case LookupIterator::ACCESSOR: {
Handle<Object> maybe_pair = it.GetAccessors(); Handle<Object> maybe_pair = it.GetAccessors();
if (maybe_pair->IsAccessorPair()) { if (maybe_pair->IsAccessorPair()) {
Handle<NativeContext> native_context =
it.GetHolder<JSReceiver>()->GetCreationContext();
return *AccessorPair::GetComponent( return *AccessorPair::GetComponent(
isolate, Handle<AccessorPair>::cast(maybe_pair), component); isolate, native_context, Handle<AccessorPair>::cast(maybe_pair),
component);
} }
} }
} }
......
...@@ -1614,12 +1614,14 @@ Maybe<bool> JSReceiver::GetOwnPropertyDescriptor(LookupIterator* it, ...@@ -1614,12 +1614,14 @@ Maybe<bool> JSReceiver::GetOwnPropertyDescriptor(LookupIterator* it,
// 6. Else X is an accessor property, so // 6. Else X is an accessor property, so
Handle<AccessorPair> accessors = Handle<AccessorPair> accessors =
Handle<AccessorPair>::cast(it->GetAccessors()); Handle<AccessorPair>::cast(it->GetAccessors());
Handle<NativeContext> native_context =
it->GetHolder<JSReceiver>()->GetCreationContext();
// 6a. Set D.[[Get]] to the value of X's [[Get]] attribute. // 6a. Set D.[[Get]] to the value of X's [[Get]] attribute.
desc->set_get( desc->set_get(AccessorPair::GetComponent(isolate, native_context, accessors,
AccessorPair::GetComponent(isolate, accessors, ACCESSOR_GETTER)); ACCESSOR_GETTER));
// 6b. Set D.[[Set]] to the value of X's [[Set]] attribute. // 6b. Set D.[[Set]] to the value of X's [[Set]] attribute.
desc->set_set( desc->set_set(AccessorPair::GetComponent(isolate, native_context, accessors,
AccessorPair::GetComponent(isolate, accessors, ACCESSOR_SETTER)); ACCESSOR_SETTER));
} }
// 7. Set D.[[Enumerable]] to the value of X's [[Enumerable]] attribute. // 7. Set D.[[Enumerable]] to the value of X's [[Enumerable]] attribute.
......
...@@ -4289,11 +4289,13 @@ Handle<AccessorPair> AccessorPair::Copy(Isolate* isolate, ...@@ -4289,11 +4289,13 @@ Handle<AccessorPair> AccessorPair::Copy(Isolate* isolate,
} }
Handle<Object> AccessorPair::GetComponent(Isolate* isolate, Handle<Object> AccessorPair::GetComponent(Isolate* isolate,
Handle<NativeContext> native_context,
Handle<AccessorPair> accessor_pair, Handle<AccessorPair> accessor_pair,
AccessorComponent component) { AccessorComponent component) {
Object accessor = accessor_pair->get(component); Object accessor = accessor_pair->get(component);
if (accessor.IsFunctionTemplateInfo()) { if (accessor.IsFunctionTemplateInfo()) {
return ApiNatives::InstantiateFunction( return ApiNatives::InstantiateFunction(
isolate, native_context,
handle(FunctionTemplateInfo::cast(accessor), isolate)) handle(FunctionTemplateInfo::cast(accessor), isolate))
.ToHandleChecked(); .ToHandleChecked();
} }
......
...@@ -60,6 +60,7 @@ class AccessorPair : public Struct { ...@@ -60,6 +60,7 @@ class AccessorPair : public Struct {
// Note: Returns undefined if the component is not set. // Note: Returns undefined if the component is not set.
static Handle<Object> GetComponent(Isolate* isolate, static Handle<Object> GetComponent(Isolate* isolate,
Handle<NativeContext> native_context,
Handle<AccessorPair> accessor_pair, Handle<AccessorPair> accessor_pair,
AccessorComponent component); AccessorComponent component);
......
...@@ -3,12 +3,6 @@ ...@@ -3,12 +3,6 @@
# found in the LICENSE file. # found in the LICENSE file.
[ [
[ALWAYS, {
# https://crbug.com/986063.
# TODO(szuend): Re-enable test once the fix has landed.
'AccessRegressionTest.InstantiatedLazyAccessorPairsHaveCorrectNativeContext': [FAIL],
}], # ALWAYS
['system == macos and asan', { ['system == macos and asan', {
# BUG(820416). # BUG(820416).
'BitsDeathTest*': [SKIP], 'BitsDeathTest*': [SKIP],
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment