Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(811)

Side by Side Diff: src/api.cc

Issue 8937003: Implement callback when script finishes running in V8 API. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Fixed comments. Created 8 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
71 UNREACHABLE(); \ 71 UNREACHABLE(); \
72 } 72 }
73 73
74 74
75 #define EXCEPTION_PREAMBLE(isolate) \ 75 #define EXCEPTION_PREAMBLE(isolate) \
76 (isolate)->handle_scope_implementer()->IncrementCallDepth(); \ 76 (isolate)->handle_scope_implementer()->IncrementCallDepth(); \
77 ASSERT(!(isolate)->external_caught_exception()); \ 77 ASSERT(!(isolate)->external_caught_exception()); \
78 bool has_pending_exception = false 78 bool has_pending_exception = false
79 79
80 80
81 #define EXCEPTION_BAILOUT_CHECK(isolate, value) \ 81 #define EXCEPTION_BAILOUT_CHECK_GENERIC(isolate, value, do_callback) \
82 do { \ 82 do { \
83 i::HandleScopeImplementer* handle_scope_implementer = \ 83 i::HandleScopeImplementer* handle_scope_implementer = \
84 (isolate)->handle_scope_implementer(); \ 84 (isolate)->handle_scope_implementer(); \
85 handle_scope_implementer->DecrementCallDepth(); \ 85 handle_scope_implementer->DecrementCallDepth(); \
86 if (has_pending_exception) { \ 86 if (has_pending_exception) { \
87 if (handle_scope_implementer->CallDepthIsZero() && \ 87 if (handle_scope_implementer->CallDepthIsZero() && \
88 (isolate)->is_out_of_memory()) { \ 88 (isolate)->is_out_of_memory()) { \
89 if (!(isolate)->ignore_out_of_memory()) \ 89 if (!(isolate)->ignore_out_of_memory()) \
90 i::V8::FatalProcessOutOfMemory(NULL); \ 90 i::V8::FatalProcessOutOfMemory(NULL); \
91 } \ 91 } \
92 bool call_depth_is_zero = handle_scope_implementer->CallDepthIsZero(); \ 92 bool call_depth_is_zero = handle_scope_implementer->CallDepthIsZero(); \
93 (isolate)->OptionalRescheduleException(call_depth_is_zero); \ 93 (isolate)->OptionalRescheduleException(call_depth_is_zero); \
94 do_callback \
94 return value; \ 95 return value; \
95 } \ 96 } \
97 do_callback \
96 } while (false) 98 } while (false)
97 99
98 100
101 #define EXCEPTION_BAILOUT_CHECK_DO_CALLBACK(isolate, value) \
102 EXCEPTION_BAILOUT_CHECK_GENERIC( \
103 isolate, value, i::V8::FireCallCompletedCallback(isolate);)
104
105
106 #define EXCEPTION_BAILOUT_CHECK(isolate, value) \
107 EXCEPTION_BAILOUT_CHECK_GENERIC(isolate, value, ;)
108
109
99 #define API_ENTRY_CHECK(isolate, msg) \ 110 #define API_ENTRY_CHECK(isolate, msg) \
100 do { \ 111 do { \
101 if (v8::Locker::IsActive()) { \ 112 if (v8::Locker::IsActive()) { \
102 ApiCheck(isolate->thread_manager()->IsLockedByCurrentThread(), \ 113 ApiCheck(isolate->thread_manager()->IsLockedByCurrentThread(), \
103 msg, \ 114 msg, \
104 "Entering the V8 API without proper locking in place"); \ 115 "Entering the V8 API without proper locking in place"); \
105 } \ 116 } \
106 } while (false) 117 } while (false)
107 118
108 119
(...skipping 1452 matching lines...) Expand 10 before | Expand all | Expand 10 after
1561 fun = isolate->factory()->NewFunctionFromSharedFunctionInfo( 1572 fun = isolate->factory()->NewFunctionFromSharedFunctionInfo(
1562 function_info, isolate->global_context()); 1573 function_info, isolate->global_context());
1563 } else { 1574 } else {
1564 fun = i::Handle<i::JSFunction>(i::JSFunction::cast(*obj), isolate); 1575 fun = i::Handle<i::JSFunction>(i::JSFunction::cast(*obj), isolate);
1565 } 1576 }
1566 EXCEPTION_PREAMBLE(isolate); 1577 EXCEPTION_PREAMBLE(isolate);
1567 i::Handle<i::Object> receiver( 1578 i::Handle<i::Object> receiver(
1568 isolate->context()->global_proxy(), isolate); 1579 isolate->context()->global_proxy(), isolate);
1569 i::Handle<i::Object> result = 1580 i::Handle<i::Object> result =
1570 i::Execution::Call(fun, receiver, 0, NULL, &has_pending_exception); 1581 i::Execution::Call(fun, receiver, 0, NULL, &has_pending_exception);
1571 EXCEPTION_BAILOUT_CHECK(isolate, Local<Value>()); 1582 EXCEPTION_BAILOUT_CHECK_DO_CALLBACK(isolate, Local<Value>());
1572 raw_result = *result; 1583 raw_result = *result;
1573 } 1584 }
1574 i::Handle<i::Object> result(raw_result, isolate); 1585 i::Handle<i::Object> result(raw_result, isolate);
1575 return Utils::ToLocal(result); 1586 return Utils::ToLocal(result);
1576 } 1587 }
1577 1588
1578 1589
1579 static i::Handle<i::SharedFunctionInfo> OpenScript(Script* script) { 1590 static i::Handle<i::SharedFunctionInfo> OpenScript(Script* script) {
1580 i::Handle<i::Object> obj = Utils::OpenHandle(script); 1591 i::Handle<i::Object> obj = Utils::OpenHandle(script);
1581 i::Handle<i::SharedFunctionInfo> result; 1592 i::Handle<i::SharedFunctionInfo> result;
(...skipping 1905 matching lines...) Expand 10 before | Expand all | Expand 10 after
3487 EXCEPTION_PREAMBLE(isolate); 3498 EXCEPTION_PREAMBLE(isolate);
3488 i::Handle<i::Object> delegate = 3499 i::Handle<i::Object> delegate =
3489 i::Execution::TryGetFunctionDelegate(obj, &has_pending_exception); 3500 i::Execution::TryGetFunctionDelegate(obj, &has_pending_exception);
3490 EXCEPTION_BAILOUT_CHECK(isolate, Local<Value>()); 3501 EXCEPTION_BAILOUT_CHECK(isolate, Local<Value>());
3491 fun = i::Handle<i::JSFunction>::cast(delegate); 3502 fun = i::Handle<i::JSFunction>::cast(delegate);
3492 recv_obj = obj; 3503 recv_obj = obj;
3493 } 3504 }
3494 EXCEPTION_PREAMBLE(isolate); 3505 EXCEPTION_PREAMBLE(isolate);
3495 i::Handle<i::Object> returned = 3506 i::Handle<i::Object> returned =
3496 i::Execution::Call(fun, recv_obj, argc, args, &has_pending_exception); 3507 i::Execution::Call(fun, recv_obj, argc, args, &has_pending_exception);
3497 EXCEPTION_BAILOUT_CHECK(isolate, Local<Value>()); 3508 EXCEPTION_BAILOUT_CHECK_DO_CALLBACK(isolate, Local<Value>());
3498 return Utils::ToLocal(scope.CloseAndEscape(returned)); 3509 return Utils::ToLocal(scope.CloseAndEscape(returned));
3499 } 3510 }
3500 3511
3501 3512
3502 Local<v8::Value> Object::CallAsConstructor(int argc, 3513 Local<v8::Value> Object::CallAsConstructor(int argc,
3503 v8::Handle<v8::Value> argv[]) { 3514 v8::Handle<v8::Value> argv[]) {
3504 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 3515 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
3505 ON_BAILOUT(isolate, "v8::Object::CallAsConstructor()", 3516 ON_BAILOUT(isolate, "v8::Object::CallAsConstructor()",
3506 return Local<v8::Object>()); 3517 return Local<v8::Object>());
3507 LOG_API(isolate, "Object::CallAsConstructor"); 3518 LOG_API(isolate, "Object::CallAsConstructor");
3508 ENTER_V8(isolate); 3519 ENTER_V8(isolate);
3509 i::HandleScope scope(isolate); 3520 i::HandleScope scope(isolate);
3510 i::Handle<i::JSObject> obj = Utils::OpenHandle(this); 3521 i::Handle<i::JSObject> obj = Utils::OpenHandle(this);
3511 STATIC_ASSERT(sizeof(v8::Handle<v8::Value>) == sizeof(i::Object**)); 3522 STATIC_ASSERT(sizeof(v8::Handle<v8::Value>) == sizeof(i::Object**));
3512 i::Handle<i::Object>* args = reinterpret_cast<i::Handle<i::Object>*>(argv); 3523 i::Handle<i::Object>* args = reinterpret_cast<i::Handle<i::Object>*>(argv);
3513 if (obj->IsJSFunction()) { 3524 if (obj->IsJSFunction()) {
3514 i::Handle<i::JSFunction> fun = i::Handle<i::JSFunction>::cast(obj); 3525 i::Handle<i::JSFunction> fun = i::Handle<i::JSFunction>::cast(obj);
3515 EXCEPTION_PREAMBLE(isolate); 3526 EXCEPTION_PREAMBLE(isolate);
3516 i::Handle<i::Object> returned = 3527 i::Handle<i::Object> returned =
3517 i::Execution::New(fun, argc, args, &has_pending_exception); 3528 i::Execution::New(fun, argc, args, &has_pending_exception);
3518 EXCEPTION_BAILOUT_CHECK(isolate, Local<v8::Object>()); 3529 EXCEPTION_BAILOUT_CHECK_DO_CALLBACK(isolate, Local<v8::Object>());
3519 return Utils::ToLocal(scope.CloseAndEscape( 3530 return Utils::ToLocal(scope.CloseAndEscape(
3520 i::Handle<i::JSObject>::cast(returned))); 3531 i::Handle<i::JSObject>::cast(returned)));
3521 } 3532 }
3522 EXCEPTION_PREAMBLE(isolate); 3533 EXCEPTION_PREAMBLE(isolate);
3523 i::Handle<i::Object> delegate = 3534 i::Handle<i::Object> delegate =
3524 i::Execution::TryGetConstructorDelegate(obj, &has_pending_exception); 3535 i::Execution::TryGetConstructorDelegate(obj, &has_pending_exception);
3525 EXCEPTION_BAILOUT_CHECK(isolate, Local<v8::Object>()); 3536 EXCEPTION_BAILOUT_CHECK(isolate, Local<v8::Object>());
3526 if (!delegate->IsUndefined()) { 3537 if (!delegate->IsUndefined()) {
3527 i::Handle<i::JSFunction> fun = i::Handle<i::JSFunction>::cast(delegate); 3538 i::Handle<i::JSFunction> fun = i::Handle<i::JSFunction>::cast(delegate);
3528 EXCEPTION_PREAMBLE(isolate); 3539 EXCEPTION_PREAMBLE(isolate);
3529 i::Handle<i::Object> returned = 3540 i::Handle<i::Object> returned =
3530 i::Execution::Call(fun, obj, argc, args, &has_pending_exception); 3541 i::Execution::Call(fun, obj, argc, args, &has_pending_exception);
3531 EXCEPTION_BAILOUT_CHECK(isolate, Local<v8::Object>()); 3542 EXCEPTION_BAILOUT_CHECK_DO_CALLBACK(isolate, Local<v8::Object>());
3532 ASSERT(!delegate->IsUndefined()); 3543 ASSERT(!delegate->IsUndefined());
3533 return Utils::ToLocal(scope.CloseAndEscape(returned)); 3544 return Utils::ToLocal(scope.CloseAndEscape(returned));
3534 } 3545 }
3535 return Local<v8::Object>(); 3546 return Local<v8::Object>();
3536 } 3547 }
3537 3548
3538 3549
3539 Local<v8::Object> Function::NewInstance() const { 3550 Local<v8::Object> Function::NewInstance() const {
3540 return NewInstance(0, NULL); 3551 return NewInstance(0, NULL);
3541 } 3552 }
3542 3553
3543 3554
3544 Local<v8::Object> Function::NewInstance(int argc, 3555 Local<v8::Object> Function::NewInstance(int argc,
3545 v8::Handle<v8::Value> argv[]) const { 3556 v8::Handle<v8::Value> argv[]) const {
3546 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 3557 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
3547 ON_BAILOUT(isolate, "v8::Function::NewInstance()", 3558 ON_BAILOUT(isolate, "v8::Function::NewInstance()",
3548 return Local<v8::Object>()); 3559 return Local<v8::Object>());
3549 LOG_API(isolate, "Function::NewInstance"); 3560 LOG_API(isolate, "Function::NewInstance");
3550 ENTER_V8(isolate); 3561 ENTER_V8(isolate);
3551 HandleScope scope; 3562 HandleScope scope;
3552 i::Handle<i::JSFunction> function = Utils::OpenHandle(this); 3563 i::Handle<i::JSFunction> function = Utils::OpenHandle(this);
3553 STATIC_ASSERT(sizeof(v8::Handle<v8::Value>) == sizeof(i::Object**)); 3564 STATIC_ASSERT(sizeof(v8::Handle<v8::Value>) == sizeof(i::Object**));
3554 i::Handle<i::Object>* args = reinterpret_cast<i::Handle<i::Object>*>(argv); 3565 i::Handle<i::Object>* args = reinterpret_cast<i::Handle<i::Object>*>(argv);
3555 EXCEPTION_PREAMBLE(isolate); 3566 EXCEPTION_PREAMBLE(isolate);
3556 i::Handle<i::Object> returned = 3567 i::Handle<i::Object> returned =
3557 i::Execution::New(function, argc, args, &has_pending_exception); 3568 i::Execution::New(function, argc, args, &has_pending_exception);
3558 EXCEPTION_BAILOUT_CHECK(isolate, Local<v8::Object>()); 3569 EXCEPTION_BAILOUT_CHECK_DO_CALLBACK(isolate, Local<v8::Object>());
3559 return scope.Close(Utils::ToLocal(i::Handle<i::JSObject>::cast(returned))); 3570 return scope.Close(Utils::ToLocal(i::Handle<i::JSObject>::cast(returned)));
3560 } 3571 }
3561 3572
3562 3573
3563 Local<v8::Value> Function::Call(v8::Handle<v8::Object> recv, int argc, 3574 Local<v8::Value> Function::Call(v8::Handle<v8::Object> recv, int argc,
3564 v8::Handle<v8::Value> argv[]) { 3575 v8::Handle<v8::Value> argv[]) {
3565 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 3576 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
3566 ON_BAILOUT(isolate, "v8::Function::Call()", return Local<v8::Value>()); 3577 ON_BAILOUT(isolate, "v8::Function::Call()", return Local<v8::Value>());
3567 LOG_API(isolate, "Function::Call"); 3578 LOG_API(isolate, "Function::Call");
3568 ENTER_V8(isolate); 3579 ENTER_V8(isolate);
3569 i::Object* raw_result = NULL; 3580 i::Object* raw_result = NULL;
3570 { 3581 {
3571 i::HandleScope scope(isolate); 3582 i::HandleScope scope(isolate);
3572 i::Handle<i::JSFunction> fun = Utils::OpenHandle(this); 3583 i::Handle<i::JSFunction> fun = Utils::OpenHandle(this);
3573 i::Handle<i::Object> recv_obj = Utils::OpenHandle(*recv); 3584 i::Handle<i::Object> recv_obj = Utils::OpenHandle(*recv);
3574 STATIC_ASSERT(sizeof(v8::Handle<v8::Value>) == sizeof(i::Object**)); 3585 STATIC_ASSERT(sizeof(v8::Handle<v8::Value>) == sizeof(i::Object**));
3575 i::Handle<i::Object>* args = reinterpret_cast<i::Handle<i::Object>*>(argv); 3586 i::Handle<i::Object>* args = reinterpret_cast<i::Handle<i::Object>*>(argv);
3576 EXCEPTION_PREAMBLE(isolate); 3587 EXCEPTION_PREAMBLE(isolate);
3577 i::Handle<i::Object> returned = 3588 i::Handle<i::Object> returned =
3578 i::Execution::Call(fun, recv_obj, argc, args, &has_pending_exception); 3589 i::Execution::Call(fun, recv_obj, argc, args, &has_pending_exception);
3579 EXCEPTION_BAILOUT_CHECK(isolate, Local<Object>()); 3590 EXCEPTION_BAILOUT_CHECK_DO_CALLBACK(isolate, Local<Object>());
3580 raw_result = *returned; 3591 raw_result = *returned;
3581 } 3592 }
3582 i::Handle<i::Object> result(raw_result); 3593 i::Handle<i::Object> result(raw_result);
3583 return Utils::ToLocal(result); 3594 return Utils::ToLocal(result);
3584 } 3595 }
3585 3596
3586 3597
3587 void Function::SetName(v8::Handle<v8::String> name) { 3598 void Function::SetName(v8::Handle<v8::String> name) {
3588 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 3599 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
3589 ENTER_V8(isolate); 3600 ENTER_V8(isolate);
(...skipping 1448 matching lines...) Expand 10 before | Expand all | Expand 10 after
5038 5049
5039 5050
5040 void V8::RemoveMemoryAllocationCallback(MemoryAllocationCallback callback) { 5051 void V8::RemoveMemoryAllocationCallback(MemoryAllocationCallback callback) {
5041 i::Isolate* isolate = i::Isolate::Current(); 5052 i::Isolate* isolate = i::Isolate::Current();
5042 if (IsDeadCheck(isolate, "v8::V8::RemoveMemoryAllocationCallback()")) return; 5053 if (IsDeadCheck(isolate, "v8::V8::RemoveMemoryAllocationCallback()")) return;
5043 isolate->memory_allocator()->RemoveMemoryAllocationCallback( 5054 isolate->memory_allocator()->RemoveMemoryAllocationCallback(
5044 callback); 5055 callback);
5045 } 5056 }
5046 5057
5047 5058
5059 void V8::AddCallCompletedCallback(CallCompletedCallback callback) {
5060 if (callback == NULL) return;
5061 i::Isolate* isolate = i::Isolate::Current();
5062 if (IsDeadCheck(isolate, "v8::V8::AddLeaveScriptCallback()")) return;
5063 i::V8::AddCallCompletedCallback(callback);
5064 }
5065
5066
5067 void V8::RemoveCallCompletedCallback(CallCompletedCallback callback) {
5068 i::Isolate* isolate = i::Isolate::Current();
5069 if (IsDeadCheck(isolate, "v8::V8::RemoveLeaveScriptCallback()")) return;
5070 i::V8::RemoveCallCompletedCallback(callback);
5071 }
5072
5073
5048 void V8::PauseProfiler() { 5074 void V8::PauseProfiler() {
5049 i::Isolate* isolate = i::Isolate::Current(); 5075 i::Isolate* isolate = i::Isolate::Current();
5050 isolate->logger()->PauseProfiler(); 5076 isolate->logger()->PauseProfiler();
5051 } 5077 }
5052 5078
5053 5079
5054 void V8::ResumeProfiler() { 5080 void V8::ResumeProfiler() {
5055 i::Isolate* isolate = i::Isolate::Current(); 5081 i::Isolate* isolate = i::Isolate::Current();
5056 isolate->logger()->ResumeProfiler(); 5082 isolate->logger()->ResumeProfiler();
5057 } 5083 }
(...skipping 1063 matching lines...) Expand 10 before | Expand all | Expand 10 after
6121 6147
6122 6148
6123 char* HandleScopeImplementer::Iterate(ObjectVisitor* v, char* storage) { 6149 char* HandleScopeImplementer::Iterate(ObjectVisitor* v, char* storage) {
6124 HandleScopeImplementer* scope_implementer = 6150 HandleScopeImplementer* scope_implementer =
6125 reinterpret_cast<HandleScopeImplementer*>(storage); 6151 reinterpret_cast<HandleScopeImplementer*>(storage);
6126 scope_implementer->IterateThis(v); 6152 scope_implementer->IterateThis(v);
6127 return storage + ArchiveSpacePerThread(); 6153 return storage + ArchiveSpacePerThread();
6128 } 6154 }
6129 6155
6130 } } // namespace v8::internal 6156 } } // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698