Plumb Isolate through HasProperty and friends

Currently the Isolate is gotten off of the object that the operation is
being performed on. Shared objects return the shared Isolate, which is
incorrect as it shouldn't be used to run JS, nor does it have
HandleScopes open. Plumb the executing Isolate through.

Bug: v8:12547
Change-Id: I52d5a172ea602f4ad058d979003d51a80cdb4405
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3441022
Reviewed-by: Adam Klein <adamk@chromium.org>
Commit-Queue: Shu-yu Guo <syg@chromium.org>
Cr-Commit-Position: refs/heads/main@{#78961}
This commit is contained in:
Shu-yu Guo 2022-02-04 13:22:43 -08:00 committed by V8 LUCI CQ
parent d4baeee65f
commit 33457e544a
16 changed files with 94 additions and 87 deletions

View File

@ -2895,7 +2895,7 @@ MaybeLocal<Value> v8::TryCatch::StackTrace(Local<Context> context,
PREPARE_FOR_EXECUTION(context, TryCatch, StackTrace, Value); PREPARE_FOR_EXECUTION(context, TryCatch, StackTrace, Value);
auto obj = i::Handle<i::JSObject>::cast(i_exception); auto obj = i::Handle<i::JSObject>::cast(i_exception);
i::Handle<i::String> name = isolate->factory()->stack_string(); i::Handle<i::String> name = isolate->factory()->stack_string();
Maybe<bool> maybe = i::JSReceiver::HasProperty(obj, name); Maybe<bool> maybe = i::JSReceiver::HasProperty(isolate, obj, name);
has_pending_exception = maybe.IsNothing(); has_pending_exception = maybe.IsNothing();
RETURN_ON_FAILED_EXECUTION(Value); RETURN_ON_FAILED_EXECUTION(Value);
if (!maybe.FromJust()) return v8::Local<Value>(); if (!maybe.FromJust()) return v8::Local<Value>();
@ -4748,12 +4748,12 @@ Maybe<bool> v8::Object::Has(Local<Context> context, Local<Value> key) {
// Check if the given key is an array index. // Check if the given key is an array index.
uint32_t index = 0; uint32_t index = 0;
if (key_obj->ToArrayIndex(&index)) { if (key_obj->ToArrayIndex(&index)) {
maybe = i::JSReceiver::HasElement(self, index); maybe = i::JSReceiver::HasElement(isolate, self, index);
} else { } else {
// Convert the key to a name - possibly by calling back into JavaScript. // Convert the key to a name - possibly by calling back into JavaScript.
i::Handle<i::Name> name; i::Handle<i::Name> name;
if (i::Object::ToName(isolate, key_obj).ToHandle(&name)) { if (i::Object::ToName(isolate, key_obj).ToHandle(&name)) {
maybe = i::JSReceiver::HasProperty(self, name); maybe = i::JSReceiver::HasProperty(isolate, self, name);
} }
} }
has_pending_exception = maybe.IsNothing(); has_pending_exception = maybe.IsNothing();
@ -4779,7 +4779,7 @@ Maybe<bool> v8::Object::Has(Local<Context> context, uint32_t index) {
auto isolate = reinterpret_cast<i::Isolate*>(context->GetIsolate()); auto isolate = reinterpret_cast<i::Isolate*>(context->GetIsolate());
ENTER_V8(isolate, context, Object, Has, Nothing<bool>(), i::HandleScope); ENTER_V8(isolate, context, Object, Has, Nothing<bool>(), i::HandleScope);
auto self = Utils::OpenHandle(this); auto self = Utils::OpenHandle(this);
auto maybe = i::JSReceiver::HasElement(self, index); auto maybe = i::JSReceiver::HasElement(isolate, self, index);
has_pending_exception = maybe.IsNothing(); has_pending_exception = maybe.IsNothing();
RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool); RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool);
return maybe; return maybe;
@ -4882,7 +4882,7 @@ Maybe<bool> v8::Object::HasOwnProperty(Local<Context> context,
i::HandleScope); i::HandleScope);
auto self = Utils::OpenHandle(this); auto self = Utils::OpenHandle(this);
auto key_val = Utils::OpenHandle(*key); auto key_val = Utils::OpenHandle(*key);
auto result = i::JSReceiver::HasOwnProperty(self, key_val); auto result = i::JSReceiver::HasOwnProperty(isolate, self, key_val);
has_pending_exception = result.IsNothing(); has_pending_exception = result.IsNothing();
RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool); RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool);
return result; return result;
@ -4893,7 +4893,7 @@ Maybe<bool> v8::Object::HasOwnProperty(Local<Context> context, uint32_t index) {
ENTER_V8(isolate, context, Object, HasOwnProperty, Nothing<bool>(), ENTER_V8(isolate, context, Object, HasOwnProperty, Nothing<bool>(),
i::HandleScope); i::HandleScope);
auto self = Utils::OpenHandle(this); auto self = Utils::OpenHandle(this);
auto result = i::JSReceiver::HasOwnProperty(self, index); auto result = i::JSReceiver::HasOwnProperty(isolate, self, index);
has_pending_exception = result.IsNothing(); has_pending_exception = result.IsNothing();
RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool); RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool);
return result; return result;
@ -4908,7 +4908,7 @@ Maybe<bool> v8::Object::HasRealNamedProperty(Local<Context> context,
if (!self->IsJSObject()) return Just(false); if (!self->IsJSObject()) return Just(false);
auto key_val = Utils::OpenHandle(*key); auto key_val = Utils::OpenHandle(*key);
auto result = i::JSObject::HasRealNamedProperty( auto result = i::JSObject::HasRealNamedProperty(
i::Handle<i::JSObject>::cast(self), key_val); isolate, i::Handle<i::JSObject>::cast(self), key_val);
has_pending_exception = result.IsNothing(); has_pending_exception = result.IsNothing();
RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool); RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool);
return result; return result;
@ -4922,7 +4922,7 @@ Maybe<bool> v8::Object::HasRealIndexedProperty(Local<Context> context,
auto self = Utils::OpenHandle(this); auto self = Utils::OpenHandle(this);
if (!self->IsJSObject()) return Just(false); if (!self->IsJSObject()) return Just(false);
auto result = i::JSObject::HasRealElementProperty( auto result = i::JSObject::HasRealElementProperty(
i::Handle<i::JSObject>::cast(self), index); isolate, i::Handle<i::JSObject>::cast(self), index);
has_pending_exception = result.IsNothing(); has_pending_exception = result.IsNothing();
RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool); RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool);
return result; return result;
@ -4937,7 +4937,7 @@ Maybe<bool> v8::Object::HasRealNamedCallbackProperty(Local<Context> context,
if (!self->IsJSObject()) return Just(false); if (!self->IsJSObject()) return Just(false);
auto key_val = Utils::OpenHandle(*key); auto key_val = Utils::OpenHandle(*key);
auto result = i::JSObject::HasRealNamedCallbackProperty( auto result = i::JSObject::HasRealNamedCallbackProperty(
i::Handle<i::JSObject>::cast(self), key_val); isolate, i::Handle<i::JSObject>::cast(self), key_val);
has_pending_exception = result.IsNothing(); has_pending_exception = result.IsNothing();
RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool); RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool);
return result; return result;

View File

@ -537,7 +537,8 @@ V8_WARN_UNUSED_RESULT Object GenericArrayShift(Isolate* isolate,
// c. Let fromPresent be ? HasProperty(O, from). // c. Let fromPresent be ? HasProperty(O, from).
bool from_present; bool from_present;
MAYBE_ASSIGN_RETURN_FAILURE_ON_EXCEPTION( MAYBE_ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
isolate, from_present, JSReceiver::HasProperty(receiver, from)); isolate, from_present,
JSReceiver::HasProperty(isolate, receiver, from));
// d. If fromPresent is true, then. // d. If fromPresent is true, then.
if (from_present) { if (from_present) {
@ -1046,7 +1047,7 @@ void CollectElementIndices(Isolate* isolate, Handle<JSObject> object,
bool IterateElementsSlow(Isolate* isolate, Handle<JSReceiver> receiver, bool IterateElementsSlow(Isolate* isolate, Handle<JSReceiver> receiver,
uint32_t length, ArrayConcatVisitor* visitor) { uint32_t length, ArrayConcatVisitor* visitor) {
FOR_WITH_HANDLE_SCOPE(isolate, uint32_t, i = 0, i, i < length, ++i, { FOR_WITH_HANDLE_SCOPE(isolate, uint32_t, i = 0, i, i < length, ++i, {
Maybe<bool> maybe = JSReceiver::HasElement(receiver, i); Maybe<bool> maybe = JSReceiver::HasElement(isolate, receiver, i);
if (maybe.IsNothing()) return false; if (maybe.IsNothing()) return false;
if (maybe.FromJust()) { if (maybe.FromJust()) {
Handle<Object> element_value; Handle<Object> element_value;
@ -1123,7 +1124,7 @@ bool IterateElements(Isolate* isolate, Handle<JSReceiver> receiver,
if (!element_value->IsTheHole(isolate)) { if (!element_value->IsTheHole(isolate)) {
if (!visitor->visit(j, element_value)) return false; if (!visitor->visit(j, element_value)) return false;
} else { } else {
Maybe<bool> maybe = JSReceiver::HasElement(array, j); Maybe<bool> maybe = JSReceiver::HasElement(isolate, array, j);
if (maybe.IsNothing()) return false; if (maybe.IsNothing()) return false;
if (maybe.FromJust()) { if (maybe.FromJust()) {
// Call GetElement on array, not its prototype, or getters won't // Call GetElement on array, not its prototype, or getters won't
@ -1161,7 +1162,7 @@ bool IterateElements(Isolate* isolate, Handle<JSReceiver> receiver,
isolate->factory()->NewNumber(double_value); isolate->factory()->NewNumber(double_value);
if (!visitor->visit(j, element_value)) return false; if (!visitor->visit(j, element_value)) return false;
} else { } else {
Maybe<bool> maybe = JSReceiver::HasElement(array, j); Maybe<bool> maybe = JSReceiver::HasElement(isolate, array, j);
if (maybe.IsNothing()) return false; if (maybe.IsNothing()) return false;
if (maybe.FromJust()) { if (maybe.FromJust()) {
// Call GetElement on array, not its prototype, or getters won't // Call GetElement on array, not its prototype, or getters won't

View File

@ -565,7 +565,7 @@ Handle<JSObject> ScopeIterator::ScopeObject(Mode mode) {
if (value->IsTheHole(isolate_)) { if (value->IsTheHole(isolate_)) {
// Reflect variables under TDZ as undefined in scope object. // Reflect variables under TDZ as undefined in scope object.
if (scope_type == ScopeTypeScript && if (scope_type == ScopeTypeScript &&
JSReceiver::HasOwnProperty(scope, name).FromMaybe(true)) { JSReceiver::HasOwnProperty(isolate_, scope, name).FromMaybe(true)) {
// We also use the hole to represent overridden let-declarations via // We also use the hole to represent overridden let-declarations via
// REPL mode in a script context. Catch this case. // REPL mode in a script context. Catch this case.
return false; return false;

View File

@ -2765,7 +2765,8 @@ void Isolate::InstallConditionalFeatures(Handle<Context> context) {
Handle<JSGlobalObject> global = handle(context->global_object(), this); Handle<JSGlobalObject> global = handle(context->global_object(), this);
Handle<String> sab_name = factory()->SharedArrayBuffer_string(); Handle<String> sab_name = factory()->SharedArrayBuffer_string();
if (IsSharedArrayBufferConstructorEnabled(context)) { if (IsSharedArrayBufferConstructorEnabled(context)) {
if (!JSObject::HasRealNamedProperty(global, sab_name).FromMaybe(true)) { if (!JSObject::HasRealNamedProperty(this, global, sab_name)
.FromMaybe(true)) {
JSObject::AddProperty(this, global, factory()->SharedArrayBuffer_string(), JSObject::AddProperty(this, global, factory()->SharedArrayBuffer_string(),
shared_array_buffer_fun(), DONT_ENUM); shared_array_buffer_fun(), DONT_ENUM);
} }

View File

@ -557,7 +557,8 @@ MaybeHandle<JSObject> ErrorUtils::Construct(
Handle<Name> cause_string = isolate->factory()->cause_string(); Handle<Name> cause_string = isolate->factory()->cause_string();
if (options->IsJSReceiver()) { if (options->IsJSReceiver()) {
Handle<JSReceiver> js_options = Handle<JSReceiver>::cast(options); Handle<JSReceiver> js_options = Handle<JSReceiver>::cast(options);
Maybe<bool> has_cause = JSObject::HasProperty(js_options, cause_string); Maybe<bool> has_cause =
JSObject::HasProperty(isolate, js_options, cause_string);
if (has_cause.IsNothing()) { if (has_cause.IsNothing()) {
DCHECK((isolate)->has_pending_exception()); DCHECK((isolate)->has_pending_exception());
return MaybeHandle<JSObject>(); return MaybeHandle<JSObject>();

View File

@ -707,19 +707,18 @@ DEF_GETTER(JSReceiver, property_array, PropertyArray) {
return PropertyArray::cast(prop); return PropertyArray::cast(prop);
} }
Maybe<bool> JSReceiver::HasProperty(Handle<JSReceiver> object, Maybe<bool> JSReceiver::HasProperty(Isolate* isolate, Handle<JSReceiver> object,
Handle<Name> name) { Handle<Name> name) {
Isolate* isolate = object->GetIsolate();
PropertyKey key(isolate, name); PropertyKey key(isolate, name);
LookupIterator it(isolate, object, key, object); LookupIterator it(isolate, object, key, object);
return HasProperty(&it); return HasProperty(&it);
} }
Maybe<bool> JSReceiver::HasOwnProperty(Handle<JSReceiver> object, Maybe<bool> JSReceiver::HasOwnProperty(Isolate* isolate,
Handle<JSReceiver> object,
uint32_t index) { uint32_t index) {
if (object->IsJSObject()) { // Shortcut. if (object->IsJSObject()) { // Shortcut.
LookupIterator it(object->GetIsolate(), object, index, object, LookupIterator it(isolate, object, index, object, LookupIterator::OWN);
LookupIterator::OWN);
return HasProperty(&it); return HasProperty(&it);
} }
@ -752,8 +751,9 @@ Maybe<PropertyAttributes> JSReceiver::GetOwnPropertyAttributes(
return GetPropertyAttributes(&it); return GetPropertyAttributes(&it);
} }
Maybe<bool> JSReceiver::HasElement(Handle<JSReceiver> object, uint32_t index) { Maybe<bool> JSReceiver::HasElement(Isolate* isolate, Handle<JSReceiver> object,
LookupIterator it(object->GetIsolate(), object, index, object); uint32_t index) {
LookupIterator it(isolate, object, index, object);
return HasProperty(&it); return HasProperty(&it);
} }

View File

@ -120,16 +120,15 @@ Maybe<bool> JSReceiver::HasProperty(LookupIterator* it) {
} }
// static // static
Maybe<bool> JSReceiver::HasOwnProperty(Handle<JSReceiver> object, Maybe<bool> JSReceiver::HasOwnProperty(Isolate* isolate,
Handle<JSReceiver> object,
Handle<Name> name) { Handle<Name> name) {
if (object->IsJSModuleNamespace()) { if (object->IsJSModuleNamespace()) {
PropertyDescriptor desc; PropertyDescriptor desc;
return JSReceiver::GetOwnPropertyDescriptor(object->GetIsolate(), object, return JSReceiver::GetOwnPropertyDescriptor(isolate, object, name, &desc);
name, &desc);
} }
if (object->IsJSObject()) { // Shortcut. if (object->IsJSObject()) { // Shortcut.
Isolate* isolate = object->GetIsolate();
PropertyKey key(isolate, name); PropertyKey key(isolate, name);
LookupIterator it(isolate, object, key, LookupIterator::OWN); LookupIterator it(isolate, object, key, LookupIterator::OWN);
return HasProperty(&it); return HasProperty(&it);
@ -5220,25 +5219,25 @@ MaybeHandle<Object> JSObject::GetPropertyWithInterceptor(LookupIterator* it,
return GetPropertyWithInterceptorInternal(it, it->GetInterceptor(), done); return GetPropertyWithInterceptorInternal(it, it->GetInterceptor(), done);
} }
Maybe<bool> JSObject::HasRealNamedProperty(Handle<JSObject> object, Maybe<bool> JSObject::HasRealNamedProperty(Isolate* isolate,
Handle<JSObject> object,
Handle<Name> name) { Handle<Name> name) {
Isolate* isolate = object->GetIsolate();
PropertyKey key(isolate, name); PropertyKey key(isolate, name);
LookupIterator it(isolate, object, key, LookupIterator::OWN_SKIP_INTERCEPTOR); LookupIterator it(isolate, object, key, LookupIterator::OWN_SKIP_INTERCEPTOR);
return HasProperty(&it); return HasProperty(&it);
} }
Maybe<bool> JSObject::HasRealElementProperty(Handle<JSObject> object, Maybe<bool> JSObject::HasRealElementProperty(Isolate* isolate,
Handle<JSObject> object,
uint32_t index) { uint32_t index) {
Isolate* isolate = object->GetIsolate();
LookupIterator it(isolate, object, index, object, LookupIterator it(isolate, object, index, object,
LookupIterator::OWN_SKIP_INTERCEPTOR); LookupIterator::OWN_SKIP_INTERCEPTOR);
return HasProperty(&it); return HasProperty(&it);
} }
Maybe<bool> JSObject::HasRealNamedCallbackProperty(Handle<JSObject> object, Maybe<bool> JSObject::HasRealNamedCallbackProperty(Isolate* isolate,
Handle<JSObject> object,
Handle<Name> name) { Handle<Name> name) {
Isolate* isolate = object->GetIsolate();
PropertyKey key(isolate, name); PropertyKey key(isolate, name);
LookupIterator it(isolate, object, key, LookupIterator::OWN_SKIP_INTERCEPTOR); LookupIterator it(isolate, object, key, LookupIterator::OWN_SKIP_INTERCEPTOR);
Maybe<PropertyAttributes> maybe_result = GetPropertyAttributes(&it); Maybe<PropertyAttributes> maybe_result = GetPropertyAttributes(&it);

View File

@ -119,14 +119,14 @@ class JSReceiver : public TorqueGeneratedJSReceiver<JSReceiver, HeapObject> {
V8_EXPORT_PRIVATE V8_WARN_UNUSED_RESULT static Maybe<bool> HasProperty( V8_EXPORT_PRIVATE V8_WARN_UNUSED_RESULT static Maybe<bool> HasProperty(
LookupIterator* it); LookupIterator* it);
V8_WARN_UNUSED_RESULT static inline Maybe<bool> HasProperty( V8_WARN_UNUSED_RESULT static inline Maybe<bool> HasProperty(
Handle<JSReceiver> object, Handle<Name> name); Isolate* isolate, Handle<JSReceiver> object, Handle<Name> name);
V8_WARN_UNUSED_RESULT static inline Maybe<bool> HasElement( V8_WARN_UNUSED_RESULT static inline Maybe<bool> HasElement(
Handle<JSReceiver> object, uint32_t index); Isolate* isolate, Handle<JSReceiver> object, uint32_t index);
V8_EXPORT_PRIVATE V8_WARN_UNUSED_RESULT static Maybe<bool> HasOwnProperty( V8_EXPORT_PRIVATE V8_WARN_UNUSED_RESULT static Maybe<bool> HasOwnProperty(
Handle<JSReceiver> object, Handle<Name> name); Isolate* isolate, Handle<JSReceiver> object, Handle<Name> name);
V8_WARN_UNUSED_RESULT static inline Maybe<bool> HasOwnProperty( V8_WARN_UNUSED_RESULT static inline Maybe<bool> HasOwnProperty(
Handle<JSReceiver> object, uint32_t index); Isolate* isolate, Handle<JSReceiver> object, uint32_t index);
V8_WARN_UNUSED_RESULT static inline MaybeHandle<Object> GetProperty( V8_WARN_UNUSED_RESULT static inline MaybeHandle<Object> GetProperty(
Isolate* isolate, Handle<JSReceiver> receiver, const char* key); Isolate* isolate, Handle<JSReceiver> receiver, const char* key);
@ -587,11 +587,11 @@ class JSObject : public TorqueGeneratedJSObject<JSObject, JSReceiver> {
// Support functions for v8 api (needed for correct interceptor behavior). // Support functions for v8 api (needed for correct interceptor behavior).
V8_WARN_UNUSED_RESULT static Maybe<bool> HasRealNamedProperty( V8_WARN_UNUSED_RESULT static Maybe<bool> HasRealNamedProperty(
Handle<JSObject> object, Handle<Name> name); Isolate* isolate, Handle<JSObject> object, Handle<Name> name);
V8_WARN_UNUSED_RESULT static Maybe<bool> HasRealElementProperty( V8_WARN_UNUSED_RESULT static Maybe<bool> HasRealElementProperty(
Handle<JSObject> object, uint32_t index); Isolate* isolate, Handle<JSObject> object, uint32_t index);
V8_WARN_UNUSED_RESULT static Maybe<bool> HasRealNamedCallbackProperty( V8_WARN_UNUSED_RESULT static Maybe<bool> HasRealNamedCallbackProperty(
Handle<JSObject> object, Handle<Name> name); Isolate* isolate, Handle<JSObject> object, Handle<Name> name);
// Get the header size for a JSObject. Used to compute the index of // Get the header size for a JSObject. Used to compute the index of
// embedder fields as well as the number of embedder fields. // embedder fields as well as the number of embedder fields.

View File

@ -1330,7 +1330,7 @@ MaybeHandle<JSReceiver> ToTemporalCalendar(
// b. If ? HasProperty(temporalCalendarLike, "calendar") is false, return // b. If ? HasProperty(temporalCalendarLike, "calendar") is false, return
// temporalCalendarLike. // temporalCalendarLike.
Maybe<bool> maybe_has = Maybe<bool> maybe_has =
JSReceiver::HasProperty(obj, factory->calendar_string()); JSReceiver::HasProperty(isolate, obj, factory->calendar_string());
MAYBE_RETURN(maybe_has, Handle<JSReceiver>()); MAYBE_RETURN(maybe_has, Handle<JSReceiver>());
if (!maybe_has.FromJust()) { if (!maybe_has.FromJust()) {
@ -1345,7 +1345,8 @@ MaybeHandle<JSReceiver> ToTemporalCalendar(
if (temporal_calendar_like->IsJSReceiver()) { if (temporal_calendar_like->IsJSReceiver()) {
obj = Handle<JSReceiver>::cast(temporal_calendar_like); obj = Handle<JSReceiver>::cast(temporal_calendar_like);
// and ? HasProperty(temporalCalendarLike, "calendar") is false, // and ? HasProperty(temporalCalendarLike, "calendar") is false,
maybe_has = JSReceiver::HasProperty(obj, factory->calendar_string()); maybe_has =
JSReceiver::HasProperty(isolate, obj, factory->calendar_string());
MAYBE_RETURN(maybe_has, Handle<JSReceiver>()); MAYBE_RETURN(maybe_has, Handle<JSReceiver>());
if (!maybe_has.FromJust()) { if (!maybe_has.FromJust()) {
// return temporalCalendarLike. // return temporalCalendarLike.
@ -1405,7 +1406,7 @@ MaybeHandle<JSReceiver> ToTemporalTimeZone(
Handle<JSReceiver> obj = Handle<JSReceiver>::cast(temporal_time_zone_like); Handle<JSReceiver> obj = Handle<JSReceiver>::cast(temporal_time_zone_like);
// b. If ? HasProperty(temporalTimeZoneLike, "timeZone") is false, // b. If ? HasProperty(temporalTimeZoneLike, "timeZone") is false,
Maybe<bool> maybe_has = Maybe<bool> maybe_has =
JSReceiver::HasProperty(obj, factory->timeZone_string()); JSReceiver::HasProperty(isolate, obj, factory->timeZone_string());
MAYBE_RETURN(maybe_has, Handle<JSReceiver>()); MAYBE_RETURN(maybe_has, Handle<JSReceiver>());
if (!maybe_has.FromJust()) { if (!maybe_has.FromJust()) {
// return temporalTimeZoneLike. // return temporalTimeZoneLike.
@ -1421,7 +1422,8 @@ MaybeHandle<JSReceiver> ToTemporalTimeZone(
if (temporal_time_zone_like->IsJSReceiver()) { if (temporal_time_zone_like->IsJSReceiver()) {
// is Object and ? HasProperty(temporalTimeZoneLike, "timeZone") is false, // is Object and ? HasProperty(temporalTimeZoneLike, "timeZone") is false,
obj = Handle<JSReceiver>::cast(temporal_time_zone_like); obj = Handle<JSReceiver>::cast(temporal_time_zone_like);
maybe_has = JSReceiver::HasProperty(obj, factory->timeZone_string()); maybe_has =
JSReceiver::HasProperty(isolate, obj, factory->timeZone_string());
MAYBE_RETURN(maybe_has, Handle<JSReceiver>()); MAYBE_RETURN(maybe_has, Handle<JSReceiver>());
if (!maybe_has.FromJust()) { if (!maybe_has.FromJust()) {
// return temporalTimeZoneLike. // return temporalTimeZoneLike.

View File

@ -428,7 +428,8 @@ namespace {
bool IsErrorObject(Isolate* isolate, Handle<Object> object) { bool IsErrorObject(Isolate* isolate, Handle<Object> object) {
if (!object->IsJSReceiver()) return false; if (!object->IsJSReceiver()) return false;
Handle<Symbol> symbol = isolate->factory()->error_stack_symbol(); Handle<Symbol> symbol = isolate->factory()->error_stack_symbol();
return JSReceiver::HasOwnProperty(Handle<JSReceiver>::cast(object), symbol) return JSReceiver::HasOwnProperty(isolate, Handle<JSReceiver>::cast(object),
symbol)
.FromMaybe(false); .FromMaybe(false);
} }
@ -3021,7 +3022,7 @@ Maybe<bool> JSProxy::HasProperty(Isolate* isolate, Handle<JSProxy> proxy,
// 7. If trap is undefined, then // 7. If trap is undefined, then
if (trap->IsUndefined(isolate)) { if (trap->IsUndefined(isolate)) {
// 7a. Return target.[[HasProperty]](P). // 7a. Return target.[[HasProperty]](P).
return JSReceiver::HasProperty(target, name); return JSReceiver::HasProperty(isolate, target, name);
} }
// 8. Let booleanTrapResult be ToBoolean(? Call(trap, handler, «target, P»)). // 8. Let booleanTrapResult be ToBoolean(? Call(trap, handler, «target, P»)).
Handle<Object> trap_result_obj; Handle<Object> trap_result_obj;

View File

@ -77,7 +77,7 @@ MaybeHandle<Object> Runtime::HasProperty(Isolate* isolate,
Object); Object);
// Lookup the {name} on {receiver}. // Lookup the {name} on {receiver}.
Maybe<bool> maybe = JSReceiver::HasProperty(receiver, name); Maybe<bool> maybe = JSReceiver::HasProperty(isolate, receiver, name);
if (maybe.IsNothing()) return MaybeHandle<Object>(); if (maybe.IsNothing()) return MaybeHandle<Object>();
return maybe.FromJust() ? ReadOnlyRoots(isolate).true_value_handle() return maybe.FromJust() ? ReadOnlyRoots(isolate).true_value_handle()
: ReadOnlyRoots(isolate).false_value_handle(); : ReadOnlyRoots(isolate).false_value_handle();
@ -969,7 +969,7 @@ RUNTIME_FUNCTION(Runtime_HasProperty) {
Object::ToName(isolate, key)); Object::ToName(isolate, key));
// Lookup the {name} on {receiver}. // Lookup the {name} on {receiver}.
Maybe<bool> maybe = JSReceiver::HasProperty(receiver, name); Maybe<bool> maybe = JSReceiver::HasProperty(isolate, receiver, name);
if (maybe.IsNothing()) return ReadOnlyRoots(isolate).exception(); if (maybe.IsNothing()) return ReadOnlyRoots(isolate).exception();
return isolate->heap()->ToBoolean(maybe.FromJust()); return isolate->heap()->ToBoolean(maybe.FromJust());
} }

View File

@ -2989,7 +2989,8 @@ void WasmJs::InstallConditionalFeatures(Isolate* isolate,
Handle<JSObject> webassembly = Handle<JSObject>::cast(webassembly_obj); Handle<JSObject> webassembly = Handle<JSObject>::cast(webassembly_obj);
// Setup Exception // Setup Exception
Handle<String> tag_name = v8_str(isolate, "Tag"); Handle<String> tag_name = v8_str(isolate, "Tag");
if (JSObject::HasOwnProperty(webassembly, tag_name).FromMaybe(true)) { if (JSObject::HasOwnProperty(isolate, webassembly, tag_name)
.FromMaybe(true)) {
// The {Exception} constructor already exists, there is nothing more to // The {Exception} constructor already exists, there is nothing more to
// do. // do.
return; return;

View File

@ -337,7 +337,8 @@ TEST(HeapObjects) {
Handle<String> object_string = Handle<String>::cast(factory->Object_string()); Handle<String> object_string = Handle<String>::cast(factory->Object_string());
Handle<JSGlobalObject> global(CcTest::i_isolate()->context().global_object(), Handle<JSGlobalObject> global(CcTest::i_isolate()->context().global_object(),
isolate); isolate);
CHECK(Just(true) == JSReceiver::HasOwnProperty(global, object_string)); CHECK(Just(true) ==
JSReceiver::HasOwnProperty(isolate, global, object_string));
// Check ToString for oddballs // Check ToString for oddballs
ReadOnlyRoots roots(heap); ReadOnlyRoots roots(heap);
@ -406,7 +407,7 @@ TEST(GarbageCollection) {
CcTest::CollectGarbage(NEW_SPACE); CcTest::CollectGarbage(NEW_SPACE);
// Function should be alive. // Function should be alive.
CHECK(Just(true) == JSReceiver::HasOwnProperty(global, name)); CHECK(Just(true) == JSReceiver::HasOwnProperty(isolate, global, name));
// Check function is retained. // Check function is retained.
Handle<Object> func_value = Handle<Object> func_value =
Object::GetProperty(isolate, global, name).ToHandleChecked(); Object::GetProperty(isolate, global, name).ToHandleChecked();
@ -424,7 +425,7 @@ TEST(GarbageCollection) {
// After gc, it should survive. // After gc, it should survive.
CcTest::CollectGarbage(NEW_SPACE); CcTest::CollectGarbage(NEW_SPACE);
CHECK(Just(true) == JSReceiver::HasOwnProperty(global, obj_name)); CHECK(Just(true) == JSReceiver::HasOwnProperty(isolate, global, obj_name));
Handle<Object> obj = Handle<Object> obj =
Object::GetProperty(isolate, global, obj_name).ToHandleChecked(); Object::GetProperty(isolate, global, obj_name).ToHandleChecked();
CHECK(obj->IsJSObject()); CHECK(obj->IsJSObject());
@ -800,60 +801,60 @@ TEST(ObjectProperties) {
Handle<Smi> two(Smi::FromInt(2), isolate); Handle<Smi> two(Smi::FromInt(2), isolate);
// check for empty // check for empty
CHECK(Just(false) == JSReceiver::HasOwnProperty(obj, first)); CHECK(Just(false) == JSReceiver::HasOwnProperty(isolate, obj, first));
// add first // add first
Object::SetProperty(isolate, obj, first, one).Check(); Object::SetProperty(isolate, obj, first, one).Check();
CHECK(Just(true) == JSReceiver::HasOwnProperty(obj, first)); CHECK(Just(true) == JSReceiver::HasOwnProperty(isolate, obj, first));
// delete first // delete first
CHECK(Just(true) == CHECK(Just(true) ==
JSReceiver::DeleteProperty(obj, first, LanguageMode::kSloppy)); JSReceiver::DeleteProperty(obj, first, LanguageMode::kSloppy));
CHECK(Just(false) == JSReceiver::HasOwnProperty(obj, first)); CHECK(Just(false) == JSReceiver::HasOwnProperty(isolate, obj, first));
// add first and then second // add first and then second
Object::SetProperty(isolate, obj, first, one).Check(); Object::SetProperty(isolate, obj, first, one).Check();
Object::SetProperty(isolate, obj, second, two).Check(); Object::SetProperty(isolate, obj, second, two).Check();
CHECK(Just(true) == JSReceiver::HasOwnProperty(obj, first)); CHECK(Just(true) == JSReceiver::HasOwnProperty(isolate, obj, first));
CHECK(Just(true) == JSReceiver::HasOwnProperty(obj, second)); CHECK(Just(true) == JSReceiver::HasOwnProperty(isolate, obj, second));
// delete first and then second // delete first and then second
CHECK(Just(true) == CHECK(Just(true) ==
JSReceiver::DeleteProperty(obj, first, LanguageMode::kSloppy)); JSReceiver::DeleteProperty(obj, first, LanguageMode::kSloppy));
CHECK(Just(true) == JSReceiver::HasOwnProperty(obj, second)); CHECK(Just(true) == JSReceiver::HasOwnProperty(isolate, obj, second));
CHECK(Just(true) == CHECK(Just(true) ==
JSReceiver::DeleteProperty(obj, second, LanguageMode::kSloppy)); JSReceiver::DeleteProperty(obj, second, LanguageMode::kSloppy));
CHECK(Just(false) == JSReceiver::HasOwnProperty(obj, first)); CHECK(Just(false) == JSReceiver::HasOwnProperty(isolate, obj, first));
CHECK(Just(false) == JSReceiver::HasOwnProperty(obj, second)); CHECK(Just(false) == JSReceiver::HasOwnProperty(isolate, obj, second));
// add first and then second // add first and then second
Object::SetProperty(isolate, obj, first, one).Check(); Object::SetProperty(isolate, obj, first, one).Check();
Object::SetProperty(isolate, obj, second, two).Check(); Object::SetProperty(isolate, obj, second, two).Check();
CHECK(Just(true) == JSReceiver::HasOwnProperty(obj, first)); CHECK(Just(true) == JSReceiver::HasOwnProperty(isolate, obj, first));
CHECK(Just(true) == JSReceiver::HasOwnProperty(obj, second)); CHECK(Just(true) == JSReceiver::HasOwnProperty(isolate, obj, second));
// delete second and then first // delete second and then first
CHECK(Just(true) == CHECK(Just(true) ==
JSReceiver::DeleteProperty(obj, second, LanguageMode::kSloppy)); JSReceiver::DeleteProperty(obj, second, LanguageMode::kSloppy));
CHECK(Just(true) == JSReceiver::HasOwnProperty(obj, first)); CHECK(Just(true) == JSReceiver::HasOwnProperty(isolate, obj, first));
CHECK(Just(true) == CHECK(Just(true) ==
JSReceiver::DeleteProperty(obj, first, LanguageMode::kSloppy)); JSReceiver::DeleteProperty(obj, first, LanguageMode::kSloppy));
CHECK(Just(false) == JSReceiver::HasOwnProperty(obj, first)); CHECK(Just(false) == JSReceiver::HasOwnProperty(isolate, obj, first));
CHECK(Just(false) == JSReceiver::HasOwnProperty(obj, second)); CHECK(Just(false) == JSReceiver::HasOwnProperty(isolate, obj, second));
// check string and internalized string match // check string and internalized string match
const char* string1 = "fisk"; const char* string1 = "fisk";
Handle<String> s1 = factory->NewStringFromAsciiChecked(string1); Handle<String> s1 = factory->NewStringFromAsciiChecked(string1);
Object::SetProperty(isolate, obj, s1, one).Check(); Object::SetProperty(isolate, obj, s1, one).Check();
Handle<String> s1_string = factory->InternalizeUtf8String(string1); Handle<String> s1_string = factory->InternalizeUtf8String(string1);
CHECK(Just(true) == JSReceiver::HasOwnProperty(obj, s1_string)); CHECK(Just(true) == JSReceiver::HasOwnProperty(isolate, obj, s1_string));
// check internalized string and string match // check internalized string and string match
const char* string2 = "fugl"; const char* string2 = "fugl";
Handle<String> s2_string = factory->InternalizeUtf8String(string2); Handle<String> s2_string = factory->InternalizeUtf8String(string2);
Object::SetProperty(isolate, obj, s2_string, one).Check(); Object::SetProperty(isolate, obj, s2_string, one).Check();
Handle<String> s2 = factory->NewStringFromAsciiChecked(string2); Handle<String> s2 = factory->NewStringFromAsciiChecked(string2);
CHECK(Just(true) == JSReceiver::HasOwnProperty(obj, s2)); CHECK(Just(true) == JSReceiver::HasOwnProperty(isolate, obj, s2));
} }

View File

@ -154,7 +154,7 @@ HEAP_TEST(MarkCompactCollector) {
{ HandleScope scope(isolate); { HandleScope scope(isolate);
Handle<String> func_name = factory->InternalizeUtf8String("theFunction"); Handle<String> func_name = factory->InternalizeUtf8String("theFunction");
CHECK(Just(true) == JSReceiver::HasOwnProperty(global, func_name)); CHECK(Just(true) == JSReceiver::HasOwnProperty(isolate, global, func_name));
Handle<Object> func_value = Handle<Object> func_value =
Object::GetProperty(isolate, global, func_name).ToHandleChecked(); Object::GetProperty(isolate, global, func_name).ToHandleChecked();
CHECK(func_value->IsJSFunction()); CHECK(func_value->IsJSFunction());
@ -172,7 +172,7 @@ HEAP_TEST(MarkCompactCollector) {
{ HandleScope scope(isolate); { HandleScope scope(isolate);
Handle<String> obj_name = factory->InternalizeUtf8String("theObject"); Handle<String> obj_name = factory->InternalizeUtf8String("theObject");
CHECK(Just(true) == JSReceiver::HasOwnProperty(global, obj_name)); CHECK(Just(true) == JSReceiver::HasOwnProperty(isolate, global, obj_name));
Handle<Object> object = Handle<Object> object =
Object::GetProperty(isolate, global, obj_name).ToHandleChecked(); Object::GetProperty(isolate, global, obj_name).ToHandleChecked();
CHECK(object->IsJSObject()); CHECK(object->IsJSObject());

View File

@ -1340,7 +1340,7 @@ TEST(TryHasOwnProperty) {
for (Handle<JSObject> object : objects) { for (Handle<JSObject> object : objects) {
for (size_t name_index = 0; name_index < arraysize(names); name_index++) { for (size_t name_index = 0; name_index < arraysize(names); name_index++) {
Handle<Name> name = names[name_index]; Handle<Name> name = names[name_index];
CHECK(JSReceiver::HasProperty(object, name).FromJust()); CHECK(JSReceiver::HasProperty(isolate, object, name).FromJust());
ft.CheckTrue(object, name, expect_found); ft.CheckTrue(object, name, expect_found);
} }
} }
@ -1360,7 +1360,7 @@ TEST(TryHasOwnProperty) {
for (size_t key_index = 0; key_index < arraysize(non_existing_names); for (size_t key_index = 0; key_index < arraysize(non_existing_names);
key_index++) { key_index++) {
Handle<Name> name = non_existing_names[key_index]; Handle<Name> name = non_existing_names[key_index];
CHECK(!JSReceiver::HasProperty(object, name).FromJust()); CHECK(!JSReceiver::HasProperty(isolate, object, name).FromJust());
ft.CheckTrue(object, name, expect_not_found); ft.CheckTrue(object, name, expect_not_found);
} }
} }
@ -1667,11 +1667,11 @@ TEST(TryLookupElement) {
Handle<Object> expect_bailout(Smi::FromInt(kBailout), isolate); Handle<Object> expect_bailout(Smi::FromInt(kBailout), isolate);
#define CHECK_FOUND(object, index) \ #define CHECK_FOUND(object, index) \
CHECK(JSReceiver::HasElement(object, index).FromJust()); \ CHECK(JSReceiver::HasElement(isolate, object, index).FromJust()); \
ft.CheckTrue(object, smi##index, expect_found); ft.CheckTrue(object, smi##index, expect_found);
#define CHECK_NOT_FOUND(object, index) \ #define CHECK_NOT_FOUND(object, index) \
CHECK(!JSReceiver::HasElement(object, index).FromJust()); \ CHECK(!JSReceiver::HasElement(isolate, object, index).FromJust()); \
ft.CheckTrue(object, smi##index, expect_not_found); ft.CheckTrue(object, smi##index, expect_not_found);
#define CHECK_ABSENT(object, index) \ #define CHECK_ABSENT(object, index) \

View File

@ -539,11 +539,11 @@ TEST_P(MicrotaskQueueTest, DetachGlobal_HandlerContext) {
" results['stale_rejected_promise'] = true;" " results['stale_rejected_promise'] = true;"
"})"); "})");
microtask_queue()->RunMicrotasks(isolate()); microtask_queue()->RunMicrotasks(isolate());
EXPECT_TRUE( EXPECT_TRUE(JSReceiver::HasProperty(isolate(), results,
JSReceiver::HasProperty(results, NameFromChars("stale_resolved_promise")) NameFromChars("stale_resolved_promise"))
.FromJust()); .FromJust());
EXPECT_TRUE( EXPECT_TRUE(JSReceiver::HasProperty(isolate(), results,
JSReceiver::HasProperty(results, NameFromChars("stale_rejected_promise")) NameFromChars("stale_rejected_promise"))
.FromJust()); .FromJust());
// Set stale handlers to valid promises. // Set stale handlers to valid promises.
@ -554,11 +554,11 @@ TEST_P(MicrotaskQueueTest, DetachGlobal_HandlerContext) {
"Promise.reject(" "Promise.reject("
" stale_handler.bind(null, results, 'stale_handler_reject'))"); " stale_handler.bind(null, results, 'stale_handler_reject'))");
microtask_queue()->RunMicrotasks(isolate()); microtask_queue()->RunMicrotasks(isolate());
EXPECT_FALSE( EXPECT_FALSE(JSReceiver::HasProperty(isolate(), results,
JSReceiver::HasProperty(results, NameFromChars("stale_handler_resolve")) NameFromChars("stale_handler_resolve"))
.FromJust()); .FromJust());
EXPECT_FALSE( EXPECT_FALSE(JSReceiver::HasProperty(isolate(), results,
JSReceiver::HasProperty(results, NameFromChars("stale_handler_reject")) NameFromChars("stale_handler_reject"))
.FromJust()); .FromJust());
} }