From 7eb6bad336ade6ba3fe1c086378b22906f8b424b Mon Sep 17 00:00:00 2001 From: Nunuhara Cabbage Date: Sun, 21 Jun 2020 17:25:49 -0700 Subject: [PATCH] jaf: fix bug with reference types --- src/tools/ainedit/jaf_compile.c | 5 +++++ src/tools/ainedit/jaf_lexer.l | 2 +- src/tools/ainedit/jaf_types.c | 28 +++++++++++++++++++++++++--- 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/tools/ainedit/jaf_compile.c b/src/tools/ainedit/jaf_compile.c index f8b1c1b..ebd5103 100644 --- a/src/tools/ainedit/jaf_compile.c +++ b/src/tools/ainedit/jaf_compile.c @@ -742,9 +742,14 @@ static void compile_statement(struct compiler_state *state, struct jaf_block_ite case AIN_FLOAT: case AIN_BOOL: case AIN_LONG_INT: + case AIN_REF_INT: + case AIN_REF_FLOAT: + case AIN_REF_BOOL: + case AIN_REF_LONG_INT: write_instruction0(state, POP); break; case AIN_STRING: + case AIN_REF_STRING: write_instruction0(state, state->ain->version >= 11 ? DELETE : S_POP); break; default: diff --git a/src/tools/ainedit/jaf_lexer.l b/src/tools/ainedit/jaf_lexer.l index 58b0984..4d3efe1 100644 --- a/src/tools/ainedit/jaf_lexer.l +++ b/src/tools/ainedit/jaf_lexer.l @@ -99,7 +99,7 @@ static int check_type(void); {HP}{H}*"."{H}+{P}{FS}? { RETURN_STRING(F_CONSTANT); } {HP}{H}+"."{P}{FS}? { RETURN_STRING(F_CONSTANT); } -({SP}?\"([^"\\\n]|{ES})*\"{WS}*)+ { RETURN_STRING(STRING_LITERAL); } +({SP}?\"([^"\\\n]|{ES})*\"{WS}*)+ { yylval.string = make_string(yytext+1, yyleng-2); return STRING_LITERAL; } "..." { return ELLIPSIS; } ">>=" { return RIGHT_ASSIGN; } diff --git a/src/tools/ainedit/jaf_types.c b/src/tools/ainedit/jaf_types.c index 88b5bdd..87f2426 100644 --- a/src/tools/ainedit/jaf_types.c +++ b/src/tools/ainedit/jaf_types.c @@ -41,13 +41,35 @@ const char *jaf_typestr(enum jaf_type type) return "unknown"; } +static enum ain_data_type strip_ref(enum ain_data_type type) +{ + switch (type) { + case AIN_REF_INT: return AIN_INT; + case AIN_REF_FLOAT: return AIN_FLOAT; + case AIN_REF_STRING: return AIN_STRING; + case AIN_REF_STRUCT: return AIN_STRUCT; + case AIN_REF_ARRAY_INT: return AIN_ARRAY_INT; + case AIN_REF_ARRAY_FLOAT: return AIN_ARRAY_FLOAT; + case AIN_REF_ARRAY_STRING: return AIN_ARRAY_STRING; + case AIN_REF_ARRAY_STRUCT: return AIN_ARRAY_STRUCT; + case AIN_REF_FUNC_TYPE: return AIN_FUNC_TYPE; + case AIN_REF_ARRAY_FUNC_TYPE: return AIN_ARRAY_FUNC_TYPE; + case AIN_REF_BOOL: return AIN_BOOL; + case AIN_REF_ARRAY_BOOL: return AIN_ARRAY_BOOL; + case AIN_REF_LONG_INT: return AIN_LONG_INT; + case AIN_REF_ARRAY_LONG_INT: return AIN_ARRAY_LONG_INT; + default: return type; + } +} + static bool jaf_type_equal(struct ain_type *a, struct ain_type *b) { - if (a->data != b->data) + enum ain_data_type a_data = strip_ref(a->data), b_data = strip_ref(b->data); + if (a_data != b_data) return false; - if (a->data == AIN_STRUCT && a->struc != b->struc) + if (a_data == AIN_STRUCT && a->struc != b->struc) return false; - if (a->data == AIN_FUNC_TYPE && a->struc != b->struc) + if (a_data == AIN_FUNC_TYPE && a->struc != b->struc) return false; return true; }