block static variables seem to be working
This commit is contained in:
parent
c5e2556d31
commit
d718819ee7
2 changed files with 57 additions and 9 deletions
14
05/main.c
14
05/main.c
|
@ -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]; */
|
||||||
|
|
52
05/parse.b
52
05/parse.b
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue