mirror of
https://github.com/justinethier/cyclone.git
synced 2025-07-16 17:27:33 +02:00
WIP
This commit is contained in:
parent
866fbcac9a
commit
196cc51431
2 changed files with 35 additions and 20 deletions
|
@ -21,9 +21,17 @@ object Cyc_installation_dir(object cont, object type) {
|
||||||
object Cyc_command_line_arguments(object cont) {
|
object Cyc_command_line_arguments(object cont) {
|
||||||
object Cyc_make_vector(object cont, object len, object fill) {
|
object Cyc_make_vector(object cont, object len, object fill) {
|
||||||
object Cyc_list2vector(void *data, object cont, object l) {
|
object Cyc_list2vector(void *data, object cont, object l) {
|
||||||
|
declare_num_op(Cyc_sum, Cyc_sum_op, dispatch_sum, +, 0);
|
||||||
|
declare_num_op(Cyc_sub, Cyc_sub_op, dispatch_sub, -, 0);
|
||||||
|
declare_num_op(Cyc_mul, Cyc_mul_op, dispatch_mul, *, 0);
|
||||||
|
declare_num_op(Cyc_div, Cyc_div_op, dispatch_div, /, 1);
|
||||||
|
port_type Cyc_io_open_input_file(void *data, object str) {
|
||||||
|
port_type Cyc_io_open_output_file(void *data, object str) {
|
||||||
|
|
||||||
- plan:
|
- plan:
|
||||||
- update runtime, get it to compile
|
- update runtime, get it to compile
|
||||||
|
- have not adjusted any code that checks value of argc, will probably need to do that
|
||||||
|
EG for Cyc_num_op_va_list
|
||||||
- update any associated tools (dispatch.c, etc)
|
- update any associated tools (dispatch.c, etc)
|
||||||
- update cgen
|
- update cgen
|
||||||
- integration
|
- integration
|
||||||
|
|
47
runtime.c
47
runtime.c
|
@ -1187,19 +1187,19 @@ object __halt(object obj) {
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
JAE TODO: left off here
|
|
||||||
|
|
||||||
#define declare_num_op(FUNC, FUNC_OP, FUNC_APPLY, OP, DIV) \
|
#define declare_num_op(FUNC, FUNC_OP, FUNC_APPLY, OP, DIV) \
|
||||||
common_type FUNC_OP(object x, object y) { \
|
common_type FUNC_OP(void *data, object x, object y) { \
|
||||||
common_type s; \
|
common_type s; \
|
||||||
int tx = type_of(x), ty = type_of(y); \
|
int tx = type_of(x), ty = type_of(y); \
|
||||||
|
s.double_t.hdr.mark = gc_color_red; \
|
||||||
s.double_t.tag = double_tag; \
|
s.double_t.tag = double_tag; \
|
||||||
if (DIV && \
|
if (DIV && \
|
||||||
((ty == integer_tag && integer_value(y) == 0) || \
|
((ty == integer_tag && integer_value(y) == 0) || \
|
||||||
(ty == double_tag && double_value(y) == 0.0))) { \
|
(ty == double_tag && double_value(y) == 0.0))) { \
|
||||||
Cyc_rt_raise_msg("Divide by zero"); \
|
Cyc_rt_raise_msg(data, "Divide by zero"); \
|
||||||
} \
|
} \
|
||||||
if (tx == integer_tag && ty == integer_tag) { \
|
if (tx == integer_tag && ty == integer_tag) { \
|
||||||
|
s.integer_t.hdr.mark = gc_color_red; \
|
||||||
s.integer_t.tag = integer_tag; \
|
s.integer_t.tag = integer_tag; \
|
||||||
s.integer_t.value = ((integer_type *)x)->value OP ((integer_type *)y)->value; \
|
s.integer_t.value = ((integer_type *)x)->value OP ((integer_type *)y)->value; \
|
||||||
} else if (tx == double_tag && ty == integer_tag) { \
|
} else if (tx == double_tag && ty == integer_tag) { \
|
||||||
|
@ -1212,23 +1212,23 @@ common_type FUNC_OP(object x, object y) { \
|
||||||
make_string(s, "Bad argument type"); \
|
make_string(s, "Bad argument type"); \
|
||||||
make_cons(c1, y, nil); \
|
make_cons(c1, y, nil); \
|
||||||
make_cons(c0, &s, &c1); \
|
make_cons(c0, &s, &c1); \
|
||||||
Cyc_rt_raise(&c0); \
|
Cyc_rt_raise(data, &c0); \
|
||||||
} \
|
} \
|
||||||
return s; \
|
return s; \
|
||||||
} \
|
} \
|
||||||
common_type FUNC(int argc, object n, ...) { \
|
common_type FUNC(void *data, int argc, object n, ...) { \
|
||||||
va_list ap; \
|
va_list ap; \
|
||||||
va_start(ap, n); \
|
va_start(ap, n); \
|
||||||
common_type result = Cyc_num_op_va_list(argc, FUNC_OP, n, ap); \
|
common_type result = Cyc_num_op_va_list(data, argc, FUNC_OP, n, ap); \
|
||||||
va_end(ap); \
|
va_end(ap); \
|
||||||
return result; \
|
return result; \
|
||||||
} \
|
} \
|
||||||
void FUNC_APPLY(int argc, object clo, object cont, object n, ...) { \
|
void FUNC_APPLY(void *data, int argc, object clo, object cont, object n, ...) { \
|
||||||
va_list ap; \
|
va_list ap; \
|
||||||
va_start(ap, n); \
|
va_start(ap, n); \
|
||||||
common_type result = Cyc_num_op_va_list(argc - 1, FUNC_OP, n, ap); \
|
common_type result = Cyc_num_op_va_list(data, argc - 1, FUNC_OP, n, ap); \
|
||||||
va_end(ap); \
|
va_end(ap); \
|
||||||
return_closcall1(cont, &result); \
|
return_closcall1(data, cont, &result); \
|
||||||
}
|
}
|
||||||
|
|
||||||
declare_num_op(Cyc_sum, Cyc_sum_op, dispatch_sum, +, 0);
|
declare_num_op(Cyc_sum, Cyc_sum_op, dispatch_sum, +, 0);
|
||||||
|
@ -1238,38 +1238,43 @@ declare_num_op(Cyc_mul, Cyc_mul_op, dispatch_mul, *, 0);
|
||||||
// result contains a decimal component?
|
// result contains a decimal component?
|
||||||
declare_num_op(Cyc_div, Cyc_div_op, dispatch_div, /, 1);
|
declare_num_op(Cyc_div, Cyc_div_op, dispatch_div, /, 1);
|
||||||
|
|
||||||
common_type Cyc_num_op_va_list(int argc, common_type (fn_op(object, object)), object n, va_list ns) {
|
common_type Cyc_num_op_va_list(void *data, int argc, common_type (fn_op(object, object)), object n, va_list ns) {
|
||||||
common_type sum;
|
common_type sum;
|
||||||
int i;
|
int i;
|
||||||
if (argc == 0) {
|
if (argc == 0) {
|
||||||
|
sum.integer_t.hdr.mark = gc_color_red;
|
||||||
sum.integer_t.tag = integer_tag;
|
sum.integer_t.tag = integer_tag;
|
||||||
sum.integer_t.value = 0;
|
sum.integer_t.value = 0;
|
||||||
return sum;
|
return sum;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type_of(n) == integer_tag) {
|
if (type_of(n) == integer_tag) {
|
||||||
|
sum.integer_t.hdr.mark = gc_color_red;
|
||||||
sum.integer_t.tag = integer_tag;
|
sum.integer_t.tag = integer_tag;
|
||||||
sum.integer_t.value = ((integer_type *)n)->value;
|
sum.integer_t.value = ((integer_type *)n)->value;
|
||||||
} else if (type_of(n) == double_tag) {
|
} else if (type_of(n) == double_tag) {
|
||||||
|
sum.double_t.hdr.mark = gc_color_red;
|
||||||
sum.double_t.tag = double_tag;
|
sum.double_t.tag = double_tag;
|
||||||
sum.double_t.value = ((double_type *)n)->value;
|
sum.double_t.value = ((double_type *)n)->value;
|
||||||
} else {
|
} else {
|
||||||
make_string(s, "Bad argument type");
|
make_string(s, "Bad argument type");
|
||||||
make_cons(c1, n, nil);
|
make_cons(c1, n, nil);
|
||||||
make_cons(c0, &s, &c1);
|
make_cons(c0, &s, &c1);
|
||||||
Cyc_rt_raise(&c0);
|
Cyc_rt_raise(data, &c0);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 1; i < argc; i++) {
|
for (i = 1; i < argc; i++) {
|
||||||
common_type result = fn_op(&sum, va_arg(ns, object));
|
common_type result = fn_op(&sum, va_arg(ns, object));
|
||||||
if (type_of(&result) == integer_tag) {
|
if (type_of(&result) == integer_tag) {
|
||||||
|
sum.integer_t.hdr.mark = gc_color_red;
|
||||||
sum.integer_t.tag = integer_tag;
|
sum.integer_t.tag = integer_tag;
|
||||||
sum.integer_t.value = ((integer_type *) &result)->value;
|
sum.integer_t.value = ((integer_type *) &result)->value;
|
||||||
} else if (type_of(&result) == double_tag) {
|
} else if (type_of(&result) == double_tag) {
|
||||||
|
sum.double_t.hdr.mark = gc_color_red;
|
||||||
sum.double_t.tag = double_tag;
|
sum.double_t.tag = double_tag;
|
||||||
sum.double_t.value = ((double_type *) &result)->value;
|
sum.double_t.value = ((double_type *) &result)->value;
|
||||||
} else {
|
} else {
|
||||||
Cyc_rt_raise_msg("Internal error, invalid tag in Cyc_num_op_va_list");
|
Cyc_rt_raise_msg(data, "Internal error, invalid tag in Cyc_num_op_va_list");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1293,23 +1298,23 @@ port_type Cyc_stderr() {
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
port_type Cyc_io_open_input_file(object str) {
|
port_type Cyc_io_open_input_file(void *data, object str) {
|
||||||
const char *fname;
|
const char *fname;
|
||||||
Cyc_check_str(str);
|
Cyc_check_str(str);
|
||||||
fname = ((string_type *)str)->str;
|
fname = ((string_type *)str)->str;
|
||||||
make_port(p, NULL, 1);
|
make_port(p, NULL, 1);
|
||||||
p.fp = fopen(fname, "r");
|
p.fp = fopen(fname, "r");
|
||||||
if (p.fp == NULL) { Cyc_rt_raise2("Unable to open file", str); }
|
if (p.fp == NULL) { Cyc_rt_raise2(data, "Unable to open file", str); }
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
port_type Cyc_io_open_output_file(object str) {
|
port_type Cyc_io_open_output_file(void *data, object str) {
|
||||||
const char *fname;
|
const char *fname;
|
||||||
Cyc_check_str(str);
|
Cyc_check_str(str);
|
||||||
fname = ((string_type *)str)->str;
|
fname = ((string_type *)str)->str;
|
||||||
make_port(p, NULL, 0);
|
make_port(p, NULL, 0);
|
||||||
p.fp = fopen(fname, "w");
|
p.fp = fopen(fname, "w");
|
||||||
if (p.fp == NULL) { Cyc_rt_raise2("Unable to open file", str); }
|
if (p.fp == NULL) { Cyc_rt_raise2(data, "Unable to open file", str); }
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1376,7 +1381,7 @@ object Cyc_io_read_char(object port) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO: this function needs some work, but approximates what is needed */
|
/* TODO: this function needs some work, but approximates what is needed */
|
||||||
object Cyc_io_read_line(object cont, object port) {
|
object Cyc_io_read_line(void *data, object cont, object port) {
|
||||||
FILE *stream = ((port_type *)port)->fp;
|
FILE *stream = ((port_type *)port)->fp;
|
||||||
char buf[1024];
|
char buf[1024];
|
||||||
int i = 0, c;
|
int i = 0, c;
|
||||||
|
@ -1384,12 +1389,12 @@ object Cyc_io_read_line(object cont, object port) {
|
||||||
while (1) {
|
while (1) {
|
||||||
c = fgetc(stream);
|
c = fgetc(stream);
|
||||||
if (c == EOF && i == 0) {
|
if (c == EOF && i == 0) {
|
||||||
return_closcall1(cont, Cyc_EOF);
|
return_closcall1(data, cont, Cyc_EOF);
|
||||||
} else if (c == EOF || i == 1023 || c == '\n') {
|
} else if (c == EOF || i == 1023 || c == '\n') {
|
||||||
buf[i] = '\0';
|
buf[i] = '\0';
|
||||||
{
|
{
|
||||||
make_string(s, buf);
|
make_string(s, buf);
|
||||||
return_closcall1(cont, &s);
|
return_closcall1(data, cont, &s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1428,6 +1433,8 @@ cvar_type *mcvar(object *var) {
|
||||||
c->pvar = var;
|
c->pvar = var;
|
||||||
return c;}
|
return c;}
|
||||||
|
|
||||||
|
JAE TODO: left off thread data changes here
|
||||||
|
|
||||||
void _Cyc_91global_91vars(object cont, object args){
|
void _Cyc_91global_91vars(object cont, object args){
|
||||||
return_closcall1(cont, Cyc_global_variables); }
|
return_closcall1(cont, Cyc_global_variables); }
|
||||||
void _car(object cont, object args) {
|
void _car(object cont, object args) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue