| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 | /*  +----------------------------------------------------------------------+  | PHP Version 7                                                        |  +----------------------------------------------------------------------+  | Copyright (c) 2016 The PHP Group                                     |  +----------------------------------------------------------------------+  | http://www.opensource.org/licenses/mit-license.php  MIT License      |  +----------------------------------------------------------------------+  | Author: Stefan Siegl <[email protected]>                                |  +----------------------------------------------------------------------+*/#ifdef HAVE_CONFIG_H#include "config.h"#endif#include <assert.h>#include "php_v8js_macros.h"v8::Local<v8::Value> v8js_wrap_generator(v8::Isolate *isolate, v8::Local<v8::Value> wrapped_object) /* {{{ */{	v8::Local<v8::Value> result;	assert(!wrapped_object.IsEmpty());	assert(wrapped_object->IsObject());	v8::TryCatch try_catch;	v8::Local<v8::String> source = v8::String::NewFromUtf8(isolate, "(\function(wrapped_object) {					\	return (function*() {					\		for(;;) {							\			if(!wrapped_object.valid()) {	\				return;						\			}								\			yield wrapped_object.current();	\			wrapped_object.next();			\		}									\	})();									\})");	v8::Local<v8::Script> script = v8::Script::Compile(source);	if(script.IsEmpty()) {		zend_error(E_ERROR, "Failed to compile Generator object wrapper");		return result;	}	v8::Local<v8::Value> wrapper_fn_val = script->Run();	if(wrapper_fn_val.IsEmpty() || !wrapper_fn_val->IsFunction()) {		zend_error(E_ERROR, "Failed to create Generator object wrapper function");		return result;	}	v8::Local<v8::Function> wrapper_fn = v8::Local<v8::Function>::Cast(wrapper_fn_val);	v8::Local<v8::Value> *jsArgv = static_cast<v8::Local<v8::Value> *>(alloca(sizeof(v8::Local<v8::Value>)));	new(&jsArgv[0]) v8::Local<v8::Value>;	jsArgv[0] = v8::Local<v8::Value>::New(isolate, wrapped_object);	result = wrapper_fn->Call(V8JS_GLOBAL(isolate), 1, jsArgv);	return result;}/* }}} *//* * Local variables: * tab-width: 4 * c-basic-offset: 4 * End: * vim600: noet sw=4 ts=4 fdm=marker * vim<600: noet sw=4 ts=4 */
 |