Browse Source

change over stuff to new arguments format

master
nisstyre56 11 years ago
parent
commit
6786822dd4
  1. 33
      RTS.c
  2. 9
      RTS.h

33
RTS.c

@ -7,13 +7,13 @@
/* Test case stuff */ /* Test case stuff */
#ifndef LIB #ifndef LIB
static svalue_t* static svalue_t*
make_doubleadder_inner_inner(svalue_t *, svalue_t **); make_doubleadder_inner_inner(svalue_t **, svalue_t **);
static svalue_t* static svalue_t*
make_doubleadder_inner(svalue_t *, svalue_t **); make_doubleadder_inner(svalue_t **, svalue_t **);
static svalue_t* static svalue_t*
make_doubleadder(svalue_t *, svalue_t **); make_doubleadder(svalue_t **, svalue_t **);
#endif #endif
inline svalue_t inline svalue_t
@ -126,7 +126,7 @@ box_pair(svalue_t *left, svalue_t *right) {
} }
inline svalue_t* inline svalue_t*
make_closure(svalue_t *(*func)(svalue_t*, svalue_t**), make_closure(svalue_t *(*func)(svalue_t**, svalue_t**),
svalue_t **fvars) { svalue_t **fvars) {
/* The reason we dynamically allocate here is because /* The reason we dynamically allocate here is because
* svalue_variants_t will hold a pointer to the closure * svalue_variants_t will hold a pointer to the closure
@ -141,8 +141,8 @@ make_closure(svalue_t *(*func)(svalue_t*, svalue_t**),
} }
inline svalue_t* inline svalue_t*
invoke(svalue_t *closure, svalue_t *val) { invoke(svalue_t *closure, svalue_t **arguments) {
return closure->value.closure->func(val, closure->value.closure->fvars); return closure->value.closure->func(arguments, closure->value.closure->fvars);
} }
/* /*
@ -157,23 +157,23 @@ invoke(svalue_t *closure, svalue_t *val) {
/* More testing stuff */ /* More testing stuff */
#ifndef LIB #ifndef LIB
static inline svalue_t* static inline svalue_t*
make_doubleadder_inner_inner(svalue_t *z, svalue_t **env) { make_doubleadder_inner_inner(svalue_t **z, svalue_t **env) {
int x,y; int x,y;
x = env[0]->value.integer; x = env[0]->value.integer;
y = env[1]->value.integer; y = env[1]->value.integer;
z->value.integer = x + y + (z->value.integer); z[0]->value.integer = x + y + (z[0]->value.integer);
return box_int(z->value.integer); return box_int(z[0]->value.integer);
} }
static inline svalue_t* static inline svalue_t*
make_doubleadder_inner(svalue_t *y, svalue_t **env) { make_doubleadder_inner(svalue_t **y, svalue_t **env) {
env[1] = y; env[1] = *y;
return make_closure(make_doubleadder_inner_inner, env); return make_closure(make_doubleadder_inner_inner, env);
} }
static svalue_t* static svalue_t*
make_doubleadder(svalue_t *x, svalue_t **env) { make_doubleadder(svalue_t **x, svalue_t **env) {
env[0] = x; env[0] = *x;
return make_closure(make_doubleadder_inner, env); return make_closure(make_doubleadder_inner, env);
} }
@ -189,15 +189,16 @@ main(void) {
/* Get the final closure */ /* Get the final closure */
svalue_t *closure1 = make_closure(make_doubleadder, env); svalue_t *closure1 = make_closure(make_doubleadder, env);
/* Invoke the closure that the closure returns */ /* Invoke the closure that the closure returns */
svalue_t *c1 = invoke(closure1, box_int(23)); svalue_t *c1 = invoke(closure1, &box_int(23));
svalue_t *c2 = invoke(c1, box_int(5)); svalue_t *c2 = invoke(c1, &box_int(5));
svalue_t *result = invoke(c2, box_int(334)); svalue_t *result = invoke(c2, &box_int(334));
/* The final result */ /* The final result */
printf("print 23 + 5 + 334 == %d\n", result->value.integer); printf("print 23 + 5 + 334 == %d\n", result->value.integer);
svalue_t *a = box_int(123); svalue_t *a = box_int(123);
svalue_t *b = box_int(455); svalue_t *b = box_int(455);
svalue_t *improper = box_pair(a, b); svalue_t *improper = box_pair(a, b);
improper->value.pair.right = improper; improper->value.pair.right = improper;
/* woo cyclic pair */
printf("(%d, %d)\n", improper->value.pair.left->value.integer, improper->value.pair.right->value.pair.left->value.integer); printf("(%d, %d)\n", improper->value.pair.left->value.integer, improper->value.pair.right->value.pair.left->value.integer);
return 0; return 0;
} }

9
RTS.h

@ -55,7 +55,7 @@ typedef
*/ */
typedef typedef
struct sc_closure_t { struct sc_closure_t {
svalue_t *(*func)(svalue_t*, svalue_t**); svalue_t *(*func)(svalue_t**, svalue_t**);
svalue_t **fvars; svalue_t **fvars;
} sc_closure_t; } sc_closure_t;
@ -63,11 +63,11 @@ svalue_t
box_value(svalue_variants_t, stype_t); box_value(svalue_variants_t, stype_t);
svalue_t* svalue_t*
make_closure(svalue_t *(*func)(svalue_t*, svalue_t**), make_closure(svalue_t *(*func)(svalue_t**, svalue_t**),
svalue_t**); svalue_t**);
svalue_t * svalue_t *
invoke(svalue_t*, svalue_t*); invoke(svalue_t*, svalue_t**);
svalue_t * svalue_t *
@ -85,3 +85,6 @@ box_string(char *,
svalue_t * svalue_t *
box_closure(sc_closure_t*); box_closure(sc_closure_t*);
svalue_t *
box_pair(svalue_t*, svalue_t*);