changeset 588:82718dc9f758

declaration anyware
author kono
date Wed, 18 Jan 2006 16:35:35 +0900
parents c991b82e6849
children f095b8507947
files mc-code-mips.c mc-parse.c
diffstat 2 files changed, 19 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/mc-code-mips.c	Wed Jan 18 15:40:44 2006 +0900
+++ b/mc-code-mips.c	Wed Jan 18 16:35:35 2006 +0900
@@ -182,7 +182,7 @@
 static int max_reg_var, max_freg_var;
 
 static char *reg_name[] = {
-    "$0","$1","$2","$3","$4","$5","$6","$7","$8","$9",
+    "$0","$fp","$2","$3","$4","$5","$6","$7","$8","$9",
     "$10","$11","$12","$13","$14","$15","$16","$17","$18","$19",
     "$20","$21","$22","$23","$24","$25","$26","$27","$28","$29",
     "$30","$31",
--- a/mc-parse.c	Wed Jan 18 15:40:44 2006 +0900
+++ b/mc-parse.c	Wed Jan 18 16:35:35 2006 +0900
@@ -1427,6 +1427,9 @@
 decl_data_1(int type,NMTBL *n,int offset)
 {
     int t;
+
+    // casted initializer    (sturct hoge){.a=3,.b=c,...}
+
     getsym(0);
     if (sym==LPAR) {
 	offset = decl_data_1(type,n,offset);
@@ -1871,11 +1874,12 @@
 /* local decl can be used, after {}         */
 /*  but it's lexical scope remains after {} */
 /*  my be in for(int i=....) not yet  (fixed already?)      */
+/*  After this call, emit_init_vars() is required */
 
 static void
-local_decl()
+local_decl(int scope)
 {
-    enter_scope();
+    if (scope) enter_scope();
     init_vars=0;
     /* local variable declaration */
     stmode=0;
@@ -1944,7 +1948,7 @@
     init_vars=0;
 
     /* local variable declaration */
-    local_decl();
+    local_decl(1);
     control=1;
     cslabel = -1;
     if (!inmode && !chk) gen_enter1();
@@ -2069,6 +2073,16 @@
     if(sym==SM) {
 	conv->sm_();
 	getsym(0); return;
+    } else if (typeid(sym) || sym==REGISTER ) {
+	// anytime local declaration...
+	mode=LDECL;
+	stmode=0;
+	lfree_type_limit = lfree;
+	decl();
+	mode=STAT;
+	checkret();
+	emit_init_vars();
+	goto loop;
     }
     switch(sym) {
     case IF:
@@ -2426,7 +2440,7 @@
     int slimit = lfree_type_limit ;
     int sinit_vars = init_vars;
     conv->lc_();
-    local_decl();
+    local_decl(1);
     emit_init_vars();
     lfree_type_limit = lfree;
     while(sym!=RC) statement(use);