Browse Source

fix a bunch of crap

master
nisstyre56 10 years ago
parent
commit
a7742ac3c7
  1. 8
      Makefile
  2. 15
      RTS.h
  3. 45
      closures.c

8
Makefile

@ -20,9 +20,15 @@ lib: tokenize.c closures.c tokenize.h RTS.h
$(CC) -DLIB -DNDEBUG -c -fpic -Wall -Wextra -pedantic -Wpointer-arith -Werror -std=c99 -O3 ./closures.c;
$(CC) -shared -o closures.so closures.o;
debug: tokenize.c closures.c tokenize.h RTS.h
debug:
$(CC) -g -Wall -Wextra -pedantic -Wpointer-arith -Wmissing-prototypes -Werror -std=c99 -O3 ./tokenize.c -lmaa;
$(CC) -g -Wall -Wextra -pedantic -Wpointer-arith -Wmissing-prototypes -Werror -std=c99 -O3 ./closures.c;
debuglib: tokenize.c closures.c tokenize.h RTS.h
$(CC) -g -c -fpic -Wall -Wextra -pedantic -Wpointer-arith -Wmissing-prototypes -Werror -std=c99 ./tokenize.c;
$(CC) -shared -o tokenize.so tokenize.o -lmaa;
$(CC) -g -c -fpic -Wall -Wextra -pedantic -Wpointer-arith -Wmissing-prototypes -Werror -std=c99 ./closures.c;
$(CC) -shared -o closures.so closures.o;

15
RTS.h

@ -45,7 +45,7 @@ typedef
* way
*/
typedef
struct {
struct closure_t {
svalue_t *(*func)(svalue_t*, svalue_t**);
svalue_t **fvars;
} closure_t;
@ -65,7 +65,7 @@ make_closure(svalue_t *(*func)(svalue_t*, svalue_t**),
svalue_t**);
svalue_t *
invoke(closure_t, svalue_t*);
invoke(svalue_t*, svalue_t*);
inline svalue_t *
@ -83,14 +83,3 @@ box_string(char *,
inline svalue_t *
box_closure(closure_t);
#ifndef LIB
static svalue_t*
make_doubleadder_inner_inner(svalue_t*, svalue_t **);
static svalue_t*
make_adder_inner(svalue_t*, svalue_t **);
static closure_t
make_adder(svalue_t *);
#endif

45
closures.c

@ -4,11 +4,26 @@
#include "error.h"
#include "RTS.h"
static svalue_t*
make_doubleadder_inner_inner(svalue_t *, svalue_t **);
static svalue_t*
make_doubleadder_inner(svalue_t *, svalue_t **);
static svalue_t*
make_doubleadder(svalue_t *, svalue_t **);
static svalue_t*
make_adder_inner(svalue_t*, svalue_t **);
static closure_t
make_adder(svalue_t *);
inline svalue_t *
box_value(svalue_variants_t value,
stype_t type) {
svalue_t *val = malloc(sizeof(svalue_t));
svalue_t *val = calloc(sizeof(svalue_t), 1);
CHECK(val);
switch (type) {
case INT:
@ -82,7 +97,7 @@ box_closure(closure_t closure) {
svalue_t *val = malloc(sizeof(svalue_t));
CHECK(val);
svalue_variants_t value_val;
value_val.closure = (struct closure_t *)&closure;
value_val.closure = (struct closure_t *)(&closure);
val = box_value(value_val, CLOSURE);
return val;
}
@ -98,12 +113,11 @@ make_closure(svalue_t *(*func)(svalue_t*, svalue_t**),
}
inline svalue_t*
invoke(closure_t closure, svalue_t *val) {
svalue_t *(*func)(svalue_t*, svalue_t**) = closure.func;
return func(val, closure.fvars);
invoke(svalue_t *closure, svalue_t *val) {
svalue_t *(*func)(svalue_t*, svalue_t**) = closure->value.closure->func;
return func(val, closure->value.closure->fvars);
}
#ifndef LIB
static svalue_t*
make_adder_inner(svalue_t *x, svalue_t **env) {
svalue_variants_t val;
@ -113,7 +127,7 @@ make_adder_inner(svalue_t *x, svalue_t **env) {
static closure_t
make_adder(svalue_t *inc) {
svalue_t **env = calloc(sizeof(svalue_t *), 2);
svalue_t **env = calloc(sizeof(svalue_t *), 1);
CHECK(env);
env[0] = inc;
closure_t closure = make_closure(make_adder_inner, env);
@ -126,8 +140,8 @@ make_doubleadder_inner_inner(svalue_t *z, svalue_t **env) {
int x,y;
x = env[0]->value.integer;
y = env[1]->value.integer;
z->value.integer = x + y + z->value.integer;
return box_value(z->value, INT);
z->value.integer = x + y + (z->value.integer);
return box_int(z->value.integer);
}
static svalue_t*
@ -137,6 +151,13 @@ make_doubleadder_inner(svalue_t *y, svalue_t **env) {
return box_closure(inner);
}
static svalue_t*
make_doubleadder(svalue_t *x, svalue_t **env) {
env[0] = x;
closure_t closure = make_closure(make_doubleadder_inner, env);
return box_closure(closure);
}
int
main(void) {
(void)make_adder;
@ -146,6 +167,10 @@ main(void) {
(void)box_closure;
(void)make_doubleadder_inner_inner;
(void)make_doubleadder_inner;
(void)make_doubleadder;
svalue_t **env = calloc(sizeof(svalue_t), 2);
svalue_t *closure1 = box_closure(make_closure(make_doubleadder, env));
CHECK(env);
printf("%d\n", invoke(invoke(invoke(closure1, box_int(23)), box_int(3)), box_int(5))->value.integer);
return 0;
}
#endif