Browse Source

Unlock isolate on JS->PHP transition.

Stefan Siegl 11 năm trước cách đây
mục cha
commit
3f049d3b91
2 tập tin đã thay đổi với 52 bổ sung9 xóa
  1. 36 0
      samples/debug_callback_line_processor.php
  2. 16 9
      v8js_convert.cc

+ 36 - 0
samples/debug_callback_line_processor.php

@@ -0,0 +1,36 @@
+<?php
+
+class LineProcessor {
+  protected $_processor;
+
+  public function readLineLoop() {
+	$fh = fopen('php://stdin', 'r');
+	$p = $this->_processor;
+
+	while(($line = fgets($fh))) {
+	  echo $p($line);
+	}
+  }
+
+  public function setProcessor($p) {
+	$this->_processor = $p;
+  }
+}
+
+$v8 = new V8Js();
+$v8->lp = new LineProcessor();
+$v8->startDebugAgent('LineProcessor', 9222, V8Js::DEBUG_AUTO_BREAK_NEVER);
+
+$JS = <<< EOT
+  print("Hello LineProcessor User!\\n");
+
+  PHP.lp.setProcessor(function (foo) {
+	return foo.toUpperCase();
+  });
+
+  PHP.lp.readLineLoop();
+EOT;
+
+$v8->executeString($JS, 'processor.js');
+
+

+ 16 - 9
v8js_convert.cc

@@ -125,15 +125,22 @@ static void php_v8js_call_php_func(zval *value, zend_class_entry *ce, zend_funct
 	}
 	fci.no_separation = 1;
 
-	/* zend_fcall_info_cache */
-	fcc.initialized = 1;
-	fcc.function_handler = method_ptr;
-	fcc.calling_scope = ce;
-	fcc.called_scope = ce;
-	fcc.object_ptr = value;
-
-	/* Call the method */
-	zend_call_function(&fci, &fcc TSRMLS_CC);
+	{
+		isolate->Exit();
+		v8::Unlocker unlocker(isolate);
+
+		/* zend_fcall_info_cache */
+		fcc.initialized = 1;
+		fcc.function_handler = method_ptr;
+		fcc.calling_scope = ce;
+		fcc.called_scope = ce;
+		fcc.object_ptr = value;
+
+		/* Call the method */
+		zend_call_function(&fci, &fcc TSRMLS_CC);
+	}
+
+	isolate->Enter();
 
 failure:
 	/* Cleanup */