From: NeilBrown Date: Fri, 17 Dec 2021 04:09:11 +0000 (+1100) Subject: oceani: pass 'rules' into the 'compat' type function. X-Git-Url: https://ocean-lang.org/code/?p=ocean;a=commitdiff_plain;h=69ba500597a59e484af0fa351bdd4d0b5fe53df4 oceani: pass 'rules' into the 'compat' type function. A future 'compat' will want to know about rules. Also identify as 'enum val_rules', not 'int'. And remove some trailing spaces. Signed-off-by: NeilBrown --- diff --git a/csrc/oceani.mdc b/csrc/oceani.mdc index 0f2174d..a625348 100644 --- a/csrc/oceani.mdc +++ b/csrc/oceani.mdc @@ -367,14 +367,14 @@ context so indicate that parsing failed. static void fput_loc(struct exec *loc, FILE *f); static void type_err(struct parse_context *c, char *fmt, struct exec *loc, - struct type *t1, int rules, struct type *t2); + struct type *t1, enum val_rules rules, struct type *t2); static void tok_err(struct parse_context *c, char *fmt, struct token *t); ###### core functions static void type_err(struct parse_context *c, char *fmt, struct exec *loc, - struct type *t1, int rules, struct type *t2) + struct type *t1, enum val_rules rules, struct type *t2) { fprintf(stderr, "%s:", c->file_name); fput_loc(loc, stderr); @@ -604,12 +604,12 @@ the value can only be assigned once, when the variable is declared. ###### forward decls static struct type *propagate_types(struct exec *prog, struct parse_context *c, enum prop_err *perr, - struct type *type, int rules); + struct type *type, enum val_rules rules); ###### core functions static struct type *__propagate_types(struct exec *prog, struct parse_context *c, enum prop_err *perr, enum prop_err *perr_local, - struct type *type, int rules) + struct type *type, enum val_rules rules) { struct type *t; @@ -631,7 +631,7 @@ the value can only be assigned once, when the variable is declared. } static struct type *propagate_types(struct exec *prog, struct parse_context *c, enum prop_err *perr, - struct type *type, int rules) + struct type *type, enum val_rules rules) { int pre_err = c->parse_error; enum prop_err perr_local = 0; @@ -991,7 +991,7 @@ which might be reported in error messages. ###### forward decls static void free_value(struct type *type, struct value *v); - static int type_compat(struct type *require, struct type *have, int rules); + static int type_compat(struct type *require, struct type *have, enum val_rules rules); static void type_print(struct type *type, FILE *f); static void val_init(struct type *type, struct value *v); static void dup_value(struct type *type, @@ -1056,11 +1056,12 @@ A separate function encoding these cases will simplify some code later. ###### type functions - int (*compat)(struct type *this, struct type *other); + int (*compat)(struct type *this, struct type *other, enum val_rules rules); ###### ast functions - static int type_compat(struct type *require, struct type *have, int rules) + static int type_compat(struct type *require, struct type *have, + enum val_rules rules) { if ((rules & Rboolok) && have == Tbool) return 1; // NOTEST @@ -1068,7 +1069,7 @@ A separate function encoding these cases will simplify some code later. return 1; if (require->compat) - return require->compat(require, have); + return require->compat(require, have, rules); return require == have; } @@ -2461,7 +2462,8 @@ with a const size by whether they are prepared at parse time or not. free(ptr); } - static int array_compat(struct type *require, struct type *have) + static int array_compat(struct type *require, struct type *have, + enum val_rules rules) { if (have->compat != require->compat) return 0; @@ -3118,7 +3120,8 @@ anything in the heap or on the stack. A reference can be assigned /* Nothing to do here */ } - static int reference_compat(struct type *require, struct type *have) + static int reference_compat(struct type *require, struct type *have, + enum val_rules rules) { if (have->compat != require->compat) return 0; @@ -3445,7 +3448,8 @@ further detailed when Expression Lists are introduced. val->function = NULL; } - static int function_compat(struct type *require, struct type *have) + static int function_compat(struct type *require, struct type *have, + enum val_rules rules) { // FIXME can I do anything here yet? return 0; @@ -5657,8 +5661,8 @@ is a bit more interesting at this level. struct value fn = {.function = code}; struct type *t; var_block_close(c, CloseFunction, code); - t = add_anon_type(c, &function_prototype, - "func %.*s", name->name->name.len, + t = add_anon_type(c, &function_prototype, + "func %.*s", name->name->name.len, name->name->name.txt); name->type = t; t->function.params = reorder_bilist(args); @@ -5770,7 +5774,7 @@ is a bit more interesting at this level. all_ok = 0; if (!v->type->function.inline_result && !v->type->function.return_type->dup) { - type_err(c, "error: function cannot return value of type %1", + type_err(c, "error: function cannot return value of type %1", v->where_decl, v->type->function.return_type, 0, NULL); }