diff --git a/NEWS.rst b/NEWS.rst index 94a561f..1be077e 100644 --- a/NEWS.rst +++ b/NEWS.rst @@ -27,6 +27,7 @@ Bug Fixes ------------------------------ * Fix `(return)` so it works correctly to exit a Python 2 generator * Fixed a case where `->` and `->>` duplicated an argument +* Fixed bugs that caused `defclass` to drop statements or crash Misc. Improvements ---------------------------- diff --git a/hy/compiler.py b/hy/compiler.py index 9758d50..d2f7fd0 100755 --- a/hy/compiler.py +++ b/hy/compiler.py @@ -2072,12 +2072,7 @@ class HyASTCompiler(object): # grab the doc string, if there is one if expressions and isinstance(expressions[0], HyString): - docstring = expressions.pop(0) - symb = HySymbol("__doc__") - symb.start_line = docstring.start_line - symb.start_column = docstring.start_column - body += self._compile_assign(symb, docstring) - body += body.expr_as_stmt() + body += self.compile(expressions.pop(0)).expr_as_stmt() if expressions and isinstance(expressions[0], HyList) \ and not isinstance(expressions[0], HyExpression): @@ -2088,7 +2083,8 @@ class HyASTCompiler(object): body += self.compile(rewire_init(expr)) for expression in expressions: - body += self.compile(rewire_init(macroexpand(expression, self))) + e = self.compile(rewire_init(macroexpand(expression, self))) + body += e + e.expr_as_stmt() if not body.stmts: body += asty.Pass(expressions) diff --git a/tests/native_tests/defclass.hy b/tests/native_tests/defclass.hy index da3d9ad..b07e991 100644 --- a/tests/native_tests/defclass.hy +++ b/tests/native_tests/defclass.hy @@ -127,3 +127,14 @@ (setv b (B)) (assert (= a.x 1)) (assert (= b.x 2))) + +(defn test-class-sideeffects [] + "NATIVE: test that defclass runs all expressions" + (defn set-sentinel [] + (setv set-sentinel.set True)) + (setv set-sentinel.set False) + + (defclass A [] + (set-sentinel)) + + (assert set-sentinel.set))