Merge V8 5.2.361.47 DO NOT MERGE
https://chromium.googlesource.com/v8/v8/+/5.2.361.47
FPIIM-449
Change-Id: Ibec421b85a9b88cb3a432ada642e469fe7e78346
(cherry picked from commit bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8)
diff --git a/src/accessors.cc b/src/accessors.cc
index 374c0a2..8b8753b 100644
--- a/src/accessors.cc
+++ b/src/accessors.cc
@@ -40,6 +40,11 @@
Handle<Object> set = v8::FromCData(isolate, setter);
info->set_getter(*get);
info->set_setter(*set);
+ Address redirected = info->redirected_getter();
+ if (redirected != nullptr) {
+ Handle<Object> js_get = v8::FromCData(isolate, redirected);
+ info->set_js_getter(*js_get);
+ }
return info;
}
@@ -88,37 +93,6 @@
Isolate* isolate = name->GetIsolate();
switch (map->instance_type()) {
- case JS_TYPED_ARRAY_TYPE: {
- if (!CheckForName(name, isolate->factory()->length_string(),
- JSTypedArray::kLengthOffset, object_offset) &&
- !CheckForName(name, isolate->factory()->byte_length_string(),
- JSTypedArray::kByteLengthOffset, object_offset) &&
- !CheckForName(name, isolate->factory()->byte_offset_string(),
- JSTypedArray::kByteOffsetOffset, object_offset)) {
- return false;
- }
-
- if (map->is_dictionary_map()) return false;
-
- // Check if the property is overridden on the instance.
- DescriptorArray* descriptors = map->instance_descriptors();
- int descriptor = descriptors->SearchWithCache(isolate, *name, *map);
- if (descriptor != DescriptorArray::kNotFound) return false;
-
- Handle<Object> proto = Handle<Object>(map->prototype(), isolate);
- if (!proto->IsJSReceiver()) return false;
-
- // Check if the property is defined in the prototype chain.
- LookupIterator it(proto, name);
- if (!it.IsFound()) return false;
-
- Object* original_proto =
- JSFunction::cast(map->GetConstructor())->prototype();
-
- // Property is not configurable. It is enough to verify that
- // the holder is the same.
- return *it.GetHolder<Object>() == original_proto;
- }
case JS_DATA_VIEW_TYPE:
return CheckForName(name, isolate->factory()->byte_length_string(),
JSDataView::kByteLengthOffset, object_offset) ||
@@ -129,9 +103,11 @@
}
}
-MUST_USE_RESULT static MaybeHandle<Object> ReplaceAccessorWithDataProperty(
- Isolate* isolate, Handle<JSObject> receiver, Handle<JSObject> holder,
- Handle<Name> name, Handle<Object> value, bool observe) {
+namespace {
+
+MUST_USE_RESULT MaybeHandle<Object> ReplaceAccessorWithDataProperty(
+ Isolate* isolate, Handle<Object> receiver, Handle<JSObject> holder,
+ Handle<Name> name, Handle<Object> value) {
LookupIterator it(receiver, name, holder,
LookupIterator::OWN_SKIP_INTERCEPTOR);
// Skip any access checks we might hit. This accessor should never hit in a
@@ -140,37 +116,26 @@
CHECK(it.HasAccess());
it.Next();
}
+ DCHECK(holder.is_identical_to(it.GetHolder<JSObject>()));
CHECK_EQ(LookupIterator::ACCESSOR, it.state());
-
- Handle<Object> old_value;
- bool is_observed = observe && receiver->map()->is_observed();
- if (is_observed) {
- MaybeHandle<Object> maybe_old = Object::GetPropertyWithAccessor(&it);
- if (!maybe_old.ToHandle(&old_value)) return maybe_old;
- }
-
it.ReconfigureDataProperty(value, it.property_attributes());
-
- if (is_observed && !old_value->SameValue(*value)) {
- return JSObject::EnqueueChangeRecord(receiver, "update", name, old_value);
- }
-
return value;
}
+} // namespace
+
void Accessors::ReconfigureToDataProperty(
v8::Local<v8::Name> key, v8::Local<v8::Value> val,
const v8::PropertyCallbackInfo<void>& info) {
i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate());
HandleScope scope(isolate);
- Handle<JSObject> receiver =
- Handle<JSObject>::cast(Utils::OpenHandle(*info.This()));
+ Handle<Object> receiver = Utils::OpenHandle(*info.This());
Handle<JSObject> holder =
Handle<JSObject>::cast(Utils::OpenHandle(*info.Holder()));
Handle<Name> name = Utils::OpenHandle(*key);
Handle<Object> value = Utils::OpenHandle(*val);
- MaybeHandle<Object> result = ReplaceAccessorWithDataProperty(
- isolate, receiver, holder, name, value, false);
+ MaybeHandle<Object> result =
+ ReplaceAccessorWithDataProperty(isolate, receiver, holder, name, value);
if (result.is_null()) isolate->OptionalRescheduleException(false);
}
@@ -221,7 +186,7 @@
i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate());
HandleScope scope(isolate);
- Handle<JSReceiver> object = Utils::OpenHandle(*info.This());
+ Handle<JSReceiver> object = Utils::OpenHandle(*info.Holder());
Handle<JSArray> array = Handle<JSArray>::cast(object);
Handle<Object> length_obj = Utils::OpenHandle(*val);
@@ -231,9 +196,7 @@
return;
}
- if (JSArray::ObservableSetLength(array, length).is_null()) {
- isolate->OptionalRescheduleException(false);
- }
+ JSArray::SetLength(array, length);
if (info.ShouldThrowOnError()) {
uint32_t actual_new_len = 0;
@@ -305,7 +268,7 @@
i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate());
DisallowHeapAllocation no_allocation;
HandleScope scope(isolate);
- Object* object = *Utils::OpenHandle(*info.This());
+ Object* object = *Utils::OpenHandle(*info.Holder());
Object* res = Smi::FromInt(
Script::cast(JSValue::cast(object)->value())->column_offset());
info.GetReturnValue().Set(Utils::ToLocal(Handle<Object>(res, isolate)));
@@ -332,7 +295,7 @@
i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate());
DisallowHeapAllocation no_allocation;
HandleScope scope(isolate);
- Object* object = *Utils::OpenHandle(*info.This());
+ Object* object = *Utils::OpenHandle(*info.Holder());
Object* id = Smi::FromInt(Script::cast(JSValue::cast(object)->value())->id());
info.GetReturnValue().Set(Utils::ToLocal(Handle<Object>(id, isolate)));
}
@@ -357,7 +320,7 @@
i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate());
DisallowHeapAllocation no_allocation;
HandleScope scope(isolate);
- Object* object = *Utils::OpenHandle(*info.This());
+ Object* object = *Utils::OpenHandle(*info.Holder());
Object* source = Script::cast(JSValue::cast(object)->value())->name();
info.GetReturnValue().Set(Utils::ToLocal(Handle<Object>(source, isolate)));
}
@@ -381,7 +344,7 @@
i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate());
DisallowHeapAllocation no_allocation;
HandleScope scope(isolate);
- Object* object = *Utils::OpenHandle(*info.This());
+ Object* object = *Utils::OpenHandle(*info.Holder());
Object* source = Script::cast(JSValue::cast(object)->value())->source();
info.GetReturnValue().Set(Utils::ToLocal(Handle<Object>(source, isolate)));
}
@@ -405,7 +368,7 @@
i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate());
DisallowHeapAllocation no_allocation;
HandleScope scope(isolate);
- Object* object = *Utils::OpenHandle(*info.This());
+ Object* object = *Utils::OpenHandle(*info.Holder());
Object* res =
Smi::FromInt(Script::cast(JSValue::cast(object)->value())->line_offset());
info.GetReturnValue().Set(Utils::ToLocal(Handle<Object>(res, isolate)));
@@ -432,7 +395,7 @@
i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate());
DisallowHeapAllocation no_allocation;
HandleScope scope(isolate);
- Object* object = *Utils::OpenHandle(*info.This());
+ Object* object = *Utils::OpenHandle(*info.Holder());
Object* res =
Smi::FromInt(Script::cast(JSValue::cast(object)->value())->type());
info.GetReturnValue().Set(Utils::ToLocal(Handle<Object>(res, isolate)));
@@ -458,7 +421,7 @@
i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate());
DisallowHeapAllocation no_allocation;
HandleScope scope(isolate);
- Object* object = *Utils::OpenHandle(*info.This());
+ Object* object = *Utils::OpenHandle(*info.Holder());
Object* res = Smi::FromInt(
Script::cast(JSValue::cast(object)->value())->compilation_type());
info.GetReturnValue().Set(Utils::ToLocal(Handle<Object>(res, isolate)));
@@ -484,7 +447,7 @@
const v8::PropertyCallbackInfo<v8::Value>& info) {
i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate());
HandleScope scope(isolate);
- Handle<Object> object = Utils::OpenHandle(*info.This());
+ Handle<Object> object = Utils::OpenHandle(*info.Holder());
Handle<Script> script(
Script::cast(Handle<JSValue>::cast(object)->value()), isolate);
Script::InitLineEnds(script);
@@ -519,7 +482,7 @@
i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate());
DisallowHeapAllocation no_allocation;
HandleScope scope(isolate);
- Object* object = *Utils::OpenHandle(*info.This());
+ Object* object = *Utils::OpenHandle(*info.Holder());
Object* url = Script::cast(JSValue::cast(object)->value())->source_url();
info.GetReturnValue().Set(Utils::ToLocal(Handle<Object>(url, isolate)));
}
@@ -543,7 +506,7 @@
i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate());
DisallowHeapAllocation no_allocation;
HandleScope scope(isolate);
- Object* object = *Utils::OpenHandle(*info.This());
+ Object* object = *Utils::OpenHandle(*info.Holder());
Object* url =
Script::cast(JSValue::cast(object)->value())->source_mapping_url();
info.GetReturnValue().Set(Utils::ToLocal(Handle<Object>(url, isolate)));
@@ -567,7 +530,7 @@
i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate());
DisallowHeapAllocation no_allocation;
HandleScope scope(isolate);
- Object* object = *Utils::OpenHandle(*info.This());
+ Object* object = *Utils::OpenHandle(*info.Holder());
bool is_embedder_debug_script = Script::cast(JSValue::cast(object)->value())
->origin_options()
.IsEmbedderDebugScript();
@@ -596,7 +559,7 @@
i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate());
DisallowHeapAllocation no_allocation;
HandleScope scope(isolate);
- Object* object = *Utils::OpenHandle(*info.This());
+ Object* object = *Utils::OpenHandle(*info.Holder());
Object* res = Script::cast(JSValue::cast(object)->value())->context_data();
info.GetReturnValue().Set(Utils::ToLocal(Handle<Object>(res, isolate)));
}
@@ -621,7 +584,7 @@
const v8::PropertyCallbackInfo<v8::Value>& info) {
i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate());
HandleScope scope(isolate);
- Handle<Object> object = Utils::OpenHandle(*info.This());
+ Handle<Object> object = Utils::OpenHandle(*info.Holder());
Handle<Script> script(
Script::cast(Handle<JSValue>::cast(object)->value()), isolate);
Handle<Object> result = isolate->factory()->undefined_value();
@@ -657,16 +620,12 @@
const v8::PropertyCallbackInfo<v8::Value>& info) {
i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate());
HandleScope scope(isolate);
- Handle<Object> object = Utils::OpenHandle(*info.This());
+ Handle<Object> object = Utils::OpenHandle(*info.Holder());
Handle<Script> script(
Script::cast(Handle<JSValue>::cast(object)->value()), isolate);
Handle<Object> result = isolate->factory()->undefined_value();
if (script->compilation_type() == Script::COMPILATION_TYPE_EVAL) {
- Handle<Code> code(SharedFunctionInfo::cast(
- script->eval_from_shared())->code());
- result = Handle<Object>(Smi::FromInt(code->SourcePosition(
- script->eval_from_instructions_offset())),
- isolate);
+ result = Handle<Object>(Smi::FromInt(script->GetEvalPosition()), isolate);
}
info.GetReturnValue().Set(Utils::ToLocal(result));
}
@@ -691,17 +650,19 @@
const v8::PropertyCallbackInfo<v8::Value>& info) {
i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate());
HandleScope scope(isolate);
- Handle<Object> object = Utils::OpenHandle(*info.This());
+ Handle<Object> object = Utils::OpenHandle(*info.Holder());
Handle<Script> script(
Script::cast(Handle<JSValue>::cast(object)->value()), isolate);
- Handle<Object> result;
- Handle<SharedFunctionInfo> shared(
- SharedFunctionInfo::cast(script->eval_from_shared()));
- // Find the name of the function calling eval.
- if (!shared->name()->IsUndefined()) {
- result = Handle<Object>(shared->name(), isolate);
- } else {
- result = Handle<Object>(shared->inferred_name(), isolate);
+ Handle<Object> result = isolate->factory()->undefined_value();
+ if (!script->eval_from_shared()->IsUndefined()) {
+ Handle<SharedFunctionInfo> shared(
+ SharedFunctionInfo::cast(script->eval_from_shared()));
+ // Find the name of the function calling eval.
+ if (!shared->name()->IsUndefined()) {
+ result = Handle<Object>(shared->name(), isolate);
+ } else {
+ result = Handle<Object>(shared->inferred_name(), isolate);
+ }
}
info.GetReturnValue().Set(Utils::ToLocal(result));
}
@@ -732,24 +693,8 @@
MUST_USE_RESULT static MaybeHandle<Object> SetFunctionPrototype(
Isolate* isolate, Handle<JSFunction> function, Handle<Object> value) {
- Handle<Object> old_value;
- bool is_observed = function->map()->is_observed();
- if (is_observed) {
- if (function->has_prototype())
- old_value = handle(function->prototype(), isolate);
- else
- old_value = isolate->factory()->NewFunctionPrototype(function);
- }
-
JSFunction::SetPrototype(function, value);
DCHECK(function->prototype() == *value);
-
- if (is_observed && !old_value->SameValue(*value)) {
- MaybeHandle<Object> result = JSObject::EnqueueChangeRecord(
- function, "update", isolate->factory()->prototype_string(), old_value);
- if (result.is_null()) return MaybeHandle<Object>();
- }
-
return function;
}
@@ -811,45 +756,19 @@
HandleScope scope(isolate);
Handle<JSFunction> function =
Handle<JSFunction>::cast(Utils::OpenHandle(*info.Holder()));
-
- int length = 0;
- if (function->shared()->is_compiled()) {
- length = function->shared()->length();
- } else {
- // If the function isn't compiled yet, the length is not computed
- // correctly yet. Compile it now and return the right length.
- if (Compiler::Compile(function, Compiler::KEEP_EXCEPTION)) {
- length = function->shared()->length();
- }
- if (isolate->has_pending_exception()) {
- isolate->OptionalRescheduleException(false);
- }
+ Handle<Object> result;
+ if (!JSFunction::GetLength(isolate, function).ToHandle(&result)) {
+ result = handle(Smi::FromInt(0), isolate);
+ isolate->OptionalRescheduleException(false);
}
- Handle<Object> result(Smi::FromInt(length), isolate);
+
info.GetReturnValue().Set(Utils::ToLocal(result));
}
-void Accessors::ObservedReconfigureToDataProperty(
- v8::Local<v8::Name> key, v8::Local<v8::Value> val,
- const v8::PropertyCallbackInfo<void>& info) {
- i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate());
- HandleScope scope(isolate);
- Handle<JSObject> receiver =
- Handle<JSObject>::cast(Utils::OpenHandle(*info.This()));
- Handle<JSObject> holder =
- Handle<JSObject>::cast(Utils::OpenHandle(*info.Holder()));
- Handle<Name> name = Utils::OpenHandle(*key);
- Handle<Object> value = Utils::OpenHandle(*val);
- MaybeHandle<Object> result = ReplaceAccessorWithDataProperty(
- isolate, receiver, holder, name, value, true);
- if (result.is_null()) isolate->OptionalRescheduleException(false);
-}
-
-
Handle<AccessorInfo> Accessors::FunctionLengthInfo(
Isolate* isolate, PropertyAttributes attributes) {
return MakeAccessor(isolate, isolate->factory()->length_string(),
- &FunctionLengthGetter, &ObservedReconfigureToDataProperty,
+ &FunctionLengthGetter, &ReconfigureToDataProperty,
attributes);
}
@@ -866,19 +785,14 @@
HandleScope scope(isolate);
Handle<JSFunction> function =
Handle<JSFunction>::cast(Utils::OpenHandle(*info.Holder()));
- Handle<Object> result;
- if (function->shared()->name_should_print_as_anonymous()) {
- result = isolate->factory()->anonymous_string();
- } else {
- result = handle(function->shared()->name(), isolate);
- }
+ Handle<Object> result = JSFunction::GetName(isolate, function);
info.GetReturnValue().Set(Utils::ToLocal(result));
}
Handle<AccessorInfo> Accessors::FunctionNameInfo(
Isolate* isolate, PropertyAttributes attributes) {
return MakeAccessor(isolate, isolate->factory()->name_string(),
- &FunctionNameGetter, &ObservedReconfigureToDataProperty,
+ &FunctionNameGetter, &ReconfigureToDataProperty,
attributes);
}
@@ -1155,6 +1069,65 @@
//
+// Accessors::BoundFunctionLength
+//
+
+void Accessors::BoundFunctionLengthGetter(
+ v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) {
+ i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate());
+ HandleScope scope(isolate);
+ Handle<JSBoundFunction> function =
+ Handle<JSBoundFunction>::cast(Utils::OpenHandle(*info.Holder()));
+
+ Handle<Smi> target_length;
+ Handle<JSFunction> target(JSFunction::cast(function->bound_target_function()),
+ isolate);
+ if (!JSFunction::GetLength(isolate, target).ToHandle(&target_length)) {
+ target_length = handle(Smi::FromInt(0), isolate);
+ isolate->OptionalRescheduleException(false);
+ return;
+ }
+
+ int bound_length = function->bound_arguments()->length();
+ int length = Max(0, target_length->value() - bound_length);
+
+ Handle<Object> result(Smi::FromInt(length), isolate);
+ info.GetReturnValue().Set(Utils::ToLocal(result));
+}
+
+Handle<AccessorInfo> Accessors::BoundFunctionLengthInfo(
+ Isolate* isolate, PropertyAttributes attributes) {
+ return MakeAccessor(isolate, isolate->factory()->length_string(),
+ &BoundFunctionLengthGetter, &ReconfigureToDataProperty,
+ attributes);
+}
+
+//
+// Accessors::BoundFunctionName
+//
+
+void Accessors::BoundFunctionNameGetter(
+ v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) {
+ i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate());
+ HandleScope scope(isolate);
+ Handle<JSBoundFunction> function =
+ Handle<JSBoundFunction>::cast(Utils::OpenHandle(*info.Holder()));
+ Handle<Object> result;
+ if (!JSBoundFunction::GetName(isolate, function).ToHandle(&result)) {
+ isolate->OptionalRescheduleException(false);
+ return;
+ }
+ info.GetReturnValue().Set(Utils::ToLocal(result));
+}
+
+Handle<AccessorInfo> Accessors::BoundFunctionNameInfo(
+ Isolate* isolate, PropertyAttributes attributes) {
+ return MakeAccessor(isolate, isolate->factory()->name_string(),
+ &BoundFunctionNameGetter, &ReconfigureToDataProperty,
+ attributes);
+}
+
+//
// Accessors::MakeModuleExport
//