beq a1,ex_handle_it /* NULL catches everything */
ldq a0,offobjvftbl(xptr) /* a0 = vftblptr(xptr) */
- ldq a1,offobjvftbl(a1) /* a1 = vftblptr(catchtype) class (not obj) */
+ ldq a0,offclass(a0)
ldl a0,offbaseval(a0) /* a0 = baseval(xptr) */
ldl v0,offbaseval(a1) /* a2 = baseval(catchtype) */
ldl a1,offdiffval(a1) /* a1 = diffval(catchtype) */
Authors: Andreas Krall EMAIL: cacao@complang.tuwien.ac.at
Reinhard Grafl EMAIL: cacao@complang.tuwien.ac.at
- Last Change: $Id: ngen.c 139 1999-11-11 19:21:30Z andi $
+ Last Change: $Id: ngen.c 227 2003-02-12 13:23:24Z stefan $
*******************************************************************************/
M_CMPULE(REG_ITMP1, REG_ITMP2, d);
}
*/
- M_BEQZ(s1, 7);
+ M_BEQZ(s1, 8);
M_ALD(REG_ITMP1, s1, OFFSET(java_objectheader, vftbl));
- a = dseg_addaddress ((void*) super->vftbl);
+ M_ALD(REG_ITMP1, REG_ITMP1, OFFSET(vftbl, class));
+ a = dseg_addaddress ((void*) super);
M_ALD(REG_ITMP2, REG_PV, a);
- M_ILD(REG_ITMP1, REG_ITMP1, OFFSET(vftbl, baseval));
- M_ILD(REG_ITMP3, REG_ITMP2, OFFSET(vftbl, baseval));
- M_ILD(REG_ITMP2, REG_ITMP2, OFFSET(vftbl, diffval));
+ M_ILD(REG_ITMP1, REG_ITMP1, OFFSET(classinfo, baseval));
+ M_ILD(REG_ITMP3, REG_ITMP2, OFFSET(classinfo, baseval));
+ M_ILD(REG_ITMP2, REG_ITMP2, OFFSET(classinfo, diffval));
M_ISUB(REG_ITMP1, REG_ITMP3, REG_ITMP1);
M_CMPULE(REG_ITMP1, REG_ITMP2, d);
}
M_BEQZ(REG_ITMP2, 0);
}
*/
- M_BEQZ(s1, 8 + (d == REG_ITMP3));
+ M_BEQZ(s1, 9 + (d == REG_ITMP3));
M_ALD(REG_ITMP1, s1, OFFSET(java_objectheader, vftbl));
- a = dseg_addaddress ((void*) super->vftbl);
+ M_ALD(REG_ITMP1, REG_ITMP1, OFFSET(vftbl, class));
+ a = dseg_addaddress ((void*) super);
M_ALD(REG_ITMP2, REG_PV, a);
- M_ILD(REG_ITMP1, REG_ITMP1, OFFSET(vftbl, baseval));
+ M_ILD(REG_ITMP1, REG_ITMP1, OFFSET(classinfo, baseval));
if (d != REG_ITMP3) {
- M_ILD(REG_ITMP3, REG_ITMP2, OFFSET(vftbl, baseval));
- M_ILD(REG_ITMP2, REG_ITMP2, OFFSET(vftbl, diffval));
+ M_ILD(REG_ITMP3, REG_ITMP2, OFFSET(classinfo, baseval));
+ M_ILD(REG_ITMP2, REG_ITMP2, OFFSET(classinfo, diffval));
M_ISUB(REG_ITMP1, REG_ITMP3, REG_ITMP1);
}
else {
- M_ILD(REG_ITMP2, REG_ITMP2, OFFSET(vftbl, baseval));
+ M_ILD(REG_ITMP2, REG_ITMP2, OFFSET(classinfo, baseval));
M_ISUB(REG_ITMP1, REG_ITMP2, REG_ITMP1);
M_ALD(REG_ITMP2, REG_PV, a);
- M_ILD(REG_ITMP2, REG_ITMP2, OFFSET(vftbl, diffval));
+ M_ILD(REG_ITMP2, REG_ITMP2, OFFSET(classinfo, diffval));
}
M_CMPULE(REG_ITMP1, REG_ITMP2, REG_ITMP2);
M_BEQZ(REG_ITMP2, 0);
return 0;
*/
- return (unsigned) (sub->vftbl->baseval - super->vftbl->baseval) <=
- (unsigned) (super->vftbl->diffval);
+ return (unsigned) (sub->baseval - super->baseval) <=
+ (unsigned) (super->diffval);
}
Changes: Mark Probst (schani) EMAIL: cacao@complang.tuwien.ac.at
Philipp Tomsich (phil) EMAIL: cacao@complang.tuwien.ac.at
- Last Change: $Id: global.h 139 1999-11-11 19:21:30Z andi $
+ Last Change: $Id: global.h 227 2003-02-12 13:23:24Z stefan $
*******************************************************************************/
innerclassinfo *innerclass;
classinfo *hashlink; /* link for external hash chain */
+
+ s4 baseval; /* base for runtime type check */
+ s4 diffval; /* high - base for runtime type check */
+
};
s4 vftbllength; /* virtual function table length */
s4 interfacetablelength; /* interface table length */
- s4 baseval; /* base for runtime type check */
- s4 diffval; /* high - base for runtime type check */
-
s4 *interfacevftbllength; /* length of interface vftbls */
methodptr table[1]; /* class vftbl */
Changes: Mark Probst EMAIL: cacao@complang.tuwien.ac.at
Philipp Tomsich EMAIL: cacao@complang.tuwien.ac.at
- Last Change: $Id: headers.c 172 2002-12-03 21:11:29Z stefan $
+ Last Change: $Id: headers.c 227 2003-02-12 13:23:24Z stefan $
*******************************************************************************/
fprintf (file, "#define offobjvftbl %3d\n", (int) OFFSET(java_objectheader, vftbl));
fprintf (file, "#define offarraysize %3d\n", (int) OFFSET(java_arrayheader, size));
fprintf (file, "#define offobjarrdata %3d\n\n", (int) OFFSET(java_objectarray, data[0]));
- fprintf (file, "#define offbaseval %3d\n", (int) OFFSET(vftbl, baseval));
- fprintf (file, "#define offdiffval %3d\n", (int) OFFSET(vftbl, diffval));
+ fprintf (file, "#define offbaseval %3d\n", (int) OFFSET(classinfo, baseval));
+ fprintf (file, "#define offdiffval %3d\n", (int) OFFSET(classinfo, diffval));
+ fprintf (file, "#define offclass %3d\n", (int) OFFSET(vftbl, class));
fclose (file);
if (c->flags & ACC_INTERFACE)
printf(" (INTERFACE) ");
else
- printf(" (CLASS,%3d) ", c->vftbl->diffval);
+ printf(" (CLASS,%3d) ", c->diffval);
utf_fprint(stdout, c->name);
}
break;
{
classinfo *subs;
- c->vftbl->baseval = ++classvalue;
+ c->baseval = ++classvalue;
subs = c->sub;
while (subs != NULL) {
loader_compute_class_values(subs);
subs = subs->nextsub;
}
- c->vftbl->diffval = classvalue - c->vftbl->baseval;
+ c->diffval = classvalue - c->baseval;
/*
{
int i;
for (i = 0; i < c->index; i++)
printf(" ");
- printf("%3d %3d ", (int) c->vftbl->baseval, c->vftbl->diffval);
+ printf("%3d %3d ", (int) c->baseval, c->diffval);
utf_display(c->name);
printf("\n");
}
Changes: Mark Probst EMAIL: cacao@complang.tuwien.ac.at
Philipp Tomsich EMAIL: cacao@complang.tuwien.ac.at
- Last Change: $Id: headers.c 172 2002-12-03 21:11:29Z stefan $
+ Last Change: $Id: headers.c 227 2003-02-12 13:23:24Z stefan $
*******************************************************************************/
fprintf (file, "#define offobjvftbl %3d\n", (int) OFFSET(java_objectheader, vftbl));
fprintf (file, "#define offarraysize %3d\n", (int) OFFSET(java_arrayheader, size));
fprintf (file, "#define offobjarrdata %3d\n\n", (int) OFFSET(java_objectarray, data[0]));
- fprintf (file, "#define offbaseval %3d\n", (int) OFFSET(vftbl, baseval));
- fprintf (file, "#define offdiffval %3d\n", (int) OFFSET(vftbl, diffval));
+ fprintf (file, "#define offbaseval %3d\n", (int) OFFSET(classinfo, baseval));
+ fprintf (file, "#define offdiffval %3d\n", (int) OFFSET(classinfo, diffval));
+ fprintf (file, "#define offclass %3d\n", (int) OFFSET(vftbl, class));
fclose (file);
return 0;
*/
- return (unsigned) (sub->vftbl->baseval - super->vftbl->baseval) <=
- (unsigned) (super->vftbl->diffval);
+ return (unsigned) (sub->baseval - super->baseval) <=
+ (unsigned) (super->diffval);
}
Changes: Mark Probst (schani) EMAIL: cacao@complang.tuwien.ac.at
Philipp Tomsich (phil) EMAIL: cacao@complang.tuwien.ac.at
- Last Change: $Id: global.h 139 1999-11-11 19:21:30Z andi $
+ Last Change: $Id: global.h 227 2003-02-12 13:23:24Z stefan $
*******************************************************************************/
innerclassinfo *innerclass;
classinfo *hashlink; /* link for external hash chain */
+
+ s4 baseval; /* base for runtime type check */
+ s4 diffval; /* high - base for runtime type check */
+
};
s4 vftbllength; /* virtual function table length */
s4 interfacetablelength; /* interface table length */
- s4 baseval; /* base for runtime type check */
- s4 diffval; /* high - base for runtime type check */
-
s4 *interfacevftbllength; /* length of interface vftbls */
methodptr table[1]; /* class vftbl */
if (c->flags & ACC_INTERFACE)
printf(" (INTERFACE) ");
else
- printf(" (CLASS,%3d) ", c->vftbl->diffval);
+ printf(" (CLASS,%3d) ", c->diffval);
utf_fprint(stdout, c->name);
}
break;
{
classinfo *subs;
- c->vftbl->baseval = ++classvalue;
+ c->baseval = ++classvalue;
subs = c->sub;
while (subs != NULL) {
loader_compute_class_values(subs);
subs = subs->nextsub;
}
- c->vftbl->diffval = classvalue - c->vftbl->baseval;
+ c->diffval = classvalue - c->baseval;
/*
{
int i;
for (i = 0; i < c->index; i++)
printf(" ");
- printf("%3d %3d ", (int) c->vftbl->baseval, c->vftbl->diffval);
+ printf("%3d %3d ", (int) c->baseval, c->diffval);
utf_display(c->name);
printf("\n");
}