WIP function array fixes

This commit is contained in:
zongor 2026-07-06 18:38:56 -07:00
parent ed933356d2
commit 3a44877465
4 changed files with 71 additions and 50 deletions

View File

@ -296,7 +296,7 @@ calculate_strides(List *dims, List *strides)
}
}
void
Symbol*
define_array(void)
{
i32 size = 0, n = 0, flat_array_length = 1;
@ -329,13 +329,7 @@ define_array(void)
calculate_strides(dims, strides);
array->args = dims;
array->fields = strides;
}
void
define_string(void)
{
scope_add_symbol(parser->current.start, parser->current.length, SYMBOL_STR,
0);
return array;
}
void
@ -357,13 +351,6 @@ build_symbol_table(char *source)
define_plex();
} else if(match(TOKEN_KEYWORD_TRAIT)) {
define_trait();
} else if(parser->previous.type != TOKEN_KEYWORD_AS &&
match(TOKEN_TYPE_STR)) {
define_string();
} else if(parser->current.type >= TOKEN_TYPE_I8 &&
parser->current.type <= TOKEN_TYPE_PTR) {
advance();
if(check(TOKEN_LBRACKET)) define_array();
} else {
/* in binary bytecode output mode we need to count the bytes here */
/* otherwise ignore everything */
@ -387,9 +374,10 @@ variable_declaration(Symbol *def)
Symbol *variable;
List *array_literal;
if(tt == TOKEN_TYPE_STR) {
variable = scope_get_symbol(parser->current_scope, parser->current.start,
parser->current.length);
if(!def && tt == TOKEN_TYPE_STR) {
variable = scope_add_symbol(parser->current.start, parser->current.length, SYMBOL_STR,
0);
if(!variable) {
emitter->error("cannot find str symbol", 23, parser->current.line);
return 0;
@ -408,12 +396,8 @@ variable_declaration(Symbol *def)
return emitter->get_size(st);
}
if(parser->current.type == TOKEN_LBRACKET) {
while(!check(TOKEN_RBRACKET)) advance();
advance();
variable = scope_get_symbol(parser->current_scope, parser->current.start,
parser->current.length);
if(!def && parser->current.type == TOKEN_LBRACKET) {
variable = define_array();
if(!variable) {
emitter->error("cannot find array symbol", 25, parser->current.line);
return 0;
@ -459,7 +443,7 @@ variable_declaration(Symbol *def)
if(def) {
List_push(arena, def->args, variable, sizeof(Symbol));
} else {
emitter->emit_type(arena, code, variable, variable->scope);
emitter->emit_type(arena, code, variable);
parser->current_type = st;
}
} else {
@ -478,7 +462,7 @@ variable_declaration(Symbol *def)
if(match(TOKEN_EQ)) {
emitter->emit_set_value(arena, code);
expression();
emitter->emit_constant(arena, code, variable, variable->scope);
emitter->emit_constant(arena, code, variable);
}
consume(TOKEN_SEMICOLON);
@ -691,9 +675,9 @@ variable(void)
parser->current_type = sym->type;
if(match(TOKEN_EQ)) {
expression();
emitter->emit_set_variable(arena, code, sym, sym->scope);
emitter->emit_set_variable(arena, code, sym);
} else {
emitter->emit_variable(arena, code, sym, sym->scope);
emitter->emit_variable(arena, code, sym);
}
}
@ -1125,7 +1109,7 @@ emit_program(char *source)
while(!match(TOKEN_EOF)) declaration();
/*emitter->epilogue(arena, code);*/
emitter->epilogue(arena, code);
}
bool

9
emit.h
View File

@ -10,7 +10,6 @@ typedef void (*ErrorMsg)(const char *str, i32 length, i32 line);
typedef void (*SymbolEmit)(Arena *a, List *out, Symbol *sym);
typedef void (*VoidArgEmit)(Arena *a, List *out);
typedef void (*StrArgEmit)(Arena *a, List *out, const char *str, i32 length);
typedef void (*VarEmit)(Arena *a, List *out, Symbol *sym, bool local);
typedef void (*MultipleEmit)(Arena *a, List *out, Symbol *sym, List* in);
typedef void (*I32ArgEmit)(Arena *a, List *out, i32 val);
typedef void (*U32ArgEmit)(Arena *a, List *out, u32 ptr);
@ -45,7 +44,7 @@ struct emitter_s {
StrArgEmit emit_real;
StrArgEmit emit_byte;
RawEmit emit_str;
VarEmit emit_type;
SymbolEmit emit_type;
MultipleEmit emit_array;
SymbolEmit emit_function;
VoidArgEmit emit_plex;
@ -57,9 +56,9 @@ struct emitter_s {
VoidArgEmit emit_not;
VoidArgEmit emit_open_paren;
VoidArgEmit emit_close_paren;
VarEmit emit_constant;
VarEmit emit_variable;
VarEmit emit_set_variable;
SymbolEmit emit_constant;
SymbolEmit emit_variable;
SymbolEmit emit_set_variable;
VoidArgEmit emit_write;
VoidArgEmit emit_read;
VoidArgEmit emit_open;

View File

@ -583,7 +583,6 @@ uxn_mem(u32 a)
void
uxn_prolog(Arena *a, List *out)
{
/*StrBuf_append(a, out, "|100\n\tLIT2r 0000 main_ POP2r BRK\n\n");*/
StrBuf_append(a, out, "|100\n\tLIT2r 0000\n\n");
}
@ -747,17 +746,25 @@ uxn_get_size(SymbolType t)
return 4;
case SYMBOL_F32:
return 4;
default:
break;
case SYMBOL_ARRAY:
case SYMBOL_FUNCTION:
case SYMBOL_PLEX:
case SYMBOL_METHOD:
case SYMBOL_TRAIT:
case SYMBOL_CONST:
return 2;
case SYMBOL_UNDEFINED:
case SYMBOL_VOID:
return 0;
}
return 0;
}
void
uxn_emit_type(Arena *a, List *out, Symbol *sym, bool local)
uxn_emit_type(Arena *a, List *out, Symbol *sym)
{
if(local) {
if(sym->scope) {
if(sym->ref) {
sprintf(uxn_temp_strbuf, "\tSTH2kr #%04x ADD2 LDA2\n", sym->ref);
StrBuf_append(a, out, uxn_temp_strbuf);
@ -812,15 +819,36 @@ uxn_emit_byte(Arena *a, List *out, const char *str, i32 length)
void
uxn_emit_char(Arena *a, List *out, const char *str, i32 length)
{
if (str[1] == '\\') {
char c = ' ';
switch(str[2]) {
case 'n':
c = '\n';
break;
case 't':
c = '\t';
break;
case 'r':
c = '\r';
break;
case '\\':
case '"':
case '\'':
break;
}
sprintf(uxn_temp_strbuf, "#%02x ", c);
} else {
sprintf(uxn_temp_strbuf, "#%02x ", (char)str[1]);
}
StrBuf_append(a, out, uxn_temp_strbuf);
USED(length);
}
void
uxn_emit_constant(Arena *a, List *out, Symbol *sym, bool local)
uxn_emit_constant(Arena *a, List *out, Symbol *sym)
{
if(local) {
if(sym->scope) {
if(sym->ref) {
sprintf(uxn_temp_strbuf, "\tSTH2kr #%04x ADD2 STA2\n", sym->ref);
StrBuf_append(a, out, uxn_temp_strbuf);
@ -1120,9 +1148,9 @@ uxn_emit_close_paren(Arena *a, List *out)
}
void
uxn_emit_variable(Arena *a, List *out, Symbol *sym, bool local)
uxn_emit_variable(Arena *a, List *out, Symbol *sym)
{
if(local) {
if(sym->scope) {
if(sym->ref) {
sprintf(uxn_temp_strbuf, "\tSTH2kr #%04x ADD2 LDA2 ", sym->ref);
StrBuf_append(a, out, uxn_temp_strbuf);
@ -1137,9 +1165,9 @@ uxn_emit_variable(Arena *a, List *out, Symbol *sym, bool local)
}
void
uxn_emit_set_variable(Arena *a, List *out, Symbol *sym, bool local)
uxn_emit_set_variable(Arena *a, List *out, Symbol *sym)
{
if(local) {
if(sym->scope) {
if(sym->ref) {
sprintf(uxn_temp_strbuf, "\tSTH2kr #%04x ADD2 STA2 ", sym->ref);
StrBuf_append(a, out, uxn_temp_strbuf);
@ -1417,8 +1445,18 @@ uxn_emit_halt(Arena *a, List *out)
void
uxn_emit_deref_prolog(Arena *a, List *out, Symbol *sym)
{
if(sym->scope) {
if(sym->ref) {
sprintf(uxn_temp_strbuf, "\tSTH2kr #%04x ADD2 ", sym->ref);
StrBuf_append(a, out, uxn_temp_strbuf);
} else {
sprintf(uxn_temp_strbuf, "\tSTH2kr ");
StrBuf_append(a, out, uxn_temp_strbuf);
}
} else {
sprintf(uxn_temp_strbuf, ";%.*s ", sym->name_length, sym->name);
StrBuf_append(a, out, uxn_temp_strbuf);
}
}
void

View File

@ -319,9 +319,9 @@ identifierType(void)
if(lexer.current - lexer.start > 1) {
switch(lexer.start[1]) {
case 'y':
return check_keyword(2, 2, "te", TOKEN_TYPE_U8);
return check_keyword(2, 2, "te", TOKEN_TYPE_BYTE);
case 'o':
return check_keyword(2, 2, "ol", TOKEN_TYPE_U8);
return check_keyword(2, 2, "ol", TOKEN_TYPE_BOOL);
}
}
break;