0
0
mirror of https://github.com/phpv8/v8js.git synced 2024-11-09 23:08:41 +00:00

Use weak persistent handles and DELREF zval.

This commit is contained in:
Stefan Siegl 2013-06-12 13:13:47 +02:00
parent 90ed152f40
commit bc1cf7c5bb

View File

@ -278,9 +278,23 @@ static v8::Handle<v8::Integer> php_v8js_property_query(v8::Local<v8::String> pro
#define PHP_V8JS_CALLBACK(mptr) \ #define PHP_V8JS_CALLBACK(mptr) \
v8::FunctionTemplate::New(php_v8js_php_callback, v8::External::New(mptr))->GetFunction() v8::FunctionTemplate::New(php_v8js_php_callback, v8::External::New(mptr))->GetFunction()
static void php_v8js_weak_object_callback(v8::Isolate *isolate, v8::Persistent<v8::Object> *object, zval *value)
{
if (READY_TO_DESTROY(value)) {
zval_dtor(value);
FREE_ZVAL(value);
} else {
Z_DELREF_P(value);
}
v8::V8::AdjustAmountOfExternalAllocatedMemory(-1024);
object->Dispose();
}
static v8::Handle<v8::Value> php_v8js_hash_to_jsobj(zval *value, v8::Isolate *isolate TSRMLS_DC) /* {{{ */ static v8::Handle<v8::Value> php_v8js_hash_to_jsobj(zval *value, v8::Isolate *isolate TSRMLS_DC) /* {{{ */
{ {
v8::Local<v8::Object> newobj; v8::Handle<v8::Object> newobj;
int i; int i;
char *key = NULL; char *key = NULL;
ulong index; ulong index;
@ -390,7 +404,17 @@ static v8::Handle<v8::Value> php_v8js_hash_to_jsobj(zval *value, v8::Isolate *is
} }
} }
newobj = new_tpl->InstanceTemplate()->NewInstance(); // Since we got to decrease the reference count again, in case v8 garbage collector
// decides to dispose the JS object, we add a weak persistent handle and register
// a callback function that removes the reference.
v8::Persistent<v8::Object> persist_newobj = v8::Persistent<v8::Object>::New(isolate, new_tpl->GetFunction()->NewInstance());
persist_newobj.MakeWeak(value, php_v8js_weak_object_callback);
// Just tell v8 that we're allocating some external memory
// (for the moment we just always tell 1k instead of trying to find out actual values)
v8::V8::AdjustAmountOfExternalAllocatedMemory(1024);
newobj = persist_newobj;
if (ce != zend_ce_closure) { // @fixme all of those get lost, when using cached templates if (ce != zend_ce_closure) { // @fixme all of those get lost, when using cached templates
if (call_ptr) { if (call_ptr) {