mirror of
https://github.com/php-win-ext/php-lua.git
synced 2026-03-24 00:52:12 +01:00
Merge pull request #42 from negram/demangle-object-name
Demangle name of a property when assigning an object into Lua
This commit is contained in:
22
lua.c
22
lua.c
@@ -457,13 +457,31 @@ try_again:
|
|||||||
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) {
|
||||||
ZVAL_STR(&zkey, 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);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
ZVAL_LONG(&zkey, longkey);
|
ZVAL_LONG(&zkey, longkey);
|
||||||
}
|
}
|
||||||
php_lua_send_zval_to_lua(L, &zkey);
|
|
||||||
|
if (!key_pushed) {
|
||||||
|
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();
|
||||||
|
|
||||||
|
|||||||
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,
|
||||||
Reference in New Issue
Block a user