From 10ecd1ff852ec86d06603433ab1439d20c724532 Mon Sep 17 00:00:00 2001 From: zongor Date: Wed, 15 Jul 2026 20:36:29 -0700 Subject: [PATCH] WIP array arg for function --- compiler.c | 114 +++++++++++++++++++++++---------------------- test/array.ul | 10 ++-- test/tal/array.tal | 112 -------------------------------------------- 3 files changed, 65 insertions(+), 171 deletions(-) diff --git a/compiler.c b/compiler.c index f4df485..5a65d8e 100644 --- a/compiler.c +++ b/compiler.c @@ -108,23 +108,24 @@ scope_add_symbol(const char *name, u32 name_length, SymbolType type, u32 size) sizeof(Symbol)); } -void CallStack_push(CallStack *stack, Symbol *symbol) { - if (stack->count >= stack->capacity) { - emitter->error("call stack full", 16, parser->previous.line); - } - stack->symbols[stack->count] = symbol; - stack->count++; +void +CallStack_push(CallStack *stack, Symbol *symbol) +{ + if(stack->count >= stack->capacity) + emitter->error("call stack full", 16, parser->previous.line); + stack->symbols[stack->count] = symbol; + stack->count++; } -Symbol *CallStack_pop(CallStack *stack) { - if (stack->count == 0) { - emitter->error("call stack empty", 17, parser->previous.line); - } - stack->count--; - return stack->symbols[stack->count]; +Symbol * +CallStack_pop(CallStack *stack) +{ + if(stack->count == 0) + emitter->error("call stack empty", 17, parser->previous.line); + stack->count--; + return stack->symbols[stack->count]; } - bool is_global(void) { @@ -145,7 +146,6 @@ is_current_type(void) parser->current.type <= TOKEN_TYPE_PTR; } - SymbolType token_type_to_sym_type(TokenType t) { @@ -324,7 +324,7 @@ calculate_strides(List *dims, List *strides) } } -Symbol* +Symbol * define_array(void) { i32 size = 0, n = 0, flat_array_length = 1; @@ -403,8 +403,8 @@ variable_declaration(Symbol *def) List *array_literal; if(!def && tt == TOKEN_TYPE_STR) { - variable = scope_add_symbol(parser->current.start, parser->current.length, SYMBOL_STR, - 0); + 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); @@ -424,40 +424,47 @@ variable_declaration(Symbol *def) return emitter->get_size(st); } - if(!def && parser->current.type == TOKEN_LBRACKET) { - variable = define_array(); - if(!variable) { - emitter->error("cannot find array symbol", 25, parser->current.line); - return 0; - } - advance(); + if(parser->current.type == TOKEN_LBRACKET) { - if(match(TOKEN_EQ)) { - expect(TOKEN_LBRACKET); - array_literal = List_init(arena); + if(def) { + emitter->error("define array argument", 21, parser->previous.line); - while(!match(TOKEN_RBRACKET)) { - StrBuf_append_exactly(arena, array_literal, - (char *)parser->current.start, - parser->current.length); - advance(); - if(match(TOKEN_RBRACKET)) break; - expect(TOKEN_COMMA); + } else { + + variable = define_array(); + if(!variable) { + emitter->error("cannot find array symbol", 25, parser->current.line); + return 0; + } + advance(); + + if(match(TOKEN_EQ)) { + expect(TOKEN_LBRACKET); + array_literal = List_init(arena); + + while(!match(TOKEN_RBRACKET)) { + StrBuf_append_exactly(arena, array_literal, + (char *)parser->current.start, + parser->current.length); + advance(); + if(match(TOKEN_RBRACKET)) break; + expect(TOKEN_COMMA); + } + + expect(TOKEN_SEMICOLON); + emitter->emit_array(arena, memory, variable, array_literal); + } else { + expect(TOKEN_SEMICOLON); + + emitter->emit_array(arena, memory, variable, nil); + emitter->emit_zero_block( + arena, memory, + variable->size * emitter->get_size(variable->secondary_type)); } - expect(TOKEN_SEMICOLON); - emitter->emit_array(arena, memory, variable, array_literal); - } else { - expect(TOKEN_SEMICOLON); - - emitter->emit_array(arena, memory, variable, nil); - emitter->emit_zero_block(arena, memory, - variable->size * - emitter->get_size(variable->secondary_type)); + parser->current_type = st; + return emitter->get_size(st); } - - parser->current_type = st; - return emitter->get_size(st); } if(st != SYMBOL_UNDEFINED) { @@ -616,8 +623,7 @@ variable(void) emitter->emit_deref_prolog(arena, code, sym); if(match(TOKEN_LBRACKET)) { - if (sym->scope) - emitter->emit_deref(arena, code, 2); + if(sym->scope) emitter->emit_deref(arena, code, 2); /* add offset of "length"*/ emitter->emit_nat(arena, code, "2", 1); emitter->emit_add(arena, code, 2); @@ -639,8 +645,7 @@ variable(void) parser->current_type = SYMBOL_BYTE; } else if(match(TOKEN_DOT)) { if(sleq("length", parser->current.start, parser->current.length)) { - if (sym->scope) - emitter->emit_deref(arena, code, 2); + if(sym->scope) emitter->emit_deref(arena, code, 2); emitter->emit_deref(arena, code, 2); } else { emitter->error("arrays currently can only get their length, don't do " @@ -650,8 +655,7 @@ variable(void) parser->current_type = SYMBOL_NAT; advance(); } else { - if (sym->scope) - emitter->emit_deref(arena, code, 2); + if(sym->scope) emitter->emit_deref(arena, code, 2); } return; @@ -855,9 +859,7 @@ while_statement(void) void block(void) { - while(!check(TOKEN_RBRACE) && !check(TOKEN_EOF)) { - declaration(); - } + while(!check(TOKEN_RBRACE) && !check(TOKEN_EOF)) declaration(); consume(TOKEN_RBRACE); } @@ -871,7 +873,7 @@ function(void) scope_push(); while(!check(TOKEN_RPAREN)) advance(); consume(TOKEN_RPAREN); - if (is_current_type()) advance(); + if(is_current_type()) advance(); expect(TOKEN_LBRACE); block(); emitter->emit_arena_fn_return(arena, code); diff --git a/test/array.ul b/test/array.ul index ba85608..45027eb 100644 --- a/test/array.ul +++ b/test/array.ul @@ -1,9 +1,7 @@ nat[6] fixed_size = [1, 2, 3, 4, 5, 0]; -if (!fixed_size[5]) { - fixed_size[5] = 6; -} +repair(fixed_size); nat i = 0; while (i < fixed_size.length) { @@ -22,6 +20,12 @@ print("\n"); halt; +function repair(nat[6] arr) { + if (!arr[5]) { + arr[5] = 6; + } +} + function print(str string) { nat i = 0; while (i < string.length) { diff --git a/test/tal/array.tal b/test/tal/array.tal index 0d3fd0e..e69de29 100644 --- a/test/tal/array.tal +++ b/test/tal/array.tal @@ -1,112 +0,0 @@ -|100 - LIT2r 0000 - -;fixed_size #0005 #0002 MUL2 ADD2 #0002 ADD2 LDA2 #0000 EQU2 #03 JCN !{ -;fixed_size #0005 #0002 MUL2 ADD2 #0002 ADD2 #0006 SWP2 STA2 -!&if_end.0 } &if_end.0 - STH2kr #000c ADD2 LDA2 -#0000 STH2kr #000c ADD2 STA2 - -&while.0 STH2kr #000c ADD2 LDA2 ;fixed_size LDA2 LTH2 #03 JCN !{ -;fixed_size STH2kr #000c ADD2 LDA2 #0002 MUL2 ADD2 #0002 ADD2 LDA2 nat_to_str_ print_ - STH2kr #000c ADD2 LDA2 ;fixed_size LDA2 #0001 SUB2 LTH2 #03 JCN !{ -;{ #0001 ADD2 } !{ 0001 20 00 } print_ -!&if_end.1 } &if_end.1 - STH2kr #000c ADD2 LDA2 #0001 ADD2 STH2kr #000c ADD2 STA2 -!&while.0 } -;{ #0001 ADD2 } !{ 0002 0a 00 } print_ -POP2r BRK -@print_ ( string -- ) - OVR2r LIT2r 0004 SUB2r - STH2kr STA2 - - STH2kr #0002 ADD2 LDA2 -#0000 STH2kr #0002 ADD2 STA2 - -&while.1 STH2kr #0002 ADD2 LDA2 STH2kr LDA2 LDA2 LTH2 #03 JCN !{ - STH2kr LDA2 #0002 ADD2 STH2kr #0002 ADD2 LDA2 ADD2 LDA #18 DEO - STH2kr #0002 ADD2 LDA2 #0001 ADD2 STH2kr #0002 ADD2 STA2 -!&while.1 } - &return - POP2r JMP2r - -@pln_ ( string -- ) - OVR2r LIT2r 0002 SUB2r - STH2kr STA2 - - STH2kr LDA2 print_ -#0a #18 DEO - &return - POP2r JMP2r - -@sext - #80 ANDk EQU #ff MUL SWP JMP2r - -@aalloc_ ( size* -- result* ) - OVR2r LIT2r 0004 SUB2r STH2kr INC2 INC2 STA2 - ;mem_length_ LDA2 STH2kr STA2 - ;mem_length_ LDA2k STH2kr INC2 INC2 LDA2 ADD2 SWP2 STA2 - ;mem_ STH2kr LDA2 ADD2 !&return - #0000 - - &return - POP2r JMP2r - -@afree_ ( -- result* ) - OVR2r #0000 ;mem_length_ STA2 - #0000 - - &return - POP2r JMP2r - -@amcpy_ ( length* from* -- result* ) - OVR2r LIT2r 000a SUB2r STH2kr #0008 ADD2 STA2 - STH2kr #0006 ADD2 STA2 - STH2kr #0006 ADD2 LDA2 INC2 INC2 STH2kr #0004 ADD2 STA2 - STH2kr #0004 ADD2 LDA2 aalloc_ - STH2kr INC2 INC2 STA2 - STH2kr #0006 ADD2 LDA2 #00ff AND2 NIP sext - STH2kr INC2 INC2 LDA2 STA - POP STH2kr #0006 ADD2 LDA2 #08 SFT2 #00ff AND2 NIP sext - STH2kr INC2 INC2 LDA2 INC2 STA - POP #0000 STH2kr STA2 - - &begin.1 - STH2kr LDA2 STH2kr #0006 ADD2 LDA2 LTH2 #00 EQU ?&break.1 - STH2kr #0008 ADD2 LDA2 STH2kr LDA2 ADD2 LDA sext - STH2kr INC2 INC2 LDA2 STH2kr LDA2 INC2 INC2 ADD2 STA - POP - - &continue.1 - STH2kr LDA2k INC2k ROT2 STA2 - POP2 !&begin.1 - - &break.1 - STH2kr INC2 INC2 LDA2 !&return - #0000 - - &return - POP2r JMP2r - -@nat_to_str_ ( n* -- result* ) - OVR2r LIT2r 000a SUB2r STH2kr #0008 ADD2 STA2 - #0005 STH2kr STA2 - - &begin.1 - STH2kr #0008 ADD2 LDA2 #000a OVR2 OVR2 DIV2 MUL2 SUB2 #0030 ADD2 STH2kr INC2 INC2 STH2kr LDA2k #0001 SUB2 SWP2 STA2k - POP2 ADD2 STA - POP STH2kr #0008 ADD2 LDA2k #000a DIV2 SWP2 STA2 - - &continue.1 - #0000 STH2kr #0008 ADD2 LDA2 LTH2 ?&begin.1 - - &break.1 - #0005 STH2kr LDA2 SUB2 STH2kr INC2 INC2 STH2kr LDA2 ADD2 amcpy_ - !&return - #0000 - - &return - POP2r JMP2r -@mem_length_ #0009 -@mem_ @fixed_size 0006 0001 0002 0003 0004 0005 0000 -