You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by ge...@apache.org on 2006/08/02 18:04:07 UTC
svn commit: r428040 - in /incubator/harmony/enhanced/drlvm/trunk:
src/test/invokespecial_super/ src/test/invokespecial_super/src/
vm/vmcore/src/verifier/
Author: geirm
Date: Wed Aug 2 09:04:06 2006
New Revision: 428040
URL: http://svn.apache.org/viewvc?rev=428040&view=rev
Log:
HARMONY-919 : fix to DRLVM verifier for invokespecial
instruction
Also committed the tests for later integration
Added:
incubator/harmony/enhanced/drlvm/trunk/src/test/invokespecial_super/
incubator/harmony/enhanced/drlvm/trunk/src/test/invokespecial_super/HowTo.txt (with props)
incubator/harmony/enhanced/drlvm/trunk/src/test/invokespecial_super/src/
incubator/harmony/enhanced/drlvm/trunk/src/test/invokespecial_super/src/Super.j
incubator/harmony/enhanced/drlvm/trunk/src/test/invokespecial_super/src/Test.java (with props)
incubator/harmony/enhanced/drlvm/trunk/src/test/invokespecial_super/src/TestInvokeSpecial.j
Modified:
incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/verifier/Verifier.cpp
incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/verifier/ver_dataflow.cpp
incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/verifier/ver_real.h
incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/verifier/ver_utils.cpp
Added: incubator/harmony/enhanced/drlvm/trunk/src/test/invokespecial_super/HowTo.txt
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/src/test/invokespecial_super/HowTo.txt?rev=428040&view=auto
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/src/test/invokespecial_super/HowTo.txt (added)
+++ incubator/harmony/enhanced/drlvm/trunk/src/test/invokespecial_super/HowTo.txt Wed Aug 2 09:04:06 2006
@@ -0,0 +1,14 @@
+How to compile and run test:
+
+1) To compile you need to have a Jasmin version 1.1.
+This can be downloaded from http://jasmin.sourceforge.net
+
+2) The Jasmin distribution contains a jasmin.jar file holding the Jasmin assembler.
+To compile sources execute the following commands:
+
+$ java -jar <path to Jasmin 1.1>/jasmin.jar src/*.j
+$ java -d . src/Test.java
+
+3) To run test execute the following command:
+
+$ java Test
Propchange: incubator/harmony/enhanced/drlvm/trunk/src/test/invokespecial_super/HowTo.txt
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/harmony/enhanced/drlvm/trunk/src/test/invokespecial_super/src/Super.j
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/src/test/invokespecial_super/src/Super.j?rev=428040&view=auto
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/src/test/invokespecial_super/src/Super.j (added)
+++ incubator/harmony/enhanced/drlvm/trunk/src/test/invokespecial_super/src/Super.j Wed Aug 2 09:04:06 2006
@@ -0,0 +1,12 @@
+.class public Super
+.super java/lang/Object
+
+.method public <init>()V
+ aload_0
+ invokespecial java/lang/Object/<init>()V
+ return
+.end method
+
+.method public TestSuper()V
+ return
+.end method
Added: incubator/harmony/enhanced/drlvm/trunk/src/test/invokespecial_super/src/Test.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/src/test/invokespecial_super/src/Test.java?rev=428040&view=auto
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/src/test/invokespecial_super/src/Test.java (added)
+++ incubator/harmony/enhanced/drlvm/trunk/src/test/invokespecial_super/src/Test.java Wed Aug 2 09:04:06 2006
@@ -0,0 +1,15 @@
+public class Test {
+ public static void main(String [] argv) {
+ // check invokespecial
+ try {
+ Class cl = Class.forName("TestInvokeSpecial");
+ cl.newInstance();
+ System.out.println("TestInvokeSpecial: Fails");
+ } catch (LinkageError e) {
+ System.out.println("TestInvokeSpecial: Passes: " + e);
+ } catch (Throwable e) {
+ System.out.println("Test Failed, caught unexpected exception");
+ e.printStackTrace(System.out);
+ }
+ }
+}
Propchange: incubator/harmony/enhanced/drlvm/trunk/src/test/invokespecial_super/src/Test.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/harmony/enhanced/drlvm/trunk/src/test/invokespecial_super/src/TestInvokeSpecial.j
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/src/test/invokespecial_super/src/TestInvokeSpecial.j?rev=428040&view=auto
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/src/test/invokespecial_super/src/TestInvokeSpecial.j (added)
+++ incubator/harmony/enhanced/drlvm/trunk/src/test/invokespecial_super/src/TestInvokeSpecial.j Wed Aug 2 09:04:06 2006
@@ -0,0 +1,22 @@
+.class public TestInvokeSpecial
+.super Super
+
+.method public <init>()V
+ aload_0
+ invokespecial Super/<init>()V
+ return
+.end method
+
+.method public static main([Ljava/lang/String;)V
+
+ .limit stack 2
+
+ new Super
+ dup
+ invokespecial Super/<init>()V
+
+ ; object is instance of super class
+ invokespecial Super/TestSuper()V
+
+ return
+.end method
Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/verifier/Verifier.cpp
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/verifier/Verifier.cpp?rev=428040&r1=428039&r2=428040&view=diff
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/verifier/Verifier.cpp (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/verifier/Verifier.cpp Wed Aug 2 09:04:06 2006
@@ -3678,9 +3678,11 @@
if( !strcmp( cp_parse.method.m_name, "<init>" ) ) {
// set uninitialized check
vf_set_in_vector_type( code, 0, SM_UNINITIALIZED );
+ vf_set_in_vector_check( code, 0, VF_CHECK_DIRECT_SUPER );
+ } else {
+ // set method access check
+ vf_set_in_vector_check( code, 0, VF_CHECK_INVOKESPECIAL );
}
- // set method access check
- vf_set_in_vector_check( code, 0, VF_CHECK_ACCESS_METHOD );
vf_set_in_vector_check_index( code, 0, cp_index );
return VER_OK;
} // vf_opcode_invokespecial
@@ -5322,7 +5324,10 @@
result = vf_verify_method_bytecode( &context );
context.ClearContext();
}
- if (result != VER_OK) {
+ if( result == VER_NoSupportJSR ) {
+ result = VER_OK;
+ }
+ if (result != VER_OK ) {
goto labelEnd_verifyClass;
}
}
@@ -5344,9 +5349,6 @@
vf_delete_pool( context.m_pool );
delete context.m_type;
*message = context.m_error;
- if( result == VER_NoSupportJSR ) {
- result = VER_OK;
- }
#if _VERIFY_DEBUG
if( result != VER_OK ) {
VERIFY_DEBUG( "VerifyError: " << (context.m_error ? context.m_error : "NULL") );
Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/verifier/ver_dataflow.cpp
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/verifier/ver_dataflow.cpp?rev=428040&r1=428039&r2=428040&view=diff
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/verifier/ver_dataflow.cpp (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/verifier/ver_dataflow.cpp Wed Aug 2 09:04:06 2006
@@ -505,6 +505,14 @@
return result;
}
break;
+ case VF_CHECK_DIRECT_SUPER: // check is target class is direct super class of source
+ is_error = ctex->m_type->CheckTypes( target->m_vtype, source->m_vtype,
+ 0, VF_CHECK_DIRECT_SUPER );
+ break;
+ case VF_CHECK_INVOKESPECIAL: // check invokespecial object reference
+ is_error = ctex->m_type->CheckTypes( target->m_vtype, source->m_vtype,
+ 0, VF_CHECK_INVOKESPECIAL );
+ break;
default:
DIE( "Verifier: vf_check_entry_refs: unknown check in switch" );
}
@@ -822,7 +830,7 @@
VERIFY_REPORT( ctex, "(class: " << class_get_name( ctex->m_class )
<< ", method: " << method_get_name( ctex->m_method )
<< method_get_descriptor( ctex->m_method )
- << ") Data flow analysis error" );
+ << ") Data flow analysis error (uninitialized)" );
return result;
}
// check initialization class in constructor
Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/verifier/ver_real.h
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/verifier/ver_real.h?rev=428040&r1=428039&r2=428040&view=diff
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/verifier/ver_real.h (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/verifier/ver_real.h Wed Aug 2 09:04:06 2006
@@ -233,6 +233,7 @@
VF_CHECK_ACCESS_FIELD,
VF_CHECK_ACCESS_METHOD,
VF_CHECK_DIRECT_SUPER,
+ VF_CHECK_INVOKESPECIAL,
VF_CHECK_NUM
} vf_CheckConstraint_t;
Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/verifier/ver_utils.cpp
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/verifier/ver_utils.cpp?rev=428040&r1=428039&r2=428040&view=diff
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/verifier/ver_utils.cpp (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/verifier/ver_utils.cpp Wed Aug 2 09:04:06 2006
@@ -477,6 +477,7 @@
}
}
return false;
+
case VF_CHECK_ACCESS_FIELD: // check field access
// compare types
assert( required->number == 1 );
@@ -490,6 +491,7 @@
index, VF_CHECK_ACCESS_FIELD );
}
return false;
+
case VF_CHECK_ACCESS_METHOD: // check method access
// compare types
assert( required->number == 1 );
@@ -503,10 +505,29 @@
index, VF_CHECK_ACCESS_METHOD );
}
return false;
+ case VF_CHECK_DIRECT_SUPER:
+ if( required->number == 1 && available->number == 1 ) {
+ if( required->string[0] != available->string[0] ) {
+ SetRestriction( required->string[0], available->string[0],
+ 0, VF_CHECK_DIRECT_SUPER );
+ }
+ return false;
+ }
+ return true;
+
+ case VF_CHECK_INVOKESPECIAL:
+ assert( required->number == 1 );
+ for( index1 = 0; index1 < available->number; index1++ ) {
+ SetRestriction( required->string[0], available->string[index1],
+ index, VF_CHECK_INVOKESPECIAL );
+ }
+ return false;
default:
DIE("Verifier: CompareTypes: unknown check type in switch");
+ return true;
}
- return true;
+ // unreachable code
+ assert(0);
} // vf_TypePool::CheckTypes
/**
@@ -968,7 +989,8 @@
static bool
vf_is_valid( class_handler source, // checked class
class_handler target, // required class
- vf_CheckConstraint_t check) // checked class type
+ class_handler current, // current class
+ unsigned check) // checked class type
{
switch( check )
{
@@ -986,18 +1008,25 @@
return class_is_same_class( class_get_super_class( source ), target );
case VF_CHECK_ACCESS_FIELD: // protected field access
case VF_CHECK_ACCESS_METHOD: // protected method acceess
- if( class_is_same_package( source, target )
- || vf_is_super_class( source, target ) )
+ if( class_is_same_package( source, current )
+ || vf_is_super_class( source, current ) )
{
return true;
}
- break;
+ return false;
+ case VF_CHECK_INVOKESPECIAL:
+ if( vf_is_super_class( source, current )
+ && vf_is_super_class( current, target ) )
+ {
+ return true;
+ }
+ return false;
default:
- VERIFY_DEBUG( "vf_is_valid: invalid check type" );
- vf_error();
- break;
+ DIE( "Verifier: vf_is_valid: invalid check type" );
+ return false;
}
- return false;
+ // unreachable code
+ assert(0);
} // vf_is_valid
/**
@@ -1009,7 +1038,7 @@
{
switch( restriction->check_type )
{
- case VF_CHECK_DIRECT_SUPER:
+ case VF_CHECK_SUPER:
/**
* Extension for class java/lang/Object doesn't check
* because it's expected all references extend it.
@@ -1106,7 +1135,7 @@
}
// check restriction
- if( !vf_is_valid( source, target, (vf_CheckConstraint_t)restriction->check_type ) ) {
+ if( !vf_is_valid( source, target, ctex->m_class, restriction->check_type ) ) {
// return error
switch( restriction->check_type )
{
@@ -1230,7 +1259,7 @@
}
// check access constraint
- if( !vf_is_valid( instance, ctex->m_class, check_type ) )
+ if( !vf_is_valid( instance, NULL, ctex->m_class, check_type ) )
{
// return error
switch( check_type )
@@ -1389,7 +1418,7 @@
}
// check restriction
- if( !vf_is_valid( source, target, check ) )
+ if( !vf_is_valid( source, target, ctex->m_class, check ) )
{
switch( check )
{