Skip to content

Eval Expr with Expr(:quote) produces segfault #35367

Closed
@ssikdar1

Description

@ssikdar1

Discovered while doing PR #35363 for Issue #34544.

There are two lines I can come up with that still produce a segfault. (that's a different different code path from the issue mentioned above)

eval(Expr(:quote, Expr(:module, true, :bar, Expr(:quote))))
eval(Expr(:call, :eval, Expr(:quote, Expr(:module, true, :bar, Expr(:quote)))))

Which appear to be related to

julia/src/ast.c

Line 1120 in 60323b6

expr = jl_call_scm_on_ast("julia-bq-macro", jl_exprarg(e, 0), inmodule);

stacktrace:

signal (11): Segmentation fault: 11
in expression starting at none:1
scm_to_julia_ at /Users/ssikdar1/julia/src/ast.c:578
scm_to_julia_ at /Users/ssikdar1/julia/src/ast.c:597
scm_to_julia_ at /Users/ssikdar1/julia/src/ast.c:579
scm_to_julia_ at /Users/ssikdar1/julia/src/ast.c:597
scm_to_julia at /Users/ssikdar1/julia/src/ast.c:455
jl_call_scm_on_ast at /Users/ssikdar1/julia/src/ast.c:961 [inlined]
jl_expand_macros at /Users/ssikdar1/julia/src/ast.c:1120
jl_expand_macros at /Users/ssikdar1/julia/src/ast.c:1190
jl_expand_with_loc_warn at /Users/ssikdar1/julia/src/ast.c:1245
jl_toplevel_eval_flex at /Users/ssikdar1/julia/src/toplevel.c:633
jl_toplevel_eval at /Users/ssikdar1/julia/src/toplevel.c:822 [inlined]
jl_toplevel_eval_in at /Users/ssikdar1/julia/src/toplevel.c:845

I tried adding a display to julia-bq-expand- in src/macroexpand.scm

+++ b/src/macroexpand.scm
@@ -15,6 +15,10 @@
               (loop (cdr lst) (cons nxt out)))))))
 
 (define (julia-bq-expand- x d)
+  (display "\n x: ")
+  (display x)
+  (display "\n d: ")
+  (display d)

which outputs:

julia> eval(Expr(:quote, Expr(:module, true, :bar, Expr(:quote))))

 x: (module (true) bar (quote))

trying this statement in the julia --lisp returns a compilation error:

> (module (true) bar (quote))
type error: car: expected cons, got ()
#0 (compile-in [(2 loadg 0 call 1 loadg 0 loadg 0 argc)
	     #table(true 1  bar 2  module 0) 3 () 7]
	    (()) #f (quote))
#1 (compile-arglist/lambda
 (quote))
#2 (compile-arglist [(2 loadg 0 call 1 loadg 0 loadg 0 argc)
		  #table(true 1  bar 2  module 0) 3 () 7]
		 (()) ((true) bar (quote)))
#3 (compile-app [(2 loadg 0 call 1 loadg 0 loadg 0 argc)
	      #table(true 1  bar 2  module 0) 3 () 7]
	     (()) #t (module (true) bar (quote)))
#4 (compile-f- () (lambda ()
		 (module (true) bar (quote))))
#5 (lambda #fn("7000r0e0~\x7f42;" [compile-f-] [() (lambda ()
						  (module (true) bar (quote)))])
  #fn("5000r2|;" []))
#6 (eval (module (true) bar (quote)))

So it seems the value getting passed to julia-bq-macro is incorrect?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions