ceifa / wasmoon

A real lua 5.4 VM with JS bindings made with webassembly
MIT License
495 stars 32 forks source link

unable to remove keys from hashes after interop #82

Open TomWoodward opened 1 year ago

TomWoodward commented 1 year ago

in a normal lua environment, my understanding is that the normal way to remove a key from a hash is to set its value to nil, like this:

lua -e "obj={print_me='foobar',dont_print_me='foobar'}; obj.dont_print_me=nil; for k,v in pairs(obj) do print(k); end"

prints only the one key

in wasmoon it works the same with no interop

node << EOF
new (require("wasmoon").LuaFactory)().createEngine().then(lua => lua.doString("obj={print_me='asdf',dont_print_me='asdf'}; obj.dont_print_me=nil; for k,v in pairs(obj) do print(k); end"));
EOF

prints only the one key

but if i interop at all with js i get both keys

node << EOF
new (require("wasmoon").LuaFactory)().createEngine().then(lua => { lua.global.set('identity', x => x); lua.doString("obj=identity({print_me='foobar',dont_print_me='foobar'}); obj.dont_print_me=nil; for k,v in pairs(obj) do print(k); end") });
EOF

gets both keys

i'm experiencing a bunch of bugs because in normal code you never expect looping over pairs to return null values, but with wasmoon it does in this case. is there something i can do to fix this?

using wasmoon@1.15.0

ceifa commented 1 year ago

Hey, can you try disable enableProxy and check if the issue persists?

TomWoodward commented 1 year ago

looks like that does fix it

node << EOF
>  new (require("wasmoon").LuaFactory)().createEngine({enableProxy:false}).then(lua => { lua.global.set('identity', x => x); lua.doString("obj=identity({print_me='foobar',dont_print_me='foobar'}); obj.dont_print_me=nil; for k,v in pairs(obj) do print(k); end") });
> EOF
print_me

i saw some other issues mentioning these config options, but no documentation describing what they do. is there some somewhere?

TomWoodward commented 1 year ago

closing because the enableProxy:false was the solution here, but i would suggest some more documentation for these options.

also, you might consider disabling the proxy by default, because it really causes some issues in otherwise valid LUA code

ceifa commented 1 year ago

i saw some other issues mentioning these config options, but no documentation describing what they do. is there some somewhere?

No, I'm very bad at documenting (PRs welcome)

also, you might consider disabling the proxy by default, because it really causes some issues in otherwise valid LUA code

Actually I think this issue specifically can be a bug and not a expected behaviour of proxying. I will reopen to check this later.