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

What exactly is required from the custom lua interpreter? #10

Closed
hroncok opened this issue May 11, 2020 · 5 comments · Fixed by #12
Closed

What exactly is required from the custom lua interpreter? #10

hroncok opened this issue May 11, 2020 · 5 comments · Fixed by #12

Comments

@hroncok
Copy link
Contributor

hroncok commented May 11, 2020

Hey. I try to use ilua with a custom lua interpreted (used in RPM).

It seems the interpreter doesn't support being called with a file name as an argument. Before I approach RPM to request the functions ilua needs, I'd like to know the set of requirements. I figured it's easier to ask than to reverse engineer it.

So far I think it is:

  • accept filename as a command line argument
  • respect the LUA_PATH environment variable

Is there anythign else? Howe can I see what's happening to debug this?

@guysv
Copy link
Owner

guysv commented May 12, 2020

accept filename as a command line argument

I guess that's really the essence of it, can't think of another requirement.
For starters, before modifying RPM, I'd try to write a wrapper that accepts a script as argument, and sets up your custom interpreter as needed.

@hroncok
Copy link
Contributor Author

hroncok commented May 12, 2020

The problem with debugging this is for me that even using this fails for me:

#/usr/bin/bash
exec /usr/bin/lua "$@"
$ ilua -i lua
Jupyter console 6.1.0

ILua 0.2.1
In [1]: print"a"                                                                                                                                                                                                                 
a

$ ilua -i luafake
Jupyter console 6.1.0

ILua 0.2.1
In [1]: print"a"2020-05-12T20:06:42+0200 [ilua.kernel.ILuaKernel#critical] Uncought exception in message handler                                                                                                                 
	Traceback (most recent call last):
	  File "/usr/lib64/python3.8/site-packages/twisted/internet/defer.py", line 1418, in _inlineCallbacks
	    result = g.send(result)
	  File "/usr/lib/python3.8/site-packages/ilua/kernelbase.py", line 196, in handle_message
	    content = yield self.do_is_complete(**msg['content'])
	  File "/usr/lib64/python3.8/site-packages/twisted/internet/defer.py", line 1613, in unwindGenerator
	    return _cancellableInlineCallbacks(gen)
	  File "/usr/lib64/python3.8/site-packages/twisted/internet/defer.py", line 1529, in _cancellableInlineCallbacks
	    _inlineCallbacks(None, g, status)
	--- <exception caught here> ---
	  File "/usr/lib/python3.8/site-packages/ilua/kernelbase.py", line 196, in handle_message
	    content = yield self.do_is_complete(**msg['content'])
	  File "/usr/lib64/python3.8/site-packages/twisted/internet/defer.py", line 1418, in _inlineCallbacks
	    result = g.send(result)
	  File "/usr/lib/python3.8/site-packages/ilua/kernel.py", line 179, in do_is_complete
	    result = yield self.proto.sendRequest({"type": "is_complete",
	builtins.AttributeError: 'ILuaKernel' object has no attribute 'proto'
	
In [1]: print"a"                                                                                                                                                                                                                 
/usr/lib/python3.8/site-packages/jupyter_console/ptshell.py:656: UserWarning: The kernel did not respond to an is_complete_request. Setting `use_kernel_is_complete` to False.
  warn('The kernel did not respond to an is_complete_request. '
2020-05-12T20:06:43+0200 [ilua.kernel.ILuaKernel#critical] Uncought exception in message handler
	Traceback (most recent call last):
	  File "/usr/lib64/python3.8/site-packages/twisted/internet/defer.py", line 1418, in _inlineCallbacks
	    result = g.send(result)
	  File "/usr/lib/python3.8/site-packages/ilua/kernelbase.py", line 193, in handle_message
	    content = yield self.do_execute(**msg['content'])
	  File "/usr/lib64/python3.8/site-packages/twisted/internet/defer.py", line 1613, in unwindGenerator
	    return _cancellableInlineCallbacks(gen)
	  File "/usr/lib64/python3.8/site-packages/twisted/internet/defer.py", line 1529, in _cancellableInlineCallbacks
	    _inlineCallbacks(None, g, status)
	--- <exception caught here> ---
	  File "/usr/lib/python3.8/site-packages/ilua/kernelbase.py", line 193, in handle_message
	    content = yield self.do_execute(**msg['content'])
	  File "/usr/lib64/python3.8/site-packages/twisted/internet/defer.py", line 1418, in _inlineCallbacks
	    result = g.send(result)
	  File "/usr/lib/python3.8/site-packages/ilua/kernel.py", line 126, in do_execute
	    result = yield self.proto.sendRequest({"type": "execute",
	builtins.AttributeError: 'ILuaKernel' object has no attribute 'proto'
	

@guysv
Copy link
Owner

guysv commented May 12, 2020

Hmm, same script worked on my machine. Perhaps you need to change 'luafake' to './luafake' or wherever it's placed.

Further more, you can get more verbose output with ilua -l debug

I'm sorry about that unfortunate stack trace. It really is incomprehensible

@hroncok
Copy link
Contributor Author

hroncok commented May 12, 2020

luafake is in PATH:

$ luafake 
Lua 5.3.5  Copyright (C) 1994-2018 Lua.org, PUC-Rio
> print"a"
a
>
$ ilua -l debug -i luafake
2020-05-12T22:14:02+0200 [ilua.kernel.ILuaKernel#debug] Launching child lua
2020-05-12T22:14:02+0200 [ilua.proto.OutputCapture#debug] Process is running
2020-05-12T22:14:02+0200 [ilua.proto.OutputCapture#debug] Received stdout data: b'Upon execvpe luafake [b\'luafake\', b\'/usr/lib/python3.8/site-packages/ilua/interp.lua\'] in environment id 140414718368224\n:Traceback (most recent call last):\n  File "/usr/lib64/python3.8/site-packages/twisted/internet/process.py", line 405, in _fork\n    self._execChild(path, uid, gid, executable, args,\n  File "/usr/lib64/python3.8/site-packages/twisted/internet/process.py", line 484, in _execChild\n    os.execvpe(executable, args, environment)\n  File "/usr/lib64/python3.8/os.py", line 577, in execvpe\n    _execvpe(file, args, env)\n  File "/usr/lib64/python3.8/os.py", line 609, in _execvpe\n    raise saved_exc\n  File "/usr/lib64/python3.8/os.py", line 601, in _execvpe\n    exec_func(fullname, *argrest)\nOSError: [Errno 8] Exec format error\n'
Jupyter console 6.1.0

That is indeed more interesting:

Traceback (most recent call last):
  File "/usr/lib64/python3.8/site-packages/twisted/internet/process.py", line 405, in _fork
    self._execChild(path, uid, gid, executable, args,
  File "/usr/lib64/python3.8/site-packages/twisted/internet/process.py", line 484, in _execChild
    os.execvpe(executable, args, environment)
  File "/usr/lib64/python3.8/os.py", line 577, in execvpe
    _execvpe(file, args, env)
  File "/usr/lib64/python3.8/os.py", line 609, in _execvpe
    raise saved_exc
  File "/usr/lib64/python3.8/os.py", line 601, in _execvpe
    exec_func(fullname, *argrest)
OSError: [Errno 8] Exec format error

It's was just a typo in shebang :)

@hroncok
Copy link
Contributor Author

hroncok commented May 12, 2020

So far I'm blocked by rpm-software-management/rpm#1215

But this seem to do the trick:

#!/usr/bin/bash
exec rpm --eval '%{lua:package.path = "'${LUA_PATH}';" .. package.path;'"$(cat "$@")"';rpm.interactive()}'

Thanks.

EDIT: the rpm.interactive() call is redundant, the executed file takes care of that

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

Successfully merging a pull request may close this issue.

2 participants