Leo --

I tried my hand at adding a naiive (that is, incorrect) version of

    .const <type> <ident> = <literal>

to imcc. I'm forwarding the patch. What it does is combine the
creation of the identifier with the assignment of the value. It is
incorrect (of course) because it uses a register, when it should
not be necessary to assign a register. Although, I suppose a
later version of imcc could determine that there was a single
assign of a literal value to the register and optimize it away,
substituting the constant literal value...

This is useful for the .imc that jakoc generates to reflect the
intended semantics (even though right now its generating
using a register rather than the smarter way).

I did not commit the changes, since I don't "own" the imcc
goals, design, or implementation. If you think this is consistent
with the goals and design of imcc, though, either I can commit
it, or you could apply the patch....

Also, the patch does not include changes to the documentation,
although that would not be hard.

----------

I don't know where to start to add the ability to have .locals declared
in the straight line code be accessible (like globals) inside .subs.
But, this also is a critical feature before I can commit the latest jakoc
code, since using multiple .subs instead of the one big bracketing
one like I used to is now thwarting my use of .local for *all* symbolics.

Can you provide any assistance/guidance here? If you think imcc
already supports other ways (that is, ways that are more correct,
rather than just workarounds -- I could work around it by going back
to my old "outer .sub only" approach) of doing what I'm trying, I'm
eager to learn...


Regards,

-- Gregor


Index: imcc.l
===================================================================
RCS file: /cvs/public/parrot/languages/imcc/imcc.l,v
retrieving revision 1.18
diff -u -r1.18 imcc.l
--- imcc.l               7 Dec 2002 13:29:59 -0000               1.18
+++ imcc.l               10 Dec 2002 19:34:31 -0000
@@ -93,6 +93,7 @@
 ".namespace"    return(NAMESPACE);
 ".endnamespace" return(ENDNAMESPACE);
 ".local"        return(LOCAL);
+".const"        return(CONST);
 ".param"        return(PARAM);
 "end"           return(END);
 "goto"          return(GOTO);
Index: imcc.y
===================================================================
RCS file: /cvs/public/parrot/languages/imcc/imcc.y,v
retrieving revision 1.34
diff -u -r1.34 imcc.y
--- imcc.y               10 Dec 2002 08:55:14 -0000              1.34
+++ imcc.y               10 Dec 2002 19:34:31 -0000
@@ -367,7 +367,7 @@
 }
 
 %token <t> CALL GOTO ARG PRINT IF UNLESS NEW END SAVEALL RESTOREALL
-%token <t> SUB NAMESPACE ENDNAMESPACE CLASS ENDCLASS SYM LOCAL PARAM
+%token <t> SUB NAMESPACE ENDNAMESPACE CLASS ENDCLASS SYM LOCAL CONST 
PARAM
 %token <t> INC DEC
 %token <t> SHIFT_LEFT SHIFT_RIGHT INTV FLOATV STRINGV DEFINED LOG_XOR
 %token <t> RELOP_EQ RELOP_NE RELOP_GT RELOP_GTE RELOP_LT RELOP_LTE
@@ -470,6 +470,7 @@
     |   if_statement
     |   NAMESPACE IDENTIFIER            { push_namespace($2); }
     |   ENDNAMESPACE IDENTIFIER         { pop_namespace($2); }
+    |   CONST { is_def=1; } type IDENTIFIER '=' var { $$ = MK_I("set", 
R2(mk_ident($4, $3), $6)); is_def=0; }
     |   LOCAL { is_def=1; } type IDENTIFIER { mk_ident($4, $3);is_def=0; 
}
     |   PARAM { is_def=1; } type IDENTIFIER { $$ = MK_I("restore",
 R1(mk_ident($4, $3)));is_def=0; }
Index: t/syn/namespace.t
===================================================================
RCS file: /cvs/public/parrot/languages/imcc/t/syn/namespace.t,v
retrieving revision 1.1
diff -u -r1.1 namespace.t
--- t/syn/namespace.t            7 Dec 2002 13:30:02 -0000 1.1
+++ t/syn/namespace.t            10 Dec 2002 19:34:31 -0000
@@ -6,8 +6,7 @@
 ##############################
 output_is(<<'CODE', <<'OUT', "namespace 1");
 .sub _foo
-    .local int x
-    x = 5
+    .const int x = 5
     .namespace A
     .local int x
     x = 3

Reply via email to