diff --git a/femtolisp/cvalues.c b/femtolisp/cvalues.c index 45b9491..cfd8b9a 100644 --- a/femtolisp/cvalues.c +++ b/femtolisp/cvalues.c @@ -1264,6 +1264,12 @@ int numeric_compare(value_t a, value_t b, int eq, int eqnans, char *fname) return 1; } +static void DivideByZeroError() __attribute__ ((__noreturn__)); +static void DivideByZeroError() +{ + lerror(DivideError, "/: division by zero"); +} + static value_t fl_div2(value_t a, value_t b) { double da, db; @@ -1280,7 +1286,7 @@ static value_t fl_div2(value_t a, value_t b) db = conv_to_double(bptr, tb); if (db == 0 && tb < T_FLOAT) // exact 0 - lerror(DivideError, "/: division by zero"); + DivideByZeroError(); da = da/db; @@ -1330,7 +1336,7 @@ static value_t fl_idiv2(value_t a, value_t b) return return_from_int64(conv_to_int64(aptr, ta) / b64); div_error: - lerror(DivideError, "/: division by zero"); + DivideByZeroError(); } static value_t fl_bitwise_op(value_t a, value_t b, int opcode, char *fname) diff --git a/femtolisp/flisp.c b/femtolisp/flisp.c index 57a2bfc..dbfb4f6 100644 --- a/femtolisp/flisp.c +++ b/femtolisp/flisp.c @@ -1139,8 +1139,10 @@ static value_t apply_cl(uint32_t nargs) goto next_op; case OP_IDIV: v = Stack[SP-2]; e = Stack[SP-1]; - if (bothfixnums(v, e)) + if (bothfixnums(v, e)) { + if (e==0) DivideByZeroError(); v = fixnum(numval(v) / numval(e)); + } else v = fl_idiv2(v, e); POPN(1); diff --git a/femtolisp/todo b/femtolisp/todo index 7c400b9..1a969ca 100644 --- a/femtolisp/todo +++ b/femtolisp/todo @@ -1024,13 +1024,13 @@ new evaluator todo: * make (for ...) a special form * trycatch should require 2nd arg to be a lambda expression * immediate load int8 instruction -- fix equal? on functions -- store function name and signature -- maxstack calculation, replace Stack with C stack, alloca +- maxstack calculation, make Stack growable - stack traces and better debugging support +- let eversion - lambda lifting * let optimization -- let eversion +- fix equal? on functions +- store function name and signature * have macroexpand use its own global syntax table * be able to create/load an image file * fix trace and untrace