|  | @@ -0,0 +1,76 @@
 | 
	
		
			
				|  |  | +/*
 | 
	
		
			
				|  |  | +  +----------------------------------------------------------------------+
 | 
	
		
			
				|  |  | +  | 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"
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +#ifdef V8JS_GENERATOR_EXPORT_SUPPORT
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +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;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +/* }}} */
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +#endif /* V8JS_GENERATOR_EXPORT_SUPPORT */
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/*
 | 
	
		
			
				|  |  | + * 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
 | 
	
		
			
				|  |  | + */
 |