Index: include/class_interface.h
===================================================================
--- include/class_interface.h (revision 584118)
+++ include/class_interface.h (working copy)
@@ -179,11 +179,11 @@
* @param klass - checked klass
* @param super_name - parent class name
* @return If given class extends current class with given name,
- * function returns 1, else function returns 0.
+ * function returns its class handler, else function returns 0.
* @note Assertion is raised if klass or super_name are equal to null.
*/
-unsigned
-class_is_extending_class( class_handler klass, char *super_name );
+class_handler
+class_is_extending_class( class_handler klass, const char *super_name );
/**
* Function returns number of methods for current class.
Index: src/class_support/class_impl.cpp
===================================================================
--- src/class_support/class_impl.cpp (revision 584118)
+++ src/class_support/class_impl.cpp (working copy)
@@ -171,15 +171,19 @@
/**
* Function checks if class extends current class with given name.
*/
-unsigned
-class_is_extending_class( class_handler klass, char *super_name )
+class_handler
+class_is_extending_class( class_handler klass, const char *super_name )
{
assert( klass );
assert( super_name );
+
+ Global_Env *env = VM_Global_State::loader_env;
+ String *pooled_name = env->string_pool.lookup( super_name );
+
for( Class *clss = (Class*)klass; clss; clss = clss->get_super_class() ) {
- if( !strcmp( clss->get_name()->bytes, super_name ) ) {
+ if( clss->get_name() == pooled_name ) {
// found class with given name
- return 1;
+ return (class_handler)clss;
}
}
return 0;
Index: src/verifier-3363/java6/context_6.h
===================================================================
--- src/verifier-3363/java6/context_6.h (revision 595349)
+++ src/verifier-3363/java6/context_6.h (working copy)
@@ -41,6 +41,8 @@
vf_Context_x(classwide) {}
vf_Result verify_method(method_handler method);
+uint8 use_substitution;
+uint8 *substitution;
protected:
// stackmaps for instructions
InstrPropsBase props;
Index: src/verifier-3363/java6/context_6.cpp
===================================================================
--- src/verifier-3363/java6/context_6.cpp (revision 595349)
+++ src/verifier-3363/java6/context_6.cpp (working copy)
@@ -18,6 +18,7 @@
* @author Mikhail Loenko, Vladimir Molotkov
*/
+#include "verifier.h"
#include "context_6.h"
namespace CPVerifier_6 {
@@ -196,7 +197,7 @@
vf_Result vf_Context_6::load_stackmaptable() {
vf_Result tcr;
- uint8* stackmaptable = method_get_stackmaptable(m_method);
+ uint8* stackmaptable = use_substitution ? substitution : method_get_stackmaptable(m_method);
if(!stackmaptable) return VF_OK;
Index: src/verifier-3363/base/tpool.cpp
===================================================================
--- src/verifier-3363/base/tpool.cpp (revision 595349)
+++ src/verifier-3363/base/tpool.cpp (working copy)
@@ -272,15 +272,14 @@
}
if( referred == CLASS_NOT_LOADED ) {
- //referred class can't be resolved ==> it's not a super class
-//#ifndef NDEBUG
-// class_handler k = k_class;
-// while(k) {
-// assert(strcmp(class_get_name(k), expected_type->name));
-// k = class_get_super_class(k);
-// }
-//#endif
- return false;
+ //referred class can't be resolved ==> still might be a super class
+ class_handler k = class_is_extending_class(k_class, expected_type->name);
+
+ if( k ) {
+ referred = k;
+ } else {
+ return false;
+ }
}
return !class_is_same_package(k_class, referred) && vf_is_extending(k_class, referred);