+Fri Oct 14 18:54:48 1994 Mike Stump <mrs@cygnus.com>
+
+ * class.c (modify_one_vtable): Since the DECL_CONTEXT of fndecl can
+ be set just below, use current_fndecl instead.
+
Thu Oct 13 17:44:55 1994 Jason Merrill (jason@phydeaux.cygnus.com)
* method.c (build_decl_overload): Set numeric_outputed_need_bar to 0.
* various: Cast pointer arguments to bzero and bcopy to char *.
+Tue Oct 11 19:34:32 1994 Mike Stump <mrs@cygnus.com>
+
+ * class.c (get_derived_offset): Added a type parameter to limit how
+ far up the CLASSTYPE_VFIELD_PARENT chain we search.
+ * class.c (modify_one_vtable, fixup_vtable_deltas): When forming the
+ offset to put into the vtable for the this parameter, make sure we
+ don't offset from a parent of the DECL_CONTEXT of the function.
+
Mon Oct 10 00:56:53 1994 Jason Merrill (jason@phydeaux.cygnus.com)
* lex.c (cons_up_default_function): Mark methods in a template class
BINFO_OFFSET (binfo));
}
-/* Get the offset to the start of the original binfo that we derived this
- binfo from. */
-tree get_derived_offset (binfo)
- tree binfo;
+/* Get the offset to the start of the original binfo that we derived
+ this binfo from. If we find TYPE first, return the offset only
+ that far. The shortened search is useful because the this pointer
+ on method calling is expected to point to a DECL_CONTEXT (fndecl)
+ object, and not a baseclass of it. */
+static tree
+get_derived_offset (binfo, type)
+ tree binfo, type;
{
tree offset1 = get_vfield_offset (TYPE_BINFO (BINFO_TYPE (binfo)));
tree offset2;
&& (i=CLASSTYPE_VFIELD_PARENT (BINFO_TYPE (binfo))) != -1)
{
tree binfos = BINFO_BASETYPES (binfo);
+ if (BINFO_TYPE (binfo) == type)
+ break;
binfo = TREE_VEC_ELT (binfos, i);
}
offset2 = get_vfield_offset (TYPE_BINFO (BINFO_TYPE (binfo)));
Also, we want just the delta bewteen the most base class
that we derived this vfield from and us. */
base_offset = size_binop (PLUS_EXPR,
- get_derived_offset (binfo),
+ get_derived_offset (binfo, DECL_CONTEXT (current_fndecl)),
BINFO_OFFSET (binfo));
this_offset = size_binop (MINUS_EXPR, offset, base_offset);
Also, we want just the delta bewteen the most base class
that we derived this vfield from and us. */
base_offset = size_binop (PLUS_EXPR,
- get_derived_offset (binfo),
+ get_derived_offset (binfo, DECL_CONTEXT (fndecl)),
BINFO_OFFSET (binfo));
this_offset = size_binop (MINUS_EXPR, offset, base_offset);