block static variables seem to be working

This commit is contained in:
pommicket 2022-02-05 18:07:42 -05:00
parent c5e2556d31
commit d718819ee7
2 changed files with 57 additions and 9 deletions

View file

@ -1,10 +1,24 @@
static int g;
int f(void) { int f(void) {
lbl1:break;;goto blah; lbl1:break;;goto blah;
case -1-3: case -1-3:
continue;a:break;return;return 6+3<<sizeof(int); continue;a:break;return;return 6+3<<sizeof(int);
goto lbl1; goto lbl1;
case 77:;return 92834; case 77:;return 92834;
return g;
static int x = 0x12345; static int x = 0x12345;
return x;
}
int h(void) {
static long x = 0x12345;
return x;
{
static unsigned short x = 0x123f;
return x;
}{{{{{{{{{{{{{{static unsigned x = 0x1234567; return x;}}}}}}}}return x;}}}}}return x;}
return g;
} }
/* typedef int AA[sizeof x]; */ /* typedef int AA[sizeof x]; */

View file

@ -303,6 +303,7 @@ function write_statement_header
*4out = *4token *4out = *4token
return 0 return 0
; writes statement data for the statement at *p_token to (*)*p_out ; writes statement data for the statement at *p_token to (*)*p_out
; always advances *p_out by exactly 40 bytes, since that's the length of a statement. ; always advances *p_out by exactly 40 bytes, since that's the length of a statement.
function parse_statement function parse_statement
@ -470,7 +471,14 @@ function parse_statement
p = *8block_p_out p = *8block_p_out
*1p = 0 ; probably redundant, but whatever *1p = 0 ; probably redundant, but whatever
*8block_p_out += 8 ; add 8 and not 1 because of alignment *8block_p_out += 8 ; add 8 and not 1 because of alignment
; clear block-related stuff for this depth
p = block_static_variables
p += block_depth < 3
ident_list_clear(*8p)
block_depth -= 1 block_depth -= 1
goto parse_statement_ret goto parse_statement_ret
:parse_block_eof :parse_block_eof
@ -487,12 +495,21 @@ function parse_statement
; empty statement, e.g. while(something)-> ; <- ; empty statement, e.g. while(something)-> ; <-
token += 16 ; skip semicolon token += 16 ; skip semicolon
goto parse_statement_ret goto parse_statement_ret
function print_statement function print_statement
argument statement argument statement
print_statement_with_depth(statement, 0) print_statement_with_depth(statement, 0)
return return
function print_indents
argument count
:print_indent_loop
if count == 0 goto return_0
putc(9)
count -= 1
goto print_indent_loop
function print_statement_with_depth function print_statement_with_depth
argument statement argument statement
argument depth argument depth
@ -502,13 +519,7 @@ function print_statement_with_depth
local dat3 local dat3
local dat4 local dat4
c = depth print_indents(depth)
:print_stmt_indent_loop
if c == 0 goto print_stmt_indent_loop_end
putc(9) ; tab
c -= 1
goto print_stmt_indent_loop
:print_stmt_indent_loop_end
c = *1statement c = *1statement
dat1 = statement + 8 dat1 = statement + 8
@ -573,6 +584,8 @@ function print_statement_with_depth
dat1 += 40 dat1 += 40
goto print_block_loop goto print_block_loop
:print_block_loop_end :print_block_loop_end
depth -= 1
print_indents(depth)
putcln('}) putcln('})
return return
:print_stmt_goto :print_stmt_goto
@ -2221,11 +2234,22 @@ function parse_expression
out += 8 out += 8
return out return out
:not_enumerator :not_enumerator
; @TODO: check if it's a local variable
n = block_depth
:var_lookup_loop
; check if it's a block static variable
p = block_static_variables
p += n < 3
c = ident_list_lookup(*8p, a)
if c != 0 goto found_global_variable
; @TODO: check if it's a local variable
n -= 1
if n >= 0 goto var_lookup_loop
; check if it's a global ; check if it's a global
c = ident_list_lookup(global_variables, a) c = ident_list_lookup(global_variables, a)
if c == 0 goto not_global if c == 0 goto not_global
:found_global_variable
; it is a global variable ; it is a global variable
*1out = EXPRESSION_GLOBAL_VARIABLE *1out = EXPRESSION_GLOBAL_VARIABLE
out += 4 out += 4
@ -3169,6 +3193,7 @@ function print_expression
:print_expr_skip_type :print_expr_skip_type
c = *1expression c = *1expression
if c == EXPRESSION_GLOBAL_VARIABLE goto print_global_variable
if c == EXPRESSION_CONSTANT_INT goto print_expr_int if c == EXPRESSION_CONSTANT_INT goto print_expr_int
if c == EXPRESSION_CONSTANT_FLOAT goto print_expr_float if c == EXPRESSION_CONSTANT_FLOAT goto print_expr_float
if c == EXPRESSION_POST_INCREMENT goto print_post_increment if c == EXPRESSION_POST_INCREMENT goto print_post_increment
@ -3195,6 +3220,15 @@ function print_expression
string Bad expression passed to print_expression. string Bad expression passed to print_expression.
byte 10 byte 10
byte 0 byte 0
:str_global_at
string global@
byte 0
:print_global_variable
puts(.str_global_at)
expression += 8
putx32(*8expression)
expression += 8
return expression
:print_cast :print_cast
; we've already printed the type ; we've already printed the type
expression += 8 expression += 8