mirror of
https://github.com/php-win-ext/php-lua.git
synced 2026-03-25 17:42:09 +01:00
Compare commits
41 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a6c5162a7c | ||
|
|
0875f92328 | ||
|
|
445e886030 | ||
|
|
5c405f9746 | ||
|
|
9b25ea36a5 | ||
|
|
5b6ac82491 | ||
|
|
5663931ce7 | ||
|
|
a5a8995b2e | ||
|
|
ffae3062a4 | ||
|
|
13e26a383a | ||
|
|
ef70d19a33 | ||
|
|
d763f167d8 | ||
|
|
24fd1baf19 | ||
|
|
a780d5623d | ||
|
|
0d73a2fdaa | ||
|
|
aa1dd4f526 | ||
|
|
199a846d7a | ||
|
|
84c831e4cb | ||
|
|
f588c88528 | ||
|
|
ad31d5f7c6 | ||
|
|
15f58c43fb | ||
|
|
c4c61f05bf | ||
|
|
9ef044896a | ||
|
|
feb39efa86 | ||
|
|
4438a88e85 | ||
|
|
0c6a60d21b | ||
|
|
db95520d2f | ||
|
|
8afc555bce | ||
|
|
486de80ebf | ||
|
|
1813b36307 | ||
|
|
a2be2c935b | ||
|
|
6690ee0c70 | ||
|
|
f64a8d6d27 | ||
|
|
d6c7850afa | ||
|
|
257d46c1e4 | ||
|
|
e350b425f4 | ||
|
|
527f927ead | ||
|
|
9be57325c6 | ||
|
|
1ff1eb10c9 | ||
|
|
cbe65b9ad6 | ||
|
|
04f7106631 |
38
.gitignore
vendored
Normal file
38
.gitignore
vendored
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
*.o
|
||||||
|
*.lo
|
||||||
|
*.la
|
||||||
|
.*.swp
|
||||||
|
.deps
|
||||||
|
.libs/
|
||||||
|
include/
|
||||||
|
tests/*.diff
|
||||||
|
tests/*.exp
|
||||||
|
tests/*.log
|
||||||
|
tests/*.php
|
||||||
|
tests/*.out
|
||||||
|
tests/*.sh
|
||||||
|
Makefile
|
||||||
|
Makefile.fragments
|
||||||
|
Makefile.global
|
||||||
|
Makefile.objects
|
||||||
|
acinclude.m4
|
||||||
|
aclocal.m4
|
||||||
|
autom4te.cache/
|
||||||
|
build/
|
||||||
|
config.guess
|
||||||
|
config.h
|
||||||
|
config.h.in
|
||||||
|
config.log
|
||||||
|
config.nice
|
||||||
|
config.status
|
||||||
|
config.sub
|
||||||
|
configure
|
||||||
|
configure.ac
|
||||||
|
configure.in
|
||||||
|
install-sh
|
||||||
|
libtool
|
||||||
|
ltmain.sh
|
||||||
|
missing
|
||||||
|
mkinstalldirs
|
||||||
|
modules/
|
||||||
|
run-tests.php
|
||||||
@@ -7,6 +7,10 @@ addons:
|
|||||||
|
|
||||||
php:
|
php:
|
||||||
- 7.0
|
- 7.0
|
||||||
|
- 7.1
|
||||||
|
- 7.2
|
||||||
|
- 7.3
|
||||||
|
- 7.4
|
||||||
|
|
||||||
notifications:
|
notifications:
|
||||||
email: false
|
email: false
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
dnl $Id: config.m4 321796 2012-01-05 17:23:48Z laruence $
|
|
||||||
PHP_ARG_WITH(lua, for lua support,
|
PHP_ARG_WITH(lua, for lua support,
|
||||||
[ --with-lua=[DIR] Include php lua support])
|
[ --with-lua=[DIR] Include php lua support])
|
||||||
PHP_ARG_WITH(lua-version, to specify a custom lua version, [ --with-lua-version=[VERSION]] Use the specified lua version.)
|
PHP_ARG_WITH(lua-version, to specify a custom lua version, [ --with-lua-version=[VERSION]] Use the specified lua version.)
|
||||||
|
|||||||
161
lua.c
161
lua.c
@@ -93,31 +93,31 @@ ZEND_GET_MODULE(lua)
|
|||||||
static void php_lua_stack_dump(lua_State* L) {
|
static void php_lua_stack_dump(lua_State* L) {
|
||||||
int i = 1;
|
int i = 1;
|
||||||
int n = lua_gettop(L);
|
int n = lua_gettop(L);
|
||||||
printf("The Length of stack is %d\n", n);
|
php_printf("The Length of stack is %d\n", n);
|
||||||
for (; i <= n; ++i) {
|
for (; i <= n; ++i) {
|
||||||
int t = lua_type(L, i);
|
int t = lua_type(L, i);
|
||||||
printf("%s:", lua_typename(L, t));
|
php_printf("%s:", lua_typename(L, t));
|
||||||
switch(t) {
|
switch(t) {
|
||||||
case LUA_TNUMBER:
|
case LUA_TNUMBER:
|
||||||
printf("%f", lua_tonumber(L, i));
|
php_printf("%f", lua_tonumber(L, i));
|
||||||
break;
|
break;
|
||||||
case LUA_TSTRING:
|
case LUA_TSTRING:
|
||||||
printf("%s", lua_tostring(L, i));
|
php_printf("%s", lua_tostring(L, i));
|
||||||
break;
|
break;
|
||||||
case LUA_TTABLE:
|
case LUA_TTABLE:
|
||||||
break;
|
break;
|
||||||
case LUA_TFUNCTION:
|
case LUA_TFUNCTION:
|
||||||
break;
|
break;
|
||||||
case LUA_TNIL:
|
case LUA_TNIL:
|
||||||
printf("NULL");
|
php_printf("NULL");
|
||||||
break;
|
break;
|
||||||
case LUA_TBOOLEAN:
|
case LUA_TBOOLEAN:
|
||||||
printf("%s", lua_toboolean(L, i) ? "TRUE" : "FALSE");
|
php_printf("%s", lua_toboolean(L, i) ? "TRUE" : "FALSE");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
printf("\n");
|
php_printf("\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
@@ -174,6 +174,11 @@ static void php_lua_dtor_object(zend_object *object) /* {{{ */ {
|
|||||||
php_lua_object *lua_obj = php_lua_obj_from_obj(object);
|
php_lua_object *lua_obj = php_lua_obj_from_obj(object);
|
||||||
|
|
||||||
zend_object_std_dtor(&(lua_obj->obj));
|
zend_object_std_dtor(&(lua_obj->obj));
|
||||||
|
}
|
||||||
|
/* }}} */
|
||||||
|
|
||||||
|
static void php_lua_free_object(zend_object *object) /* {{{ */ {
|
||||||
|
php_lua_object *lua_obj = php_lua_obj_from_obj(object);
|
||||||
|
|
||||||
if (lua_obj->L) {
|
if (lua_obj->L) {
|
||||||
lua_close(lua_obj->L);
|
lua_close(lua_obj->L);
|
||||||
@@ -192,12 +197,7 @@ zend_object *php_lua_create_object(zend_class_entry *ce)
|
|||||||
|
|
||||||
lua_atpanic(L, php_lua_atpanic);
|
lua_atpanic(L, php_lua_atpanic);
|
||||||
|
|
||||||
intern = emalloc(sizeof(php_lua_object) + sizeof(zval) * (ce->default_properties_count - 1));
|
intern = ecalloc(1, sizeof(php_lua_object) + zend_object_properties_size(ce));
|
||||||
|
|
||||||
if (!intern) {
|
|
||||||
php_error_docref(NULL, E_ERROR, "alloc memory for lua object failed");
|
|
||||||
}
|
|
||||||
|
|
||||||
intern->L = L;
|
intern->L = L;
|
||||||
|
|
||||||
zend_object_std_init(&intern->obj, ce);
|
zend_object_std_init(&intern->obj, ce);
|
||||||
@@ -212,27 +212,22 @@ zend_object *php_lua_create_object(zend_class_entry *ce)
|
|||||||
/** {{{ static zval * php_lua_read_property(zval *object, zval *member, int type)
|
/** {{{ static zval * php_lua_read_property(zval *object, zval *member, int type)
|
||||||
*/
|
*/
|
||||||
zval *php_lua_read_property(zval *object, zval *member, int type, void **cache_slot, zval *rv){
|
zval *php_lua_read_property(zval *object, zval *member, int type, void **cache_slot, zval *rv){
|
||||||
lua_State *L = NULL;
|
lua_State *L = (Z_LUAVAL_P(object))->L;
|
||||||
zval *tmp_member = NULL;
|
zend_string *str_member;
|
||||||
|
|
||||||
if (type != BP_VAR_R) {
|
if (type != BP_VAR_R) {
|
||||||
ZVAL_NULL(rv);
|
ZVAL_NULL(rv);
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Z_TYPE_P(member) != IS_STRING) {
|
str_member = zval_get_string(member);
|
||||||
*tmp_member = *member;
|
|
||||||
zval_copy_ctor(tmp_member);
|
|
||||||
convert_to_string(tmp_member);
|
|
||||||
member = tmp_member;
|
|
||||||
}
|
|
||||||
|
|
||||||
L = (Z_LUAVAL_P(object))->L;
|
|
||||||
#if (LUA_VERSION_NUM < 502)
|
#if (LUA_VERSION_NUM < 502)
|
||||||
lua_getfield(L, LUA_GLOBALSINDEX, Z_STRVAL_P(member));
|
lua_getfield(L, LUA_GLOBALSINDEX, ZSTR_VAL(str_member));
|
||||||
#else
|
#else
|
||||||
lua_getglobal(L, Z_STRVAL_P(member));
|
lua_getglobal(L, ZSTR_VAL(str_member));
|
||||||
#endif
|
#endif
|
||||||
|
zend_string_release(str_member);
|
||||||
|
|
||||||
php_lua_get_zval_from_lua(L, -1, object, rv);
|
php_lua_get_zval_from_lua(L, -1, object, rv);
|
||||||
lua_pop(L, 1);
|
lua_pop(L, 1);
|
||||||
return rv;
|
return rv;
|
||||||
@@ -242,17 +237,8 @@ zval *php_lua_read_property(zval *object, zval *member, int type, void **cache_s
|
|||||||
/** {{{ static void php_lua_write_property(zval *object, zval *member, zval *value)
|
/** {{{ static void php_lua_write_property(zval *object, zval *member, zval *value)
|
||||||
*/
|
*/
|
||||||
static void php_lua_write_property(zval *object, zval *member, zval *value, void ** key) {
|
static void php_lua_write_property(zval *object, zval *member, zval *value, void ** key) {
|
||||||
lua_State *L = NULL;
|
lua_State *L = (Z_LUAVAL_P(object))->L;
|
||||||
zval *tmp_member = NULL;
|
zend_string *str_member = zval_get_string(member);
|
||||||
|
|
||||||
if (Z_TYPE_P(member) != IS_STRING) {
|
|
||||||
*tmp_member = *member;
|
|
||||||
zval_copy_ctor(tmp_member);
|
|
||||||
convert_to_string(tmp_member);
|
|
||||||
member = tmp_member;
|
|
||||||
}
|
|
||||||
|
|
||||||
L = (Z_LUAVAL_P(object))->L;
|
|
||||||
|
|
||||||
#if (LUA_VERSION_NUM < 502)
|
#if (LUA_VERSION_NUM < 502)
|
||||||
php_lua_send_zval_to_lua(L, member);
|
php_lua_send_zval_to_lua(L, member);
|
||||||
@@ -264,9 +250,7 @@ static void php_lua_write_property(zval *object, zval *member, zval *value, void
|
|||||||
lua_setglobal(L, Z_STRVAL_P(member));
|
lua_setglobal(L, Z_STRVAL_P(member));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (tmp_member) {
|
zend_string_release(str_member);
|
||||||
zval_ptr_dtor(tmp_member);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
||||||
@@ -337,15 +321,18 @@ zval *php_lua_get_zval_from_lua(lua_State *L, int index, zval *lua_obj, zval *rv
|
|||||||
break;
|
break;
|
||||||
case LUA_TTABLE:
|
case LUA_TTABLE:
|
||||||
array_init(rv);
|
array_init(rv);
|
||||||
lua_pushnil(L); /* first key */
|
lua_pushvalue(L, index); // table
|
||||||
while (lua_next(L, index-1) != 0) {
|
lua_pushnil(L); // first key
|
||||||
|
while (lua_next(L, -2) != 0) {
|
||||||
zval key, val;
|
zval key, val;
|
||||||
|
|
||||||
/* uses 'key' (at index -2) and 'value' (at index -1) */
|
lua_pushvalue(L, -2);
|
||||||
if (!php_lua_get_zval_from_lua(L, -2, lua_obj, &key)) {
|
|
||||||
|
/* uses 'key' (at index -1) and 'value' (at index -2) */
|
||||||
|
if (!php_lua_get_zval_from_lua(L, -1, lua_obj, &key)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (!php_lua_get_zval_from_lua(L, -1, lua_obj, &val)) {
|
if (!php_lua_get_zval_from_lua(L, -2, lua_obj, &val)) {
|
||||||
zval_ptr_dtor(&key);
|
zval_ptr_dtor(&key);
|
||||||
/* there is a warning already in php_lua_get_zval_from_lua */
|
/* there is a warning already in php_lua_get_zval_from_lua */
|
||||||
break;
|
break;
|
||||||
@@ -365,17 +352,13 @@ zval *php_lua_get_zval_from_lua(lua_State *L, int index, zval *lua_obj, zval *rv
|
|||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
lua_pop(L, 1);
|
lua_pop(L, 2);
|
||||||
}
|
}
|
||||||
|
lua_pop(L, 1);
|
||||||
break;
|
break;
|
||||||
case LUA_TFUNCTION:
|
case LUA_TFUNCTION:
|
||||||
{
|
{
|
||||||
long ref_id = 0;
|
long ref_id = 0;
|
||||||
if (!lua_obj) {
|
|
||||||
php_error_docref(NULL, E_WARNING, "corrupted Lua object");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
lua_pushvalue(L, index);
|
lua_pushvalue(L, index);
|
||||||
ref_id = luaL_ref(L, LUA_REGISTRYINDEX);
|
ref_id = luaL_ref(L, LUA_REGISTRYINDEX);
|
||||||
|
|
||||||
@@ -401,6 +384,7 @@ zval *php_lua_get_zval_from_lua(lua_State *L, int index, zval *lua_obj, zval *rv
|
|||||||
|
|
||||||
int php_lua_send_zval_to_lua(lua_State *L, zval *val) /* {{{ */ {
|
int php_lua_send_zval_to_lua(lua_State *L, zval *val) /* {{{ */ {
|
||||||
|
|
||||||
|
try_again:
|
||||||
switch (Z_TYPE_P(val)) {
|
switch (Z_TYPE_P(val)) {
|
||||||
case IS_TRUE:
|
case IS_TRUE:
|
||||||
lua_pushboolean(L, 1);
|
lua_pushboolean(L, 1);
|
||||||
@@ -408,6 +392,7 @@ int php_lua_send_zval_to_lua(lua_State *L, zval *val) /* {{{ */ {
|
|||||||
case IS_FALSE:
|
case IS_FALSE:
|
||||||
lua_pushboolean(L, 0);
|
lua_pushboolean(L, 0);
|
||||||
break;
|
break;
|
||||||
|
case IS_UNDEF:
|
||||||
case IS_NULL:
|
case IS_NULL:
|
||||||
lua_pushnil(L);
|
lua_pushnil(L);
|
||||||
break;
|
break;
|
||||||
@@ -439,39 +424,91 @@ int php_lua_send_zval_to_lua(lua_State *L, zval *val) /* {{{ */ {
|
|||||||
add_next_index_zval(callbacks, val);
|
add_next_index_zval(callbacks, val);
|
||||||
} else {
|
} else {
|
||||||
zval *v;
|
zval *v;
|
||||||
ulong longkey;
|
zend_ulong longkey;
|
||||||
zend_string *key;
|
zend_string *key;
|
||||||
zval zkey;
|
zval zkey;
|
||||||
|
|
||||||
HashTable *ht = HASH_OF(val);
|
HashTable *ht = HASH_OF(val);
|
||||||
if (ZEND_HASH_APPLY_PROTECTION(ht)) {
|
if (
|
||||||
ZEND_HASH_INC_APPLY_COUNT(ht);
|
#if PHP_VERSION_ID < 70300
|
||||||
if (ZEND_HASH_GET_APPLY_COUNT(ht) > 1) {
|
ZEND_HASH_APPLY_PROTECTION(ht)
|
||||||
|
#else
|
||||||
|
!(GC_FLAGS(ht) & GC_IMMUTABLE)
|
||||||
|
#endif
|
||||||
|
) {
|
||||||
|
if (
|
||||||
|
#if PHP_VERSION_ID < 70300
|
||||||
|
ZEND_HASH_GET_APPLY_COUNT(ht)
|
||||||
|
#else
|
||||||
|
GC_IS_RECURSIVE(ht)
|
||||||
|
#endif
|
||||||
|
) {
|
||||||
|
|
||||||
php_error_docref(NULL, E_ERROR, "recursion found");
|
php_error_docref(NULL, E_ERROR, "recursion found");
|
||||||
ZEND_HASH_DEC_APPLY_COUNT(ht);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
#if PHP_VERSION_ID < 70300
|
||||||
|
ZEND_HASH_INC_APPLY_COUNT(ht);
|
||||||
|
#else
|
||||||
|
GC_PROTECT_RECURSION(ht);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
lua_newtable(L);
|
lua_newtable(L);
|
||||||
|
|
||||||
ZEND_HASH_FOREACH_KEY_VAL_IND(ht, longkey, key, v) {
|
ZEND_HASH_FOREACH_KEY_VAL_IND(ht, longkey, key, v) {
|
||||||
|
zend_bool key_pushed = 0;
|
||||||
|
|
||||||
if (key) {
|
if (key) {
|
||||||
|
if (Z_TYPE_P(val) == IS_OBJECT && ZSTR_VAL(key)[0] == 0) {
|
||||||
|
/* This is object property and it's name should be demangled*/
|
||||||
|
const char *prop_name, *class_name;
|
||||||
|
size_t prop_len;
|
||||||
|
|
||||||
|
zend_unmangle_property_name_ex(key, &class_name, &prop_name, &prop_len);
|
||||||
|
|
||||||
|
lua_pushlstring(L, prop_name, prop_len);
|
||||||
|
key_pushed = 1;
|
||||||
|
} else {
|
||||||
ZVAL_STR(&zkey, key);
|
ZVAL_STR(&zkey, key);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
ZVAL_LONG(&zkey, longkey);
|
ZVAL_LONG(&zkey, longkey);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!key_pushed) {
|
||||||
php_lua_send_zval_to_lua(L, &zkey);
|
php_lua_send_zval_to_lua(L, &zkey);
|
||||||
|
}
|
||||||
|
|
||||||
php_lua_send_zval_to_lua(L, v);
|
php_lua_send_zval_to_lua(L, v);
|
||||||
|
|
||||||
lua_settable(L, -3);
|
lua_settable(L, -3);
|
||||||
} ZEND_HASH_FOREACH_END();
|
} ZEND_HASH_FOREACH_END();
|
||||||
|
|
||||||
if (ZEND_HASH_APPLY_PROTECTION(ht)) {
|
if (
|
||||||
|
#if PHP_VERSION_ID < 70300
|
||||||
|
ZEND_HASH_APPLY_PROTECTION(ht)
|
||||||
|
#else
|
||||||
|
!(GC_FLAGS(ht) & GC_IMMUTABLE)
|
||||||
|
#endif
|
||||||
|
) {
|
||||||
|
#if PHP_VERSION_ID < 70300
|
||||||
ZEND_HASH_DEC_APPLY_COUNT(ht);
|
ZEND_HASH_DEC_APPLY_COUNT(ht);
|
||||||
|
#else
|
||||||
|
GC_UNPROTECT_RECURSION(ht);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case IS_REFERENCE:
|
||||||
|
ZVAL_DEREF(val);
|
||||||
|
goto try_again;
|
||||||
|
break;
|
||||||
|
case IS_INDIRECT:
|
||||||
|
val = Z_INDIRECT_P(val);
|
||||||
|
goto try_again;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
php_error_docref(NULL, E_ERROR, "unsupported type `%s' for lua", zend_zval_type_name(val));
|
php_error_docref(NULL, E_ERROR, "unsupported type `%s' for lua", zend_zval_type_name(val));
|
||||||
lua_pushnil(L);
|
lua_pushnil(L);
|
||||||
@@ -541,13 +578,9 @@ static zval *php_lua_call_lua_function(zval *lua_obj, zval *func, zval *args, in
|
|||||||
}
|
}
|
||||||
} else if (IS_OBJECT == Z_TYPE_P(func)
|
} else if (IS_OBJECT == Z_TYPE_P(func)
|
||||||
&& instanceof_function(Z_OBJCE_P(func), php_lua_get_closure_ce())) {
|
&& instanceof_function(Z_OBJCE_P(func), php_lua_get_closure_ce())) {
|
||||||
zval *closure = zend_read_property(php_lua_get_closure_ce(), func, ZEND_STRL("_closure"), 1, &rv);
|
lua_closure_object *closure_obj = php_lua_closure_object_from_zend_object(Z_OBJ_P(func));
|
||||||
if (!Z_LVAL_P(closure)) {
|
|
||||||
zend_throw_exception_ex(lua_exception_ce, 0, "invalid lua closure");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
bp = lua_gettop(L);
|
bp = lua_gettop(L);
|
||||||
lua_rawgeti(L, LUA_REGISTRYINDEX, Z_LVAL_P(closure));
|
lua_rawgeti(L, LUA_REGISTRYINDEX, closure_obj->closure);
|
||||||
if (LUA_TFUNCTION != lua_type(L, lua_gettop(L))) {
|
if (LUA_TFUNCTION != lua_type(L, lua_gettop(L))) {
|
||||||
lua_pop(L, -1);
|
lua_pop(L, -1);
|
||||||
zend_throw_exception_ex(lua_exception_ce, 0, "call to lua closure failed");
|
zend_throw_exception_ex(lua_exception_ce, 0, "call to lua closure failed");
|
||||||
@@ -792,7 +825,7 @@ zend_function_entry lua_class_methods[] = {
|
|||||||
PHP_ME(lua, getVersion, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_ALLOW_STATIC)
|
PHP_ME(lua, getVersion, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_ALLOW_STATIC)
|
||||||
PHP_ME(lua, registerCallback, arginfo_lua_register, ZEND_ACC_PUBLIC)
|
PHP_ME(lua, registerCallback, arginfo_lua_register, ZEND_ACC_PUBLIC)
|
||||||
PHP_MALIAS(lua, __call, call, arginfo_lua_call, ZEND_ACC_PUBLIC)
|
PHP_MALIAS(lua, __call, call, arginfo_lua_call, ZEND_ACC_PUBLIC)
|
||||||
{NULL, NULL, NULL}
|
PHP_FE_END
|
||||||
};
|
};
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
||||||
@@ -821,7 +854,7 @@ PHP_MINIT_FUNCTION(lua) {
|
|||||||
memcpy(&lua_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
|
memcpy(&lua_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
|
||||||
lua_object_handlers.offset = XtOffsetOf(php_lua_object, obj);
|
lua_object_handlers.offset = XtOffsetOf(php_lua_object, obj);
|
||||||
lua_object_handlers.dtor_obj = php_lua_dtor_object;
|
lua_object_handlers.dtor_obj = php_lua_dtor_object;
|
||||||
lua_object_handlers.free_obj = NULL;
|
lua_object_handlers.free_obj = php_lua_free_object;
|
||||||
lua_object_handlers.clone_obj = NULL;
|
lua_object_handlers.clone_obj = NULL;
|
||||||
lua_object_handlers.write_property = php_lua_write_property;
|
lua_object_handlers.write_property = php_lua_write_property;
|
||||||
lua_object_handlers.read_property = php_lua_read_property;
|
lua_object_handlers.read_property = php_lua_read_property;
|
||||||
|
|||||||
108
lua_closure.c
108
lua_closure.c
@@ -25,6 +25,7 @@
|
|||||||
#include "Zend/zend_exceptions.h"
|
#include "Zend/zend_exceptions.h"
|
||||||
|
|
||||||
#include "lua.h"
|
#include "lua.h"
|
||||||
|
#include "lua_closure.h"
|
||||||
#include "lauxlib.h"
|
#include "lauxlib.h"
|
||||||
#include "lualib.h"
|
#include "lualib.h"
|
||||||
|
|
||||||
@@ -33,6 +34,7 @@
|
|||||||
static zend_class_entry *lua_closure_ce;
|
static zend_class_entry *lua_closure_ce;
|
||||||
extern zend_class_entry *lua_ce;
|
extern zend_class_entry *lua_ce;
|
||||||
extern zend_class_entry *lua_exception_ce;
|
extern zend_class_entry *lua_exception_ce;
|
||||||
|
static zend_object_handlers lua_closure_handlers;
|
||||||
|
|
||||||
/** {{{ ARG_INFO
|
/** {{{ ARG_INFO
|
||||||
*
|
*
|
||||||
@@ -46,9 +48,14 @@ ZEND_END_ARG_INFO()
|
|||||||
/** {{{ zval * php_lua_closure_instance(zval *instance, long ref_id, zval *lua_obj)
|
/** {{{ zval * php_lua_closure_instance(zval *instance, long ref_id, zval *lua_obj)
|
||||||
*/
|
*/
|
||||||
zval* php_lua_closure_instance(zval *instance, long ref_id, zval *lua_obj) {
|
zval* php_lua_closure_instance(zval *instance, long ref_id, zval *lua_obj) {
|
||||||
|
lua_closure_object *objval;
|
||||||
|
|
||||||
object_init_ex(instance, lua_closure_ce);
|
object_init_ex(instance, lua_closure_ce);
|
||||||
zend_update_property_long(lua_closure_ce, instance, ZEND_STRL("_closure"), ref_id);
|
objval = php_lua_closure_object_from_zend_object(Z_OBJ_P(instance));
|
||||||
zend_update_property(lua_closure_ce, instance, ZEND_STRL("_lua_object"), lua_obj);
|
objval->closure = ref_id;
|
||||||
|
if (lua_obj) {
|
||||||
|
ZVAL_ZVAL(&(objval->lua), lua_obj, 1, 0);
|
||||||
|
}
|
||||||
|
|
||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
@@ -60,39 +67,17 @@ PHP_METHOD(lua_closure, __construct) {
|
|||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
||||||
/** {{{ proto LuaClosure::__destruct()
|
|
||||||
*/
|
|
||||||
PHP_METHOD(lua_closure, __destruct) {
|
|
||||||
zval *lua_obj, *closure, rv;
|
|
||||||
|
|
||||||
lua_obj = zend_read_property(lua_closure_ce, getThis(), ZEND_STRL("_lua_object"), 1, &rv);
|
|
||||||
if (ZVAL_IS_NULL(lua_obj)
|
|
||||||
|| Z_TYPE_P(lua_obj) != IS_OBJECT
|
|
||||||
|| !instanceof_function(Z_OBJCE_P(lua_obj), lua_ce)) {
|
|
||||||
RETURN_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
closure = zend_read_property(lua_closure_ce, getThis(), ZEND_STRL("_closure"), 1, &rv);
|
|
||||||
if (!Z_LVAL_P(closure)) {
|
|
||||||
RETURN_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
luaL_unref((Z_LUAVAL_P(lua_obj))->L, LUA_REGISTRYINDEX, Z_LVAL_P(closure));
|
|
||||||
}
|
|
||||||
/* }}} */
|
|
||||||
|
|
||||||
/** {{{ proto LuaClosure::invoke(mxied $args)
|
/** {{{ proto LuaClosure::invoke(mxied $args)
|
||||||
*/
|
*/
|
||||||
PHP_METHOD(lua_closure, invoke) {
|
PHP_METHOD(lua_closure, invoke) {
|
||||||
|
lua_closure_object *objval = php_lua_closure_object_from_zend_object(Z_OBJ_P(getThis()));
|
||||||
int bp, sp;
|
int bp, sp;
|
||||||
zval *arguments = NULL;
|
zval *arguments = NULL;
|
||||||
zval *lua_obj = NULL;
|
|
||||||
lua_State *L = NULL;
|
lua_State *L = NULL;
|
||||||
zval *closure = NULL;
|
|
||||||
zval rv;
|
zval rv;
|
||||||
|
|
||||||
if (ZEND_NUM_ARGS()) {
|
if (ZEND_NUM_ARGS()) {
|
||||||
arguments = emalloc(sizeof(zval*) * ZEND_NUM_ARGS());
|
arguments = emalloc(sizeof(zval) * ZEND_NUM_ARGS());
|
||||||
if (zend_get_parameters_array_ex(ZEND_NUM_ARGS(), arguments) == FAILURE) {
|
if (zend_get_parameters_array_ex(ZEND_NUM_ARGS(), arguments) == FAILURE) {
|
||||||
efree(arguments);
|
efree(arguments);
|
||||||
zend_throw_exception_ex(NULL, 0, "cannot get arguments for calling closure");
|
zend_throw_exception_ex(NULL, 0, "cannot get arguments for calling closure");
|
||||||
@@ -100,25 +85,16 @@ PHP_METHOD(lua_closure, invoke) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
lua_obj = zend_read_property(lua_closure_ce, getThis(), ZEND_STRL("_lua_object"), 1, &rv);
|
if (Z_TYPE(objval->lua) != IS_OBJECT
|
||||||
|
|| !instanceof_function(Z_OBJCE(objval->lua), lua_ce)) {
|
||||||
if (ZVAL_IS_NULL(lua_obj)
|
|
||||||
|| Z_TYPE_P(lua_obj) != IS_OBJECT
|
|
||||||
|| !instanceof_function(Z_OBJCE_P(lua_obj), lua_ce)) {
|
|
||||||
zend_throw_exception_ex(NULL, 0, "corrupted Lua object");
|
zend_throw_exception_ex(NULL, 0, "corrupted Lua object");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
closure = zend_read_property(lua_closure_ce, getThis(), ZEND_STRL("_closure"), 1, &rv);
|
L = (Z_LUAVAL(objval->lua))->L;
|
||||||
if (!Z_LVAL_P(closure)) {
|
|
||||||
zend_throw_exception_ex(NULL, 0, "invalid lua closure");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
L = (Z_LUAVAL_P(lua_obj))->L;
|
|
||||||
|
|
||||||
bp = lua_gettop(L);
|
bp = lua_gettop(L);
|
||||||
lua_rawgeti(L, LUA_REGISTRYINDEX, Z_LVAL_P(closure));
|
lua_rawgeti(L, LUA_REGISTRYINDEX, objval->closure);
|
||||||
if (LUA_TFUNCTION != lua_type(L, lua_gettop(L))) {
|
if (LUA_TFUNCTION != lua_type(L, lua_gettop(L))) {
|
||||||
lua_pop(L, -1);
|
lua_pop(L, -1);
|
||||||
zend_throw_exception_ex(NULL, 0, "call to lua closure failed");
|
zend_throw_exception_ex(NULL, 0, "call to lua closure failed");
|
||||||
@@ -147,13 +123,13 @@ PHP_METHOD(lua_closure, invoke) {
|
|||||||
if (!sp) {
|
if (!sp) {
|
||||||
RETURN_NULL();
|
RETURN_NULL();
|
||||||
} else if (sp == 1) {
|
} else if (sp == 1) {
|
||||||
php_lua_get_zval_from_lua(L, -1, lua_obj, return_value);
|
php_lua_get_zval_from_lua(L, -1, &(objval->lua), return_value);
|
||||||
} else {
|
} else {
|
||||||
zval rv;
|
zval rv;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
array_init(return_value);
|
array_init(return_value);
|
||||||
for (i = -sp; i < 0; i++) {
|
for (i = -sp; i < 0; i++) {
|
||||||
php_lua_get_zval_from_lua(L, i, lua_obj, &rv);
|
php_lua_get_zval_from_lua(L, i, &(objval->lua), &rv);
|
||||||
add_next_index_zval(return_value, &rv);
|
add_next_index_zval(return_value, &rv);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -166,51 +142,37 @@ PHP_METHOD(lua_closure, invoke) {
|
|||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
||||||
/** {{{ proto LuaClosure::__clone()
|
|
||||||
*/
|
|
||||||
PHP_METHOD(lua_closure, __clone) {
|
|
||||||
}
|
|
||||||
/* }}} */
|
|
||||||
|
|
||||||
/* {{{ lua_class_methods[]
|
/* {{{ lua_class_methods[]
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
zend_function_entry lua_closure_methods[] = {
|
zend_function_entry lua_closure_methods[] = {
|
||||||
PHP_ME(lua_closure, __construct, NULL, ZEND_ACC_PRIVATE|ZEND_ACC_CTOR)
|
PHP_ME(lua_closure, __construct, NULL, ZEND_ACC_PRIVATE|ZEND_ACC_CTOR)
|
||||||
PHP_ME(lua_closure, __destruct, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_DTOR)
|
|
||||||
PHP_ME(lua_closure, __clone, NULL, ZEND_ACC_PRIVATE)
|
|
||||||
PHP_ME(lua_closure, invoke, arginfo_lua_invoke, ZEND_ACC_PUBLIC)
|
PHP_ME(lua_closure, invoke, arginfo_lua_invoke, ZEND_ACC_PUBLIC)
|
||||||
PHP_MALIAS(lua_closure, __invoke, invoke, arginfo_lua_invoke, ZEND_ACC_PUBLIC)
|
PHP_MALIAS(lua_closure, __invoke, invoke, arginfo_lua_invoke, ZEND_ACC_PUBLIC)
|
||||||
{NULL, NULL, NULL}
|
PHP_FE_END
|
||||||
};
|
};
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
||||||
static void php_lua_closure_dtor_object(void *object, zend_object_handlers handle) /* {{{ */
|
static void php_lua_closure_free_obj(zend_object *zobj) /* {{{ */
|
||||||
{
|
{
|
||||||
zend_object *obj = (zend_object*)object;
|
lua_closure_object *objval = php_lua_closure_object_from_zend_object(zobj);
|
||||||
|
|
||||||
zend_object_std_dtor(obj);
|
if ((Z_TYPE(objval->lua) == IS_OBJECT) &&
|
||||||
|
instanceof_function(Z_OBJCE(objval->lua), lua_ce)) {
|
||||||
efree(obj);
|
luaL_unref((Z_LUAVAL(objval->lua))->L, LUA_REGISTRYINDEX, objval->closure);
|
||||||
|
}
|
||||||
|
zval_dtor(&(objval->lua));
|
||||||
|
zend_object_std_dtor(zobj);
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
|
|
||||||
zend_object *php_lua_closure_create_object(zend_class_entry *ce) /* {{{ */
|
zend_object *php_lua_closure_create_object(zend_class_entry *ce) /* {{{ */
|
||||||
{
|
{
|
||||||
zend_object *intern;
|
lua_closure_object *objval = ecalloc(1, sizeof(lua_closure_object) + zend_object_properties_size(ce));
|
||||||
|
zend_object *zobj = &(objval->std);
|
||||||
|
|
||||||
intern = emalloc(sizeof(zend_object)+ sizeof(zval) * (ce->default_properties_count - 1));
|
zend_object_std_init(zobj, ce);
|
||||||
|
zobj->handlers = &lua_closure_handlers;
|
||||||
if (!intern) {
|
|
||||||
php_error_docref(NULL, E_ERROR, "alloc memory for lua object failed");
|
|
||||||
}
|
|
||||||
|
|
||||||
zend_object_std_init(intern, ce);
|
|
||||||
object_properties_init(intern, ce);
|
|
||||||
|
|
||||||
intern->handlers = zend_get_std_object_handlers();
|
|
||||||
|
|
||||||
return intern;
|
|
||||||
|
|
||||||
|
return zobj;
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
|
|
||||||
void php_lua_closure_register() /* {{{ */
|
void php_lua_closure_register() /* {{{ */
|
||||||
@@ -222,10 +184,10 @@ void php_lua_closure_register() /* {{{ */
|
|||||||
lua_closure_ce->create_object = php_lua_closure_create_object;
|
lua_closure_ce->create_object = php_lua_closure_create_object;
|
||||||
lua_closure_ce->ce_flags |= ZEND_ACC_FINAL;
|
lua_closure_ce->ce_flags |= ZEND_ACC_FINAL;
|
||||||
|
|
||||||
zend_declare_property_long(lua_closure_ce, ZEND_STRL("_closure"), 0, ZEND_ACC_PRIVATE);
|
memcpy(&lua_closure_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
|
||||||
zend_declare_property_null(lua_closure_ce, ZEND_STRL("_lua_object"), ZEND_ACC_PRIVATE);
|
lua_closure_handlers.offset = XtOffsetOf(lua_closure_object, std);
|
||||||
|
lua_closure_handlers.clone_obj = NULL;
|
||||||
|
lua_closure_handlers.free_obj = php_lua_closure_free_obj;
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
|
|
||||||
zend_class_entry *php_lua_get_closure_ce() /* {{{ */
|
zend_class_entry *php_lua_get_closure_ce() /* {{{ */
|
||||||
|
|||||||
@@ -19,6 +19,17 @@
|
|||||||
|
|
||||||
#ifndef LUA_CLOSURE_H
|
#ifndef LUA_CLOSURE_H
|
||||||
#define LUA_CLOSURE_H
|
#define LUA_CLOSURE_H
|
||||||
|
typedef struct _lua_closure_object {
|
||||||
|
long closure;
|
||||||
|
zval lua;
|
||||||
|
|
||||||
|
zend_object std;
|
||||||
|
} lua_closure_object;
|
||||||
|
|
||||||
|
static inline lua_closure_object* php_lua_closure_object_from_zend_object(zend_object *zobj) {
|
||||||
|
return ((lua_closure_object*)(zobj + 1)) - 1;
|
||||||
|
}
|
||||||
|
|
||||||
void php_lua_closure_register();
|
void php_lua_closure_register();
|
||||||
zend_class_entry *php_lua_get_closure_ce();
|
zend_class_entry *php_lua_get_closure_ce();
|
||||||
zval * php_lua_closure_instance(zval *instance, long ref_id, zval *lua_obj);
|
zval * php_lua_closure_instance(zval *instance, long ref_id, zval *lua_obj);
|
||||||
|
|||||||
89
package.xml
89
package.xml
@@ -23,11 +23,11 @@
|
|||||||
<email>msaraujo@php.net</email>
|
<email>msaraujo@php.net</email>
|
||||||
<active>yes</active>
|
<active>yes</active>
|
||||||
</developer>
|
</developer>
|
||||||
<date>2016-05-26</date>
|
<date>2020-03-10</date>
|
||||||
<time>10:50:27</time>
|
<time>11:10:00</time>
|
||||||
<version>
|
<version>
|
||||||
<release>2.0.2</release>
|
<release>2.0.7</release>
|
||||||
<api>2.0.2</api>
|
<api>2.0.7</api>
|
||||||
</version>
|
</version>
|
||||||
<stability>
|
<stability>
|
||||||
<release>stable</release>
|
<release>stable</release>
|
||||||
@@ -35,7 +35,7 @@
|
|||||||
</stability>
|
</stability>
|
||||||
<license uri="http://www.php.net/license">PHP</license>
|
<license uri="http://www.php.net/license">PHP</license>
|
||||||
<notes>
|
<notes>
|
||||||
- Fixed issue #22 (Boolean FALSE is always TRUE)
|
- Fixed windows build for 7.4
|
||||||
</notes>
|
</notes>
|
||||||
<contents>
|
<contents>
|
||||||
<dir name="/">
|
<dir name="/">
|
||||||
@@ -65,6 +65,7 @@
|
|||||||
<file name="issue012.phpt" role="test" />
|
<file name="issue012.phpt" role="test" />
|
||||||
<file name="bug65097.phpt" role="test" />
|
<file name="bug65097.phpt" role="test" />
|
||||||
<file name="bug71997.phpt" role="test" />
|
<file name="bug71997.phpt" role="test" />
|
||||||
|
<file name="bug73964.phpt" role="test" />
|
||||||
</dir>
|
</dir>
|
||||||
</dir>
|
</dir>
|
||||||
</contents>
|
</contents>
|
||||||
@@ -81,6 +82,83 @@
|
|||||||
<providesextension>lua</providesextension>
|
<providesextension>lua</providesextension>
|
||||||
<extsrcrelease />
|
<extsrcrelease />
|
||||||
<changelog>
|
<changelog>
|
||||||
|
<release>
|
||||||
|
<date>2020-03-10</date>
|
||||||
|
<version>
|
||||||
|
<release>2.0.7</release>
|
||||||
|
<api>2.0.7</api>
|
||||||
|
</version>
|
||||||
|
<stability>
|
||||||
|
<release>stable</release>
|
||||||
|
<api>stable</api>
|
||||||
|
</stability>
|
||||||
|
<license uri="http://www.php.net/license">PHP License</license>
|
||||||
|
<notes>
|
||||||
|
- Fixed windows build for 7.4
|
||||||
|
</notes>
|
||||||
|
</release>
|
||||||
|
|
||||||
|
<date>2018-12-21</date>
|
||||||
|
<version>
|
||||||
|
<release>2.0.6</release>
|
||||||
|
<api>2.0.6</api>
|
||||||
|
</version>
|
||||||
|
<stability>
|
||||||
|
<release>stable</release>
|
||||||
|
<api>stable</api>
|
||||||
|
</stability>
|
||||||
|
<license uri="http://www.php.net/license">PHP License</license>
|
||||||
|
<notes>
|
||||||
|
- Fixed Hash Recursive Detecting in PHP-7.3
|
||||||
|
</notes>
|
||||||
|
<release>
|
||||||
|
<date>2017-12-31</date>
|
||||||
|
<version>
|
||||||
|
<release>2.0.5</release>
|
||||||
|
<api>2.0.5</api>
|
||||||
|
</version>
|
||||||
|
<stability>
|
||||||
|
<release>stable</release>
|
||||||
|
<api>stable</api>
|
||||||
|
</stability>
|
||||||
|
<license uri="http://www.php.net/license">PHP License</license>
|
||||||
|
<notes>
|
||||||
|
- Refactor LuaClosure. (SaraG)
|
||||||
|
- Fix non-string member access in read/write prop. (SaraG)
|
||||||
|
- Fix allocation of lua object. (SaraG)
|
||||||
|
</notes>
|
||||||
|
</release>
|
||||||
|
<release>
|
||||||
|
<date>2017-07-12</date>
|
||||||
|
<version>
|
||||||
|
<release>2.0.4</release>
|
||||||
|
<api>2.0.4</api>
|
||||||
|
</version>
|
||||||
|
<stability>
|
||||||
|
<release>stable</release>
|
||||||
|
<api>stable</api>
|
||||||
|
</stability>
|
||||||
|
<license uri="http://www.php.net/license">PHP License</license>
|
||||||
|
<notes>
|
||||||
|
- Fixed bug #73964 (Segmentation fault)
|
||||||
|
</notes>
|
||||||
|
</release>
|
||||||
|
<release>
|
||||||
|
<date>2017-02-10</date>
|
||||||
|
<version>
|
||||||
|
<release>2.0.3</release>
|
||||||
|
<api>2.0.3</api>
|
||||||
|
</version>
|
||||||
|
<stability>
|
||||||
|
<release>stable</release>
|
||||||
|
<api>stable</api>
|
||||||
|
</stability>
|
||||||
|
<license uri="http://www.php.net/license">PHP License</license>
|
||||||
|
<notes>
|
||||||
|
- Fixed issue #20 (PHP 7: Lua::eval(): unsupported type `unknown' for lua)
|
||||||
|
</notes>
|
||||||
|
</release>
|
||||||
|
|
||||||
<release>
|
<release>
|
||||||
<date>2016-05-26</date>
|
<date>2016-05-26</date>
|
||||||
<version>
|
<version>
|
||||||
@@ -96,7 +174,6 @@
|
|||||||
- Fixed issue #22 (Boolean FALSE is always TRUE)
|
- Fixed issue #22 (Boolean FALSE is always TRUE)
|
||||||
</notes>
|
</notes>
|
||||||
</release>
|
</release>
|
||||||
|
|
||||||
<release>
|
<release>
|
||||||
<date>2016-04-11</date>
|
<date>2016-04-11</date>
|
||||||
<version>
|
<version>
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ extern zend_module_entry lua_module_entry;
|
|||||||
#define LUA_G(v) (lua_globals.v)
|
#define LUA_G(v) (lua_globals.v)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define PHP_LUA_VERSION "2.0.2"
|
#define PHP_LUA_VERSION "2.0.8-dev"
|
||||||
|
|
||||||
struct _php_lua_object {
|
struct _php_lua_object {
|
||||||
lua_State *L;
|
lua_State *L;
|
||||||
@@ -61,6 +61,7 @@ static inline php_lua_object *php_lua_obj_from_obj(zend_object *obj) {
|
|||||||
return (php_lua_object*)((char*)(obj)-XtOffsetOf(php_lua_object, obj));
|
return (php_lua_object*)((char*)(obj)-XtOffsetOf(php_lua_object, obj));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define Z_LUAVAL(obj) php_lua_obj_from_obj(Z_OBJ((obj)))
|
||||||
#define Z_LUAVAL_P(obj) php_lua_obj_from_obj(Z_OBJ_P((obj)))
|
#define Z_LUAVAL_P(obj) php_lua_obj_from_obj(Z_OBJ_P((obj)))
|
||||||
|
|
||||||
zval *php_lua_get_zval_from_lua(lua_State *L, int index, zval *lua_obj, zval *rv);
|
zval *php_lua_get_zval_from_lua(lua_State *L, int index, zval *lua_obj, zval *rv);
|
||||||
|
|||||||
45
tests/016.phpt
Normal file
45
tests/016.phpt
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
--TEST--
|
||||||
|
PHP Object to lua
|
||||||
|
--SKIPIF--
|
||||||
|
<?php if (!extension_loaded("lua")) print "skip"; ?>
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
class T {
|
||||||
|
private $v;
|
||||||
|
private $s;
|
||||||
|
|
||||||
|
public function __construct($v)
|
||||||
|
{
|
||||||
|
$this->v = $v;
|
||||||
|
$this->s = "string = $v";
|
||||||
|
}
|
||||||
|
|
||||||
|
static function create($arg)
|
||||||
|
{
|
||||||
|
return new self($arg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$l = new lua();
|
||||||
|
$l->registerCallback('create_object', [T::class, 'create']);
|
||||||
|
|
||||||
|
$l->eval(<<<CODE
|
||||||
|
local t = create_object(2)
|
||||||
|
|
||||||
|
local keys = {}
|
||||||
|
|
||||||
|
for k, _ in pairs(t) do
|
||||||
|
table.insert(keys, k)
|
||||||
|
end
|
||||||
|
|
||||||
|
table.sort(keys)
|
||||||
|
for _,k in ipairs(keys) do
|
||||||
|
print(k, " -> ", t[k], ",")
|
||||||
|
end
|
||||||
|
CODE
|
||||||
|
);
|
||||||
|
|
||||||
|
?>
|
||||||
|
--EXPECTF--
|
||||||
|
s -> string = 2,v -> 2,
|
||||||
45
tests/bug73964.phpt
Normal file
45
tests/bug73964.phpt
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
--TEST--
|
||||||
|
Bug #73964 (Segmentation fault (11))
|
||||||
|
--SKIPIF--
|
||||||
|
<?php
|
||||||
|
if (!extension_loaded("lua")) print "skip lua extension missing";
|
||||||
|
?>
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
|
||||||
|
class LuaTest
|
||||||
|
{
|
||||||
|
function __construct()
|
||||||
|
{
|
||||||
|
$this->lua = new Lua();
|
||||||
|
$this->lua->registerCallback("log", array($this, "API_LuaLog"));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function API_LuaLog( $entry)
|
||||||
|
{
|
||||||
|
echo("from lua: $entry");
|
||||||
|
}
|
||||||
|
|
||||||
|
public function RunTest()
|
||||||
|
{
|
||||||
|
$this->lua->eval(<<<CODE
|
||||||
|
function TestFunc(str)
|
||||||
|
log(str)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
CODE
|
||||||
|
);
|
||||||
|
$GamePackage = $this->lua->RootTable;
|
||||||
|
|
||||||
|
$this->lua->call("TestFunc", array("okey"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$a = new LuaTest();
|
||||||
|
$a->runtest();
|
||||||
|
?>
|
||||||
|
--EXPECT--
|
||||||
|
from lua: okey
|
||||||
19
tests/issue040.phpt
Normal file
19
tests/issue040.phpt
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
--TEST--
|
||||||
|
ISSUE #040 (segmentation fault)
|
||||||
|
--SKIPIF--
|
||||||
|
<?php
|
||||||
|
if (!extension_loaded("lua")) print "skip lua extension missing";
|
||||||
|
?>
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
$lua = new Lua();
|
||||||
|
$lua->eval(<<<CODE
|
||||||
|
local a = {}
|
||||||
|
print(a)
|
||||||
|
CODE
|
||||||
|
);
|
||||||
|
?>
|
||||||
|
--EXPECT--
|
||||||
|
Array
|
||||||
|
(
|
||||||
|
)
|
||||||
BIN
tests/print.phpt
Normal file
BIN
tests/print.phpt
Normal file
Binary file not shown.
28
tests/print_tables-1.phpt
Normal file
28
tests/print_tables-1.phpt
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
--TEST--
|
||||||
|
print with tables - 1
|
||||||
|
--SKIPIF--
|
||||||
|
<?php
|
||||||
|
if (!extension_loaded("lua")) print "skip lua extension missing";
|
||||||
|
?>
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
$lua = new Lua();
|
||||||
|
$lua->eval(<<<CODE
|
||||||
|
local people = {
|
||||||
|
{
|
||||||
|
phone = "123456"
|
||||||
|
},
|
||||||
|
}
|
||||||
|
print(people)
|
||||||
|
CODE
|
||||||
|
);
|
||||||
|
?>
|
||||||
|
--EXPECT--
|
||||||
|
Array
|
||||||
|
(
|
||||||
|
[1] => Array
|
||||||
|
(
|
||||||
|
[phone] => 123456
|
||||||
|
)
|
||||||
|
|
||||||
|
)
|
||||||
22
tests/print_tables-2.phpt
Normal file
22
tests/print_tables-2.phpt
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
--TEST--
|
||||||
|
print with tables - 2
|
||||||
|
--SKIPIF--
|
||||||
|
<?php
|
||||||
|
if (!extension_loaded("lua")) print "skip lua extension missing";
|
||||||
|
?>
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
$lua = new Lua();
|
||||||
|
$lua->eval(<<<CODE
|
||||||
|
local a = {
|
||||||
|
LEFT = 1,
|
||||||
|
}
|
||||||
|
print(a)
|
||||||
|
CODE
|
||||||
|
);
|
||||||
|
?>
|
||||||
|
--EXPECT--
|
||||||
|
Array
|
||||||
|
(
|
||||||
|
[LEFT] => 1
|
||||||
|
)
|
||||||
Reference in New Issue
Block a user