From 69b443d4de3dd0217968fd4482abc13b8988116b Mon Sep 17 00:00:00 2001 From: Preston Pan Date: Sun, 21 Jan 2024 16:10:54 -0800 Subject: get rid of some useless mallocs --- src/builtins.c | 178 +++++++++++++++++++++++++++++++-------------------------- 1 file changed, 96 insertions(+), 82 deletions(-) (limited to 'src/builtins.c') diff --git a/src/builtins.c b/src/builtins.c index 73e16fd..bb18bb1 100644 --- a/src/builtins.c +++ b/src/builtins.c @@ -96,20 +96,19 @@ void stemadd(value_t *v) { eval_error("EMPTY STACK"); return; } - value_t *retval = init_value(VFLOAT); - if (v1->type == VINT && v2->type == VINT) { - retval->type = VINT; - } - if (v1->type != VINT && v1->type != VFLOAT || - v2->type != VINT && v2->type != VFLOAT) { + if (v1->type != VINT && v1->type != VFLOAT && v2->type != VINT && + v2->type != VFLOAT) { array_append(STACK, v1); array_append(STACK, v2); eval_error("INCORRECT TYPE ARGUMENT"); return; } - retval->int_float = v1->int_float + v2->int_float; - array_append(STACK, retval); - value_free(v1); + + v1->int_float = v1->int_float + v2->int_float; + if (v2->type == VFLOAT) + v1->type = VFLOAT; + + array_append(STACK, v1); value_free(v2); } @@ -125,20 +124,19 @@ void stemsub(value_t *v) { eval_error("EMPTY STACK"); return; } - value_t *retval = init_value(VFLOAT); - if (v1->type == VINT && v2->type == VINT) { - retval->type = VINT; - } - if (v1->type != VINT && v1->type != VFLOAT || - v2->type != VINT && v2->type != VFLOAT) { + if (v1->type != VINT && v1->type != VFLOAT && v2->type != VINT && + v2->type != VFLOAT) { array_append(STACK, v1); array_append(STACK, v2); eval_error("INCORRECT TYPE ARGUMENT"); return; } - retval->int_float = v1->int_float - v2->int_float; - array_append(STACK, retval); - value_free(v1); + + v1->int_float = v1->int_float - v2->int_float; + if (v2->type == VFLOAT) + v1->type = VFLOAT; + + array_append(STACK, v1); value_free(v2); } @@ -154,20 +152,19 @@ void stemmul(value_t *v) { eval_error("EMPTY STACK"); return; } - value_t *retval = init_value(VFLOAT); - if (v1->type == VINT && v2->type == VINT) { - retval->type = VINT; - } - if (v1->type != VINT && v1->type != VFLOAT || - v2->type != VINT && v2->type != VFLOAT) { + if (v1->type != VINT && v1->type != VFLOAT && v2->type != VINT && + v2->type != VFLOAT) { array_append(STACK, v1); array_append(STACK, v2); eval_error("INCORRECT TYPE ARGUMENT"); return; } - retval->int_float = v1->int_float * v2->int_float; - array_append(STACK, retval); - value_free(v1); + + v1->int_float = v1->int_float * v2->int_float; + if (v2->type == VFLOAT) + v1->type = VFLOAT; + + array_append(STACK, v1); value_free(v2); } @@ -183,20 +180,19 @@ void stemdiv(value_t *v) { eval_error("EMPTY STACK"); return; } - value_t *retval = init_value(VFLOAT); - if (v1->type == VINT && v2->type == VINT) { - retval->type = VINT; - } - if (v1->type != VINT && v1->type != VFLOAT || - v2->type != VINT && v2->type != VFLOAT) { + if (v1->type != VINT && v1->type != VFLOAT && v2->type != VINT && + v2->type != VFLOAT) { array_append(STACK, v1); array_append(STACK, v2); eval_error("INCORRECT TYPE ARGUMENT"); return; } - retval->int_float = v1->int_float / v2->int_float; - array_append(STACK, retval); - value_free(v1); + + v1->int_float = v1->int_float / v2->int_float; + if (v2->type == VFLOAT) + v1->type = VFLOAT; + + array_append(STACK, v1); value_free(v2); } @@ -234,13 +230,19 @@ void stempow(value_t *v) { eval_error("EMPTY STACK"); return; } - value_t *retval = init_value(VFLOAT); - if (v1->type == VINT && v2->type == VINT) { - retval->type = VINT; + if (v1->type != VINT && v1->type != VFLOAT && v2->type != VINT && + v2->type != VFLOAT) { + array_append(STACK, v1); + array_append(STACK, v2); + eval_error("INCORRECT TYPE ARGUMENT"); + return; } - retval->int_float = powl(v1->int_float, v2->int_float); - array_append(STACK, retval); - value_free(v1); + + v1->int_float = powl(v1->int_float, v2->int_float); + if (v2->type == VFLOAT) + v1->type = VFLOAT; + + array_append(STACK, v1); value_free(v2); } @@ -250,10 +252,12 @@ void stemsin(value_t *v) { eval_error("EMPTY STACK"); return; } - value_t *retval = init_value(VFLOAT); - retval->int_float = sinhl(v1->int_float); - array_append(STACK, retval); - value_free(v1); + if (v1->type != VINT && v1->type != VFLOAT) { + array_append(STACK, v1); + eval_error("INVALID TYPE ARGUMENT"); + } + v1->int_float = sinhl(v1->int_float); + array_append(STACK, v1); } void stemcos(value_t *v) { @@ -262,10 +266,12 @@ void stemcos(value_t *v) { eval_error("EMPTY STACK"); return; } - value_t *retval = init_value(VFLOAT); - retval->int_float = coshl(v1->int_float); - array_append(STACK, retval); - value_free(v1); + if (v1->type != VINT && v1->type != VFLOAT) { + array_append(STACK, v1); + eval_error("INVALID TYPE ARGUMENT"); + } + v1->int_float = coshl(v1->int_float); + array_append(STACK, v1); } void stemexp(value_t *v) { @@ -274,67 +280,75 @@ void stemexp(value_t *v) { eval_error("EMPTY STACK"); return; } - value_t *retval = init_value(VFLOAT); - retval->int_float = expl(v1->int_float); - array_append(STACK, retval); - value_free(v1); + if (v1->type != VINT && v1->type != VFLOAT) { + array_append(STACK, v1); + eval_error("INVALID TYPE ARGUMENT"); + } + v1->int_float = expl(v1->int_float); + array_append(STACK, v1); } -void stemeval(value_t *v) { +void stemln(value_t *v) { value_t *v1 = array_pop(STACK); if (v1 == NULL) { - array_append(STACK, v1); eval_error("EMPTY STACK"); return; } - if (v1->type == VQUOTE) { - array_append(EVAL_STACK, v1); - for (int i = 0; i < v1->quote->size; i++) { - eval(value_copy(v1->quote->items[i])); - } - value_t *vf = array_pop(EVAL_STACK); - if (vf) { - value_free(vf); - } - } else { - eval(v1); + if (v1->type != VINT && v1->type != VFLOAT) { + array_append(STACK, v1); + eval_error("INVALID TYPE ARGUMENT"); } + v1->int_float = logl(v1->int_float); + array_append(STACK, v1); } -void stemln(value_t *v) { +void stemceil(value_t *v) { value_t *v1 = array_pop(STACK); if (v1 == NULL) { eval_error("EMPTY STACK"); return; } - value_t *retval = init_value(VFLOAT); - retval->int_float = logl(v1->int_float); - array_append(STACK, retval); - value_free(v1); + if (v1->type != VINT && v1->type != VFLOAT) { + array_append(STACK, v1); + eval_error("INVALID TYPE ARGUMENT"); + } + v1->int_float = ceil(v1->int_float); + array_append(STACK, v1); } -void stemceil(value_t *v) { +void stemfloor(value_t *v) { value_t *v1 = array_pop(STACK); if (v1 == NULL) { eval_error("EMPTY STACK"); return; } - value_t *retval = init_value(VFLOAT); - retval->int_float = ceil(v1->int_float); - array_append(STACK, retval); - value_free(v1); + if (v1->type != VINT && v1->type != VFLOAT) { + array_append(STACK, v1); + eval_error("INVALID TYPE ARGUMENT"); + } + v1->int_float = floor(v1->int_float); + array_append(STACK, v1); } -void stemfloor(value_t *v) { +void stemeval(value_t *v) { value_t *v1 = array_pop(STACK); if (v1 == NULL) { + array_append(STACK, v1); eval_error("EMPTY STACK"); return; } - value_t *retval = init_value(VFLOAT); - retval->int_float = floor(v1->int_float); - array_append(STACK, retval); - value_free(v1); + if (v1->type == VQUOTE) { + array_append(EVAL_STACK, v1); + for (int i = 0; i < v1->quote->size; i++) { + eval(value_copy(v1->quote->items[i])); + } + value_t *vf = array_pop(EVAL_STACK); + if (vf) { + value_free(vf); + } + } else { + eval(v1); + } } void strquote(value_t *v) { -- cgit