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);
|
||||
|
||||
ZEND_HASH_FOREACH_KEY_VAL_IND(ht, longkey, key, v) {
|
||||
zend_bool key_pushed = 0;
|
||||
|
||||
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 {
|
||||
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);
|
||||
|
||||
lua_settable(L, -3);
|
||||
} 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