aboutsummaryrefslogtreecommitdiff
path: root/libjava
diff options
context:
space:
mode:
authorKeith Seitz <keiths@redhat.com>2007-06-20 20:30:34 +0000
committerKeith Seitz <kseitz@gcc.gnu.org>2007-06-20 20:30:34 +0000
commita7eeed049b13081415cd32acf5e5c1de3d787bdd (patch)
tree2111b26ec03f87911659e6bd58a97f1e83b76957 /libjava
parent7e657ec235f32af78f39a1c710737cc6191b0bde (diff)
downloadgcc-a7eeed049b13081415cd32acf5e5c1de3d787bdd.zip
gcc-a7eeed049b13081415cd32acf5e5c1de3d787bdd.tar.gz
gcc-a7eeed049b13081415cd32acf5e5c1de3d787bdd.tar.bz2
Update from classpath trunk:
* gnu/classpath/jdwp/processor/ClassTypeCommandSet.java (executeInvokeMethod): No need to use ValueFactory any more; MethodResult.getReturnedValue now returns a Value. (executeNewInstance): Double-check that return result is an ObjectValue; throw JdwpInternalErrorException if it is not. (invokeMethod): Method IDs come from VMMethod, not VMIdManager. Arguments are Values not Objects. Use ValueFactory to create arguments. Pass invocation options to VMVirtualMachine.executeMethod. Don't do any thread suspend/resume work: VMVM.executeMethod will take care of it. * gnu/classpath/jdwp/processor/ObjectReferenceCommandSet.java (executeInvokeMethod): Method IDs come from VMMethod, not VMIdManager. Arguments should be Values instead of Objects. Use ValueFactory to create Values. Remove specific option handling and pass options to VMVirtualMachine.executeMethod. Remove thread suspension. Use MethodResult.getReturnedValue to get method's result. * gnu/classpath/jdwp/util/MethodResult.java (returnedValue): Change type to Value. (thrownException): Change type to Throwable. (resType): Remove. (MethodResult): New constructor. (setReturnedValue): Remove. (SetThrownException): Remove. (getResultType): Remove. (setResultType): Remove. * gnu/classpath/jdwp/value/ObjectValue.java (getValue): New method. * vm/reference/gnu/classpath/jdwp/VMVirtualMachine.java (executeMethod): Replace "nonVirtual" parameter with more generic "options" parameter. Replace java.lang.reflect.Method parameter with VMMethod. Replace Object[] parameter with Value[] parameter. From-SVN: r125895
Diffstat (limited to 'libjava')
-rw-r--r--libjava/classpath/ChangeLog39
-rw-r--r--libjava/classpath/gnu/classpath/jdwp/processor/ClassTypeCommandSet.java62
-rw-r--r--libjava/classpath/gnu/classpath/jdwp/processor/ObjectReferenceCommandSet.java34
-rw-r--r--libjava/classpath/gnu/classpath/jdwp/util/MethodResult.java51
-rw-r--r--libjava/classpath/gnu/classpath/jdwp/value/ObjectValue.java10
-rw-r--r--libjava/classpath/vm/reference/gnu/classpath/jdwp/VMVirtualMachine.java18
6 files changed, 110 insertions, 104 deletions
diff --git a/libjava/classpath/ChangeLog b/libjava/classpath/ChangeLog
index 87a7956..669437a 100644
--- a/libjava/classpath/ChangeLog
+++ b/libjava/classpath/ChangeLog
@@ -1,3 +1,42 @@
+2007-07-20 Keith Seitz <keiths@redhat.com>
+
+ * gnu/classpath/jdwp/processor/ClassTypeCommandSet.java
+ (executeInvokeMethod): No need to use ValueFactory any more;
+ MethodResult.getReturnedValue now returns a Value.
+ (executeNewInstance): Double-check that return result is
+ an ObjectValue; throw JdwpInternalErrorException if it is not.
+ (invokeMethod): Method IDs come from VMMethod, not VMIdManager.
+ Arguments are Values not Objects.
+ Use ValueFactory to create arguments.
+ Pass invocation options to VMVirtualMachine.executeMethod.
+ Don't do any thread suspend/resume work: VMVM.executeMethod
+ will take care of it.
+ * gnu/classpath/jdwp/processor/ObjectReferenceCommandSet.java
+ (executeInvokeMethod): Method IDs come from VMMethod, not
+ VMIdManager.
+ Arguments should be Values instead of Objects.
+ Use ValueFactory to create Values.
+ Remove specific option handling and pass options to
+ VMVirtualMachine.executeMethod.
+ Remove thread suspension.
+ Use MethodResult.getReturnedValue to get method's result.
+ * gnu/classpath/jdwp/util/MethodResult.java
+ (returnedValue): Change type to Value.
+ (thrownException): Change type to Throwable.
+ (resType): Remove.
+ (MethodResult): New constructor.
+ (setReturnedValue): Remove.
+ (SetThrownException): Remove.
+ (getResultType): Remove.
+ (setResultType): Remove.
+ * gnu/classpath/jdwp/value/ObjectValue.java (getValue):
+ New method.
+ * vm/reference/gnu/classpath/jdwp/VMVirtualMachine.java
+ (executeMethod): Replace "nonVirtual" parameter with more
+ generic "options" parameter.
+ Replace java.lang.reflect.Method parameter with VMMethod.
+ Replace Object[] parameter with Value[] parameter.
+
2007-05-19 Andreas Tobler <a.tobler@schweiz.org>
PR libgcj/31659
diff --git a/libjava/classpath/gnu/classpath/jdwp/processor/ClassTypeCommandSet.java b/libjava/classpath/gnu/classpath/jdwp/processor/ClassTypeCommandSet.java
index b29b571..500152e 100644
--- a/libjava/classpath/gnu/classpath/jdwp/processor/ClassTypeCommandSet.java
+++ b/libjava/classpath/gnu/classpath/jdwp/processor/ClassTypeCommandSet.java
@@ -41,6 +41,7 @@ exception statement from your version. */
package gnu.classpath.jdwp.processor;
import gnu.classpath.jdwp.JdwpConstants;
+import gnu.classpath.jdwp.VMMethod;
import gnu.classpath.jdwp.VMVirtualMachine;
import gnu.classpath.jdwp.exception.InvalidFieldException;
import gnu.classpath.jdwp.exception.JdwpException;
@@ -49,13 +50,13 @@ import gnu.classpath.jdwp.exception.NotImplementedException;
import gnu.classpath.jdwp.id.ObjectId;
import gnu.classpath.jdwp.id.ReferenceTypeId;
import gnu.classpath.jdwp.util.MethodResult;
+import gnu.classpath.jdwp.value.ObjectValue;
import gnu.classpath.jdwp.value.Value;
import gnu.classpath.jdwp.value.ValueFactory;
import java.io.DataOutputStream;
import java.io.IOException;
import java.lang.reflect.Field;
-import java.lang.reflect.Method;
import java.nio.ByteBuffer;
/**
@@ -151,12 +152,9 @@ public class ClassTypeCommandSet
{
MethodResult mr = invokeMethod(bb);
- Object value = mr.getReturnedValue();
- Exception exception = mr.getThrownException();
+ Throwable exception = mr.getThrownException();
ObjectId eId = idMan.getObjectId(exception);
-
- Value val = ValueFactory.createFromObject(value, mr.getResultType());
- val.writeTagged(os);
+ mr.getReturnedValue().writeTagged(os);
eId.writeTagged(os);
}
@@ -164,10 +162,14 @@ public class ClassTypeCommandSet
throws JdwpException, IOException
{
MethodResult mr = invokeMethod(bb);
+ Throwable exception = mr.getThrownException();
+
+ if (exception == null && ! (mr.getReturnedValue() instanceof ObjectValue))
+ throw new JdwpInternalErrorException("new instance returned non-object");
+
+ ObjectValue ov = (ObjectValue) mr.getReturnedValue();
+ ObjectId oId = idMan.getObjectId(ov.getValue());
- Object obj = mr.getReturnedValue();
- ObjectId oId = idMan.getObjectId(obj);
- Exception exception = mr.getThrownException();
ObjectId eId = idMan.getObjectId(exception);
oId.writeTagged(os);
@@ -177,8 +179,8 @@ public class ClassTypeCommandSet
/**
* Execute the static method and return the resulting MethodResult.
*/
- private MethodResult invokeMethod(ByteBuffer bb) throws JdwpException,
- IOException
+ private MethodResult invokeMethod(ByteBuffer bb)
+ throws JdwpException, IOException
{
ReferenceTypeId refId = idMan.readReferenceTypeId(bb);
Class clazz = refId.getType();
@@ -186,42 +188,18 @@ public class ClassTypeCommandSet
ObjectId tId = idMan.readObjectId(bb);
Thread thread = (Thread) tId.getObject();
- ObjectId mId = idMan.readObjectId(bb);
- Method method = (Method) mId.getObject();
+ VMMethod method = VMMethod.readId(clazz, bb);
int args = bb.getInt();
- Object[] values = new Object[args];
+ Value[] values = new Value[args];
for (int i = 0; i < args; i++)
- {
- values[i] = Value.getTaggedObject(bb);
- }
+ values[i] = ValueFactory.createFromTagged(bb);
int invokeOpts = bb.getInt();
- boolean suspend = ((invokeOpts
- & JdwpConstants.InvokeOptions.INVOKE_SINGLE_THREADED)
- != 0);
- try
- {
- if (suspend)
- VMVirtualMachine.suspendAllThreads ();
-
- MethodResult mr = VMVirtualMachine.executeMethod(null, thread,
- clazz, method,
- values, false);
- mr.setResultType(method.getReturnType());
-
- if (suspend)
- VMVirtualMachine.resumeAllThreads ();
-
- return mr;
- }
- catch (Exception ex)
- {
- if (suspend)
- VMVirtualMachine.resumeAllThreads ();
-
- throw new JdwpInternalErrorException(ex);
- }
+ MethodResult mr = VMVirtualMachine.executeMethod(null, thread,
+ clazz, method,
+ values, invokeOpts);
+ return mr;
}
}
diff --git a/libjava/classpath/gnu/classpath/jdwp/processor/ObjectReferenceCommandSet.java b/libjava/classpath/gnu/classpath/jdwp/processor/ObjectReferenceCommandSet.java
index ed83fd2..49b3f0d 100644
--- a/libjava/classpath/gnu/classpath/jdwp/processor/ObjectReferenceCommandSet.java
+++ b/libjava/classpath/gnu/classpath/jdwp/processor/ObjectReferenceCommandSet.java
@@ -40,6 +40,7 @@ exception statement from your version. */
package gnu.classpath.jdwp.processor;
import gnu.classpath.jdwp.JdwpConstants;
+import gnu.classpath.jdwp.VMMethod;
import gnu.classpath.jdwp.VMVirtualMachine;
import gnu.classpath.jdwp.exception.InvalidFieldException;
import gnu.classpath.jdwp.exception.JdwpException;
@@ -213,42 +214,21 @@ public class ObjectReferenceCommandSet
ReferenceTypeId rid = idMan.readReferenceTypeId(bb);
Class clazz = rid.getType();
- ObjectId mid = idMan.readObjectId(bb);
- Method method = (Method) mid.getObject();
+ VMMethod method = VMMethod.readId(clazz, bb);
int args = bb.getInt();
- Object[] values = new Object[args];
+ Value[] values = new Value[args];
for (int i = 0; i < args; i++)
- {
- values[i] = Value.getTaggedObject(bb);
- }
+ values[i] = ValueFactory.createFromTagged(bb);
int invokeOptions = bb.getInt();
- boolean suspend = ((invokeOptions
- & JdwpConstants.InvokeOptions.INVOKE_SINGLE_THREADED)
- != 0);
- if (suspend)
- {
- // We must suspend all other running threads first
- VMVirtualMachine.suspendAllThreads ();
- }
-
- boolean nonVirtual = ((invokeOptions
- & JdwpConstants.InvokeOptions.INVOKE_NONVIRTUAL)
- != 0);
-
MethodResult mr = VMVirtualMachine.executeMethod(obj, thread,
clazz, method,
- values, nonVirtual);
- mr.setResultType (method.getReturnType());
-
- Object value = mr.getReturnedValue();
- Exception exception = mr.getThrownException();
-
+ values, invokeOptions);
+ Throwable exception = mr.getThrownException();
ObjectId eId = idMan.getObjectId(exception);
- Value val = ValueFactory.createFromObject(value, mr.getResultType());
- val.writeTagged(os);
+ mr.getReturnedValue().writeTagged(os);
eId.writeTagged(os);
}
diff --git a/libjava/classpath/gnu/classpath/jdwp/util/MethodResult.java b/libjava/classpath/gnu/classpath/jdwp/util/MethodResult.java
index 190511d..bf3ee8e 100644
--- a/libjava/classpath/gnu/classpath/jdwp/util/MethodResult.java
+++ b/libjava/classpath/gnu/classpath/jdwp/util/MethodResult.java
@@ -1,6 +1,6 @@
/* MethodResult.java -- class to wrap around values returned from a Method call
in the VM
- Copyright (C) 2005 Free Software Foundation
+ Copyright (C) 2005, 2007 Free Software Foundation
This file is part of GNU Classpath.
@@ -40,6 +40,8 @@ exception statement from your version. */
package gnu.classpath.jdwp.util;
+import gnu.classpath.jdwp.value.Value;
+
/**
* A class to wrap around values returned from a Method call in the VM.
*
@@ -48,42 +50,37 @@ package gnu.classpath.jdwp.util;
public class MethodResult
{
// The Object returned by the executing method
- private Object returnedValue;
+ private Value returnedValue;
// Any Exception that was thrown by the executing method
- private Exception thrownException;
+ private Throwable thrownException;
- // The type of this result
- private Class resType;
-
- public Object getReturnedValue()
+ /**
+ * Constructs a new MethodResult object
+ *
+ * @param return_value the return value of the method invocation
+ * @param exc exception thrown during the invocation (or null if none)
+ */
+ public MethodResult (Value return_value, Throwable exc)
{
- return returnedValue;
+ returnedValue = return_value;
+ thrownException = exc;
}
- public void setReturnedValue(Object returnedValue)
+ /**
+ * Returns the return value of the method invocation
+ */
+ public Value getReturnedValue()
{
- this.returnedValue = returnedValue;
+ return returnedValue;
}
- public Exception getThrownException()
+ /**
+ * Returns the exception thrown during the method invocation
+ * (or null if none)
+ */
+ public Throwable getThrownException()
{
return thrownException;
}
-
- public void setThrownException(Exception thrownException)
- {
- this.thrownException = thrownException;
- }
-
- public Class getResultType()
- {
- return resType;
- }
-
- public void setResultType(Class type)
- {
- resType = type;
- }
-
}
diff --git a/libjava/classpath/gnu/classpath/jdwp/value/ObjectValue.java b/libjava/classpath/gnu/classpath/jdwp/value/ObjectValue.java
index 7ec9beb..b5cdb1f 100644
--- a/libjava/classpath/gnu/classpath/jdwp/value/ObjectValue.java
+++ b/libjava/classpath/gnu/classpath/jdwp/value/ObjectValue.java
@@ -67,6 +67,16 @@ public final class ObjectValue
}
/**
+ * Get the value held in this Value
+ *
+ * @return the value represented by this Value object
+ */
+ public Object getValue()
+ {
+ return _value;
+ }
+
+ /**
* Return an object representing this type
*
* @return an Object represntation of this value
diff --git a/libjava/classpath/vm/reference/gnu/classpath/jdwp/VMVirtualMachine.java b/libjava/classpath/vm/reference/gnu/classpath/jdwp/VMVirtualMachine.java
index 5c76194..3556220 100644
--- a/libjava/classpath/vm/reference/gnu/classpath/jdwp/VMVirtualMachine.java
+++ b/libjava/classpath/vm/reference/gnu/classpath/jdwp/VMVirtualMachine.java
@@ -46,8 +46,8 @@ import gnu.classpath.jdwp.exception.InvalidMethodException;
import gnu.classpath.jdwp.exception.JdwpException;
import gnu.classpath.jdwp.util.MethodResult;
import gnu.classpath.jdwp.util.MonitorInfo;
+import gnu.classpath.jdwp.value.Value;
-import java.lang.reflect.Method;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Collection;
@@ -284,21 +284,23 @@ public class VMVirtualMachine
throws JdwpException;
/**
- * Executes a method in the virtual machine
+ * Executes a method in the virtual machine. The thread must already
+ * be suspended by a previous event. When the method invocation is
+ * complete, the thread (or all threads if INVOKE_SINGLE_THREADED is
+ * not set in options) must be suspended before this method returns.
*
* @param obj instance in which to invoke method (null for static)
* @param thread the thread in which to invoke the method
* @param clazz the class in which the method is defined
* @param method the method to invoke
* @param values arguments to pass to method
- * @param nonVirtual "otherwise, normal virtual invoke
- * (instance methods only) "
+ * @param options invocation options
* @return a result object containing the results of the invocation
*/
- public static native MethodResult executeMethod(Object obj, Thread thread,
- Class clazz, Method method,
- Object[] values,
- boolean nonVirtual)
+ public static native MethodResult executeMethod (Object obj, Thread thread,
+ Class clazz, VMMethod method,
+ Value[] values,
+ int options)
throws JdwpException;
/**