]> git.unchartedbackwaters.co.uk Git - francis/libjit.git/commitdiff
Report errors for unimplemented expressions and statements,
authorRhys Weatherley <rweather@southern-storm.com.au>
Tue, 11 May 2004 06:52:19 +0000 (06:52 +0000)
committerRhys Weatherley <rweather@southern-storm.com.au>
Tue, 11 May 2004 06:52:19 +0000 (06:52 +0000)
so that users are not "surprised" when things silently fail.

ChangeLog
dpas/dpas-parser.y
dpas/dpas-types.c
dpas/dpas-types.h

index 4a8db29eaf974acfbcdf0f147d0a702b3f6cadda..569c4923bab2221f48b486416e6fe62528832210 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
        * jit/jit-reg-alloc.c (_jit_regs_load_to_top_two): handle the
        case where the second value is on the stack but not the first.
 
+       * dpas/dpas-parser.y, dpas/dpas-types.c, dpas/dpas-types.h:
+       report errors for unimplemented expressions and statements,
+       so that users are not "surprised" when things silently fail.
+
 2004-05-10  Rhys Weatherley  <rweather@southern-storm.com.au>
 
        * jit/jit-reg-alloc.c, jit/jit-reg-alloc.h, jit/jit-rules-interp.c:
index 05dc8ada55a805090f96d4ef19fd5957ff0d6180..3561095059c6a069657eae601796bb1571eee085 100644 (file)
@@ -1523,16 +1523,28 @@ InnerStatement
                                }
                                expression_list_free($2.exprs, $2.len);
                        }
-       | K_GOTO Label
+       | K_GOTO Label          {
+                               /* TODO */
+                               dpas_error("`goto' statements not yet implemented");
+                       }
        | CompoundStatement
        | IfStatement
        | WhileStatement
        | RepeatStatement
        | ForStatement
        | CaseStatement
-       | K_WITH VariableList K_DO Statement
-       | K_THROW Expression
-       | K_THROW
+       | K_WITH VariableList K_DO Statement    {
+                               /* TODO */
+                               dpas_error("`with' statements not yet implemented");
+                       }
+       | K_THROW Expression            {
+                               /* TODO */
+                               dpas_error("`throw' statements not yet implemented");
+                       }
+       | K_THROW                                       {
+                               /* TODO */
+                               dpas_error("`throw' statements not yet implemented");
+                       }
        | TryStatement
        | K_EXIT                {
                                /* Exit from the current loop level */
@@ -2101,7 +2113,10 @@ Direction
        ;
 
 CaseStatement
-       : K_CASE Expression K_OF CaseLimbList
+       : K_CASE Expression K_OF CaseLimbList           {
+                               /* TODO */
+                               dpas_error("`case' statements not yet implemented");
+                       }
        ;
 
 CaseLimbList
@@ -2124,7 +2139,10 @@ VariableList
        ;
 
 TryStatement
-       : K_TRY StatementSequence OptSemi CatchClause FinallyClause K_END
+       : K_TRY StatementSequence OptSemi CatchClause FinallyClause K_END       {
+                               /* TODO */
+                               dpas_error("`try' statements not yet implemented");
+                       }
        ;
 
 CatchClause
@@ -2402,8 +2420,16 @@ Factor
                                        (dpas_current_function(), &($1));
                                dpas_sem_set_rvalue($$, $1.type, value);
                        }
-       | '[' ExpressionList ']'                { /* TODO */ }
-       | '[' ']'                                               { /* TODO */ }
+       | '[' ExpressionList ']'                {
+                               /* TODO */
+                               dpas_error("set expressions not yet implemented");
+                               dpas_sem_set_error($$);
+                       }
+       | '[' ']'                                               {
+                               /* TODO */
+                               dpas_error("set expressions not yet implemented");
+                               dpas_sem_set_error($$);
+                       }
        | K_NOT Factor                                  {
                                jit_value_t value;
                                if(dpas_sem_is_rvalue($2) &&
@@ -2536,10 +2562,36 @@ Factor
                                        dpas_sem_set_error($$);
                                }
                        }
-       | K_VA_ARG '(' TypeIdentifier ')'               { /* TODO */ }
-       | K_SIZEOF '(' Variable ')'                             { /* TODO */ }
+       | K_VA_ARG '(' TypeIdentifier ')'               {
+                               /* TODO */
+                               dpas_error("`va_arg' not yet implemented");
+                               dpas_sem_set_error($$);
+                       }
+       | K_SIZEOF '(' Variable ')'                             {
+                               jit_nuint size;
+                               jit_value_t value;
+                               if(dpas_sem_is_rvalue($3) || dpas_sem_is_type($3))
+                               {
+                                       size = jit_type_get_size(dpas_sem_get_type($3));
+                                       value = jit_value_create_nint_constant
+                                               (dpas_current_function(), dpas_type_size_t,
+                                                (jit_nint)size);
+                                       if(!value)
+                                       {
+                                               dpas_out_of_memory();
+                                       }
+                                       dpas_sem_set_rvalue($$, dpas_type_size_t, value);
+                               }
+                               else
+                               {
+                                       dpas_error("invalid operand to `sizeof'");
+                                       dpas_sem_set_error($$);
+                               }
+                       }
        | '(' K_IF Expression K_THEN Expression K_ELSE Expression ')'   {
                                /* TODO */
+                               dpas_error("ternary `if' not yet implemented");
+                               dpas_sem_set_error($$);
                        }
        ;
 
@@ -2643,6 +2695,8 @@ Variable
                        }
        | Variable '[' ExpressionList ']'       {
                                /* TODO */
+                               dpas_error("array expression not yet implemented");
+                               dpas_sem_set_error($$);
                        }
        | Variable '.' Identifier                       {
                                /* Fetch the effective address of a record field */
index 056daa5c6566c2f7c93885604852d65751184fa0..0bc1ae827ffa0cedaa7f692aa73607854f0eb6cf 100644 (file)
@@ -30,6 +30,8 @@ jit_type_t dpas_type_char;
 jit_type_t dpas_type_string;
 jit_type_t dpas_type_address;
 jit_type_t dpas_type_nil;
+jit_type_t dpas_type_size_t;
+jit_type_t dpas_type_ptrdiff_t;
 
 /*
  * Register a predefined type within the global scope.
@@ -127,6 +129,8 @@ void dpas_init_types(void)
        dpas_type_address = jit_type_void_ptr;
        dpas_type_nil = jit_type_create_tagged
                (jit_type_void_ptr, DPAS_TAG_NIL, 0, 0, 1);
+       dpas_type_size_t = get_uint_type(sizeof(size_t));
+       dpas_type_ptrdiff_t = get_uint_type(sizeof(ptrdiff_t));
 
        /*
         * Register all of the builtin types.
@@ -178,8 +182,8 @@ void dpas_init_types(void)
        register_type("LongReal", jit_type_nfloat);
        register_type("Extended", jit_type_nfloat);
 
-       register_type("PtrDiffType", get_int_type(sizeof(ptrdiff_t)));
-       register_type("SizeType", get_uint_type(sizeof(size_t)));
+       register_type("PtrDiffType", dpas_type_ptrdiff_t);
+       register_type("SizeType", dpas_type_size_t);
 
        register_type("SysInt", jit_type_sys_int);
        register_type("SysCard", jit_type_sys_uint);
index 855d9134ccdc31c4be0c69eb5c7bdea850d62ed7..95f4fe5f7e44739dc5443049c852fc1968b861e0 100644 (file)
@@ -49,6 +49,8 @@ extern jit_type_t dpas_type_char;
 extern jit_type_t dpas_type_string;
 extern jit_type_t dpas_type_address;
 extern jit_type_t dpas_type_nil;
+extern jit_type_t dpas_type_size_t;
+extern jit_type_t dpas_type_ptrdiff_t;
 
 /*
  * Information block for a subrange.