changed operator passing from enum to struct ptr, no change in functionality

git-svn-id: https://svn.code.sf.net/p/acme-crossass/code-0/trunk@161 4df02467-bbd4-4a76-a152-e7ce94205b78
This commit is contained in:
marcobaye 2020-05-14 00:04:20 +00:00
parent fd2ac55392
commit a7ec38bff5
2 changed files with 22 additions and 22 deletions

View File

@ -990,11 +990,11 @@ static void warn_float_to_int(void)
// int: // int:
// handle monadic operator (includes functions) // handle monadic operator (includes functions)
static void int_handle_monadic_operator(struct object *self, enum op_handle op) static void int_handle_monadic_operator(struct object *self, struct op *op)
{ {
int refs = 0; // default for "addr_refs", shortens this fn int refs = 0; // default for "addr_refs", shortens this fn
switch (op) { switch (op->handle) {
case OPHANDLE_ADDR: case OPHANDLE_ADDR:
refs = 1; // result now is an address refs = 1; // result now is an address
break; break;
@ -1044,7 +1044,7 @@ static void int_handle_monadic_operator(struct object *self, enum op_handle op)
// Throw_error("'int' type does not support this operation"); // Throw_error("'int' type does not support this operation");
// break; // break;
default: default:
Bug_found("IllegalOperatorHandleIM", op); Bug_found("IllegalOperatorHandleIM", op->handle);
} }
self->u.number.addr_refs = refs; // update address refs with local copy self->u.number.addr_refs = refs; // update address refs with local copy
} }
@ -1065,11 +1065,11 @@ static void float_ranged_fn(double (*fn)(double), struct object *self)
// float: // float:
// handle monadic operator (includes functions) // handle monadic operator (includes functions)
static void float_handle_monadic_operator(struct object *self, enum op_handle op) static void float_handle_monadic_operator(struct object *self, struct op *op)
{ {
int refs = 0; // default for "addr_refs", shortens this fn int refs = 0; // default for "addr_refs", shortens this fn
switch (op) { switch (op->handle) {
case OPHANDLE_ADDR: case OPHANDLE_ADDR:
refs = 1; // result now is an address refs = 1; // result now is an address
break; break;
@ -1115,7 +1115,7 @@ static void float_handle_monadic_operator(struct object *self, enum op_handle op
// Throw_error("'float' type does not support this operation"); // Throw_error("'float' type does not support this operation");
// break; // break;
default: default:
Bug_found("IllegalOperatorHandleFM", op); Bug_found("IllegalOperatorHandleFM", op->handle);
} }
self->u.number.addr_refs = refs; // update address refs with local copy self->u.number.addr_refs = refs; // update address refs with local copy
} }
@ -1135,15 +1135,15 @@ static void number_fix_result_after_dyadic(struct object *self, struct object *o
// helper function: don't know how to handle that ARG1 OP ARG2 combination // helper function: don't know how to handle that ARG1 OP ARG2 combination
static void unsupported_dyadic(struct object *self, enum op_handle op, struct object *other) static void unsupported_dyadic(struct object *self, struct op *op, struct object *other)
{ {
Throw_error("Unsupported combination of argument(s) and operator"); // FIXME - make dynamic, add type names of self/other, add to docs Throw_error("Unsupported combination of argument(s) and operator"); // FIXME - make dynamic, add text versions of self/op/other, add to docs
} }
// int: // int:
// handle dyadic operator // handle dyadic operator
static void int_handle_dyadic_operator(struct object *self, enum op_handle op, struct object *other) static void int_handle_dyadic_operator(struct object *self, struct op *op, struct object *other)
{ {
int refs = 0; // default for "addr_refs", shortens this fn int refs = 0; // default for "addr_refs", shortens this fn
@ -1152,7 +1152,7 @@ static void int_handle_dyadic_operator(struct object *self, enum op_handle op, s
// ok // ok
} else if (other->type == &type_float) { } else if (other->type == &type_float) {
// handle according to operation // handle according to operation
switch (op) { switch (op->handle) {
case OPHANDLE_POWEROF: case OPHANDLE_POWEROF:
case OPHANDLE_MULTIPLY: case OPHANDLE_MULTIPLY:
case OPHANDLE_DIVIDE: case OPHANDLE_DIVIDE:
@ -1202,10 +1202,10 @@ static void int_handle_dyadic_operator(struct object *self, enum op_handle op, s
// maybe put this into an extra "int_dyadic_int" function? // maybe put this into an extra "int_dyadic_int" function?
// sanity check, now "other" must be an int // sanity check, now "other" must be an int
if (other->type != &type_int) if (other->type != &type_int)
Bug_found("SecondArgIsNotAnInt", op); // FIXME - rename? then add to docs! Bug_found("SecondArgIsNotAnInt", op->handle); // FIXME - rename? then add to docs!
// part 2: now we got rid of floats, perform actual operation: // part 2: now we got rid of floats, perform actual operation:
switch (op) { switch (op->handle) {
case OPHANDLE_POWEROF: case OPHANDLE_POWEROF:
if (other->u.number.val.intval >= 0) { if (other->u.number.val.intval >= 0) {
self->u.number.val.intval = my_pow(self->u.number.val.intval, other->u.number.val.intval); self->u.number.val.intval = my_pow(self->u.number.val.intval, other->u.number.val.intval);
@ -1290,7 +1290,7 @@ static void int_handle_dyadic_operator(struct object *self, enum op_handle op, s
// Throw_error("'int' type does not support this operation"); // Throw_error("'int' type does not support this operation");
// break; // break;
default: default:
Bug_found("IllegalOperatorHandleID", op); Bug_found("IllegalOperatorHandleID", op->handle);
} }
self->u.number.addr_refs = refs; // update address refs with local copy self->u.number.addr_refs = refs; // update address refs with local copy
number_fix_result_after_dyadic(self, other); // fix result flags number_fix_result_after_dyadic(self, other); // fix result flags
@ -1298,7 +1298,7 @@ static void int_handle_dyadic_operator(struct object *self, enum op_handle op, s
// float: // float:
// handle dyadic operator // handle dyadic operator
static void float_handle_dyadic_operator(struct object *self, enum op_handle op, struct object *other) static void float_handle_dyadic_operator(struct object *self, struct op *op, struct object *other)
{ {
int refs = 0; // default for "addr_refs", shortens this fn int refs = 0; // default for "addr_refs", shortens this fn
@ -1307,7 +1307,7 @@ static void float_handle_dyadic_operator(struct object *self, enum op_handle op,
// ok // ok
} else if (other->type == &type_int) { } else if (other->type == &type_int) {
// handle according to operation // handle according to operation
switch (op) { switch (op->handle) {
// these want two floats // these want two floats
case OPHANDLE_POWEROF: case OPHANDLE_POWEROF:
case OPHANDLE_MULTIPLY: case OPHANDLE_MULTIPLY:
@ -1350,7 +1350,7 @@ static void float_handle_dyadic_operator(struct object *self, enum op_handle op,
return; return;
} }
switch (op) { switch (op->handle) {
case OPHANDLE_POWEROF: case OPHANDLE_POWEROF:
self->u.number.val.fpval = pow(self->u.number.val.fpval, other->u.number.val.fpval); self->u.number.val.fpval = pow(self->u.number.val.fpval, other->u.number.val.fpval);
break; break;
@ -1436,7 +1436,7 @@ static void float_handle_dyadic_operator(struct object *self, enum op_handle op,
// Throw_error("var type does not support this operation"); // Throw_error("var type does not support this operation");
// break; // break;
default: default:
Bug_found("IllegalOperatorHandleFD", op); Bug_found("IllegalOperatorHandleFD", op->handle);
} }
self->u.number.addr_refs = refs; // update address refs with local copy self->u.number.addr_refs = refs; // update address refs with local copy
number_fix_result_after_dyadic(self, other); // fix result flags number_fix_result_after_dyadic(self, other); // fix result flags
@ -1617,12 +1617,12 @@ static void try_to_reduce_stacks(struct expression *expression)
#define ARG_NOW (arg_stack[arg_sp - 1]) #define ARG_NOW (arg_stack[arg_sp - 1])
switch (previous_op->group) { switch (previous_op->group) {
case OPGROUP_MONADIC: // monadic operators case OPGROUP_MONADIC: // monadic operators
ARG_NOW.type->handle_monadic_operator(&ARG_NOW, previous_op->handle); ARG_NOW.type->handle_monadic_operator(&ARG_NOW, previous_op);
// operation was something other than parentheses // operation was something other than parentheses
expression->is_parenthesized = FALSE; expression->is_parenthesized = FALSE;
break; break;
case OPGROUP_DYADIC: // dyadic operators case OPGROUP_DYADIC: // dyadic operators
ARG_PREV.type->handle_dyadic_operator(&ARG_PREV, previous_op->handle, &ARG_NOW); ARG_PREV.type->handle_dyadic_operator(&ARG_PREV, previous_op, &ARG_NOW);
// decrement argument stack pointer because dyadic operator merged two arguments into one // decrement argument stack pointer because dyadic operator merged two arguments into one
--arg_sp; --arg_sp;
// operation was something other than parentheses // operation was something other than parentheses

View File

@ -10,13 +10,13 @@
#include "config.h" #include "config.h"
enum op_handle; struct op;
struct dynabuf; struct dynabuf;
struct type { struct type {
//const char *name; //const char *name;
boolean (*is_defined)(struct object *self); boolean (*is_defined)(struct object *self);
void (*handle_monadic_operator)(struct object *self, enum op_handle op); void (*handle_monadic_operator)(struct object *self, struct op *op);
void (*handle_dyadic_operator)(struct object *self, enum op_handle op, struct object *other); void (*handle_dyadic_operator)(struct object *self, struct op *op, struct object *other);
void (*fix_result)(struct object *self); void (*fix_result)(struct object *self);
void (*print)(struct object *self, struct dynabuf *db); void (*print)(struct object *self, struct dynabuf *db);
}; };