jaf: fix bug with reference types

This commit is contained in:
Nunuhara Cabbage
2020-06-21 17:25:49 -07:00
parent b41275f6f4
commit 7eb6bad336
3 changed files with 31 additions and 4 deletions
+5
View File
@@ -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:
+1 -1
View File
@@ -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; }
+25 -3
View File
@@ -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;
}