From f36fc82e1c316b6722c019517fda666523be9fe3 Mon Sep 17 00:00:00 2001 From: Ali Gholami Rudi Date: Thu, 7 Nov 2013 17:24:09 +0330 Subject: [PATCH] ncc: use label identifiers more carefully --- gen.c | 2 ++ ncc.c | 16 ++++++++++------ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/gen.c b/gen.c index 1c6f33b..518048a 100644 --- a/gen.c +++ b/gen.c @@ -73,6 +73,8 @@ static int njmps; void o_label(int id) { r_label(id); + if (id >= NJMPS) + err("nomem: NJMPS reached!\n"); if (id > nlabels) nlabels = id + 1; labels[id] = cslen; diff --git a/ncc.c b/ncc.c index c8f35e3..66d958e 100644 --- a/ncc.c +++ b/ncc.c @@ -944,11 +944,12 @@ static void readbitor(void) static void readand(void) { - int l_out = LABEL(); - int l_fail = LABEL(); + int l_out, l_fail; readbitor(); if (tok_see() != TOK2("&&")) return; + l_out = LABEL(); + l_fail = LABEL(); o_fork(); ts_pop_de(NULL); o_jz(l_fail); @@ -970,11 +971,12 @@ static void readand(void) static void reador(void) { - int l_pass = LABEL(); - int l_end = LABEL(); + int l_pass, l_end; readand(); if (tok_see() != TOK2("||")) return; + l_pass = LABEL(); + l_end = LABEL(); o_fork(); ts_pop_de(NULL); o_jnz(l_pass); @@ -1509,17 +1511,19 @@ static void readfunc(struct name *name, int flags) local_add(&arg); } /* first pass: collecting statistics */ + label = 0; + nlabels = 0; o_pass1(); readstmt(); tok_jump(beg); /* second pass: generating code */ + label = 0; + nlabels = 0; o_pass2(); readstmt(); o_func_end(); func_name[0] = '\0'; nlocals = 0; - label = 0; - nlabels = 0; } static void readdecl(void) -- 2.11.4.GIT