nvim-oxi icon indicating copy to clipboard operation
nvim-oxi copied to clipboard

the mlua example is broken

Open zjp-CN opened this issue 1 year ago • 6 comments

# build in `nvim-oxi/examples/mlua`
cargo b -r && mkdir lua -p && mv target/release/liblua.so lua/lua.so -fn
# nvim
set_rtp=":set rtp+=$PWD"
cmd=":lua require'lua'.greetings()"
nvim -u NONE --headless +"$set_rtp" +"$cmd" +quit

And I got

Hello from Rust..
Hello from Rust.. function: builtin#18
Hello from Rust.. function: builtin#18 function: builtin#18
Hello from Rust.. function: builtin#18 function: builtin#18 function: builtin#18
Hello from Rust.. function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18
Hello from Rust.. function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18
Hello from Rust.. function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18
Hello from Rust.. function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18
Hello from Rust.. function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18
Hello from Rust.. function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18
Hello from Rust.. function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18
Hello from Rust.. function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18
Hello from Rust.. function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18
Hello from Rust.. function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18
Hello from Rust.. function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18
Hello from Rust.. function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18
Hello from Rust.. function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18
Hello from Rust.. function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18
Hello from Rust.. function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18
Hello from Rust.. function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18
Hello from Rust.. function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18
Hello from Rust.. function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18
Hello from Rust.. function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18
Hello from Rust.. function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18 function: builtin#18
...

If :lua require'lua'.greetings() is run in nvim cmd, nvim just always prints them without stop.

The mlua features I use is this: mlua = { version = "0.8", features = ["luajit", "vendored"] } because Lua is not installed locally.

zjp-CN avatar Aug 25 '22 05:08 zjp-CN

And the example api is broken too:

# nvim-oxi/examples/api
cargo b && mkdir lua -p && mv target/debug/libapi.so lua/api.so -fn
# nvim
set_rtp=":set rtp+=$PWD"
cmd="
:lua require'api'
"
RUST_BACKTRACE=1 nvim -u NONE --headless +"$set_rtp" +"$cmd" +quit
thread '<unnamed>' panicked at 'called `Result::unwrap()` on an `Err` value: 
NvimError("replace_keycodes is not a boolean")', /rust/github/nvim-oxi/nvim-oxi/src/lua/lua.rs:45:12

which points to here.

zjp-CN avatar Aug 25 '22 07:08 zjp-CN

I can't replicate the first issue. If I enable the vendored feature flag I get a symbol not found in flat namespace '___emutls_get_address' error when I require("lua"), but no loops.

The api example is giving you that error because you're likely using a nightly version of Neovim, but the example is compiled without the nightly feature flag. If you either test w/ Neovim 0.7.2 or specify nvim-oxi = { path = "../../nvim-oxi", features = ["nightly"] } in Cargo.toml then it should work.

noib3 avatar Aug 28 '22 17:08 noib3

The api example is giving you that error because you're likely using a nightly version of Neovim, but the example is compiled without the nightly feature flag

I've just updated the README to specify this.

noib3 avatar Aug 28 '22 17:08 noib3

For the api example, I use the nightly feature and succeed in triggering hi mapping and Greetings command, but not for api.open_window() and api.close_window().

https://asciinema.org/a/zSG6MwzPS5A5blf23d71redJr

zjp-CN avatar Aug 30 '22 03:08 zjp-CN

mlua example remains looping under nightly feature.

zjp-CN avatar Aug 30 '22 04:08 zjp-CN

but not for api.open_window() and api.close_window()

you're assigning api as a local variable. Remove the local.

noib3 avatar Aug 30 '22 08:08 noib3

This should be fixed. Could you try building the mlua example w/ cargo build --example mlua --features mlua to see if you're still experiencing problems? The compiled library should be in target/debug/examples/libmlua.so.

noib3 avatar Sep 29 '22 22:09 noib3

Wow the mlua example works now :+1:

I notice the example directory structure has changed: when git pull or git oull --force from your master branch, I get image But yours is image

So I have to git clone my fork again to test it. Thankfully, nothing goes wrong.

zjp-CN avatar Sep 30 '22 02:09 zjp-CN

I'm testing the other examples. api doesn't work this time.

E5108: Error executing lua "replace_keycodes is not a boolean"
stack traceback:
        [C]: at 0x7f95ded80ba0
        [C]: in function 'require'
        [string ":lua"]:2: in main chunk

zjp-CN avatar Sep 30 '22 05:09 zjp-CN

# content of ./examples.sh

# build so
cargo b -q --example api --features neovim-nightly
cargo b -q --example mlua --features mlua,neovim-nightly
cargo b -q --example calc --features neovim-nightly
cargo b -q --example mechanic --features neovim-nightly

# mv so
test_dir=./_example-tests
rm $test_dir -rf && mkdir $test_dir
cd $test_dir
source=../target/debug/examples/
mv $source/libapi.so ./api.so -fn
mv $source/libmlua.so ./mlua.so -fn
mv $source/libcalc.so ./calc.so -fn
mv $source/libmechanic.so ./mechanic.so -fn

# test
function test() {
  echo === example: $1 ===
  nvim -u NONE --headless +":lua $2" +"$3"
  echo
}

api="
local api = require'api'
vim.cmd [[
  :Greetings
  :exe 'norm ' . 'ihi' . \"\<c-c>\"
]]
api.open_window()
api.close_window()
"
test api "$api" ":%p | q!"

mlua="require'mlua'.greetings()"
test mlua $mlua q

calc="
local calc = require'calc'
print(calc.add(1, 41))
print(calc.multiply(2, 21))
print(calc.compute(function(a, b) return a + b; end, 1, 41))
print(calc.compute(function(a, b) return a * b; end, 2, 21))
"
test calc "$calc" q

mechanic="
local mechanic = require('mechanic')

local fixed = mechanic.fix({
  manufacturer = 'Tesla',
  miles = 69420,
  works = false,
  problem = 'kills_pedestrians',
})

assert(fixed.works)
assert(fixed.problem == nil)
"
test mechanic "$mechanic" q

I use this script to test examples based on the latest commit, and get the errors:

=== example: api ===
Hello from Rust!LuaJIT ASSERT lj_api.c:157: lua_settop: bad stack slot -2
examples.sh: line 18: 2431819 Aborted                 nvim -u NONE --headless +":lua $2" +"$3"

=== example: mlua ===
LuaJIT ASSERT lj_api.c:157: lua_settop: bad stack slot -2
examples.sh: line 18: 2431820 Aborted                 nvim -u NONE --headless +":lua $2" +"$3"

=== example: calc ===
LuaJIT ASSERT lj_api.c:40: index2adr: bad stack slot -1
examples.sh: line 18: 2431821 Aborted                 nvim -u NONE --headless +":lua $2" +"$3"

=== example: mechanic ===
Error detected while processing command line:
E5108: Error executing lua [string ":lua"]:12: assertion failed!
stack traceback:
        [C]: in function 'assert'
        [string ":lua"]:12: in main chunk

zjp-CN avatar Oct 02 '22 05:10 zjp-CN

fixed, all the examples should work now

noib3 avatar Oct 03 '22 23:10 noib3