WIP array arg for function

This commit is contained in:
zongor 2026-07-15 20:36:29 -07:00
parent 54eaea2424
commit 10ecd1ff85
3 changed files with 65 additions and 171 deletions

View File

@ -108,23 +108,24 @@ scope_add_symbol(const char *name, u32 name_length, SymbolType type, u32 size)
sizeof(Symbol)); sizeof(Symbol));
} }
void CallStack_push(CallStack *stack, Symbol *symbol) { void
if (stack->count >= stack->capacity) { CallStack_push(CallStack *stack, Symbol *symbol)
{
if(stack->count >= stack->capacity)
emitter->error("call stack full", 16, parser->previous.line); emitter->error("call stack full", 16, parser->previous.line);
}
stack->symbols[stack->count] = symbol; stack->symbols[stack->count] = symbol;
stack->count++; stack->count++;
} }
Symbol *CallStack_pop(CallStack *stack) { Symbol *
if (stack->count == 0) { CallStack_pop(CallStack *stack)
{
if(stack->count == 0)
emitter->error("call stack empty", 17, parser->previous.line); emitter->error("call stack empty", 17, parser->previous.line);
}
stack->count--; stack->count--;
return stack->symbols[stack->count]; return stack->symbols[stack->count];
} }
bool bool
is_global(void) is_global(void)
{ {
@ -145,7 +146,6 @@ is_current_type(void)
parser->current.type <= TOKEN_TYPE_PTR; parser->current.type <= TOKEN_TYPE_PTR;
} }
SymbolType SymbolType
token_type_to_sym_type(TokenType t) token_type_to_sym_type(TokenType t)
{ {
@ -403,8 +403,8 @@ variable_declaration(Symbol *def)
List *array_literal; List *array_literal;
if(!def && tt == TOKEN_TYPE_STR) { if(!def && tt == TOKEN_TYPE_STR) {
variable = scope_add_symbol(parser->current.start, parser->current.length, SYMBOL_STR, variable = scope_add_symbol(parser->current.start, parser->current.length,
0); SYMBOL_STR, 0);
if(!variable) { if(!variable) {
emitter->error("cannot find str symbol", 23, parser->current.line); emitter->error("cannot find str symbol", 23, parser->current.line);
@ -424,7 +424,13 @@ variable_declaration(Symbol *def)
return emitter->get_size(st); return emitter->get_size(st);
} }
if(!def && parser->current.type == TOKEN_LBRACKET) { if(parser->current.type == TOKEN_LBRACKET) {
if(def) {
emitter->error("define array argument", 21, parser->previous.line);
} else {
variable = define_array(); variable = define_array();
if(!variable) { if(!variable) {
emitter->error("cannot find array symbol", 25, parser->current.line); emitter->error("cannot find array symbol", 25, parser->current.line);
@ -451,14 +457,15 @@ variable_declaration(Symbol *def)
expect(TOKEN_SEMICOLON); expect(TOKEN_SEMICOLON);
emitter->emit_array(arena, memory, variable, nil); emitter->emit_array(arena, memory, variable, nil);
emitter->emit_zero_block(arena, memory, emitter->emit_zero_block(
variable->size * arena, memory,
emitter->get_size(variable->secondary_type)); variable->size * emitter->get_size(variable->secondary_type));
} }
parser->current_type = st; parser->current_type = st;
return emitter->get_size(st); return emitter->get_size(st);
} }
}
if(st != SYMBOL_UNDEFINED) { if(st != SYMBOL_UNDEFINED) {
size = emitter->get_size(st); size = emitter->get_size(st);
@ -616,8 +623,7 @@ variable(void)
emitter->emit_deref_prolog(arena, code, sym); emitter->emit_deref_prolog(arena, code, sym);
if(match(TOKEN_LBRACKET)) { if(match(TOKEN_LBRACKET)) {
if (sym->scope) if(sym->scope) emitter->emit_deref(arena, code, 2);
emitter->emit_deref(arena, code, 2);
/* add offset of "length"*/ /* add offset of "length"*/
emitter->emit_nat(arena, code, "2", 1); emitter->emit_nat(arena, code, "2", 1);
emitter->emit_add(arena, code, 2); emitter->emit_add(arena, code, 2);
@ -639,8 +645,7 @@ variable(void)
parser->current_type = SYMBOL_BYTE; parser->current_type = SYMBOL_BYTE;
} else if(match(TOKEN_DOT)) { } else if(match(TOKEN_DOT)) {
if(sleq("length", parser->current.start, parser->current.length)) { if(sleq("length", parser->current.start, parser->current.length)) {
if (sym->scope) if(sym->scope) emitter->emit_deref(arena, code, 2);
emitter->emit_deref(arena, code, 2);
emitter->emit_deref(arena, code, 2); emitter->emit_deref(arena, code, 2);
} else { } else {
emitter->error("arrays currently can only get their length, don't do " emitter->error("arrays currently can only get their length, don't do "
@ -650,8 +655,7 @@ variable(void)
parser->current_type = SYMBOL_NAT; parser->current_type = SYMBOL_NAT;
advance(); advance();
} else { } else {
if (sym->scope) if(sym->scope) emitter->emit_deref(arena, code, 2);
emitter->emit_deref(arena, code, 2);
} }
return; return;
@ -855,9 +859,7 @@ while_statement(void)
void void
block(void) block(void)
{ {
while(!check(TOKEN_RBRACE) && !check(TOKEN_EOF)) { while(!check(TOKEN_RBRACE) && !check(TOKEN_EOF)) declaration();
declaration();
}
consume(TOKEN_RBRACE); consume(TOKEN_RBRACE);
} }

View File

@ -1,9 +1,7 @@
nat[6] fixed_size = [1, 2, 3, 4, 5, 0]; nat[6] fixed_size = [1, 2, 3, 4, 5, 0];
if (!fixed_size[5]) { repair(fixed_size);
fixed_size[5] = 6;
}
nat i = 0; nat i = 0;
while (i < fixed_size.length) { while (i < fixed_size.length) {
@ -22,6 +20,12 @@ print("\n");
halt; halt;
function repair(nat[6] arr) {
if (!arr[5]) {
arr[5] = 6;
}
}
function print(str string) { function print(str string) {
nat i = 0; nat i = 0;
while (i < string.length) { while (i < string.length) {

View File

@ -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