mirror of
https://github.com/justinethier/cyclone.git
synced 2025-05-23 20:15:05 +02:00
Added hooks to validate number of fn args
This commit is contained in:
parent
09453f3cc6
commit
ce0851212d
6 changed files with 30 additions and 13 deletions
2
Makefile
2
Makefile
|
@ -157,7 +157,7 @@ test2: examples/hello-library/int-test/hello.c libcyclone.a
|
|||
## END temporary directives
|
||||
###########################
|
||||
|
||||
icyc: cyclone icyc.scm eval.scm libraries.scm parser.scm runtime.h scheme/base.o scheme/read.o scheme/write.o scheme/char.o scheme/eval.o scheme/file.o scheme/cyclone/util.o scheme/cyclone/common.o
|
||||
icyc: cyclone icyc.scm eval.scm libraries.scm parser.scm runtime.h scheme/base.o scheme/read.o scheme/write.o scheme/char.o scheme/eval.o scheme/file.o scheme/cyclone/util.o scheme/cyclone/common.o scheme/cyclone/util.o
|
||||
./cyclone icyc.scm
|
||||
|
||||
.PHONY: tags
|
||||
|
|
5
cgen.scm
5
cgen.scm
|
@ -911,6 +911,7 @@
|
|||
"closureN_type " cv-name ";\n"
|
||||
cv-name ".tag = closureN_tag;\n "
|
||||
cv-name ".fn = (function_type)__lambda_" (number->string lid) ";\n"
|
||||
cv-name ".num_args = " (number->string (lambda-num-args lam)) ";\n"
|
||||
cv-name ".num_elt = " (number->string (length free-vars)) ";\n"
|
||||
cv-name ".elts = (object *)alloca(sizeof(object) * "
|
||||
(number->string (length free-vars)) ");\n"
|
||||
|
@ -932,7 +933,9 @@
|
|||
"(function_type)__lambda_" (number->string lid)
|
||||
(if (> (length free-vars) 0) "," "")
|
||||
(string-join free-vars ", ")
|
||||
");"))))
|
||||
");"
|
||||
cv-name ".num_args = " (number->string (lambda-num-args lam)) ";"
|
||||
))))
|
||||
(c-code/vars
|
||||
(string-append "&" cv-name)
|
||||
(list
|
||||
|
|
22
cyclone.h
22
cyclone.h
|
@ -232,12 +232,12 @@ cons_type n; n.tag = cons_tag; n.cons_car = a; n.cons_cdr = d;
|
|||
|
||||
/* Closure types */
|
||||
|
||||
typedef struct {tag_type tag; function_type fn;} closure0_type;
|
||||
typedef struct {tag_type tag; function_type fn; object elt1;} closure1_type;
|
||||
typedef struct {tag_type tag; function_type fn; object elt1,elt2;} closure2_type;
|
||||
typedef struct {tag_type tag; function_type fn; object elt1,elt2,elt3;} closure3_type;
|
||||
typedef struct {tag_type tag; function_type fn; object elt1,elt2,elt3,elt4;} closure4_type;
|
||||
typedef struct {tag_type tag; function_type fn; int num_elt; object *elts;} closureN_type;
|
||||
typedef struct {tag_type tag; function_type fn; int num_args; } closure0_type;
|
||||
typedef struct {tag_type tag; function_type fn; int num_args; object elt1;} closure1_type;
|
||||
typedef struct {tag_type tag; function_type fn; int num_args; object elt1,elt2;} closure2_type;
|
||||
typedef struct {tag_type tag; function_type fn; int num_args; object elt1,elt2,elt3;} closure3_type;
|
||||
typedef struct {tag_type tag; function_type fn; int num_args; object elt1,elt2,elt3,elt4;} closure4_type;
|
||||
typedef struct {tag_type tag; function_type fn; int num_args; int num_elt; object *elts;} closureN_type;
|
||||
|
||||
typedef closure0_type *closure0;
|
||||
typedef closure1_type *closure1;
|
||||
|
@ -247,15 +247,15 @@ typedef closure4_type *closure4;
|
|||
typedef closureN_type *closureN;
|
||||
typedef closure0_type *closure;
|
||||
|
||||
#define mclosure0(c,f) closure0_type c; c.tag = closure0_tag; c.fn = f;
|
||||
#define mclosure0(c,f) closure0_type c; c.tag = closure0_tag; c.fn = f; c.num_args = -1;
|
||||
#define mclosure1(c,f,a) closure1_type c; c.tag = closure1_tag; \
|
||||
c.fn = f; c.elt1 = a;
|
||||
c.fn = f; c.num_args = -1; c.elt1 = a;
|
||||
#define mclosure2(c,f,a1,a2) closure2_type c; c.tag = closure2_tag; \
|
||||
c.fn = f; c.elt1 = a1; c.elt2 = a2;
|
||||
c.fn = f; c.num_args = -1; c.elt1 = a1; c.elt2 = a2;
|
||||
#define mclosure3(c,f,a1,a2,a3) closure3_type c; c.tag = closure3_tag; \
|
||||
c.fn = f; c.elt1 = a1; c.elt2 = a2; c.elt3 = a3;
|
||||
c.fn = f; c.num_args = -1; c.elt1 = a1; c.elt2 = a2; c.elt3 = a3;
|
||||
#define mclosure4(c,f,a1,a2,a3,a4) closure4_type c; c.tag = closure4_tag; \
|
||||
c.fn = f; c.elt1 = a1; c.elt2 = a2; c.elt3 = a3; c.elt4 = a4;
|
||||
c.fn = f; c.num_args = -1; c.elt1 = a1; c.elt2 = a2; c.elt3 = a3; c.elt4 = a4;
|
||||
// #define setq(x,e) x = e
|
||||
|
||||
#define mlist1(e1) (mcons(e1,nil))
|
||||
|
|
|
@ -1590,6 +1590,8 @@ object apply(object cont, object func, object args){
|
|||
case closure4_tag:
|
||||
case closureN_tag:
|
||||
buf.integer_t = Cyc_length(args);
|
||||
// TODO: validate number of args provided:
|
||||
//Cyc_check_num_args("<procedure>", ((closure)func)->num_args, args); // TODO: could be more efficient, eg: cyc_length(args) is called twice.
|
||||
dispatch(buf.integer_t.value, ((closure)func)->fn, func, cont, args);
|
||||
break;
|
||||
|
||||
|
@ -1685,12 +1687,14 @@ char *transport(x, gcgen) char *x; int gcgen;
|
|||
case closure0_tag:
|
||||
{register closure0 nx = (closure0) allocp;
|
||||
type_of(nx) = closure0_tag; nx->fn = ((closure0) x)->fn;
|
||||
nx->num_args = ((closure0) x)->num_args;
|
||||
forward(x) = nx; type_of(x) = forward_tag;
|
||||
allocp = ((char *) nx)+sizeof(closure0_type);
|
||||
return (char *) nx;}
|
||||
case closure1_tag:
|
||||
{register closure1 nx = (closure1) allocp;
|
||||
type_of(nx) = closure1_tag; nx->fn = ((closure1) x)->fn;
|
||||
nx->num_args = ((closure1) x)->num_args;
|
||||
nx->elt1 = ((closure1) x)->elt1;
|
||||
forward(x) = nx; type_of(x) = forward_tag;
|
||||
x = (char *) nx; allocp = ((char *) nx)+sizeof(closure1_type);
|
||||
|
@ -1698,6 +1702,7 @@ char *transport(x, gcgen) char *x; int gcgen;
|
|||
case closure2_tag:
|
||||
{register closure2 nx = (closure2) allocp;
|
||||
type_of(nx) = closure2_tag; nx->fn = ((closure2) x)->fn;
|
||||
nx->num_args = ((closure2) x)->num_args;
|
||||
nx->elt1 = ((closure2) x)->elt1;
|
||||
nx->elt2 = ((closure2) x)->elt2;
|
||||
forward(x) = nx; type_of(x) = forward_tag;
|
||||
|
@ -1706,6 +1711,7 @@ char *transport(x, gcgen) char *x; int gcgen;
|
|||
case closure3_tag:
|
||||
{register closure3 nx = (closure3) allocp;
|
||||
type_of(nx) = closure3_tag; nx->fn = ((closure3) x)->fn;
|
||||
nx->num_args = ((closure3) x)->num_args;
|
||||
nx->elt1 = ((closure3) x)->elt1;
|
||||
nx->elt2 = ((closure3) x)->elt2;
|
||||
nx->elt3 = ((closure3) x)->elt3;
|
||||
|
@ -1715,6 +1721,7 @@ char *transport(x, gcgen) char *x; int gcgen;
|
|||
case closure4_tag:
|
||||
{register closure4 nx = (closure4) allocp;
|
||||
type_of(nx) = closure4_tag; nx->fn = ((closure4) x)->fn;
|
||||
nx->num_args = ((closure4) x)->num_args;
|
||||
nx->elt1 = ((closure4) x)->elt1;
|
||||
nx->elt2 = ((closure4) x)->elt2;
|
||||
nx->elt3 = ((closure4) x)->elt3;
|
||||
|
@ -1726,6 +1733,7 @@ char *transport(x, gcgen) char *x; int gcgen;
|
|||
{register closureN nx = (closureN) allocp;
|
||||
int i;
|
||||
type_of(nx) = closureN_tag; nx->fn = ((closureN) x)->fn;
|
||||
nx->num_args = ((closureN) x)->num_args;
|
||||
nx->num_elt = ((closureN) x)->num_elt;
|
||||
nx->elts = (object *)(((char *)nx) + sizeof(closureN_type));
|
||||
for (i = 0; i < nx->num_elt; i++) {
|
||||
|
|
|
@ -53,6 +53,7 @@
|
|||
lambda-varargs-var
|
||||
lambda-formals-type
|
||||
lambda-formals->list
|
||||
lambda-num-args
|
||||
list->lambda-formals
|
||||
pair->list
|
||||
list->pair
|
||||
|
|
|
@ -437,6 +437,11 @@
|
|||
(pair->list args)))
|
||||
(lambda->formals exp)))
|
||||
|
||||
(define (lambda-num-args exp)
|
||||
(if (lambda-varargs? exp)
|
||||
-1 ;; Unlimited
|
||||
(length (lambda-formals->list exp))))
|
||||
|
||||
;; Repack a list of args (symbols) into lambda formals, by type
|
||||
;; assumes args is a proper list
|
||||
(define (list->lambda-formals args type)
|
||||
|
|
Loading…
Add table
Reference in a new issue