@@ -297,7 +297,7 @@ static int v8js_v8object_call_method(char *method, INTERNAL_FUNCTION_PARAMETERS)
297
297
zend_get_parameters_array_ex (argc, argv);
298
298
}
299
299
300
- std::function< v8::Local<v8::Value>(v8::Isolate *) > v8_call = [obj, method, argc, argv TSRMLS_CC](v8::Isolate *isolate) {
300
+ std::function< v8::Local<v8::Value>(v8::Isolate *) > v8_call = [obj, method, argc, argv, object, &return_value TSRMLS_CC](v8::Isolate *isolate) {
301
301
int i = 0 ;
302
302
303
303
v8::Local<v8::String> method_name = V8JS_SYML (method, strlen (method));
@@ -328,7 +328,16 @@ static int v8js_v8object_call_method(char *method, INTERNAL_FUNCTION_PARAMETERS)
328
328
jsArgv[i] = v8::Local<v8::Value>::New (isolate, zval_to_v8js (*argv[i], isolate TSRMLS_CC));
329
329
}
330
330
331
- return cb->Call (thisObj, argc, jsArgv);
331
+ v8::Local<v8::Value> result = cb->Call (thisObj, argc, jsArgv);
332
+
333
+ if (obj->std .ce == php_ce_v8object && result->StrictEquals (thisObj)) {
334
+ /* JS code did "return this", retain object identity */
335
+ ZVAL_COPY_VALUE (return_value, object);
336
+ zval_copy_ctor (return_value);
337
+ result.Clear ();
338
+ }
339
+
340
+ return result;
332
341
};
333
342
334
343
v8js_v8_call (obj->ctx , &return_value, obj->flags , obj->ctx ->time_limit , obj->ctx ->memory_limit , v8_call TSRMLS_CC);
0 commit comments