* 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:
}
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 */
;
CaseStatement
- : K_CASE Expression K_OF CaseLimbList
+ : K_CASE Expression K_OF CaseLimbList {
+ /* TODO */
+ dpas_error("`case' statements not yet implemented");
+ }
;
CaseLimbList
;
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
(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) &&
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($$);
}
;
}
| Variable '[' ExpressionList ']' {
/* TODO */
+ dpas_error("array expression not yet implemented");
+ dpas_sem_set_error($$);
}
| Variable '.' Identifier {
/* Fetch the effective address of a record field */
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.
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.
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);