Revert "Revert "Upgrade to 5.0.71.48"" DO NOT MERGE
This reverts commit f2e3994fa5148cc3d9946666f0b0596290192b0e,
and updates the x64 makefile properly so it doesn't break that
build.
FPIIM-449
Change-Id: Ib83e35bfbae6af627451c926a9650ec57c045605
(cherry picked from commit 109988c7ccb6f3fd1a58574fa3dfb88beaef6632)
diff --git a/src/api.cc b/src/api.cc
index 8274a73..a71dcfa 100644
--- a/src/api.cc
+++ b/src/api.cc
@@ -15,6 +15,7 @@
#include "include/v8-experimental.h"
#include "include/v8-profiler.h"
#include "include/v8-testing.h"
+#include "src/accessors.h"
#include "src/api-experimental.h"
#include "src/api-natives.h"
#include "src/assert-scope.h"
@@ -34,11 +35,12 @@
#include "src/debug/debug.h"
#include "src/deoptimizer.h"
#include "src/execution.h"
+#include "src/gdb-jit.h"
#include "src/global-handles.h"
#include "src/icu_util.h"
#include "src/isolate-inl.h"
+#include "src/json-parser.h"
#include "src/messages.h"
-#include "src/parsing/json-parser.h"
#include "src/parsing/parser.h"
#include "src/parsing/scanner-character-streams.h"
#include "src/pending-compilation-error-handler.h"
@@ -57,6 +59,7 @@
#include "src/snapshot/natives.h"
#include "src/snapshot/snapshot.h"
#include "src/startup-data-util.h"
+#include "src/tracing/trace-event.h"
#include "src/unicode-inl.h"
#include "src/v8.h"
#include "src/v8threads.h"
@@ -166,6 +169,7 @@
isolate_->IncrementJsCallsFromApiCounter();
isolate_->handle_scope_implementer()->IncrementCallDepth();
if (!context_.IsEmpty()) context_->Enter();
+ if (do_callback_) isolate_->FireBeforeCallEnteredCallback();
}
~CallDepthScope() {
if (!context_.IsEmpty()) context_->Exit();
@@ -968,6 +972,9 @@
info->set_flag(0);
}
+static Local<ObjectTemplate> ObjectTemplateNew(
+ i::Isolate* isolate, v8::Local<FunctionTemplate> constructor,
+ bool do_not_cache);
Local<ObjectTemplate> FunctionTemplate::PrototypeTemplate() {
i::Isolate* i_isolate = Utils::OpenHandle(this)->GetIsolate();
@@ -975,8 +982,9 @@
i::Handle<i::Object> result(Utils::OpenHandle(this)->prototype_template(),
i_isolate);
if (result->IsUndefined()) {
- v8::Isolate* isolate = reinterpret_cast<v8::Isolate*>(i_isolate);
- result = Utils::OpenHandle(*ObjectTemplate::New(isolate));
+ // Do not cache prototype objects.
+ result = Utils::OpenHandle(
+ *ObjectTemplateNew(i_isolate, Local<FunctionTemplate>(), true));
Utils::OpenHandle(this)->set_prototype_template(*result);
}
return ToApiHandle<ObjectTemplate>(result);
@@ -1118,21 +1126,23 @@
return obj;
}
-
template <typename Getter, typename Setter>
static i::Handle<i::AccessorInfo> MakeAccessorInfo(
v8::Local<Name> name, Getter getter, Setter setter, v8::Local<Value> data,
v8::AccessControl settings, v8::PropertyAttribute attributes,
- v8::Local<AccessorSignature> signature) {
+ v8::Local<AccessorSignature> signature, bool is_special_data_property) {
i::Isolate* isolate = Utils::OpenHandle(*name)->GetIsolate();
- i::Handle<i::ExecutableAccessorInfo> obj =
- isolate->factory()->NewExecutableAccessorInfo();
+ i::Handle<i::AccessorInfo> obj = isolate->factory()->NewAccessorInfo();
SET_FIELD_WRAPPED(obj, set_getter, getter);
+ if (is_special_data_property && setter == nullptr) {
+ setter = reinterpret_cast<Setter>(&i::Accessors::ReconfigureToDataProperty);
+ }
SET_FIELD_WRAPPED(obj, set_setter, setter);
if (data.IsEmpty()) {
data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate));
}
obj->set_data(*Utils::OpenHandle(*data));
+ obj->set_is_special_data_property(is_special_data_property);
return SetAccessorInfoProperties(obj, name, settings, attributes, signature);
}
@@ -1224,9 +1234,9 @@
return New(i::Isolate::Current(), Local<FunctionTemplate>());
}
-
-Local<ObjectTemplate> ObjectTemplate::New(
- i::Isolate* isolate, v8::Local<FunctionTemplate> constructor) {
+static Local<ObjectTemplate> ObjectTemplateNew(
+ i::Isolate* isolate, v8::Local<FunctionTemplate> constructor,
+ bool do_not_cache) {
// Changes to the environment cannot be captured in the snapshot. Expect no
// object templates when the isolate is created for serialization.
DCHECK(!isolate->serializer_enabled());
@@ -1237,12 +1247,22 @@
i::Handle<i::ObjectTemplateInfo> obj =
i::Handle<i::ObjectTemplateInfo>::cast(struct_obj);
InitializeTemplate(obj, Consts::OBJECT_TEMPLATE);
+ int next_serial_number = 0;
+ if (!do_not_cache) {
+ next_serial_number = isolate->next_serial_number() + 1;
+ isolate->set_next_serial_number(next_serial_number);
+ }
+ obj->set_serial_number(i::Smi::FromInt(next_serial_number));
if (!constructor.IsEmpty())
obj->set_constructor(*Utils::OpenHandle(*constructor));
obj->set_internal_field_count(i::Smi::FromInt(0));
return Utils::ToLocal(obj);
}
+Local<ObjectTemplate> ObjectTemplate::New(
+ i::Isolate* isolate, v8::Local<FunctionTemplate> constructor) {
+ return ObjectTemplateNew(isolate, constructor, false);
+}
// Ensure that the object template has a constructor. If no
// constructor is available we create one.
@@ -1263,39 +1283,20 @@
}
-static inline i::Handle<i::TemplateInfo> GetTemplateInfo(
- i::Isolate* isolate,
- Template* template_obj) {
- return Utils::OpenHandle(template_obj);
-}
-
-
-// TODO(dcarney): remove this with ObjectTemplate::SetAccessor
-static inline i::Handle<i::TemplateInfo> GetTemplateInfo(
- i::Isolate* isolate,
- ObjectTemplate* object_template) {
- EnsureConstructor(isolate, object_template);
- return Utils::OpenHandle(object_template);
-}
-
-
-template<typename Getter, typename Setter, typename Data, typename Template>
-static bool TemplateSetAccessor(
- Template* template_obj,
- v8::Local<Name> name,
- Getter getter,
- Setter setter,
- Data data,
- AccessControl settings,
- PropertyAttribute attribute,
- v8::Local<AccessorSignature> signature) {
- auto isolate = Utils::OpenHandle(template_obj)->GetIsolate();
+template <typename Getter, typename Setter, typename Data, typename Template>
+static bool TemplateSetAccessor(Template* template_obj, v8::Local<Name> name,
+ Getter getter, Setter setter, Data data,
+ AccessControl settings,
+ PropertyAttribute attribute,
+ v8::Local<AccessorSignature> signature,
+ bool is_special_data_property) {
+ auto info = Utils::OpenHandle(template_obj);
+ auto isolate = info->GetIsolate();
ENTER_V8(isolate);
i::HandleScope scope(isolate);
auto obj = MakeAccessorInfo(name, getter, setter, data, settings, attribute,
- signature);
+ signature, is_special_data_property);
if (obj.is_null()) return false;
- auto info = GetTemplateInfo(isolate, template_obj);
i::ApiNatives::AddNativeDataProperty(isolate, info, obj);
return true;
}
@@ -1308,8 +1309,8 @@
PropertyAttribute attribute,
v8::Local<AccessorSignature> signature,
AccessControl settings) {
- TemplateSetAccessor(
- this, name, getter, setter, data, settings, attribute, signature);
+ TemplateSetAccessor(this, name, getter, setter, data, settings, attribute,
+ signature, true);
}
@@ -1320,8 +1321,8 @@
PropertyAttribute attribute,
v8::Local<AccessorSignature> signature,
AccessControl settings) {
- TemplateSetAccessor(
- this, name, getter, setter, data, settings, attribute, signature);
+ TemplateSetAccessor(this, name, getter, setter, data, settings, attribute,
+ signature, true);
}
@@ -1343,8 +1344,8 @@
v8::Local<Value> data, AccessControl settings,
PropertyAttribute attribute,
v8::Local<AccessorSignature> signature) {
- TemplateSetAccessor(
- this, name, getter, setter, data, settings, attribute, signature);
+ TemplateSetAccessor(this, name, getter, setter, data, settings, attribute,
+ signature, i::FLAG_disable_old_api_accessors);
}
@@ -1354,8 +1355,8 @@
v8::Local<Value> data, AccessControl settings,
PropertyAttribute attribute,
v8::Local<AccessorSignature> signature) {
- TemplateSetAccessor(
- this, name, getter, setter, data, settings, attribute, signature);
+ TemplateSetAccessor(this, name, getter, setter, data, settings, attribute,
+ signature, i::FLAG_disable_old_api_accessors);
}
@@ -1451,6 +1452,10 @@
cons->set_needs_access_check(true);
}
+void ObjectTemplate::SetAccessCheckCallback(
+ DeprecatedAccessCheckCallback callback, Local<Value> data) {
+ SetAccessCheckCallback(reinterpret_cast<AccessCheckCallback>(callback), data);
+}
void ObjectTemplate::SetAccessCheckCallbacks(
NamedSecurityCallback named_callback,
@@ -1601,32 +1606,7 @@
function_info(i::SharedFunctionInfo::cast(*obj), obj->GetIsolate());
i::Isolate* isolate = obj->GetIsolate();
- i::ScopeInfo* scope_info = function_info->scope_info();
i::Handle<i::JSReceiver> global(isolate->native_context()->global_object());
- for (int i = 0; i < scope_info->StrongModeFreeVariableCount(); ++i) {
- i::Handle<i::String> name_string(scope_info->StrongModeFreeVariableName(i));
- i::ScriptContextTable::LookupResult result;
- i::Handle<i::ScriptContextTable> script_context_table(
- isolate->native_context()->script_context_table());
- if (!i::ScriptContextTable::Lookup(script_context_table, name_string,
- &result)) {
- i::Handle<i::Name> name(scope_info->StrongModeFreeVariableName(i));
- Maybe<bool> has = i::JSReceiver::HasProperty(global, name);
- if (has.IsJust() && !has.FromJust()) {
- i::PendingCompilationErrorHandler pending_error_handler_;
- pending_error_handler_.ReportMessageAt(
- scope_info->StrongModeFreeVariableStartPosition(i),
- scope_info->StrongModeFreeVariableEndPosition(i),
- i::MessageTemplate::kStrongUnboundGlobal, name_string,
- i::kReferenceError);
- i::Handle<i::Script> script(i::Script::cast(function_info->script()));
- pending_error_handler_.ThrowPendingError(isolate, script);
- isolate->ReportPendingMessages();
- isolate->OptionalRescheduleException(true);
- return Local<Script>();
- }
- }
- }
i::Handle<i::JSFunction> function =
obj->GetIsolate()->factory()->NewFunctionFromSharedFunctionInfo(
function_info, isolate->native_context());
@@ -1707,6 +1687,7 @@
PREPARE_FOR_EXECUTION_WITH_CALLBACK(context, "v8::Script::Run()", Value)
i::AggregatingHistogramTimerScope timer(isolate->counters()->compile_lazy());
i::TimerEventScope<i::TimerEventExecute> timer_scope(isolate);
+ TRACE_EVENT0("v8", "V8.Execute");
auto fun = i::Handle<i::JSFunction>::cast(Utils::OpenHandle(this));
i::Handle<i::Object> receiver(isolate->global_proxy(), isolate);
Local<Value> result;
@@ -1760,6 +1741,7 @@
i::Handle<i::SharedFunctionInfo> result;
{
i::HistogramTimerScope total(isolate->counters()->compile_script(), true);
+ TRACE_EVENT0("v8", "V8.CompileScript");
i::Handle<i::Object> name_obj;
i::Handle<i::Object> source_map_url;
int line_offset = 0;
@@ -2929,11 +2911,11 @@
MaybeLocal<Object> Value::ToObject(Local<Context> context) const {
auto obj = Utils::OpenHandle(this);
- if (obj->IsJSObject()) return ToApiHandle<Object>(obj);
+ if (obj->IsJSReceiver()) return ToApiHandle<Object>(obj);
PREPARE_FOR_EXECUTION(context, "ToObject", Object);
Local<Object> result;
has_pending_exception =
- !ToLocal<Object>(i::Execution::ToObject(isolate, obj), &result);
+ !ToLocal<Object>(i::Object::ToObject(isolate, obj), &result);
RETURN_ON_FAILED_EXECUTION(Object);
RETURN_ESCAPED(result);
}
@@ -3307,16 +3289,14 @@
Maybe<int64_t> Value::IntegerValue(Local<Context> context) const {
auto obj = Utils::OpenHandle(this);
- i::Handle<i::Object> num;
if (obj->IsNumber()) {
- num = obj;
- } else {
- PREPARE_FOR_EXECUTION_PRIMITIVE(context, "IntegerValue", int64_t);
- has_pending_exception = !i::Object::ToInteger(isolate, obj).ToHandle(&num);
- RETURN_ON_FAILED_EXECUTION_PRIMITIVE(int64_t);
+ return Just(NumberToInt64(*obj));
}
- return Just(num->IsSmi() ? static_cast<int64_t>(i::Smi::cast(*num)->value())
- : static_cast<int64_t>(num->Number()));
+ PREPARE_FOR_EXECUTION_PRIMITIVE(context, "IntegerValue", int64_t);
+ i::Handle<i::Object> num;
+ has_pending_exception = !i::Object::ToInteger(isolate, obj).ToHandle(&num);
+ RETURN_ON_FAILED_EXECUTION_PRIMITIVE(int64_t);
+ return Just(NumberToInt64(*num));
}
@@ -3558,7 +3538,8 @@
isolate, js_object, key, &success, i::LookupIterator::OWN);
if (!success) return i::MaybeHandle<i::Object>();
- return i::JSObject::DefineOwnPropertyIgnoreAttributes(&it, value, attrs);
+ return i::JSObject::DefineOwnPropertyIgnoreAttributes(
+ &it, value, attrs, i::JSObject::FORCE_FIELD);
}
@@ -3599,8 +3580,27 @@
Maybe<bool> v8::Object::SetPrivate(Local<Context> context, Local<Private> key,
Local<Value> value) {
- return DefineOwnProperty(context, Local<Name>(reinterpret_cast<Name*>(*key)),
- value, DontEnum);
+ PREPARE_FOR_EXECUTION_PRIMITIVE(context, "v8::Object::SetPrivate()", bool);
+ auto self = Utils::OpenHandle(this);
+ auto key_obj = Utils::OpenHandle(reinterpret_cast<Name*>(*key));
+ auto value_obj = Utils::OpenHandle(*value);
+ if (self->IsJSProxy()) {
+ i::PropertyDescriptor desc;
+ desc.set_writable(true);
+ desc.set_enumerable(false);
+ desc.set_configurable(true);
+ desc.set_value(value_obj);
+ return i::JSProxy::SetPrivateProperty(
+ isolate, i::Handle<i::JSProxy>::cast(self),
+ i::Handle<i::Symbol>::cast(key_obj), &desc, i::Object::DONT_THROW);
+ }
+ auto js_object = i::Handle<i::JSObject>::cast(self);
+ i::LookupIterator it(js_object, key_obj);
+ has_pending_exception = i::JSObject::DefineOwnPropertyIgnoreAttributes(
+ &it, value_obj, i::DONT_ENUM)
+ .is_null();
+ RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool);
+ return Just(true);
}
@@ -3752,8 +3752,7 @@
auto self = Utils::OpenHandle(this);
i::Handle<i::FixedArray> value;
has_pending_exception =
- !i::JSReceiver::GetKeys(self, i::JSReceiver::INCLUDE_PROTOS,
- i::ENUMERABLE_STRINGS)
+ !i::JSReceiver::GetKeys(self, i::INCLUDE_PROTOS, i::ENUMERABLE_STRINGS)
.ToHandle(&value);
RETURN_ON_FAILED_EXECUTION(Array);
// Because we use caching to speed up enumeration it is important
@@ -3775,9 +3774,9 @@
PREPARE_FOR_EXECUTION(context, "v8::Object::GetOwnPropertyNames()", Array);
auto self = Utils::OpenHandle(this);
i::Handle<i::FixedArray> value;
- has_pending_exception = !i::JSReceiver::GetKeys(self, i::JSReceiver::OWN_ONLY,
- i::ENUMERABLE_STRINGS)
- .ToHandle(&value);
+ has_pending_exception =
+ !i::JSReceiver::GetKeys(self, i::OWN_ONLY, i::ENUMERABLE_STRINGS)
+ .ToHandle(&value);
RETURN_ON_FAILED_EXECUTION(Array);
// Because we use caching to speed up enumeration it is important
// to never change the result of the basic enumeration function so
@@ -3920,7 +3919,7 @@
i::Handle<i::JSObject>::cast(Utils::OpenHandle(self));
v8::Local<AccessorSignature> signature;
auto info = MakeAccessorInfo(name, getter, setter, data, settings, attributes,
- signature);
+ signature, i::FLAG_disable_old_api_accessors);
if (info.is_null()) return Nothing<bool>();
bool fast = obj->HasFastProperties();
i::Handle<i::Object> result;
@@ -4281,6 +4280,7 @@
PREPARE_FOR_EXECUTION_WITH_CALLBACK(context, "v8::Object::CallAsFunction()",
Value);
i::TimerEventScope<i::TimerEventExecute> timer_scope(isolate);
+ TRACE_EVENT0("v8", "V8.Execute");
auto self = Utils::OpenHandle(this);
auto recv_obj = Utils::OpenHandle(*recv);
STATIC_ASSERT(sizeof(v8::Local<v8::Value>) == sizeof(i::Object**));
@@ -4307,6 +4307,7 @@
PREPARE_FOR_EXECUTION_WITH_CALLBACK(context,
"v8::Object::CallAsConstructor()", Value);
i::TimerEventScope<i::TimerEventExecute> timer_scope(isolate);
+ TRACE_EVENT0("v8", "V8.Execute");
auto self = Utils::OpenHandle(this);
STATIC_ASSERT(sizeof(v8::Local<v8::Value>) == sizeof(i::Object**));
i::Handle<i::Object>* args = reinterpret_cast<i::Handle<i::Object>*>(argv);
@@ -4356,6 +4357,7 @@
PREPARE_FOR_EXECUTION_WITH_CALLBACK(context, "v8::Function::NewInstance()",
Object);
i::TimerEventScope<i::TimerEventExecute> timer_scope(isolate);
+ TRACE_EVENT0("v8", "V8.Execute");
auto self = Utils::OpenHandle(this);
STATIC_ASSERT(sizeof(v8::Local<v8::Value>) == sizeof(i::Object**));
i::Handle<i::Object>* args = reinterpret_cast<i::Handle<i::Object>*>(argv);
@@ -4379,6 +4381,7 @@
v8::Local<v8::Value> argv[]) {
PREPARE_FOR_EXECUTION_WITH_CALLBACK(context, "v8::Function::Call()", Value);
i::TimerEventScope<i::TimerEventExecute> timer_scope(isolate);
+ TRACE_EVENT0("v8", "V8.Execute");
auto self = Utils::OpenHandle(this);
i::Handle<i::Object> recv_obj = Utils::OpenHandle(*recv);
STATIC_ASSERT(sizeof(v8::Local<v8::Value>) == sizeof(i::Object**));
@@ -7158,10 +7161,16 @@
if (params.entry_hook) {
isolate->set_function_entry_hook(params.entry_hook);
}
- if (params.code_event_handler) {
+ auto code_event_handler = params.code_event_handler;
+#ifdef ENABLE_GDB_JIT_INTERFACE
+ if (code_event_handler == nullptr && i::FLAG_gdbjit) {
+ code_event_handler = i::GDBJITInterface::EventHandler;
+ }
+#endif // ENABLE_GDB_JIT_INTERFACE
+ if (code_event_handler) {
isolate->InitializeLoggingAndCounters();
isolate->logger()->SetCodeEventHandler(kJitCodeEventDefault,
- params.code_event_handler);
+ code_event_handler);
}
if (params.counter_lookup_callback) {
v8_isolate->SetCounterFunction(params.counter_lookup_callback);
@@ -7371,6 +7380,20 @@
}
+void Isolate::AddBeforeCallEnteredCallback(BeforeCallEnteredCallback callback) {
+ if (callback == NULL) return;
+ i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this);
+ isolate->AddBeforeCallEnteredCallback(callback);
+}
+
+
+void Isolate::RemoveBeforeCallEnteredCallback(
+ BeforeCallEnteredCallback callback) {
+ i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this);
+ isolate->RemoveBeforeCallEnteredCallback(callback);
+}
+
+
void Isolate::AddCallCompletedCallback(CallCompletedCallback callback) {
if (callback == NULL) return;
i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this);
@@ -7384,6 +7407,19 @@
}
+void Isolate::AddCallCompletedCallback(
+ DeprecatedCallCompletedCallback callback) {
+ AddCallCompletedCallback(reinterpret_cast<CallCompletedCallback>(callback));
+}
+
+
+void Isolate::RemoveCallCompletedCallback(
+ DeprecatedCallCompletedCallback callback) {
+ RemoveCallCompletedCallback(
+ reinterpret_cast<CallCompletedCallback>(callback));
+}
+
+
void Isolate::SetPromiseRejectCallback(PromiseRejectCallback callback) {
if (callback == NULL) return;
i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this);
@@ -7476,6 +7512,7 @@
{
i::HistogramTimerScope idle_notification_scope(
isolate->counters()->gc_low_memory_notification());
+ TRACE_EVENT0("v8", "V8.GCLowMemoryNotification");
isolate->heap()->CollectAllAvailableGarbage("low memory notification");
}
}
@@ -8050,6 +8087,9 @@
base::TimeDelta::FromMicroseconds(us));
}
+void CpuProfiler::CollectSample() {
+ reinterpret_cast<i::CpuProfiler*>(this)->CollectSample();
+}
void CpuProfiler::StartProfiling(Local<String> title, bool record_samples) {
reinterpret_cast<i::CpuProfiler*>(this)->StartProfiling(
@@ -8278,6 +8318,23 @@
}
+bool HeapProfiler::StartSamplingHeapProfiler(uint64_t sample_interval,
+ int stack_depth) {
+ return reinterpret_cast<i::HeapProfiler*>(this)
+ ->StartSamplingHeapProfiler(sample_interval, stack_depth);
+}
+
+
+void HeapProfiler::StopSamplingHeapProfiler() {
+ reinterpret_cast<i::HeapProfiler*>(this)->StopSamplingHeapProfiler();
+}
+
+
+AllocationProfile* HeapProfiler::GetAllocationProfile() {
+ return reinterpret_cast<i::HeapProfiler*>(this)->GetAllocationProfile();
+}
+
+
void HeapProfiler::DeleteAllHeapSnapshots() {
reinterpret_cast<i::HeapProfiler*>(this)->DeleteAllSnapshots();
}