MODULE Test;
TYPE
- Stream* = POINTER TO Handle;
- Handle = RECORD END;
-
- Writer* = RECORD END;
-
- Printer* = RECORD (Writer) END;
+ Object = RECORD
+ mth : PROCEDURE;
+ END;
VAR
- s : Stream;
- o : Writer;
- out : Printer;
+ p : PROCEDURE;
+ o, a : Object;
+
+PROCEDURE X;
+END X;
-PROCEDURE SetStream(VAR w : Writer; stream : Stream);
+PROCEDURE Z(VAR g : Object);
BEGIN
-END SetStream;
+ g.mth;
+END Z;
BEGIN
- SetStream(o, s);
- SetStream(out, s);
+ p := X;
+ ASSERT(p # NIL);
+ o.mth := X;
+ ASSERT(o.mth # NIL);
+ a := o;
+ ASSERT(a.mth # NIL);
+ Z(a);
END Test.
jvm_generate_var_initialization(p, copy_dst);
jvm_generate_var_initialization(p, copy_src);
+ if(rec -> base)
+ {
+ jvm_generate_load(p, copy_dst);
+ jvm_generate_load(p, copy_src);
+ jvm_generate_copy_record(p, rec -> base);
+ }
+
num = rec -> num_decl;
field = rec -> decl;
for(int i = 0; i < num; i++)
static void
jvm_generate_cast_prefix(gen_proc_t * p, char prefix, char postfix)
{
+ if((prefix == 'b' || prefix == 's') && (postfix = 'l' || postfix == 'd'))
+ {
+ prefix = 'i';
+ }
+
if(prefix == postfix)
{
return;
}
+ if((prefix == 'l' || prefix == 'd') && (postfix == 'b' || postfix == 's'))
+ {
+ jvm_generate(p, 2, 1, "%c2i", prefix);
+ prefix = 'i';
+ }
+
int from_cell_size = jvm_cell_size_for_postfix(prefix);
int to_cell_size = jvm_cell_size_for_postfix(postfix);
jvm_generate(p, from_cell_size, to_cell_size, "%c2%c", prefix, postfix);