[kaffe] CVS kaffe (rob): kaffe/kaffevm/verify*.[ch]
Kaffe CVS
cvs-commits at kaffe.org
Sat Jun 26 11:28:18 PDT 2004
PatchSet 4870
Date: 2004/06/26 18:21:33
Author: rob
Branch: HEAD
Tag: (none)
Log:
* kaffe/kaffevm/verify*.[ch]
More refactoring, code cleaning up, etc.
Error methods removed and simplified.
* kaffe/kaffevm/verify-type.c
Fixed compilation bug with gcc-2.95 (hopefully)
Members:
ChangeLog:1.2436->1.2437
kaffe/kaffevm/verifier/verify-errors.h:1.2->1.3
kaffe/kaffevm/verifier/verify-type.c:1.2->1.3
kaffe/kaffevm/verifier/verify-type.h:1.2->1.3
kaffe/kaffevm/verifier/verify.c:1.2->1.3
kaffe/kaffevm/verifier/verify.h:1.2->1.3
kaffe/kaffevm/verifier/verify2.c:1.2->1.3
Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.2436 kaffe/ChangeLog:1.2437
--- kaffe/ChangeLog:1.2436 Sat Jun 26 05:57:37 2004
+++ kaffe/ChangeLog Sat Jun 26 18:21:33 2004
@@ -1,3 +1,11 @@
+2004-06-26 Rob Gonzalez <rob at kaffe.org>
+ * kaffe/kaffevm/verify*.[ch]
+ More refactoring, code cleaning up, etc.
+ Error methods removed and simplified.
+
+ * kaffe/kaffevm/verify-type.c
+ Fixed compilation bug with gcc-2.95 (hopefully)
+
2004-06-26 Guilhem Lavaux <guilhem at kaffe.org>
* kaffe/kaffevm/jni/jni.c, kaffe/kaffevm/jni/jni_i.h:
Index: kaffe/kaffe/kaffevm/verifier/verify-errors.h
diff -u kaffe/kaffe/kaffevm/verifier/verify-errors.h:1.2 kaffe/kaffe/kaffevm/verifier/verify-errors.h:1.3
--- kaffe/kaffe/kaffevm/verifier/verify-errors.h:1.2 Fri Jun 25 14:43:45 2004
+++ kaffe/kaffe/kaffevm/verifier/verify-errors.h Sat Jun 26 18:21:35 2004
@@ -13,52 +13,51 @@
#define _VERIFY_ERRORS_H
/*
- * Helper function for error reporting in verifyMethod3a.
+ * General verification error method.
+ * Returns false to allow statements such as:
+ * return verifyError(...);
*/
static inline
-void
-verifyErrorInVerifyMethod3a(errorInfo* einfo,
- const Verifier* v,
- const char * msg)
-{
- if (einfo->type == 0) {
- postExceptionMessage(einfo, JAVA_LANG(VerifyError),
+bool
+verifyError(Verifier* v, const char* msg) {
+ if (v->einfo->type == 0) {
+ postExceptionMessage(v->einfo, JAVA_LANG(VerifyError),
"in method \"%s.%s\": %s",
CLASS_CNAME(v->method->class), METHOD_NAMED(v->method), msg);
}
+ return false;
}
+
/*
* Helper function for error reporting in BRANCH_IN_BOUNDS macro in verifyMethod3a.
*/
static inline
-void
-branchInBoundsErrorInVerifyMethod3a(errorInfo* einfo,
- const Verifier* v,
+bool
+branchInBoundsErrorInVerifyMethod3a(Verifier* v,
uint32 codelen,
uint32 n)
{
- DBG(VERIFY3, dprintf("ERROR: branch to (%d) out of bound (%d) \n", n, codelen); );
- verifyErrorInVerifyMethod3a(einfo, v, "branch out of method code");
+ DBG(VERIFY3, dprintf("ERROR: branch to (%d) out of bound (%d) \n", n, codelen); );
+ return verifyError(v, "branch out of method code");
}
/*
* Helper function for error reporting in CHECK_LOCAL_INDEX macro in verifyMethod3a.
*/
static inline
-void
-checkLocalIndexErrorInVerifyMethod3a(errorInfo* einfo,
- const Verifier* v,
+bool
+checkLocalIndexErrorInVerifyMethod3a(Verifier* v,
uint32 pc,
unsigned char* code,
uint32 n)
{
- DBG(VERIFY3,
- dprintf("ERROR: pc = %d, instruction = ", pc);
- printInstruction(code[pc]);
- dprintf(", localsz = %d, localindex = %d\n", v->method->localsz, n);
- );
- verifyErrorInVerifyMethod3a(einfo, v, "attempting to access a local variable beyond local array");
+ DBG(VERIFY3,
+ dprintf("ERROR: pc = %d, instruction = ", pc);
+ printInstruction(code[pc]);
+ dprintf(", localsz = %d, localindex = %d\n", v->method->localsz, n);
+ );
+ return verifyError(v, "attempting to access a local variable beyond local array");
}
#endif
Index: kaffe/kaffe/kaffevm/verifier/verify-type.c
diff -u kaffe/kaffe/kaffevm/verifier/verify-type.c:1.2 kaffe/kaffe/kaffevm/verifier/verify-type.c:1.3
--- kaffe/kaffe/kaffevm/verifier/verify-type.c:1.2 Fri Jun 25 14:43:45 2004
+++ kaffe/kaffe/kaffevm/verifier/verify-type.c Sat Jun 26 18:21:35 2004
@@ -43,18 +43,18 @@
Type* TWIDE = &_WIDE;
bool
-isWide(const Type * tinfo)
+isWide(const Type * t)
{
- return (tinfo->data.class == TWIDE->data.class);
+ return (t->data.class == TWIDE->data.class);
}
static Type verify_NULL;
Type* TNULL = &verify_NULL;
bool
-isNull(const Type * tinfo)
+isNull(const Type * t)
{
- return (tinfo->data.class == TNULL->data.class);
+ return (t->data.class == TNULL->data.class);
}
static const char* OBJECT_SIG = "Ljava/lang/Object;";
@@ -172,13 +172,13 @@
* resolve it to be a pointer to an actual Class object in memory.
*/
void
-resolveType(errorInfo* einfo, Hjava_lang_Class* this, Type *type)
+resolveType(Verifier* v, Type *t)
{
const char* sig;
char* tmp = NULL;
- if (type->tinfo & TINFO_NAME) {
- sig = type->data.sig;
+ if (t->tinfo & TINFO_NAME) {
+ sig = t->data.sig;
if (*sig != '[') {
tmp = checkPtr(gc_malloc((strlen(sig) + 3) * sizeof(char), GC_ALLOC_VERIFIER));
@@ -186,16 +186,16 @@
sig = tmp;
}
- type->tinfo = TINFO_CLASS;
- type->data.class = getClassFromSignature(sig, this->loader, einfo);
+ t->tinfo = TINFO_CLASS;
+ t->data.class = getClassFromSignature(sig, v->class->loader, v->einfo);
if (tmp) {
gc_free(tmp);
}
}
- else if (type->tinfo & TINFO_SIG) {
- type->tinfo = TINFO_CLASS;
- type->data.class = getClassFromSignature(type->data.sig, this->loader, einfo);
+ else if (t->tinfo & TINFO_SIG) {
+ t->tinfo = TINFO_CLASS;
+ t->data.class = getClassFromSignature(t->data.sig, v->class->loader, v->einfo);
}
}
@@ -243,8 +243,7 @@
* @return whether an actual merger was made (i.e. they two types given were not the same type)
*/
bool
-mergeTypes(errorInfo* einfo, Hjava_lang_Class* this,
- Type* t1, Type* t2)
+mergeTypes(Verifier* v, Type* t1, Type* t2)
{
if (IS_ADDRESS(t1) || IS_ADDRESS(t2)) {
/* if one of the types is TADDR, the other one must also be TADDR */
@@ -276,8 +275,8 @@
/* must resolve them to go on */
- resolveType(einfo, this, t1);
- resolveType(einfo, this, t2);
+ resolveType(v, t1);
+ resolveType(v, t2);
if ((t1->tinfo & TINFO_CLASS && t1->data.class == NULL) ||
(t2->tinfo & TINFO_CLASS && t2->data.class == NULL)) {
return false;
@@ -314,12 +313,14 @@
* 1) both are classes
* 2)
* 1) both are classes
- /* TODO: create supertypes here */
+ * TODO: create supertypes here */
+ {
Hjava_lang_Class *tmp = t2->data.class;
t2->data.class = getCommonSuperclass(t1->data.class, t2->data.class);
return tmp != t2->data.class;
+ }
}
@@ -353,13 +354,13 @@
* returns whether the type is a reference type
*/
bool
-isReference(const Type* type)
+isReference(const Type* t)
{
- return (type->tinfo & TINFO_NAME ||
- type->tinfo & TINFO_SIG ||
- type->tinfo & TINFO_CLASS ||
- type->tinfo & TINFO_UNINIT ||
- type->tinfo & TINFO_SUPERTYPES);
+ return (t->tinfo & TINFO_NAME ||
+ t->tinfo & TINFO_SIG ||
+ t->tinfo & TINFO_CLASS ||
+ t->tinfo & TINFO_UNINIT ||
+ t->tinfo & TINFO_SUPERTYPES);
}
/*
@@ -367,25 +368,25 @@
* returns whether the Type is an array Type
*/
bool
-isArray(const Type* type)
+isArray(const Type* t)
{
- if (!isReference(type)) {
+ if (!isReference(t)) {
return false;
}
- else if (type->tinfo & TINFO_NAME || type->tinfo & TINFO_SIG) {
- return (*(type->data.sig) == '[');
+ else if (t->tinfo & TINFO_NAME || t->tinfo & TINFO_SIG) {
+ return (*(t->data.sig) == '[');
}
- else if (type->tinfo & TINFO_SUPERTYPES) {
+ else if (t->tinfo & TINFO_SUPERTYPES) {
/* if one of the supertypes is an array, it follows that
* all supertypes in the list must be arrays
*/
- return ((*CLASS_CNAME(type->data.supertypes->list[0])) == '[');
+ return ((*CLASS_CNAME(t->data.supertypes->list[0])) == '[');
}
- else if (type->tinfo != TINFO_CLASS) {
+ else if (t->tinfo != TINFO_CLASS) {
return false;
}
else {
- return (*(CLASS_CNAME(type->data.class)) == '[');
+ return (*(CLASS_CNAME(t->data.class)) == '[');
}
}
@@ -419,6 +420,9 @@
case TINFO_SUPERTYPES:
/* if we're unsure as to what type t1 might be, then
* we have to perform a merge
+ * TODO: compare the supertype lists. since we're merging
+ * them in the order of the type hirearchy, then we simply
+ * traverse each list until we get to a pair that doesn't match.
*/
return false;
@@ -554,7 +558,7 @@
* @return whether t2 can be a t1.
*/
bool
-typecheck(errorInfo* einfo, Verifier* v, Type* t1, Type* t2)
+typecheck(Verifier* v, Type* t1, Type* t2)
{
DBG(VERIFY3, dprintf("%stypechecking ", indent); printType(t1); dprintf(" vs. "); printType(t2); dprintf("\n"); );
@@ -581,12 +585,12 @@
}
- resolveType(einfo, v->class, t1);
+ resolveType(v, t1);
if (t1->data.class == NULL) {
return false;
}
- resolveType(einfo, v->class, t2);
+ resolveType(v, t2);
if (t2->data.class == NULL) {
return false;
}
Index: kaffe/kaffe/kaffevm/verifier/verify-type.h
diff -u kaffe/kaffe/kaffevm/verifier/verify-type.h:1.2 kaffe/kaffe/kaffevm/verifier/verify-type.h:1.3
--- kaffe/kaffe/kaffevm/verifier/verify-type.h:1.2 Fri Jun 25 14:43:45 2004
+++ kaffe/kaffe/kaffevm/verifier/verify-type.h Sat Jun 26 18:21:35 2004
@@ -85,7 +85,7 @@
#define TINFO_CLASS 16
#define TINFO_UNINIT 32
#define TINFO_UNINIT_SUPER 96
-#define TINFO_SUPERTYPES 128
+#define TINFO_SUPERTYPES 128
#define IS_ADDRESS(_TINFO) ((_TINFO)->tinfo & TINFO_ADDR)
#define IS_PRIMITIVE_TYPE(_TINFO) ((_TINFO)->tinfo & TINFO_PRIMITIVE)
@@ -116,25 +116,35 @@
extern Type* TSTRING;
extern void initVerifierPrimTypes(void);
-extern bool isNull(const Type * tinfo);
-extern bool isWide(const Type * tinfo);
-extern bool isReference(const Type* type);
-extern bool isArray(const Type* type);
-extern bool sameRefType(Type* t1, Type* t2);
-extern bool sameType(Type* t1, Type* t2);
-extern void resolveType(errorInfo* einfo, Hjava_lang_Class* this, Type *type);
+extern bool isNull(const Type * t);
+extern bool isWide(const Type * t);
-extern bool mergeTypes(errorInfo*, Hjava_lang_Class* this,
- Type* t1, Type* t2);
+extern bool isReference(const Type* t);
+extern bool isArray(const Type* t);
+
+extern bool sameRefType(Type* t1,
+ Type* t2);
+extern bool sameType(Type* t1,
+ Type* t2);
+extern void resolveType(struct Verifier* v,
+ Type *t);
+
+extern bool mergeTypes(struct Verifier* v,
+ Type* t1,
+ Type* t2);
extern Hjava_lang_Class* getCommonSuperclass(Hjava_lang_Class* t1,
Hjava_lang_Class* t2);
-extern bool typecheck(errorInfo*, struct Verifier* v, Type* t1, Type* t2);
+extern bool typecheck(struct Verifier* v,
+ Type* t1,
+ Type* t2);
/* for dealing with the supertype lists */
-extern void mergeSupersets(SupertypeSet* supertypes, Type* t1, Type* t2);
+extern void mergeSupersets(SupertypeSet* supertypes,
+ Type* t1,
+ Type* t2);
extern void freeSupertypes(SupertypeSet* supertypes);
Index: kaffe/kaffe/kaffevm/verifier/verify.c
diff -u kaffe/kaffe/kaffevm/verifier/verify.c:1.2 kaffe/kaffe/kaffevm/verifier/verify.c:1.3
--- kaffe/kaffe/kaffevm/verifier/verify.c:1.2 Fri Jun 25 14:43:45 2004
+++ kaffe/kaffe/kaffevm/verifier/verify.c Sat Jun 26 18:21:35 2004
@@ -262,13 +262,11 @@
Verifier* v);
-static bool loadInitialArgs(errorInfo* einfo,
- Verifier* v);
+static bool loadInitialArgs(Verifier* v);
static bool verifyBasicBlock(errorInfo*,
Verifier* v,
BlockInfo*);
-static bool mergeBasicBlocks(errorInfo* einfo,
- const Method* method,
+static bool mergeBasicBlocks(Verifier* v,
BlockInfo* fromBlock,
BlockInfo* toBlock);
@@ -411,6 +409,7 @@
int codelen = METHOD_BYTECODE_LEN(method);
Verifier v;
+ v.einfo = einfo;
v.class = method->class;
v.method = method;
v.numBlocks = 0;
@@ -445,7 +444,7 @@
/* load initial arguments into local variable array */
DBG(VERIFY3, dprintf(" about to load initial args...\n"); );
- if (!loadInitialArgs(einfo, &v)) {
+ if (!loadInitialArgs(&v)) {
/* propagate error */
return failInVerifyMethod(einfo, &v);
}
@@ -516,12 +515,14 @@
#define ENSURE_NON_WIDE \
if (wide) { \
- return verifyErrorInVerifyMethod3a(einfo, v, "illegal instruction following wide instruction"); \
+ verifyError(v, "illegal instruction following wide instruction"); \
+ return; \
}
#define CHECK_POOL_IDX(_IDX) \
if (_IDX > pool->size) { \
- return verifyErrorInVerifyMethod3a(einfo, v, "attempt to access a constant pool index beyond constant pool range"); \
+ verifyError(v, "attempt to access a constant pool index beyond constant pool range"); \
+ return; \
}
@@ -535,14 +536,14 @@
#define BRANCH_IN_BOUNDS(_N, _INST) \
if (_N >= codelen) { \
- branchInBoundsErrorInVerifyMethod3a(einfo, v, codelen, _N); \
+ branchInBoundsErrorInVerifyMethod3a(v, codelen, _N); \
return; \
}
/* makes sure the index given for a local variable is within the correct index */
#define CHECK_LOCAL_INDEX(_N) \
if ((_N) >= v->method->localsz) { \
- checkLocalIndexErrorInVerifyMethod3a(einfo, v, pc, code, _N); \
+ checkLocalIndexErrorInVerifyMethod3a(v, pc, code, _N); \
return; \
}
@@ -567,7 +568,7 @@
DBG(VERIFY3, dprintf(" Verifier Pass 3a: checking static constraints and finding basic blocks...\n"); );
if (METHOD_BYTECODE_LEN(v->method) < 0) {
- verifyErrorInVerifyMethod3a(einfo, v, "method bytecode length is less than 0");
+ verifyError(v, "method bytecode length is less than 0");
}
/* find the start of every instruction and basic block to determine legal branches
@@ -583,7 +584,8 @@
DBG(VERIFY3, dprintf(" instruction: (%d) ", pc); printInstruction(code[pc]); dprintf("\n"); );
if (codelen < getNextPC(code, pc)) {
- return verifyErrorInVerifyMethod3a(einfo, v, "last operand in code array is cut off");
+ verifyError(v, "last operand in code array is cut off");
+ return;
}
switch(code[pc]) {
@@ -633,7 +635,7 @@
n = CONST_TAG(idx, pool);
if (n != CONSTANT_Integer && n != CONSTANT_Float &&
n != CONSTANT_String && n != CONSTANT_ResolvedString) {
- verifyErrorInVerifyMethod3a(einfo, v, "ldc* on constant pool entry other than int/float/string");
+ verifyError(v, "ldc* on constant pool entry other than int/float/string");
return;
}
break;
@@ -642,7 +644,7 @@
GET_WIDX(idx, pc);
n = CONST_TAG(idx, pool);
if (n != CONSTANT_Double && n != CONSTANT_Long) {
- verifyErrorInVerifyMethod3a(einfo, v, "ldc2_w on constant pool entry other than long or double");
+ verifyError(v, "ldc2_w on constant pool entry other than long or double");
return;
}
break;
@@ -654,7 +656,7 @@
GET_WIDX(idx, pc);
idx = CONST_TAG(idx, pool);
if (idx != CONSTANT_Fieldref) {
- verifyErrorInVerifyMethod3a(einfo, v, "[get/put][field/static] accesses something in the constant pool that is not a CONSTANT_Fieldref");
+ verifyError(v, "[get/put][field/static] accesses something in the constant pool that is not a CONSTANT_Fieldref");
return;
}
break;
@@ -667,7 +669,7 @@
GET_WIDX(idx, pc);
n = CONST_TAG(idx, pool);
if (n != CONSTANT_Methodref) {
- verifyErrorInVerifyMethod3a(einfo, v, "invoke* accesses something in the constant pool that is not a CONSTANT_Methodref");
+ verifyError(v, "invoke* accesses something in the constant pool that is not a CONSTANT_Methodref");
return;
}
@@ -675,11 +677,11 @@
if (*sig == '<') {
if (!strcmp(constructor_name->data, sig)) {
if (code[pc] != INVOKESPECIAL) {
- verifyErrorInVerifyMethod3a(einfo, v, "only invokespecial can be used to execute <init> methods");
+ verifyError(v, "only invokespecial can be used to execute <init> methods");
return;
}
} else {
- verifyErrorInVerifyMethod3a(einfo, v, "no method with a name whose first character is '<' may be called by an invoke instruction");
+ verifyError(v, "no method with a name whose first character is '<' may be called by an invoke instruction");
return;
}
}
@@ -700,21 +702,21 @@
GET_WIDX(idx, pc);
n = CONST_TAG(idx, pool);
if (n != CONSTANT_InterfaceMethodref) {
- verifyErrorInVerifyMethod3a(einfo, v, "invokeinterface accesses something in the constant pool that is not a CONSTANT_InterfaceMethodref");
+ verifyError(v, "invokeinterface accesses something in the constant pool that is not a CONSTANT_InterfaceMethodref");
return;
}
sig = INTERFACEMETHODREF_SIGD(idx, pool);
if (*sig == '<') {
- verifyErrorInVerifyMethod3a(einfo, v, "invokeinterface cannot be used to invoke any instruction with a name starting with '<'");
+ verifyError(v, "invokeinterface cannot be used to invoke any instruction with a name starting with '<'");
return;
}
if (code[pc + 3] == 0) {
- verifyErrorInVerifyMethod3a(einfo, v, "fourth byte of invokeinterface is zero");
+ verifyError(v, "fourth byte of invokeinterface is zero");
return;
} else if (code[pc + 4] != 0) {
- verifyErrorInVerifyMethod3a(einfo, v, "fifth byte of invokeinterface is not zero");
+ verifyError(v, "fifth byte of invokeinterface is not zero");
return;
}
@@ -728,7 +730,7 @@
GET_WIDX(n, pc);
n = CONST_TAG(n, pool);
if (n != CONSTANT_Class && n != CONSTANT_ResolvedClass) {
- verifyErrorInVerifyMethod3a(einfo, v, "instanceof/checkcast indexes a constant pool entry that is not type CONSTANT_Class or CONSTANT_ResolvedClass");
+ verifyError(v, "instanceof/checkcast indexes a constant pool entry that is not type CONSTANT_Class or CONSTANT_ResolvedClass");
return;
}
@@ -741,7 +743,7 @@
GET_WIDX(idx, pc);
n = CONST_TAG(idx, pool);
if (n != CONSTANT_Class && n != CONSTANT_ResolvedClass) {
- verifyErrorInVerifyMethod3a(einfo, v, "multinewarray indexes a constant pool entry that is not type CONSTANT_Class or CONSTANT_ResolvedClass");
+ verifyError(v, "multinewarray indexes a constant pool entry that is not type CONSTANT_Class or CONSTANT_ResolvedClass");
return;
}
@@ -749,12 +751,12 @@
sig = CLASS_NAMED(idx, pool);
newpc = code[pc + 3];
if (newpc == 0) {
- verifyErrorInVerifyMethod3a(einfo, v, "dimensions operand of multianewarray must be non-zero");
+ verifyError(v, "dimensions operand of multianewarray must be non-zero");
return;
}
for(n = 0; *sig == '['; sig++, n++);
if (n < newpc) {
- verifyErrorInVerifyMethod3a(einfo, v, "dimensions operand of multianewarray is > the number of dimensions in array being created");
+ verifyError(v, "dimensions operand of multianewarray is > the number of dimensions in array being created");
return;
}
@@ -767,14 +769,14 @@
GET_WIDX(idx, pc);
n = CONST_TAG(idx, pool);
if (n != CONSTANT_Class && n != CONSTANT_ResolvedClass) {
- verifyErrorInVerifyMethod3a(einfo, v, "new indexes a constant pool entry that is not type CONSTANT_Class or CONSTANT_ResolvedClass");
+ verifyError(v, "new indexes a constant pool entry that is not type CONSTANT_Class or CONSTANT_ResolvedClass");
return;
}
/* cannot create arrays with NEW */
sig = CLASS_NAMED(idx, pool);
if (*sig == '[') {
- verifyErrorInVerifyMethod3a(einfo, v, "new instruction used to create a new array");
+ verifyError(v, "new instruction used to create a new array");
return;
}
break;
@@ -786,7 +788,7 @@
GET_WIDX(idx, pc);
n = CONST_TAG(idx, pool);
if (n != CONSTANT_Class && n != CONSTANT_ResolvedClass) {
- verifyErrorInVerifyMethod3a(einfo, v, "anewarray indexes a constant pool entry that is not type CONSTANT_Class or CONSTANT_ResolvedClass");
+ verifyError(v, "anewarray indexes a constant pool entry that is not type CONSTANT_Class or CONSTANT_ResolvedClass");
return;
}
@@ -794,7 +796,7 @@
sig = CLASS_NAMED(idx, pool);
for (n = 0; *sig == '['; sig++, n++);
if (n > 255) {
- verifyErrorInVerifyMethod3a(einfo, v, "anewarray used to create an array of > 255 dimensions");
+ verifyError(v, "anewarray used to create an array of > 255 dimensions");
return;
}
@@ -805,7 +807,7 @@
n = code[pc + 1];
if (n < 4 || n > 11) {
- verifyErrorInVerifyMethod3a(einfo, v, "newarray operand must be in the range [4,11]");
+ verifyError(v, "newarray operand must be in the range [4,11]");
return;
}
@@ -989,7 +991,7 @@
n += 4;
low = getDWord(code, n);
if (low < 0) {
- verifyErrorInVerifyMethod3a(einfo, v, "lookupswitch with npairs < 0");
+ verifyError(v, "lookupswitch with npairs < 0");
return;
}
@@ -1035,7 +1037,7 @@
high = getDWord(code, n + 8);
if (high < low) {
DBG(VERIFY3, dprintf("ERROR: low = %d, high = %d\n", low, high); );
- verifyErrorInVerifyMethod3a(einfo, v, "tableswitch high val < low val");
+ verifyError(v, "tableswitch high val < low val");
return;
}
n += 12;
@@ -1075,7 +1077,7 @@
default:
if (wide == true) {
- verifyErrorInVerifyMethod3a(einfo, v, "illegal instruction following wide instruction");
+ verifyError(v, "illegal instruction following wide instruction");
return;
}
}
@@ -1105,7 +1107,7 @@
newpc = pc;
}
else if (v->status[pc] & START_BLOCK) {
- verifyErrorInVerifyMethod3a(einfo, v, "branch into middle of instruction");
+ verifyError(v, "branch into middle of instruction");
return;
}
}
@@ -1119,35 +1121,35 @@
pc = entry->start_pc;
if (pc >= codelen) {
- verifyErrorInVerifyMethod3a(einfo, v, "try block is beyond bound of method code");
+ verifyError(v, "try block is beyond bound of method code");
return;
}
else if (!(v->status[pc] & IS_INSTRUCTION)) {
- verifyErrorInVerifyMethod3a(einfo, v, "try block starts in the middle of an instruction");
+ verifyError(v, "try block starts in the middle of an instruction");
return;
}
pc = entry->end_pc;
if (pc <= entry->start_pc) {
- verifyErrorInVerifyMethod3a(einfo, v, "try block ends before its starts");
+ verifyError(v, "try block ends before its starts");
return;
}
else if (pc > codelen) {
- verifyErrorInVerifyMethod3a(einfo, v, "try block ends beyond bound of method code");
+ verifyError(v, "try block ends beyond bound of method code");
return;
}
else if (!(v->status[pc] & IS_INSTRUCTION)) {
- verifyErrorInVerifyMethod3a(einfo, v, "try block ends in the middle of an instruction");
+ verifyError(v, "try block ends in the middle of an instruction");
return;
}
pc = entry->handler_pc;
if (pc >= codelen) {
- verifyErrorInVerifyMethod3a(einfo, v, "exception handler is beyond bound of method code");
+ verifyError(v, "exception handler is beyond bound of method code");
return;
}
else if (!(v->status[pc] & IS_INSTRUCTION)) {
- verifyErrorInVerifyMethod3a(einfo, v, "exception handler starts in the middle of an instruction");
+ verifyError(v, "exception handler starts in the middle of an instruction");
return;
}
@@ -1166,11 +1168,11 @@
DBG(VERIFY3, dprintf(" ERROR: could not resolve catch type...\n"); );
entry->catch_type = UNRESOLVABLE_CATCHTYPE;
- verifyErrorInVerifyMethod3a(einfo, v, "unresolvable catch type");
+ verifyError(v, "unresolvable catch type");
return;
}
if (!instanceof(javaLangThrowable, entry->catch_type)) {
- verifyErrorInVerifyMethod3a(einfo, v, "Exception to be handled by exception handler is not a subclass of Java/Lang/Throwable");
+ verifyError(v, "Exception to be handled by exception handler is not a subclass of Java/Lang/Throwable");
return;
}
}
@@ -1185,16 +1187,16 @@
pc = lve->start_pc;
if (pc >= codelen) {
- verifyErrorInVerifyMethod3a(einfo, v, "local variable is beyond bound of method code");
+ verifyError(v, "local variable is beyond bound of method code");
return;
}
else if (!(v->status[pc] & IS_INSTRUCTION)) {
- verifyErrorInVerifyMethod3a(einfo, v, "local variable starts in the middle of an instruction");
+ verifyError(v, "local variable starts in the middle of an instruction");
return;
}
if ((pc + lve->length) > codelen) {
- verifyErrorInVerifyMethod3a(einfo, v, "local variable is beyond bound of method code");
+ verifyError(v, "local variable is beyond bound of method code");
return;
}
}
@@ -1253,15 +1255,10 @@
*/
static inline
bool
-verifyErrorInVerifyMethod3b(errorInfo* einfo, Verifier* v, BlockInfo* curBlock, const char * msg)
+verifyErrorInVerifyMethod3b(Verifier* v, BlockInfo* curBlock, const char * msg)
{
gc_free(curBlock);
- if (einfo->type == 0) {
- postExceptionMessage(einfo, JAVA_LANG(VerifyError),
- "in method \"%s.%s\": %s",
- CLASS_CNAME(v->method->class), METHOD_NAMED(v->method), msg);
- }
- return(false);
+ return verifyError(v, msg);
}
/*
@@ -1361,12 +1358,12 @@
copyBlockData(v->method, blocks[curIndex], curBlock);
if (curBlock->status & EXCEPTION_HANDLER && curBlock->stacksz > 0) {
- return verifyErrorInVerifyMethod3b(einfo, v, curBlock, "it's possible to reach an exception handler with a nonempty stack");
+ return verifyErrorInVerifyMethod3b(v, curBlock, "it's possible to reach an exception handler with a nonempty stack");
}
if (!verifyBasicBlock(einfo, v, curBlock)) {
- return verifyErrorInVerifyMethod3b(einfo, v, curBlock, "failure to verify basic block");
+ return verifyErrorInVerifyMethod3b(v, curBlock, "failure to verify basic block");
}
@@ -1386,8 +1383,8 @@
newpc = pc + getWord(code, newpc);
nextBlock = inWhichBlock(newpc, blocks, v->numBlocks);
- if (!mergeBasicBlocks(einfo, v->method, curBlock, nextBlock)) {
- return verifyErrorInVerifyMethod3b(einfo, v, curBlock, "error merging operand stacks");
+ if (!mergeBasicBlocks(v, curBlock, nextBlock)) {
+ return verifyErrorInVerifyMethod3b(v, curBlock, "error merging operand stacks");
}
break;
@@ -1396,8 +1393,8 @@
newpc = pc + getDWord(code, newpc);
nextBlock = inWhichBlock(newpc, blocks, v->numBlocks);
- if (!mergeBasicBlocks(einfo, v->method, curBlock, nextBlock)) {
- return verifyErrorInVerifyMethod3b(einfo, v, curBlock, "error merging operand stacks");
+ if (!mergeBasicBlocks(v, curBlock, nextBlock)) {
+ return verifyErrorInVerifyMethod3b(v, curBlock, "error merging operand stacks");
}
break;
@@ -1411,8 +1408,8 @@
JSR_common:
nextBlock = inWhichBlock(newpc, blocks, v->numBlocks);
- if (!mergeBasicBlocks(einfo, v->method, curBlock, nextBlock)) {
- return verifyErrorInVerifyMethod3b(einfo, v, curBlock, "jsr: error merging operand stacks");
+ if (!mergeBasicBlocks(v, curBlock, nextBlock)) {
+ return verifyErrorInVerifyMethod3b(v, curBlock, "jsr: error merging operand stacks");
}
/* TODO:
@@ -1431,7 +1428,7 @@
}
if (!IS_ADDRESS(&curBlock->locals[n])) {
- return verifyErrorInVerifyMethod3b(einfo, v, curBlock, "ret instruction does not refer to a variable with type returnAddress");
+ return verifyErrorInVerifyMethod3b(v, curBlock, "ret instruction does not refer to a variable with type returnAddress");
}
newpc = curBlock->locals[n].tinfo;
@@ -1440,8 +1437,8 @@
curBlock->locals[n] = *TUNSTABLE;
nextBlock = inWhichBlock(newpc, blocks, v->numBlocks);
- if (!mergeBasicBlocks(einfo, v->method, curBlock, nextBlock)) {
- return verifyErrorInVerifyMethod3b(einfo, v, curBlock, "error merging opstacks when returning from a subroutine");
+ if (!mergeBasicBlocks(v, curBlock, nextBlock)) {
+ return verifyErrorInVerifyMethod3b(v, curBlock, "error merging opstacks when returning from a subroutine");
}
/*
@@ -1463,17 +1460,17 @@
newpc = pc + getWord(code, newpc);
nextBlock = inWhichBlock(newpc, blocks, v->numBlocks);
- if (!mergeBasicBlocks(einfo, v->method, curBlock, nextBlock)) {
- return verifyErrorInVerifyMethod3b(einfo, v, curBlock, "error merging operand stacks");
+ if (!mergeBasicBlocks(v, curBlock, nextBlock)) {
+ return verifyErrorInVerifyMethod3b(v, curBlock, "error merging operand stacks");
}
/* if the condition is false, then the next block is the one that will be executed */
curIndex++;
if (curIndex >= v->numBlocks) {
- return verifyErrorInVerifyMethod3b(einfo, v, curBlock, "execution falls off the end of a basic block");
+ return verifyErrorInVerifyMethod3b(v, curBlock, "execution falls off the end of a basic block");
}
- else if (!mergeBasicBlocks(einfo, v->method, curBlock, blocks[curIndex])) {
- return verifyErrorInVerifyMethod3b(einfo, v, curBlock, "error merging operand stacks");
+ else if (!mergeBasicBlocks(v, curBlock, blocks[curIndex])) {
+ return verifyErrorInVerifyMethod3b(v, curBlock, "error merging operand stacks");
}
break;
@@ -1487,8 +1484,8 @@
else n = pc + 1;
newpc = pc + getDWord(code, n);
nextBlock = inWhichBlock(newpc, blocks, v->numBlocks);
- if (!mergeBasicBlocks(einfo, v->method, curBlock, nextBlock)) {
- return verifyErrorInVerifyMethod3b(einfo, v, curBlock, "error merging into the default branch of a lookupswitch instruction");
+ if (!mergeBasicBlocks(v, curBlock, nextBlock)) {
+ return verifyErrorInVerifyMethod3b(v, curBlock, "error merging into the default branch of a lookupswitch instruction");
}
/* get number of key/target pairs */
@@ -1500,8 +1497,8 @@
for (n += 4, high = n + 8*low; n < (uint32)high; n += 8) {
newpc = pc + getDWord(code, n+4);
nextBlock = inWhichBlock(newpc, blocks, v->numBlocks);
- if (!mergeBasicBlocks(einfo, v->method, curBlock, nextBlock)) {
- return verifyErrorInVerifyMethod3b(einfo, v, curBlock, "error merging into a branch of a lookupswitch instruction");
+ if (!mergeBasicBlocks(v, curBlock, nextBlock)) {
+ return verifyErrorInVerifyMethod3b(v, curBlock, "error merging into a branch of a lookupswitch instruction");
}
}
@@ -1529,8 +1526,8 @@
for (high = n + 4*(high - low + 1); n < (uint32)high; n += 4) {
newpc = pc + getDWord(code, n);
nextBlock = inWhichBlock(newpc, blocks, v->numBlocks);
- if (!mergeBasicBlocks(einfo, v->method, curBlock, nextBlock)) {
- return verifyErrorInVerifyMethod3b(einfo, v, curBlock, "error merging into a branch of a tableswitch instruction");
+ if (!mergeBasicBlocks(v, curBlock, nextBlock)) {
+ return verifyErrorInVerifyMethod3b(v, curBlock, "error merging into a branch of a tableswitch instruction");
}
}
break;
@@ -1552,10 +1549,10 @@
if (v->status[n] & IS_INSTRUCTION) break;
}
if (n == codelen) {
- return verifyErrorInVerifyMethod3b(einfo, v, curBlock, "execution falls off the end of a code block");
+ return verifyErrorInVerifyMethod3b(v, curBlock, "execution falls off the end of a code block");
}
- else if (!mergeBasicBlocks(einfo, v->method, curBlock, blocks[curIndex+1])) {
- return verifyErrorInVerifyMethod3b(einfo, v, curBlock, "error merging operand stacks");
+ else if (!mergeBasicBlocks(v, curBlock, blocks[curIndex+1])) {
+ return verifyErrorInVerifyMethod3b(v, curBlock, "error merging operand stacks");
}
}
@@ -1574,24 +1571,6 @@
/*
- * Helper function for error reporting in merge.
- */
-static inline
-bool
-verifyErrorInMergeBasicBlocks(errorInfo* einfo,
- const Method* method,
- const char * msg)
-{
- if (einfo->type == 0) {
- postExceptionMessage(einfo, JAVA_LANG(VerifyError),
- "in method \"%s.%s\": %s",
- CLASS_CNAME(method->class), METHOD_NAMED(method), msg);
- }
- return(false);
-}
-
-
-/*
* merges two operand stacks. just to repeat what the JVML 2 spec says about this:
* Merge the state of the operand stack and local variable array at the end of the
* execution of the current instruction into each of the successor instructions. In
@@ -1622,8 +1601,7 @@
*/
static
bool
-mergeBasicBlocks(errorInfo* einfo,
- const Method* method,
+mergeBasicBlocks(Verifier* v,
BlockInfo* fromBlock,
BlockInfo* toBlock)
{
@@ -1634,14 +1612,14 @@
* or on the operand stack during a backwards branch
*/
if (toBlock->startAddr < fromBlock->startAddr) {
- for (n = 0; n < method->localsz; n++) {
+ for (n = 0; n < v->method->localsz; n++) {
if (fromBlock->locals[n].tinfo & TINFO_UNINIT) {
- return verifyErrorInMergeBasicBlocks(einfo, method, "uninitialized object reference in a local variable during a backwards branch");
+ return verifyError(v, "uninitialized object reference in a local variable during a backwards branch");
}
}
for (n = 0; n < fromBlock->stacksz; n++) {
if (fromBlock->opstack[n].tinfo & TINFO_UNINIT) {
- return verifyErrorInMergeBasicBlocks(einfo, method, "uninitialized object reference on operand stack during a backwards branch");
+ return verifyError(v, "uninitialized object reference on operand stack during a backwards branch");
}
}
}
@@ -1650,7 +1628,7 @@
DBG(VERIFY3, dprintf(" visiting block starting at %d for the first time\n",
toBlock->startAddr); );
- copyBlockState(method, fromBlock, toBlock);
+ copyBlockState(v->method, fromBlock, toBlock);
toBlock->status |= CHANGED;
return(true);
}
@@ -1658,25 +1636,21 @@
DBG(VERIFY3,
dprintf("%snot a first time merge\n", indent);
dprintf("%s from block (%d - %d):\n", indent, fromBlock->startAddr, fromBlock->lastAddr);
- printBlock(method, fromBlock, indent2);
+ printBlock(v->method, fromBlock, indent2);
dprintf("%s to block (%d - %d):\n", indent, toBlock->startAddr, toBlock->lastAddr);
- printBlock(method, toBlock, indent2);
+ printBlock(v->method, toBlock, indent2);
dprintf("\n");
);
if (fromBlock->stacksz != toBlock->stacksz) {
- postExceptionMessage(einfo, JAVA_LANG(VerifyError),
- "in method %s.%s: merging two operand stacks of unequal size",
- METHOD_NAMED(method), CLASS_CNAME(method->class));
- return(false);
+ return verifyError(v, "merging two operand stacks of unequal size");
}
/* merge the local variable arrays */
- for (n = 0; n < method->localsz; n++) {
- if (mergeTypes(einfo, method->class,
- &fromBlock->locals[n], &toBlock->locals[n])) {
+ for (n = 0; n < v->method->localsz; n++) {
+ if (mergeTypes(v, &fromBlock->locals[n], &toBlock->locals[n])) {
toBlock->status |= CHANGED;
}
}
@@ -1687,8 +1661,7 @@
* i mean, we could get an unstable value and then immediately pop it off the stack,
* for instance.
*/
- if (mergeTypes(einfo, method->class,
- &fromBlock->opstack[n], &toBlock->opstack[n])) {
+ if (mergeTypes(v, &fromBlock->opstack[n], &toBlock->opstack[n])) {
toBlock->status |= CHANGED;
}
}
@@ -1696,44 +1669,27 @@
DBG(VERIFY3,
dprintf("%s result block:\n", indent);
- printBlock(method, toBlock, indent2);
+ printBlock(v->method, toBlock, indent2);
);
return(true);
}
-/*
- * Helper function for error reporting in verifyBasicBlock.
- */
-static inline
-bool
-verifyErrorInVerifyBasicBlock(errorInfo* einfo,
*** Patch too long, truncated ***
More information about the kaffe
mailing list