Files
mercury/tests/hard_coded
Peter Wang 6be2fe20ee The Java backend was sometimes generating code like this to initialise RTTI
Branches: main

The Java backend was sometimes generating code like this to initialise RTTI
data structures:

    foo_type_info.init(...,
        /* cast */ new TypeInfo_Struct(bar_type_ctor_info), ...);
    bar_type_ctor_info.init(...);

where `bar_type_ctor_info' is actually a type_info.

The problem is that the fields of the non-initialised `bar_type_ctor_info'
would be copied into the new TypeInfo_Struct object.  The "cast" is of course
also unnecessary as the bar is already a TypeInfo_Struct.

This patch attempts to fix the problem in two ways:

1. Don't allocate a new TypeInfo_Struct object to emulate the "cast" unless the
value is actually a TypeCtorInfo_Struct, avoiding the problem of copying
uninitialised fields.  Currently this is implemented by a runtime check because
the MLDS `cast' operation doesn't record the original type of the value being
cast.

2. Instead of relying on mlds_to_rtti.m to return a list of RTTI data
structures where sub-structures appear before the structures that reference
them, explicitly perform a topological sort.  This should be more robust.


Unrelated change: use pre-allocated PseudoTypeInfo instances for common
variable numbers (1 through 5).


compiler/rtti_to_mlds.m:
        Add a function to order a list of RTTI definitions as above.

        Use cons instead of list.append in some places now that we can.

compiler/mlds_to_java.m:
        Call the function to order RTTI definitions before outputing
        the initialisations.

        Call TypeInfo_Struct.maybe_new instead of allocating new
        TypeInfo_Structs.

        Generate code that uses pre-allocated PseudoTypeInfo instances.

java/runtime/TypeInfo_Struct.java:
        Add a `maybe_new' method for "casting" TypeCtorInfo_Structs to
        TypeInfos or returning the argument unchanged.

        Delete a copy constructor; now unused.

        Add some assertions.

java/runtime/PseudoTypeInfo.java:
        Add static instances of PseudoTypeInfo.

tests/hard_coded/Mmakefile:
tests/hard_coded/java_rtti_bug.exp:
tests/hard_coded/java_rtti_bug.m:
        Add test case.
2009-06-26 01:12:00 +00:00
..
2004-01-08 04:49:47 +00:00
2008-08-27 03:58:44 +00:00
2008-08-27 03:58:44 +00:00
2008-08-27 03:58:44 +00:00
2008-03-26 11:02:16 +00:00
2008-03-26 11:02:16 +00:00
2008-03-26 11:02:16 +00:00
2008-03-26 11:02:16 +00:00
2007-02-22 05:56:45 +00:00
2009-05-07 07:42:16 +00:00
2006-11-14 21:36:27 +00:00
2006-11-14 21:36:27 +00:00
2005-09-12 13:00:15 +00:00
2005-09-12 13:00:15 +00:00
2007-06-25 00:47:35 +00:00