plenary.nvim icon indicating copy to clipboard operation
plenary.nvim copied to clipboard

plenary.async.uv: Attempt to yield across C-call boundary

Open chuwy opened this issue 3 years ago • 3 comments

I'm starting to write a very minimalistic plugin with async example from README. Basically there's only init.lua file with:

local a = require("plenary.async")

read = function(path)
  local err, fd = a.uv.fs_open(path, "r", 438)
  assert(not err, err)
end

return { read_token = read }

But it fails with the following error, whenever I try to call the function:

E5108: Error executing lua ...te/pack/packer/start/myplugin.nvim/lua/myplugin/init.lua:4: attempt to yield across C-call boundary

Although in fact I see the same error even when call it directly:

:lua require("plenary.async").uv.fs_open("/etc/fstab", "r", 438)

:version output:

:version
NVIM v0.6.0-dev
Build type: Release
LuaJIT 2.1.0-beta3
Compiled by antonparkhomenko

Features: +acl +iconv +tui
See ":help feature-compile"

   system vimrc file: "$VIM/sysinit.vim"
  fall-back for $VIM: "/nix/store/nzy87w4j77l1jiyrmxlifn9nv6i1jyc1-neovim-unwrapped-master/share/nvim"

chuwy avatar Oct 05 '21 15:10 chuwy

Same error with:

> nvim --clean \
  --cmd set\ rtp+=/Users/antonparkhomenko/.local/share/nvim/site/pack/packer/start/plenary.nvim \
  --cmd ":lua require('plenary.async').uv.fs_open('/Users/antonparkhomenko/.zshrc', 'r', 438)"

And even if I run it with 0.4.4 I get:

E5105: Error while calling lua chunk: [string "<VimL compiled string>"]:1: attempt to yield across C-call boundary

chuwy avatar Oct 06 '21 06:10 chuwy

I can reproduce this

NVIM v0.5.1
Build type: Release
LuaJIT 2.1.0-beta3
Compilation: clang -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1 -DNVIM_TS_HAS_SET_MATCH_LIMIT -O2 -DNDEBUG -Wall -Wextra -pedantic -Wno-unused-parameter -Wstrict-prototypes -std=gnu99 -Wshadow -Wconversion -Wmissing-prototypes -Wimplicit-fallthrough -Wvla -fstack-protector-strong -fno-common -fdiagnostics-color=auto -DINCLUDE_GENERATED_DECLARATIONS -D_GNU_SOURCE -DNVIM_MSGPACK_HAS_FLOAT32 -DNVIM_UNIBI_HAS_VAR_FROM -DMIN_LOG_LEVEL=3 -I/tmp/neovim-20210927-1441-demfsz/neovim-0.5.1/build/config -I/tmp/neovim-20210927-1441-demfsz/neovim-0.5.1/src -I/usr/local/include -I/Library/Developer/CommandLineTools/SDKs/MacOSX11.sdk/usr/include -I/usr/local/opt/gettext/include -I/tmp/neovim-20210927-1441-demfsz/neovim-0.5.1/build/src/nvim/auto -I/tmp/neovim-20210927-1441-demfsz/neovim-0.5.1/build/include
Compiled by brew@BigSur

Features: +acl +iconv +tui
See ":help feature-compile"

   system vimrc file: "$VIM/sysinit.vim"
  fall-back for $VIM: "/usr/local/Cellar/neovim/0.5.1/share/nvim"

Run :checkhealth for more info

w0ng avatar Oct 11 '21 11:10 w0ng

Async functions must be called from an async context or with async.run. Calling an async function directly means the current function must be async as well. This is very similar to JS or Python where it is more explicit because it's built-in

local a = require("plenary.async")

-- `read` is an async function
read = function(path)
  local err, fd = a.uv.fs_open(path, "r", 438)
  assert(not err, err)
end

a.run(function() read("mypath") end)

rcarriga avatar Dec 09 '21 07:12 rcarriga