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

repl shouldn't crash #1412

Closed
gilch opened this issue Sep 4, 2017 · 8 comments
Closed

repl shouldn't crash #1412

gilch opened this issue Sep 4, 2017 · 8 comments
Labels

Comments

@gilch
Copy link
Member

gilch commented Sep 4, 2017

=> (defmacro bad [] `(macro-error 'x ""))
<function <lambda> at 0x000001D01D0ED7B8>
=> (bad)
Traceback (most recent call last):
  File "c:\users\me\documents\github\hy\hy\cmdline.py", line 99, in runsource
    ast_callback)
  File "c:\users\me\documents\github\hy\hy\importer.py", line 198, in hy_eval
    eval(ast_compile(_ast, "<eval_body>", "exec"), namespace)
  File "<eval_body>", line 1, in <module>
hy.errors.HyMacroExpansionError: <exception str() failed>

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\ME\workspace\hy36-gilch\Scripts\hy-script.py", line 11, in <module>
    load_entry_point('hy', 'console_scripts', 'hy')()
  File "c:\users\me\documents\github\hy\hy\cmdline.py", line 346, in hy_main
    sys.exit(cmdline_handler("hy", sys.argv))
  File "c:\users\me\documents\github\hy\hy\cmdline.py", line 341, in cmdline_handler
    return run_repl(spy=options.spy, output_fn=options.repl_output_fn)
  File "c:\users\me\documents\github\hy\hy\cmdline.py", line 236, in run_repl
    os=platform.system()
  File "C:\Users\ME\AppData\Local\Programs\Python\Python36\lib\code.py", line 233, in interact
    more = self.push(line)
  File "C:\Users\ME\AppData\Local\Programs\Python\Python36\lib\code.py", line 259, in push
    more = self.runsource(source, self.filename)
  File "c:\users\me\documents\github\hy\hy\cmdline.py", line 105, in runsource
    print(e, file=sys.stderr)
  File "c:\users\me\documents\github\hy\hy\errors.py", line 46, in __str__
    line = self.expression.start_line
AttributeError: 'HySymbol' object has no attribute 'start_line'

The repl should report errors, but not exit.

@Kodiologist
Copy link
Member

AttributeError: 'HySymbol' object has no attribute 'start_line'

It looks like x isn't getting position information set.

Have you seen a way to replicate this without using macro-error in user code?

@Kodiologist
Copy link
Member

In particular, I don't believe macro-error is designed to take a quoted form, just an argument to the macro (or None).

@gilch
Copy link
Member Author

gilch commented Sep 12, 2017

macro-error is not documented, #1358, so I had to experiment. My complaint isn't that macro-error crashed, but that the repl crashed.

@Kodiologist
Copy link
Member

Fair enough; that's why I think this and #1413 are properly the same bug.

@gilch gilch changed the title Macros can crash the repl repl shouldn't crash Sep 12, 2017
@gilch
Copy link
Member Author

gilch commented Sep 12, 2017

I think the REPL is crashable in multiple places, but whatever.

Your minimal example from #1413 is fixable by catching BaseException (or just using an empty except:.) in those two places. But that doesn't fix the macroexpand or macro-error issues.

@Kodiologist
Copy link
Member

Hmm. Perhaps what's needed is a try for self.showtraceback(), then.

@gilch
Copy link
Member Author

gilch commented Sep 12, 2017

It actually appears to be from line 105

I'm thinking we should just wrap the whole contents of this function with a try/except to show traceback.

@gilch
Copy link
Member Author

gilch commented Sep 12, 2017

We should also fix the cause. HyTypeError is assuming its expression has start/end values for line/column. This assumption is wrong, since macros can return expressions that weren't created directly from text. Models created this way will lack those attributes.

Here's the real minimal example.

=> (import [hy.errors [HyTypeError]])
=> (raise (HyTypeError '[] "bad"))

This crashes the repl.

The easiest solution is to assign a default -1 for these four attrs in the HyObject class.

The nicest solution would probably be to find the right line and column values in some kind of source generated from the expression, probably the pretty-printed Hy models #1360 or maybe the astor-generated Python, if possible.

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

2 participants