@@ -297,7 +297,7 @@ static int v8js_v8object_call_method(char *method, INTERNAL_FUNCTION_PARAMETERS)
297297 zend_get_parameters_array_ex (argc, argv);
298298 }
299299
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) {
301301 int i = 0 ;
302302
303303 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)
328328 jsArgv[i] = v8::Local<v8::Value>::New (isolate, zval_to_v8js (*argv[i], isolate TSRMLS_CC));
329329 }
330330
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;
332341 };
333342
334343 v8js_v8_call (obj->ctx , &return_value, obj->flags , obj->ctx ->time_limit , obj->ctx ->memory_limit , v8_call TSRMLS_CC);
0 commit comments