Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

the mlua example is broken #54

Closed
zjp-CN opened this issue Aug 25, 2022 · 12 comments
Closed

the mlua example is broken #54

zjp-CN opened this issue Aug 25, 2022 · 12 comments
Labels

Comments

@zjp-CN
Copy link
Contributor

zjp-CN commented Aug 25, 2022

# 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
Copy link
Contributor Author

zjp-CN commented Aug 25, 2022

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.

@noib3 noib3 added the bug label Aug 25, 2022
zjp-CN added a commit to zjp-CN/nvim-oxi that referenced this issue Aug 25, 2022
1. add testing bash scripts for examples
2. add `src/test.rs` which takes snapshots for:
* calc & mechanic: succeeded
* mlua & api: failed noib3#54
@noib3
Copy link
Owner

noib3 commented Aug 28, 2022

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
Copy link
Owner

noib3 commented Aug 28, 2022

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.

@zjp-CN
Copy link
Contributor Author

zjp-CN commented Aug 30, 2022

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
Copy link
Contributor Author

zjp-CN commented Aug 30, 2022

mlua example remains looping under nightly feature.

@noib3
Copy link
Owner

noib3 commented Aug 30, 2022

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

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

@noib3
Copy link
Owner

noib3 commented Sep 29, 2022

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.

@zjp-CN
Copy link
Contributor Author

zjp-CN commented Sep 30, 2022

Wow the mlua example works now 👍

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
Copy link
Contributor Author

zjp-CN commented Sep 30, 2022

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
Copy link
Contributor Author

zjp-CN commented Oct 2, 2022

# 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

@noib3
Copy link
Owner

noib3 commented Oct 3, 2022

fixed, all the examples should work now

@noib3 noib3 closed this as completed Oct 3, 2022
@MostHated
Copy link

MostHated commented Feb 26, 2023

Just a heads up, I was having issues with the API examples (api.open_window() command), which lead me to this thread. I went to test out the script posted above, and ended up with the same issue E5108: Error executing lua Value of type () couldn't be pushed on the stack: "non-float cannot have \'row\'"., but it looks like there might be another issue with the mlua one as well:

_ ✗  ./examples.sh
=== example: api ===
Hello from Rust
Error detected while processing command line:
E5108: Error executing lua Value of type () couldn\'t be pushed on the stack: "non-float cannot have \'row\'"
stack traceback:
        [C]: in function 'open_window'
        [string ":lua"]:7: in main chunk
hello
=== example: mlua ===
Hello from nvim-oxi..
..and goodbye from mlua!
Error detected while processing command line:
E5108: Error executing lua [string ":lua"]:1: attempt to index a boolean value
stack traceback:
        [string ":lua"]:1: in main chunk
=== example: calc ===
42
42
42
42
=== example: mechanic ===
Hands on the wheel!!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

3 participants