Type checking, general fixes

This commit is contained in:
Justin Ethier 2015-07-23 22:58:57 -04:00
parent 5a9a8d322e
commit 84393e0993

View file

@ -9,6 +9,7 @@
#include "cyclone/types.h" #include "cyclone/types.h"
#include "cyclone/runtime.h" #include "cyclone/runtime.h"
/* Type names to use for error messages */
const char *tag_names[20] = { \ const char *tag_names[20] = { \
"pair" \ "pair" \
, "symbol" \ , "symbol" \
@ -19,8 +20,8 @@ const char *tag_names[20] = { \
, "closure" \ , "closure" \
, "closure" \ , "closure" \
, "closure" \ , "closure" \
, "integer" \ , "number" \
, "double" \ , "number" \
, "string" \ , "string" \
, "primitive" \ , "primitive" \
, "eof" \ , "eof" \
@ -28,8 +29,8 @@ const char *tag_names[20] = { \
, "boolean" \ , "boolean" \
, "C primitive" \ , "C primitive" \
, "vector" \ , "vector" \
, "" \ , "TODO: add missing type" \
, "" }; , "TODO: add missing type" };
/* Type checking section */ /* Type checking section */
#define Cyc_check_num_args(fnc_name, num_args, args) { \ #define Cyc_check_num_args(fnc_name, num_args, args) { \
@ -45,6 +46,7 @@ const char *tag_names[20] = { \
if (eq(boolean_f, fnc_test(obj))) Cyc_invalid_type_error(cons_tag, obj); } if (eq(boolean_f, fnc_test(obj))) Cyc_invalid_type_error(cons_tag, obj); }
#define Cyc_check_cons(obj) Cyc_check_type(Cyc_is_cons, cons_tag, obj); #define Cyc_check_cons(obj) Cyc_check_type(Cyc_is_cons, cons_tag, obj);
#define Cyc_check_num(obj) Cyc_check_type(Cyc_is_number, integer_tag, obj);
void Cyc_invalid_type_error(int tag, object found) { void Cyc_invalid_type_error(int tag, object found) {
char buf[256]; char buf[256];
@ -625,7 +627,9 @@ list assoc(x,l) object x; list l;
// TODO: generate these using macros??? // TODO: generate these using macros???
object __num_eq(x, y) object x, y; object __num_eq(x, y) object x, y;
{if (x && y && ((integer_type *)x)->value == ((integer_type *)y)->value) {Cyc_check_num(x);
Cyc_check_num(y);
if (((integer_type *)x)->value == ((integer_type *)y)->value)
return boolean_t; return boolean_t;
return boolean_f;} return boolean_f;}
@ -1066,6 +1070,9 @@ object __halt(object obj) {
printf("\nhalt: "); printf("\nhalt: ");
Cyc_display(obj, stdout); Cyc_display(obj, stdout);
printf("\n"); printf("\n");
printf("my_exit: heap bytes allocated=%d time=%ld ticks no_gcs=%ld no_m_gcs=%ld\n",
allocp-bottom,clock()-start,no_gcs,no_major_gcs);
printf("my_exit: ticks/second=%ld\n",(long) CLOCKS_PER_SEC);
#endif #endif
my_exit(obj); my_exit(obj);
return nil; return nil;