changeset 872:11abda130b91

struct init on going ...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Tue, 01 Apr 2014 16:57:16 +0900
parents 662e2b778fc2
children 509a394c5ff9
files mc-code-ia32.c mc-parse.c test/ps2.c
diffstat 3 files changed, 26 insertions(+), 36 deletions(-) [+]
line wrap: on
line diff
--- a/mc-code-ia32.c	Tue Apr 01 11:28:49 2014 +0900
+++ b/mc-code-ia32.c	Tue Apr 01 16:57:16 2014 +0900
@@ -3196,26 +3196,18 @@
 void
 code_builtin_fabsf(int e)
 {
-    int e1 = USE_CREG;
-    use_float(0,e1);
 }
 void
 code_builtin_fabs(int e)
 {
-    int e1 = USE_CREG;
-    use_float(1,e1);
 }
 void
 code_builtin_inff()
 {
-    int e1 = USE_CREG;
-    use_float(0,e1);
 }
 void
 code_builtin_inf()
 {
-    int e1 = USE_CREG;
-    use_float(1,e1);
 }
 
 void code_dneg(int freg,int d)
--- a/mc-parse.c	Tue Apr 01 11:28:49 2014 +0900
+++ b/mc-parse.c	Tue Apr 01 16:57:16 2014 +0900
@@ -1560,44 +1560,32 @@
 static int
 decl_data_1(int type0,int v,int offset)
 {
-    int t = type0;
-
     // casted initializer    (sturct hoge){.a=3,.b=c,...}
+
+    getsym(0);
     if (sym==LPAR) {
-        getsym(0);
 	offset = decl_data_1(type,v,offset);
 	checksym(RPAR);
     } else if (typeid(sym)) {
-	t = typename();
+	int t = typename();
 	checksym(RPAR);
 	offset = decl_data(t,v,offset,1);
 	if (inmode)
 	    offset = list4(CAST,offset,t,type);
     } else {
-        int mode_save = mode;
-        mode=STAT;
- 	int e=expr1();
-	mode = mode_save;
-	if (inmode) {
-	    offset = list3(DECL_DATA,e,type);
-	    type=t;
-	    return offset;
-	}
- 	offset = assign_data(e,t,v,offset);
- 	type=t;
-	return offset;
+        return 0;
     }
     return offset;
 }
 
 static int
-decl_data_field(int type,int v,int offset)
+decl_data_field(int type1,int v,int offset)
 {
     int t1,t2,period=0;
     int foffset;
     // int offset0 = offset+size(type);
     int mode_save=mode;
-    int type0=type_value(type);
+    int type0=type_value(type1);
     NMTBL *nptr1;
 
     if(cadr(type0)==-1) {  // no struct field defenition
@@ -1608,23 +1596,33 @@
     if (sym==LC) {
 	mode = STAT;
 	getsym(0);
-    } else {
+    } else if (sym==LPAR) {
 	// have to be a value, no comma cascading values
         //    .__tcp_lhash_lock = (rwlock_t) { },
         // We cannot distinguish this case and cascading comma here.
         // Do it more upper syntactical node;
-        int par = (sym==LPAR);
-        if (par) getsym(0);
 	if (inmode) {
 	    int offset1=decl_data_1(car(t1),v,0);
 	    offset1 = reverse0(offset1);
 	    offset=list3(DECL_DATA,offset1,car(t1));
-	    return offset;
 	}  else {
 	    offset=decl_data_1(car(t1),v,offset);
-	    if (!offset && par ) checksym(RPAR);
+            if (!offset) checksym(RPAR);
+	}
+	return offset;
+    } else {
+        int mode_save = mode;
+        int stype = type;
+        mode=STAT;
+ 	int e=expr1();
+	mode = mode_save;
+        type = stype;
+	if (inmode) {
+	    offset = list3(DECL_DATA,e,car(t1));
 	    return offset;
 	}
+ 	offset = assign_data(e,car(t1),v,offset);
+	return offset;
     }
     mode=SFDINIT;
     while(1) {
@@ -1633,7 +1631,7 @@
 	    getsym(0);
 	    if (sym==IDENT) {
 		nptr1 = nptr;
-		t2 = search_struct_type(type,nptr1->nm,&foffset);
+		t2 = search_struct_type(type1,nptr1->nm,&foffset);
 		if (!t2) error(UFLDERR);
 		getsym(0);
 		if (sym==ASS) {
@@ -1902,8 +1900,8 @@
 	}
 	conv->decl_data_end_(); conv->rc_();
 	if (lc) {
-	    while (sym==COMMA) getsym(0);  // why we need this?!
-	    checksym(RC);
+            while (sym==COMMA) getsym(0);  // why we need this?!
+            checksym(RC);
 	}
 	return offset;
     } 
--- a/test/ps2.c	Tue Apr 01 11:28:49 2014 +0900
+++ b/test/ps2.c	Tue Apr 01 16:57:16 2014 +0900
@@ -76,8 +76,8 @@
     if(!this) return;
     if(this->mtd)  this->mtd( this );
     if(this->draw) this->draw( this, work, base );
-    printf("#0078:offset draw %ld\n",((char*)(&this->draw) - ((char*)&this->object)));
-    printf("#0079:offset next %ld\n",((char*)(&this->next) - ((char*)&this->object)));
+    printf("#0078:offset draw %ld\n",(long)((char*)(&this->draw) - ((char*)&this->object)));
+    printf("#0079:offset next %ld\n",(long)((char*)(&this->next) - ((char*)&this->object)));
 
     if(this->child) graphic_ObjNode_draw( this->child, work );
     if(this->next)  graphic_ObjNode_draw( this->next,  base );