]> git.unchartedbackwaters.co.uk Git - francis/libjit.git/commitdiff
Resolve ea-based lvalues in operators.
authorRhys Weatherley <rweather@southern-storm.com.au>
Wed, 12 May 2004 00:30:02 +0000 (00:30 +0000)
committerRhys Weatherley <rweather@southern-storm.com.au>
Wed, 12 May 2004 00:30:02 +0000 (00:30 +0000)
ChangeLog
dpas/dpas-parser.y

index 93217ae30cfabc31f0d380639df50d7fbff415f2..7193630bf839aa444d88efcc231fecac6fee90f1 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -12,6 +12,8 @@
        * dpas/dpas-parser.y (IfTail): fix a bug that caused the "then"
        case of an "if" to fall through to the "else".
 
+       * dpas/dpas-parser.y: resolve ea-based lvalues in operators.
+
 2004-05-11  Rhys Weatherley  <rweather@southern-storm.com.au>
 
        * include/jit/jit-insn.h, jit/jit-insn.c, jit/jit-interp.cpp,
index 1bb9ce1a4b45618487e3546a250052d6c8d1fe2a..91f68f12c851cff3f44ea29fff19df615e621060 100644 (file)
@@ -534,10 +534,11 @@ static dpas_semvalue invoke_procedure
                        }
                        else
                        {
-                               /* TODO: type checking and EA l-values */
+                               /* TODO: type checking */
                                if(dpas_sem_is_rvalue(args[param]))
                                {
-                                       value_args[param] = dpas_sem_get_value(args[param]);
+                                       value_args[param] = dpas_sem_get_value
+                                               (dpas_lvalue_to_rvalue(args[param]));
                                }
                                else
                                {
@@ -612,8 +613,8 @@ static dpas_semvalue invoke_procedure
                                jit_value_t value; \
                                value = func \
                                        (dpas_current_function(), \
-                                        dpas_sem_get_value(arg1), \
-                                        dpas_sem_get_value(arg2)); \
+                                        dpas_sem_get_value(dpas_lvalue_to_rvalue(arg1)), \
+                                        dpas_sem_get_value(dpas_lvalue_to_rvalue(arg2))); \
                                dpas_sem_set_rvalue \
                                        (yyval.semvalue, jit_value_get_type(value), value); \
                        } \
@@ -640,8 +641,8 @@ static dpas_semvalue invoke_procedure
                                jit_value_t value; \
                                value = func \
                                        (dpas_current_function(), \
-                                        dpas_sem_get_value(arg1), \
-                                        dpas_sem_get_value(arg2)); \
+                                        dpas_sem_get_value(dpas_lvalue_to_rvalue(arg1)), \
+                                        dpas_sem_get_value(dpas_lvalue_to_rvalue(arg2))); \
                                dpas_sem_set_rvalue \
                                        (yyval.semvalue, jit_value_get_type(value), value); \
                        } \
@@ -660,8 +661,8 @@ static dpas_semvalue invoke_procedure
                                jit_value_t value; \
                                value = func \
                                        (dpas_current_function(), \
-                                        dpas_sem_get_value(arg1), \
-                                        dpas_sem_get_value(arg2)); \
+                                        dpas_sem_get_value(dpas_lvalue_to_rvalue(arg1)), \
+                                        dpas_sem_get_value(dpas_lvalue_to_rvalue(arg2))); \
                                dpas_sem_set_rvalue \
                                        (yyval.semvalue, jit_value_get_type(value), value); \
                        } \
@@ -2103,7 +2104,7 @@ ForStatement
 BooleanExpression
        : Expression            {
                                /* TODO: type checking */
-                               $$ = $1;
+                               $$ = dpas_lvalue_to_rvalue($1);
                        }
        ;
 
@@ -2227,7 +2228,8 @@ SimpleExpression
                                {
                                        jit_value_t value;
                                        value = jit_insn_neg
-                                               (dpas_current_function(), dpas_sem_get_value($2));
+                                               (dpas_current_function(),
+                                                dpas_sem_get_value(dpas_lvalue_to_rvalue($2)));
                                        dpas_sem_set_rvalue($$, jit_value_get_type(value), value);
                                }
                        }
@@ -2251,6 +2253,8 @@ AdditionExpression
                                        jit_label_t label1 = jit_label_undefined;
                                        jit_label_t label2 = jit_label_undefined;
                                        jit_value_t value, const_value;
+                                       $1 = dpas_lvalue_to_rvalue($1);
+                                       $3 = dpas_lvalue_to_rvalue($3);
                                        if(!jit_insn_branch_if
                                                        (dpas_current_function(),
                                                         dpas_sem_get_value($1), &label1))
@@ -2334,6 +2338,8 @@ Term
                                        jit_label_t label1 = jit_label_undefined;
                                        jit_label_t label2 = jit_label_undefined;
                                        jit_value_t value, const_value;
+                                       $1 = dpas_lvalue_to_rvalue($1);
+                                       $3 = dpas_lvalue_to_rvalue($3);
                                        if(!jit_insn_branch_if_not
                                                        (dpas_current_function(),
                                                         dpas_sem_get_value($1), &label1))
@@ -2426,6 +2432,7 @@ Factor
                        }
        | K_NOT Factor                                  {
                                jit_value_t value;
+                               $2 = dpas_lvalue_to_rvalue($2);
                                if(dpas_sem_is_rvalue($2) &&
                                   dpas_type_is_boolean(dpas_sem_get_type($2)))
                                {