2012-04-27 16:26:15 +00:00
|
|
|
|
/*
|
|
|
|
|
+----------------------------------------------------------------------+
|
2017-03-11 11:33:49 +00:00
|
|
|
|
| PHP Version 7 |
|
2012-04-27 16:26:15 +00:00
|
|
|
|
+----------------------------------------------------------------------+
|
2017-03-10 23:14:53 +00:00
|
|
|
|
| Copyright (c) 1997-2017 The PHP Group |
|
2012-04-27 16:26:15 +00:00
|
|
|
|
+----------------------------------------------------------------------+
|
2013-09-28 17:17:33 +00:00
|
|
|
|
| http://www.opensource.org/licenses/mit-license.php MIT License |
|
2012-04-27 16:26:15 +00:00
|
|
|
|
+----------------------------------------------------------------------+
|
|
|
|
|
| Author: Jani Taskinen <jani.taskinen@iki.fi> |
|
2012-04-27 16:41:32 +00:00
|
|
|
|
| Author: Patrick Reilly <preilly@php.net> |
|
2017-03-10 23:14:53 +00:00
|
|
|
|
| Author: Stefan Siegl <stesie@php.net> |
|
2012-04-27 16:26:15 +00:00
|
|
|
|
+----------------------------------------------------------------------+
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
|
#include "config.h"
|
|
|
|
|
#endif
|
|
|
|
|
|
2016-01-06 09:01:35 +00:00
|
|
|
|
#include <string>
|
2012-04-27 16:26:15 +00:00
|
|
|
|
|
|
|
|
|
#include "php_v8js_macros.h"
|
2017-03-10 23:14:53 +00:00
|
|
|
|
#include "v8js_exceptions.h"
|
|
|
|
|
|
|
|
|
|
extern "C" {
|
|
|
|
|
#include "zend_exceptions.h"
|
|
|
|
|
}
|
2013-04-13 23:36:05 +00:00
|
|
|
|
|
2014-12-13 00:30:23 +00:00
|
|
|
|
static void v8js_fetch_php_variable(v8::Local<v8::String> name, const v8::PropertyCallbackInfo<v8::Value>& info) /* {{{ */
|
2012-04-27 16:26:15 +00:00
|
|
|
|
{
|
2017-03-11 12:31:40 +00:00
|
|
|
|
v8::Local<v8::External> data = v8::Local<v8::External>::Cast(info.Data());
|
2014-12-13 00:15:29 +00:00
|
|
|
|
v8js_accessor_ctx *ctx = static_cast<v8js_accessor_ctx *>(data->Value());
|
2013-10-26 03:46:03 +00:00
|
|
|
|
v8::Isolate *isolate = ctx->isolate;
|
2015-08-29 15:48:26 +00:00
|
|
|
|
zval *variable;
|
2012-04-27 16:26:15 +00:00
|
|
|
|
|
2017-03-11 12:35:21 +00:00
|
|
|
|
zend_is_auto_global(ctx->variable_name);
|
2012-04-27 16:26:15 +00:00
|
|
|
|
|
2015-08-29 15:48:26 +00:00
|
|
|
|
if ((variable = zend_hash_find(&EG(symbol_table), ctx->variable_name))) {
|
2017-03-11 12:35:21 +00:00
|
|
|
|
info.GetReturnValue().Set(zval_to_v8js(variable, isolate));
|
2013-07-07 22:58:19 +00:00
|
|
|
|
return;
|
2012-04-27 16:26:15 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
/* }}} */
|
|
|
|
|
|
2017-03-11 12:35:21 +00:00
|
|
|
|
void v8js_accessor_ctx_dtor(v8js_accessor_ctx *ctx) /* {{{ */
|
2013-10-27 06:34:06 +00:00
|
|
|
|
{
|
2015-08-29 15:48:26 +00:00
|
|
|
|
zend_string_release(ctx->variable_name);
|
2013-10-27 06:34:06 +00:00
|
|
|
|
efree(ctx);
|
|
|
|
|
}
|
|
|
|
|
/* }}} */
|
|
|
|
|
|
2017-03-11 12:35:21 +00:00
|
|
|
|
void v8js_register_accessors(std::vector<v8js_accessor_ctx*> *accessor_list, v8::Local<v8::FunctionTemplate> php_obj_t, zval *array, v8::Isolate *isolate) /* {{{ */
|
2012-04-27 16:26:15 +00:00
|
|
|
|
{
|
2015-08-29 15:48:26 +00:00
|
|
|
|
zend_string *property_name;
|
|
|
|
|
zval *item;
|
2013-10-27 05:54:41 +00:00
|
|
|
|
v8::Local<v8::ObjectTemplate> php_obj = php_obj_t->InstanceTemplate();
|
2012-04-27 16:26:15 +00:00
|
|
|
|
|
2015-08-29 15:48:26 +00:00
|
|
|
|
ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(array), property_name, item) {
|
|
|
|
|
switch (Z_TYPE_P(item))
|
2012-04-27 16:26:15 +00:00
|
|
|
|
{
|
|
|
|
|
/*
|
|
|
|
|
case IS_OBJECT:
|
|
|
|
|
case IS_ARRAY:
|
|
|
|
|
*/
|
|
|
|
|
case IS_STRING:
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
continue; /* Ignore invalid values */
|
|
|
|
|
}
|
|
|
|
|
|
2017-03-10 23:14:53 +00:00
|
|
|
|
if (ZSTR_LEN(property_name) > std::numeric_limits<int>::max()) {
|
|
|
|
|
zend_throw_exception(php_ce_v8js_exception,
|
|
|
|
|
"Property name length exceeds maximum supported length", 0);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
2013-04-13 23:36:05 +00:00
|
|
|
|
// Create context to store accessor data
|
2014-12-13 00:15:29 +00:00
|
|
|
|
v8js_accessor_ctx *ctx = (v8js_accessor_ctx *)emalloc(sizeof(v8js_accessor_ctx));
|
2015-08-29 15:48:26 +00:00
|
|
|
|
ctx->variable_name = zend_string_copy(Z_STR_P(item));
|
2013-04-13 23:36:05 +00:00
|
|
|
|
ctx->isolate = isolate;
|
|
|
|
|
|
2012-04-27 16:26:15 +00:00
|
|
|
|
/* Set the variable fetch callback for given symbol on named property */
|
2022-06-24 19:47:28 +00:00
|
|
|
|
php_obj->SetAccessor(V8JS_STRL(ZSTR_VAL(property_name), static_cast<int>(ZSTR_LEN(property_name))), v8js_fetch_php_variable, NULL, v8::External::New(isolate, ctx), v8::PROHIBITS_OVERWRITING, v8::ReadOnly);
|
2013-10-27 06:34:06 +00:00
|
|
|
|
|
|
|
|
|
/* record the context so we can free it later */
|
|
|
|
|
accessor_list->push_back(ctx);
|
2015-08-29 15:48:26 +00:00
|
|
|
|
} ZEND_HASH_FOREACH_END();
|
2012-04-27 16:26:15 +00:00
|
|
|
|
}
|
|
|
|
|
/* }}} */
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Local variables:
|
|
|
|
|
* tab-width: 4
|
|
|
|
|
* c-basic-offset: 4
|
2016-07-02 20:41:01 +00:00
|
|
|
|
* indent-tabs-mode: t
|
2012-04-27 16:26:15 +00:00
|
|
|
|
* End:
|
|
|
|
|
* vim600: noet sw=4 ts=4 fdm=marker
|
|
|
|
|
* vim<600: noet sw=4 ts=4
|
|
|
|
|
*/
|