--- p/objects.c.orig Wed Mar 26 08:44:28 2003 +++ p/objects.c Fri Mar 28 16:14:29 2003 @@ -261,7 +261,7 @@ if (TREE_CODE (cp) == TREE_LIST && TREE_VALUE (cp)) { tree descr = TREE_VALUE (cp); - tree arg, argtypes, method, method_field; + tree method, method_field; tree heading = build_routine_heading (type, TREE_PURPOSE (cp), TREE_VALUE (descr), TREE_PURPOSE (descr), TREE_TYPE (descr), 0); tree name = TREE_OPERAND (TREE_PURPOSE (heading), 0); @@ -275,16 +275,14 @@ PASCAL_STRUCTOR_METHOD (TREE_PURPOSE (heading)) = PASCAL_STRUCTOR_METHOD (descr); TREE_OPERAND (TREE_PURPOSE (heading), 0) = method_name; method = grok_directive (TREE_VALUE (heading), TREE_PURPOSE (heading), NULL_TREE, virtual == 2 ? 6 : 5); - argtypes = NULL_TREE; - for (arg = TREE_OPERAND (TREE_PURPOSE (heading), 1); arg; arg = TREE_CHAIN (arg)) - if (TREE_PURPOSE (arg)) - argtypes = chainon (argtypes, TREE_TYPE (TREE_PURPOSE (arg))); if (!EM (method)) { DECL_CONTEXT (method) = type; DECL_NO_STATIC_CHAIN (method) = 1; /* @@ ? */ PASCAL_VIRTUAL_METHOD (method) = virtual != 0; PASCAL_ABSTRACT_METHOD (method) = virtual == 2; + if (virtual) + mark_addressable (method); if (virtual && PASCAL_CONSTRUCTOR_METHOD (method)) error ("constructors must not be virtual or abstract"); method_field = copy_node (method); @@ -427,17 +425,9 @@ for (field = TYPE_METHODS (type); field; field = TREE_CHAIN (field)) if (PASCAL_VIRTUAL_METHOD (field)) { - tree method_name, method, dest2 = type; - do - { - method_name = get_method_name (TYPE_LANG_OBJECT_NAME (dest2), DECL_NAME (field)); - method = lookup_name (method_name); - dest2 = TYPE_LANG_BASE (dest2); - } - while (!method && dest2); - assert (method); + tree method; if (!PASCAL_ABSTRACT_METHOD (field)) - method = build_unary_op (ADDR_EXPR, method, 0); + method = build_unary_op (ADDR_EXPR, field, 0); else { if (TYPE_LANG_CODE (type) != PASCAL_LANG_ABSTRACT_OBJECT) @@ -449,7 +439,7 @@ warning (" it contains abstract method `%s'", IDENTIFIER_NAME (DECL_NAME (field))); } } - method = convert (build_pointer_type (TREE_TYPE (method)), integer_zero_node); + method = convert (build_pointer_type (TREE_TYPE (field)), integer_zero_node); } vmt_entry = chainon (vmt_entry, build_tree_list (NULL_TREE, method)); }