123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- /*
- +----------------------------------------------------------------------+
- | PHP Version 5 |
- +----------------------------------------------------------------------+
- | Copyright (c) 1997-2015 The PHP Group |
- +----------------------------------------------------------------------+
- | http://www.opensource.org/licenses/mit-license.php MIT License |
- +----------------------------------------------------------------------+
- | Author: Stefan Siegl <[email protected]> |
- +----------------------------------------------------------------------+
- */
- #ifdef HAVE_CONFIG_H
- #include "config.h"
- #endif
- extern "C" {
- #include "php.h"
- }
- #include "php_v8js_macros.h"
- #include "v8js_debug.h"
- #ifdef ENABLE_DEBUGGER_SUPPORT
- v8js_ctx *v8js_debug_context;
- int v8js_debug_auto_break_mode;
- static void DispatchDebugMessages() { /* {{{ */
- if(v8js_debug_context == NULL) {
- return;
- }
- v8::Isolate* isolate = v8js_debug_context->isolate;
- v8::Isolate::Scope isolate_scope(isolate);
- v8::HandleScope handle_scope(isolate);
- v8::Local<v8::Context> context =
- v8::Local<v8::Context>::New(isolate, v8js_debug_context->context);
- v8::Context::Scope scope(context);
- v8::Debug::ProcessDebugMessages();
- }
- /* }}} */
- /* {{{ proto void V8Js::__destruct()
- __destruct for V8Js */
- PHP_METHOD(V8Js, __destruct)
- {
- v8js_ctx *c = (v8js_ctx *) zend_object_store_get_object(getThis() TSRMLS_CC);
- if(!c->isolate) {
- /* c->isolate is initialized by __construct, which wasn't called if this
- * instance was deserialized (which we already caught in __wakeup). */
- return;
- }
- V8JS_CTX_PROLOGUE(c);
- if(v8js_debug_context == c) {
- v8::Debug::DisableAgent();
- v8js_debug_context = NULL;
- }
- }
- /* }}} */
- /* {{{ proto bool V8Js::startDebugAgent(string agent_name[, int port[, int auto_break]])
- */
- PHP_METHOD(V8Js, startDebugAgent)
- {
- char *str = NULL;
- int str_len = 0;
- long port = 0, auto_break = 0;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|sll", &str, &str_len, &port, &auto_break) == FAILURE) {
- return;
- }
- if(!port) {
- port = 9222;
- }
- V8JS_BEGIN_CTX(c, getThis());
- if(v8js_debug_context == c) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Debug agent already started for this V8Js instance");
- RETURN_BOOL(0);
- }
- if(v8js_debug_context != NULL) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Debug agent already started for a different V8Js instance");
- RETURN_BOOL(0);
- }
- v8js_debug_context = c;
- v8js_debug_auto_break_mode = auto_break;
- v8::Debug::SetDebugMessageDispatchHandler(DispatchDebugMessages, true);
- v8::Debug::EnableAgent(str_len ? str : "V8Js", port, auto_break > 0);
- if(auto_break) {
- /* v8::Debug::EnableAgent doesn't really do what we want it to do,
- since it only breaks processing on the default isolate.
- Hence just trigger another DebugBreak, no for our main isolate. */
- v8::Debug::DebugBreak(c->isolate);
- }
- RETURN_BOOL(1);
- }
- /* }}} */
- #endif /* ENABLE_DEBUGGER_SUPPORT */
|