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);