diff --git a/v8js.cc b/v8js.cc index b11fde7..a0c4224 100644 --- a/v8js.cc +++ b/v8js.cc @@ -35,6 +35,8 @@ extern "C" { #include "zend_exceptions.h" } +#include + /* Forward declarations */ static void php_v8js_throw_script_exception(v8::TryCatch * TSRMLS_DC); static void php_v8js_create_script_exception(zval *, v8::TryCatch * TSRMLS_DC); @@ -1172,19 +1174,15 @@ static void php_v8js_compile_script(zval *this_ptr, const char *str, int str_len return; } -static void php_v8js_execute_script(zval *this_ptr, php_v8js_script *res, long flags, long time_limit, long memory_limit, zval **return_value TSRMLS_DC) + +static void php_v8js_call_v8(zval *this_ptr, zval **return_value, + long flags, long time_limit, long memory_limit, + std::function< v8::Local(v8::Isolate *) >& v8_call TSRMLS_DC) /* {{{ */ { char *tz = NULL; V8JS_BEGIN_CTX(c, this_ptr) - if (res->isolate != c->isolate) { - zend_error(E_WARNING, "Script resource from wrong V8Js object passed"); - ZVAL_BOOL(*return_value, 0); - return; - } - - V8JSG(timer_mutex).lock(); c->time_limit_hit = false; c->memory_limit_hit = false; @@ -1211,14 +1209,6 @@ static void php_v8js_execute_script(zval *this_ptr, php_v8js_script *res, long f } } - if (!c->in_execution && time_limit == 0) { - time_limit = c->time_limit; - } - - if (!c->in_execution && memory_limit == 0) { - memory_limit = c->memory_limit; - } - if (time_limit > 0 || memory_limit > 0) { // If timer thread is not running then start it if (!V8JSG(timer_thread)) { @@ -1242,8 +1232,7 @@ static void php_v8js_execute_script(zval *this_ptr, php_v8js_script *res, long f /* Execute script */ c->in_execution++; - v8::Local script = v8::Local::New(c->isolate, *res->script); - v8::Local result = script->Run(); + v8::Local result = v8_call(c->isolate); c->in_execution--; if (time_limit > 0 || memory_limit > 0) { @@ -1316,6 +1305,33 @@ static void php_v8js_execute_script(zval *this_ptr, php_v8js_script *res, long f v8js_to_zval(result, *return_value, flags, c->isolate TSRMLS_CC); } } +/* }}} */ + +static void php_v8js_execute_script(zval *this_ptr, php_v8js_script *res, long flags, long time_limit, long memory_limit, zval **return_value TSRMLS_DC) +{ + php_v8js_ctx *c = (php_v8js_ctx *) zend_object_store_get_object(getThis() TSRMLS_CC); + + if (res->isolate != c->isolate) { + zend_error(E_WARNING, "Script resource from wrong V8Js object passed"); + ZVAL_BOOL(*return_value, 0); + return; + } + + if (!c->in_execution && time_limit == 0) { + time_limit = c->time_limit; + } + + if (!c->in_execution && memory_limit == 0) { + memory_limit = c->memory_limit; + } + + std::function< v8::Local(v8::Isolate *) > v8_call = [res](v8::Isolate *isolate) { + v8::Local script = v8::Local::New(isolate, *res->script); + return script->Run(); + }; + + php_v8js_call_v8(this_ptr, return_value, flags, time_limit, memory_limit, v8_call TSRMLS_CC); +} /* {{{ proto mixed V8Js::executeString(string script [, string identifier [, int flags]]) */