# HG changeset patch # User Shinji KONO # Date 1396834032 -32400 # Node ID 66f32d0af4d21c664a51b5e4b03b305576348ab9 # Parent d712ee10feb7663a34de54133cab04a4c2e28cd7 local struct initialization target management in decl diff -r d712ee10feb7 -r 66f32d0af4d2 mc-parse.c --- a/mc-parse.c Sun Apr 06 19:20:58 2014 +0900 +++ b/mc-parse.c Mon Apr 07 10:27:12 2014 +0900 @@ -51,7 +51,7 @@ extern double strtod(const char *nptr, char **endptr); #endif -int parse_mode = 0; // generate parse tree for all code +int parse_mode = 1; // generate parse tree for all code static int HEAP_REPORT = 0; static int lfree_type_limit; // debugging purpose @@ -187,6 +187,7 @@ static void statement(int); static int typename(void); static int decl_data_field(int type,int v,int offset); +static int decl_data_def(NMTBL *n, int t, int v,int offset,int skip); static int decl_data(int t, int v,int offset,int skip); static int typeid(int s); extern NMTBL * get_name_from_chptr(); @@ -967,8 +968,7 @@ v = list3n(n->sc,n->dsp,n); if (sym==ASS && n!=&null_nptr) { conv->op_(sym); - local_nptr = n; local_struct_offset = 0; - init = decl_data(type,v,0,0); data_closing(v); + init = decl_data_def(n, type,v,0,0); data_closing(v); } if (inmode && (mode==LDECL||mode==LLDECL||mode==STADECL)) { parse = list5n(ST_DECL,parse,list3(mode,stmode,ctmode),init,n); @@ -990,8 +990,7 @@ v = list3n(n->sc,n->dsp,n); if (sym==ASS && n!=&null_nptr) { conv->op_(sym); - local_nptr = n; local_struct_offset = 0; - init = decl_data(type,v,0,0);data_closing(v); + init = decl_data_def(n, type,v,0,0);data_closing(v); } if (inmode && mode==LDECL) { parse = list5n(ST_DECL,parse, @@ -1728,6 +1727,18 @@ */ static int +decl_data_def(NMTBL *n, int t, int v,int offset,int skip) +{ + NMTBL *slocal_nptr = local_nptr; + local_nptr = n; + int slocal_struct_offset = local_struct_offset ; + int e = decl_data(t,v,offset,skip); + local_struct_offset = slocal_struct_offset ; + local_nptr = slocal_nptr; + return e; +} + +static int decl_data(int t, int v,int offset,int skip) { int t0,t1=0,e,i,mode_save,lc=0; @@ -4145,11 +4156,11 @@ int local_offset; if (mode==GDECL||inmode) { int e2,e3; - e1 = size(type); + int sz = size(type); e2 = list3n(GVAR,0,nptr0); e3 = decl_data_field(type,e2,0); if (!inmode) { - e1 = list3(RSTRUCT,e2,e1); + e1 = list3(RSTRUCT,e2,sz); } else { e1 = reverse0(e3); e1 = list3(DECL_DATA,e1,t); @@ -4157,6 +4168,8 @@ } } else { if (!local_nptr) { + // struct initialization for this variable + // (struct hoge) { .fuga = 5 } local_nptr = nptr0; int smode = mode; mode = LDECL; def(nptr0,0); @@ -4170,16 +4183,23 @@ local_offset = local_struct_offset; int offset = decl_data_field(type,e1,local_struct_offset); if (offset==local_struct_offset) { + // empty case, let's zero clear now int sz = size(type); zfill(e1,offset,sz); local_struct_offset = offset + sz; - } + } else + local_struct_offset = offset; #endif } if (mode==STAT && decl_str_init) gen_delayed_decl_data(e1,local_offset); if (init_vars && mode!=LDECL) { emit_init_vars(); } + if (nptr0==local_nptr) { + // I have created this, sanitize + local_nptr = 0; + local_struct_offset = 0; + } conv->rc_(); checksym(RC); type = t;