Skip to content

Commit

Permalink
Permit declarations of the form f(x::Vararg{Any})
Browse files Browse the repository at this point in the history
Fixes up the expanded ast so that jl_is_rest_arg, as called from
emit_function (step 2), works properly and avoids a later segfault.
  • Loading branch information
timholy committed Apr 21, 2015
1 parent e459a49 commit f0f6b6f
Show file tree
Hide file tree
Showing 6 changed files with 37 additions and 5 deletions.
1 change: 1 addition & 0 deletions src/alloc.c
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@ jl_sym_t *boundscheck_sym; jl_sym_t *copyast_sym;
jl_sym_t *fastmath_sym;
jl_sym_t *simdloop_sym; jl_sym_t *meta_sym;
jl_sym_t *arrow_sym; jl_sym_t *inert_sym;
jl_sym_t *vararg_sym;

typedef struct {
int64_t a;
Expand Down
6 changes: 5 additions & 1 deletion src/ast.c
Original file line number Diff line number Diff line change
Expand Up @@ -750,7 +750,11 @@ int jl_is_rest_arg(jl_value_t *ex)
if (((jl_expr_t*)ex)->head != colons_sym) return 0;
jl_expr_t *atype = (jl_expr_t*)jl_exprarg(ex,1);
if (!jl_is_expr(atype)) return 0;
return ((jl_expr_t*)atype)->head == dots_sym;
if (((jl_expr_t*)atype)->head == dots_sym)
return 1;
if (atype->head != call_sym || jl_array_len(atype->args) < 3 || jl_array_len(atype->args) > 4)
return 0;
return ((jl_sym_t*)jl_exprarg(atype,1)) == vararg_sym;
}

static jl_value_t *copy_ast(jl_value_t *expr, jl_svec_t *sp, int do_sp)
Expand Down
1 change: 1 addition & 0 deletions src/jltypes.c
Original file line number Diff line number Diff line change
Expand Up @@ -3061,6 +3061,7 @@ void jl_init_types(void)
jl_svec_t *tv;
tv = jl_svec1(tvar("T"));
jl_vararg_type = jl_new_abstracttype((jl_value_t*)jl_symbol("Vararg"), jl_any_type, tv);
vararg_sym = jl_symbol("Vararg");

jl_anytuple_type = jl_new_datatype(jl_symbol("Tuple"), jl_any_type, jl_emptysvec,
jl_emptysvec, jl_emptysvec, 0, 0, 0);
Expand Down
21 changes: 18 additions & 3 deletions src/julia-syntax.scm
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,9 @@
(bad-formal-argument v))
(else
(case (car v)
((...) `(... ,(decl-type (cadr v))))
((...) (if (eq? (length v) 3)
`(... ,(decl-type (cadr v)) ,(caddr v))
`(... ,(decl-type (cadr v)))))
((|::|)
(if (not (symbol? (cadr v)))
(bad-formal-argument (cadr v)))
Expand Down Expand Up @@ -399,9 +401,13 @@
;; except for rest arg
(define (method-lambda-expr argl body)
(let ((argl (map (lambda (x)
(if (and (pair? x) (eq? (car x) '...))
(if (vararg? x)
(make-decl (arg-name x) (arg-type x))
(arg-name x)))
(if (varargexpr? x)
(if (pair? (caddr x))
x
`(|::| ,(arg-name x) (curly Vararg Any)))
(arg-name x))))
argl)))
`(lambda ,argl
(scope-block ,body))))
Expand Down Expand Up @@ -484,6 +490,15 @@
,body ,isstaged))))))

(define (vararg? x) (and (pair? x) (eq? (car x) '...)))
(define (varargexpr? x) (and
(pair? x)
(eq? (car x) '::)
(or
(eq? (caddr x) 'Vararg)
(and
(pair? (caddr x))
(length> (caddr x) 1)
(eq? (cadr (caddr x)) 'Vararg)))))
(define (trans? x) (and (pair? x) (eq? (car x) '|.'|)))
(define (ctrans? x) (and (pair? x) (eq? (car x) '|'|)))

Expand Down
2 changes: 1 addition & 1 deletion src/julia.h
Original file line number Diff line number Diff line change
Expand Up @@ -457,7 +457,7 @@ DLLEXPORT extern jl_value_t *jl_nothing;
// some important symbols
extern jl_sym_t *call_sym;
extern jl_sym_t *call1_sym;
extern jl_sym_t *dots_sym;
extern jl_sym_t *dots_sym; extern jl_sym_t *vararg_sym;
extern jl_sym_t *quote_sym; extern jl_sym_t *newvar_sym;
extern jl_sym_t *top_sym; extern jl_sym_t *dot_sym;
extern jl_sym_t *line_sym; extern jl_sym_t *toplevel_sym;
Expand Down
11 changes: 11 additions & 0 deletions test/core.jl
Original file line number Diff line number Diff line change
Expand Up @@ -518,6 +518,17 @@ begin
@test firstlast(Val{false}) == "Last"
end

# x::Vararg{Any} declarations
begin
local f1, f2, f3
f1(x...) = [x...]
f2(x::Vararg{Any}) = [x...]
f3(x::Vararg) = [x...]
@test f1(1,2,3) == [1,2,3]
@test f2(1,2,3) == [1,2,3]
@test f3(1,2,3) == [1,2,3]
end

# try/finally
begin
after = 0
Expand Down

0 comments on commit f0f6b6f

Please sign in to comment.