OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/api.h" | 5 #include "src/api.h" |
6 | 6 |
7 #include <string.h> // For memcpy, strlen. | 7 #include <string.h> // For memcpy, strlen. |
8 #ifdef V8_USE_ADDRESS_SANITIZER | 8 #ifdef V8_USE_ADDRESS_SANITIZER |
9 #include <sanitizer/asan_interface.h> | 9 #include <sanitizer/asan_interface.h> |
10 #endif // V8_USE_ADDRESS_SANITIZER | 10 #endif // V8_USE_ADDRESS_SANITIZER |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
51 #include "src/property.h" | 51 #include "src/property.h" |
52 #include "src/property-descriptor.h" | 52 #include "src/property-descriptor.h" |
53 #include "src/property-details.h" | 53 #include "src/property-details.h" |
54 #include "src/prototype.h" | 54 #include "src/prototype.h" |
55 #include "src/runtime/runtime.h" | 55 #include "src/runtime/runtime.h" |
56 #include "src/runtime-profiler.h" | 56 #include "src/runtime-profiler.h" |
57 #include "src/simulator.h" | 57 #include "src/simulator.h" |
58 #include "src/snapshot/natives.h" | 58 #include "src/snapshot/natives.h" |
59 #include "src/snapshot/snapshot.h" | 59 #include "src/snapshot/snapshot.h" |
60 #include "src/startup-data-util.h" | 60 #include "src/startup-data-util.h" |
| 61 #include "src/tracing/trace-event.h" |
61 #include "src/unicode-inl.h" | 62 #include "src/unicode-inl.h" |
62 #include "src/v8.h" | 63 #include "src/v8.h" |
63 #include "src/v8threads.h" | 64 #include "src/v8threads.h" |
64 #include "src/version.h" | 65 #include "src/version.h" |
65 #include "src/vm-state-inl.h" | 66 #include "src/vm-state-inl.h" |
66 | 67 |
67 | 68 |
68 namespace v8 { | 69 namespace v8 { |
69 | 70 |
70 #define LOG_API(isolate, expr) LOG(isolate, ApiEntryCall(expr)) | 71 #define LOG_API(isolate, expr) LOG(isolate, ApiEntryCall(expr)) |
(...skipping 1631 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1702 } else { | 1703 } else { |
1703 return Local<String>(); | 1704 return Local<String>(); |
1704 } | 1705 } |
1705 } | 1706 } |
1706 | 1707 |
1707 | 1708 |
1708 MaybeLocal<Value> Script::Run(Local<Context> context) { | 1709 MaybeLocal<Value> Script::Run(Local<Context> context) { |
1709 PREPARE_FOR_EXECUTION_WITH_CALLBACK(context, "v8::Script::Run()", Value) | 1710 PREPARE_FOR_EXECUTION_WITH_CALLBACK(context, "v8::Script::Run()", Value) |
1710 i::AggregatingHistogramTimerScope timer(isolate->counters()->compile_lazy()); | 1711 i::AggregatingHistogramTimerScope timer(isolate->counters()->compile_lazy()); |
1711 i::TimerEventScope<i::TimerEventExecute> timer_scope(isolate); | 1712 i::TimerEventScope<i::TimerEventExecute> timer_scope(isolate); |
| 1713 TRACE_EVENT0("v8", "V8.Execute"); |
1712 auto fun = i::Handle<i::JSFunction>::cast(Utils::OpenHandle(this)); | 1714 auto fun = i::Handle<i::JSFunction>::cast(Utils::OpenHandle(this)); |
1713 i::Handle<i::Object> receiver(isolate->global_proxy(), isolate); | 1715 i::Handle<i::Object> receiver(isolate->global_proxy(), isolate); |
1714 Local<Value> result; | 1716 Local<Value> result; |
1715 has_pending_exception = | 1717 has_pending_exception = |
1716 !ToLocal<Value>(i::Execution::Call(isolate, fun, receiver, 0, NULL), | 1718 !ToLocal<Value>(i::Execution::Call(isolate, fun, receiver, 0, NULL), |
1717 &result); | 1719 &result); |
1718 RETURN_ON_FAILED_EXECUTION(Value); | 1720 RETURN_ON_FAILED_EXECUTION(Value); |
1719 RETURN_ESCAPED(result); | 1721 RETURN_ESCAPED(result); |
1720 } | 1722 } |
1721 | 1723 |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1755 DCHECK(source->cached_data); | 1757 DCHECK(source->cached_data); |
1756 // ScriptData takes care of pointer-aligning the data. | 1758 // ScriptData takes care of pointer-aligning the data. |
1757 script_data = new i::ScriptData(source->cached_data->data, | 1759 script_data = new i::ScriptData(source->cached_data->data, |
1758 source->cached_data->length); | 1760 source->cached_data->length); |
1759 } | 1761 } |
1760 | 1762 |
1761 i::Handle<i::String> str = Utils::OpenHandle(*(source->source_string)); | 1763 i::Handle<i::String> str = Utils::OpenHandle(*(source->source_string)); |
1762 i::Handle<i::SharedFunctionInfo> result; | 1764 i::Handle<i::SharedFunctionInfo> result; |
1763 { | 1765 { |
1764 i::HistogramTimerScope total(isolate->counters()->compile_script(), true); | 1766 i::HistogramTimerScope total(isolate->counters()->compile_script(), true); |
| 1767 TRACE_EVENT0("v8", "V8.CompileScript"); |
1765 i::Handle<i::Object> name_obj; | 1768 i::Handle<i::Object> name_obj; |
1766 i::Handle<i::Object> source_map_url; | 1769 i::Handle<i::Object> source_map_url; |
1767 int line_offset = 0; | 1770 int line_offset = 0; |
1768 int column_offset = 0; | 1771 int column_offset = 0; |
1769 if (!source->resource_name.IsEmpty()) { | 1772 if (!source->resource_name.IsEmpty()) { |
1770 name_obj = Utils::OpenHandle(*(source->resource_name)); | 1773 name_obj = Utils::OpenHandle(*(source->resource_name)); |
1771 } | 1774 } |
1772 if (!source->resource_line_offset.IsEmpty()) { | 1775 if (!source->resource_line_offset.IsEmpty()) { |
1773 line_offset = static_cast<int>(source->resource_line_offset->Value()); | 1776 line_offset = static_cast<int>(source->resource_line_offset->Value()); |
1774 } | 1777 } |
(...skipping 2499 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4274 return self->IsCallable(); | 4277 return self->IsCallable(); |
4275 } | 4278 } |
4276 | 4279 |
4277 | 4280 |
4278 MaybeLocal<Value> Object::CallAsFunction(Local<Context> context, | 4281 MaybeLocal<Value> Object::CallAsFunction(Local<Context> context, |
4279 Local<Value> recv, int argc, | 4282 Local<Value> recv, int argc, |
4280 Local<Value> argv[]) { | 4283 Local<Value> argv[]) { |
4281 PREPARE_FOR_EXECUTION_WITH_CALLBACK(context, "v8::Object::CallAsFunction()", | 4284 PREPARE_FOR_EXECUTION_WITH_CALLBACK(context, "v8::Object::CallAsFunction()", |
4282 Value); | 4285 Value); |
4283 i::TimerEventScope<i::TimerEventExecute> timer_scope(isolate); | 4286 i::TimerEventScope<i::TimerEventExecute> timer_scope(isolate); |
| 4287 TRACE_EVENT0("v8", "V8.Execute"); |
4284 auto self = Utils::OpenHandle(this); | 4288 auto self = Utils::OpenHandle(this); |
4285 auto recv_obj = Utils::OpenHandle(*recv); | 4289 auto recv_obj = Utils::OpenHandle(*recv); |
4286 STATIC_ASSERT(sizeof(v8::Local<v8::Value>) == sizeof(i::Object**)); | 4290 STATIC_ASSERT(sizeof(v8::Local<v8::Value>) == sizeof(i::Object**)); |
4287 i::Handle<i::Object>* args = reinterpret_cast<i::Handle<i::Object>*>(argv); | 4291 i::Handle<i::Object>* args = reinterpret_cast<i::Handle<i::Object>*>(argv); |
4288 Local<Value> result; | 4292 Local<Value> result; |
4289 has_pending_exception = !ToLocal<Value>( | 4293 has_pending_exception = !ToLocal<Value>( |
4290 i::Execution::Call(isolate, self, recv_obj, argc, args), &result); | 4294 i::Execution::Call(isolate, self, recv_obj, argc, args), &result); |
4291 RETURN_ON_FAILED_EXECUTION(Value); | 4295 RETURN_ON_FAILED_EXECUTION(Value); |
4292 RETURN_ESCAPED(result); | 4296 RETURN_ESCAPED(result); |
4293 } | 4297 } |
4294 | 4298 |
4295 | 4299 |
4296 Local<v8::Value> Object::CallAsFunction(v8::Local<v8::Value> recv, int argc, | 4300 Local<v8::Value> Object::CallAsFunction(v8::Local<v8::Value> recv, int argc, |
4297 v8::Local<v8::Value> argv[]) { | 4301 v8::Local<v8::Value> argv[]) { |
4298 auto context = ContextFromHeapObject(Utils::OpenHandle(this)); | 4302 auto context = ContextFromHeapObject(Utils::OpenHandle(this)); |
4299 Local<Value>* argv_cast = reinterpret_cast<Local<Value>*>(argv); | 4303 Local<Value>* argv_cast = reinterpret_cast<Local<Value>*>(argv); |
4300 RETURN_TO_LOCAL_UNCHECKED(CallAsFunction(context, recv, argc, argv_cast), | 4304 RETURN_TO_LOCAL_UNCHECKED(CallAsFunction(context, recv, argc, argv_cast), |
4301 Value); | 4305 Value); |
4302 } | 4306 } |
4303 | 4307 |
4304 | 4308 |
4305 MaybeLocal<Value> Object::CallAsConstructor(Local<Context> context, int argc, | 4309 MaybeLocal<Value> Object::CallAsConstructor(Local<Context> context, int argc, |
4306 Local<Value> argv[]) { | 4310 Local<Value> argv[]) { |
4307 PREPARE_FOR_EXECUTION_WITH_CALLBACK(context, | 4311 PREPARE_FOR_EXECUTION_WITH_CALLBACK(context, |
4308 "v8::Object::CallAsConstructor()", Value); | 4312 "v8::Object::CallAsConstructor()", Value); |
4309 i::TimerEventScope<i::TimerEventExecute> timer_scope(isolate); | 4313 i::TimerEventScope<i::TimerEventExecute> timer_scope(isolate); |
| 4314 TRACE_EVENT0("v8", "V8.Execute"); |
4310 auto self = Utils::OpenHandle(this); | 4315 auto self = Utils::OpenHandle(this); |
4311 STATIC_ASSERT(sizeof(v8::Local<v8::Value>) == sizeof(i::Object**)); | 4316 STATIC_ASSERT(sizeof(v8::Local<v8::Value>) == sizeof(i::Object**)); |
4312 i::Handle<i::Object>* args = reinterpret_cast<i::Handle<i::Object>*>(argv); | 4317 i::Handle<i::Object>* args = reinterpret_cast<i::Handle<i::Object>*>(argv); |
4313 Local<Value> result; | 4318 Local<Value> result; |
4314 has_pending_exception = !ToLocal<Value>( | 4319 has_pending_exception = !ToLocal<Value>( |
4315 i::Execution::New(isolate, self, self, argc, args), &result); | 4320 i::Execution::New(isolate, self, self, argc, args), &result); |
4316 RETURN_ON_FAILED_EXECUTION(Value); | 4321 RETURN_ON_FAILED_EXECUTION(Value); |
4317 RETURN_ESCAPED(result); | 4322 RETURN_ESCAPED(result); |
4318 } | 4323 } |
4319 | 4324 |
(...skipping 29 matching lines...) Expand all Loading... |
4349 return NewInstance(Isolate::GetCurrent()->GetCurrentContext(), 0, NULL) | 4354 return NewInstance(Isolate::GetCurrent()->GetCurrentContext(), 0, NULL) |
4350 .FromMaybe(Local<Object>()); | 4355 .FromMaybe(Local<Object>()); |
4351 } | 4356 } |
4352 | 4357 |
4353 | 4358 |
4354 MaybeLocal<Object> Function::NewInstance(Local<Context> context, int argc, | 4359 MaybeLocal<Object> Function::NewInstance(Local<Context> context, int argc, |
4355 v8::Local<v8::Value> argv[]) const { | 4360 v8::Local<v8::Value> argv[]) const { |
4356 PREPARE_FOR_EXECUTION_WITH_CALLBACK(context, "v8::Function::NewInstance()", | 4361 PREPARE_FOR_EXECUTION_WITH_CALLBACK(context, "v8::Function::NewInstance()", |
4357 Object); | 4362 Object); |
4358 i::TimerEventScope<i::TimerEventExecute> timer_scope(isolate); | 4363 i::TimerEventScope<i::TimerEventExecute> timer_scope(isolate); |
| 4364 TRACE_EVENT0("v8", "V8.Execute"); |
4359 auto self = Utils::OpenHandle(this); | 4365 auto self = Utils::OpenHandle(this); |
4360 STATIC_ASSERT(sizeof(v8::Local<v8::Value>) == sizeof(i::Object**)); | 4366 STATIC_ASSERT(sizeof(v8::Local<v8::Value>) == sizeof(i::Object**)); |
4361 i::Handle<i::Object>* args = reinterpret_cast<i::Handle<i::Object>*>(argv); | 4367 i::Handle<i::Object>* args = reinterpret_cast<i::Handle<i::Object>*>(argv); |
4362 Local<Object> result; | 4368 Local<Object> result; |
4363 has_pending_exception = !ToLocal<Object>( | 4369 has_pending_exception = !ToLocal<Object>( |
4364 i::Execution::New(isolate, self, self, argc, args), &result); | 4370 i::Execution::New(isolate, self, self, argc, args), &result); |
4365 RETURN_ON_FAILED_EXECUTION(Object); | 4371 RETURN_ON_FAILED_EXECUTION(Object); |
4366 RETURN_ESCAPED(result); | 4372 RETURN_ESCAPED(result); |
4367 } | 4373 } |
4368 | 4374 |
4369 | 4375 |
4370 Local<v8::Object> Function::NewInstance(int argc, | 4376 Local<v8::Object> Function::NewInstance(int argc, |
4371 v8::Local<v8::Value> argv[]) const { | 4377 v8::Local<v8::Value> argv[]) const { |
4372 auto context = ContextFromHeapObject(Utils::OpenHandle(this)); | 4378 auto context = ContextFromHeapObject(Utils::OpenHandle(this)); |
4373 RETURN_TO_LOCAL_UNCHECKED(NewInstance(context, argc, argv), Object); | 4379 RETURN_TO_LOCAL_UNCHECKED(NewInstance(context, argc, argv), Object); |
4374 } | 4380 } |
4375 | 4381 |
4376 | 4382 |
4377 MaybeLocal<v8::Value> Function::Call(Local<Context> context, | 4383 MaybeLocal<v8::Value> Function::Call(Local<Context> context, |
4378 v8::Local<v8::Value> recv, int argc, | 4384 v8::Local<v8::Value> recv, int argc, |
4379 v8::Local<v8::Value> argv[]) { | 4385 v8::Local<v8::Value> argv[]) { |
4380 PREPARE_FOR_EXECUTION_WITH_CALLBACK(context, "v8::Function::Call()", Value); | 4386 PREPARE_FOR_EXECUTION_WITH_CALLBACK(context, "v8::Function::Call()", Value); |
4381 i::TimerEventScope<i::TimerEventExecute> timer_scope(isolate); | 4387 i::TimerEventScope<i::TimerEventExecute> timer_scope(isolate); |
| 4388 TRACE_EVENT0("v8", "V8.Execute"); |
4382 auto self = Utils::OpenHandle(this); | 4389 auto self = Utils::OpenHandle(this); |
4383 i::Handle<i::Object> recv_obj = Utils::OpenHandle(*recv); | 4390 i::Handle<i::Object> recv_obj = Utils::OpenHandle(*recv); |
4384 STATIC_ASSERT(sizeof(v8::Local<v8::Value>) == sizeof(i::Object**)); | 4391 STATIC_ASSERT(sizeof(v8::Local<v8::Value>) == sizeof(i::Object**)); |
4385 i::Handle<i::Object>* args = reinterpret_cast<i::Handle<i::Object>*>(argv); | 4392 i::Handle<i::Object>* args = reinterpret_cast<i::Handle<i::Object>*>(argv); |
4386 Local<Value> result; | 4393 Local<Value> result; |
4387 has_pending_exception = !ToLocal<Value>( | 4394 has_pending_exception = !ToLocal<Value>( |
4388 i::Execution::Call(isolate, self, recv_obj, argc, args), &result); | 4395 i::Execution::Call(isolate, self, recv_obj, argc, args), &result); |
4389 RETURN_ON_FAILED_EXECUTION(Value); | 4396 RETURN_ON_FAILED_EXECUTION(Value); |
4390 RETURN_ESCAPED(result); | 4397 RETURN_ESCAPED(result); |
4391 } | 4398 } |
(...skipping 3077 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7469 if (!i::FLAG_use_idle_notification) return true; | 7476 if (!i::FLAG_use_idle_notification) return true; |
7470 return isolate->heap()->IdleNotification(deadline_in_seconds); | 7477 return isolate->heap()->IdleNotification(deadline_in_seconds); |
7471 } | 7478 } |
7472 | 7479 |
7473 | 7480 |
7474 void Isolate::LowMemoryNotification() { | 7481 void Isolate::LowMemoryNotification() { |
7475 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); | 7482 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); |
7476 { | 7483 { |
7477 i::HistogramTimerScope idle_notification_scope( | 7484 i::HistogramTimerScope idle_notification_scope( |
7478 isolate->counters()->gc_low_memory_notification()); | 7485 isolate->counters()->gc_low_memory_notification()); |
| 7486 TRACE_EVENT0("v8", "V8.GCLowMemoryNotification"); |
7479 isolate->heap()->CollectAllAvailableGarbage("low memory notification"); | 7487 isolate->heap()->CollectAllAvailableGarbage("low memory notification"); |
7480 } | 7488 } |
7481 } | 7489 } |
7482 | 7490 |
7483 | 7491 |
7484 int Isolate::ContextDisposedNotification(bool dependant_context) { | 7492 int Isolate::ContextDisposedNotification(bool dependant_context) { |
7485 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); | 7493 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); |
7486 return isolate->heap()->NotifyContextDisposed(dependant_context); | 7494 return isolate->heap()->NotifyContextDisposed(dependant_context); |
7487 } | 7495 } |
7488 | 7496 |
(...skipping 1065 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8554 Address callback_address = | 8562 Address callback_address = |
8555 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); | 8563 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); |
8556 VMState<EXTERNAL> state(isolate); | 8564 VMState<EXTERNAL> state(isolate); |
8557 ExternalCallbackScope call_scope(isolate, callback_address); | 8565 ExternalCallbackScope call_scope(isolate, callback_address); |
8558 callback(info); | 8566 callback(info); |
8559 } | 8567 } |
8560 | 8568 |
8561 | 8569 |
8562 } // namespace internal | 8570 } // namespace internal |
8563 } // namespace v8 | 8571 } // namespace v8 |
OLD | NEW |