v8js_generator_export.cc 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. /*
  2. +----------------------------------------------------------------------+
  3. | PHP Version 7 |
  4. +----------------------------------------------------------------------+
  5. | Copyright (c) 2016 The PHP Group |
  6. +----------------------------------------------------------------------+
  7. | http://www.opensource.org/licenses/mit-license.php MIT License |
  8. +----------------------------------------------------------------------+
  9. | Author: Stefan Siegl <[email protected]> |
  10. +----------------------------------------------------------------------+
  11. */
  12. #ifdef HAVE_CONFIG_H
  13. #include "config.h"
  14. #endif
  15. #include <assert.h>
  16. #include "php_v8js_macros.h"
  17. v8::Local<v8::Value> v8js_wrap_generator(v8::Isolate *isolate, v8::Local<v8::Value> wrapped_object) /* {{{ */
  18. {
  19. v8::Local<v8::Value> result;
  20. assert(!wrapped_object.IsEmpty());
  21. assert(wrapped_object->IsObject());
  22. v8::TryCatch try_catch;
  23. v8::Local<v8::String> source = v8::String::NewFromUtf8(isolate, "(\
  24. function(wrapped_object) { \
  25. return (function*() { \
  26. for(;;) { \
  27. if(!wrapped_object.valid()) { \
  28. return; \
  29. } \
  30. yield wrapped_object.current(); \
  31. wrapped_object.next(); \
  32. } \
  33. })(); \
  34. })");
  35. v8::Local<v8::Script> script = v8::Script::Compile(source);
  36. if(script.IsEmpty()) {
  37. zend_error(E_ERROR, "Failed to compile Generator object wrapper");
  38. return result;
  39. }
  40. v8::Local<v8::Value> wrapper_fn_val = script->Run();
  41. if(wrapper_fn_val.IsEmpty() || !wrapper_fn_val->IsFunction()) {
  42. zend_error(E_ERROR, "Failed to create Generator object wrapper function");
  43. return result;
  44. }
  45. v8::Local<v8::Function> wrapper_fn = v8::Local<v8::Function>::Cast(wrapper_fn_val);
  46. v8::Local<v8::Value> *jsArgv = static_cast<v8::Local<v8::Value> *>(alloca(sizeof(v8::Local<v8::Value>)));
  47. new(&jsArgv[0]) v8::Local<v8::Value>;
  48. jsArgv[0] = v8::Local<v8::Value>::New(isolate, wrapped_object);
  49. result = wrapper_fn->Call(V8JS_GLOBAL(isolate), 1, jsArgv);
  50. return result;
  51. }
  52. /* }}} */
  53. /*
  54. * Local variables:
  55. * tab-width: 4
  56. * c-basic-offset: 4
  57. * End:
  58. * vim600: noet sw=4 ts=4 fdm=marker
  59. * vim<600: noet sw=4 ts=4
  60. */