You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by gs...@apache.org on 2007/06/14 19:48:16 UTC

svn commit: r547333 - in /harmony/enhanced/drlvm/trunk: src/test/regression/H3908/ src/test/regression/H3908/InvokeTest.java vm/vmcore/src/reflection/reflection.cpp

Author: gshimansky
Date: Thu Jun 14 10:48:15 2007
New Revision: 547333

URL: http://svn.apache.org/viewvc?view=rev&rev=547333
Log:
Applied patch from HARMONY-3908
[drlvm][kernel] Drlvm crashes on Method.invoke(obj, {arg}) if arg extends Number instead of expected primitive type wrapper


Added:
    harmony/enhanced/drlvm/trunk/src/test/regression/H3908/
    harmony/enhanced/drlvm/trunk/src/test/regression/H3908/InvokeTest.java   (with props)
Modified:
    harmony/enhanced/drlvm/trunk/vm/vmcore/src/reflection/reflection.cpp

Added: harmony/enhanced/drlvm/trunk/src/test/regression/H3908/InvokeTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/src/test/regression/H3908/InvokeTest.java?view=auto&rev=547333
==============================================================================
--- harmony/enhanced/drlvm/trunk/src/test/regression/H3908/InvokeTest.java (added)
+++ harmony/enhanced/drlvm/trunk/src/test/regression/H3908/InvokeTest.java Thu Jun 14 10:48:15 2007
@@ -0,0 +1,54 @@
+package org.apache.harmony.drlvm.tests.regression.h3908;
+
+import junit.framework.TestCase;
+
+import java.lang.reflect.Method;
+
+public class InvokeTest extends TestCase {
+
+    byte b = 0;
+
+    public static void main(String args[]) {
+        (new InvokeTest()).test();
+    }
+
+    public void test() {
+        boolean status = false;
+
+        try {
+            Method method = InvokeTest.class.getDeclaredMethod("method", new Class[] {Byte.TYPE});
+            method.invoke(new InvokeTest(), new Object[] {new N()});
+            System.out.println("TEST FAILED: no exception");
+        } catch(IllegalArgumentException e) {
+            status = true;
+            System.out.println("TEST PASSED: " + e);
+        } catch(Exception e) {
+            System.out.println("TEST FAILED: unexpected " + e);
+        }
+
+        assertTrue(status);
+    }
+
+    public void method(byte b) {
+        this.b = b;
+    }
+}
+
+class N extends Number {
+
+    public double doubleValue() {
+        return 0;
+    }
+
+    public float floatValue() {
+        return 0;
+    }
+
+    public int intValue() {
+        return 0;
+    }
+
+    public long longValue() {
+        return 0;
+    }
+}

Propchange: harmony/enhanced/drlvm/trunk/src/test/regression/H3908/InvokeTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/reflection/reflection.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/reflection/reflection.cpp?view=diff&rev=547333&r1=547332&r2=547333
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/reflection/reflection.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/reflection/reflection.cpp Thu Jun 14 10:48:15 2007
@@ -309,9 +309,13 @@
             char arg_sig = is_wrapper_class(arg_clss->get_name()->bytes);
             char param_sig = (char)type;
 
-            ASSERT(arg_sig, "Reflection arguments mismatch: expected " 
-                << param_sig << " but was " << arg_clss->get_name()->bytes);
-            
+            // actual parameter is not a wrapper
+            if (0 == arg_sig) {
+                ThrowNew_Quick(jenv, "java/lang/IllegalArgumentException",
+                    "actual parameter for the primitive argument is not a wrapper object");
+                return false;
+            }
+
             array[arg_number] = unwrap_primitive(jenv, arg, arg_sig);
 
             if (!widen_primitive_jvalue(array + arg_number, arg_sig, param_sig)) {