You are viewing a plain text version of this content. The canonical link for it is here.
Posted to kato-commits@incubator.apache.org by sp...@apache.org on 2009/05/21 11:24:00 UTC

svn commit: r777072 - in /incubator/kato/branches/experimental/PyJVMTI: kato/BinDump.py kato/JMethod.py kato/PauseJVM.java kato/console.py pyjvmti.c pyjvmti.h

Author: spoole
Date: Thu May 21 11:24:00 2009
New Revision: 777072

URL: http://svn.apache.org/viewvc?rev=777072&view=rev
Log:
updates to jvmti dump reader project to accomodate new experimental api structure

Modified:
    incubator/kato/branches/experimental/PyJVMTI/kato/BinDump.py
    incubator/kato/branches/experimental/PyJVMTI/kato/JMethod.py
    incubator/kato/branches/experimental/PyJVMTI/kato/PauseJVM.java
    incubator/kato/branches/experimental/PyJVMTI/kato/console.py
    incubator/kato/branches/experimental/PyJVMTI/pyjvmti.c
    incubator/kato/branches/experimental/PyJVMTI/pyjvmti.h

Modified: incubator/kato/branches/experimental/PyJVMTI/kato/BinDump.py
URL: http://svn.apache.org/viewvc/incubator/kato/branches/experimental/PyJVMTI/kato/BinDump.py?rev=777072&r1=777071&r2=777072&view=diff
==============================================================================
--- incubator/kato/branches/experimental/PyJVMTI/kato/BinDump.py (original)
+++ incubator/kato/branches/experimental/PyJVMTI/kato/BinDump.py Thu May 21 11:24:00 2009
@@ -15,6 +15,7 @@
 import kato.JField as JField
 import kato.JThreadGroup as JThreadGroup
 import kato.JMethod as JMethod
+import jvmti
 
 import struct
 
@@ -84,7 +85,7 @@
             self.saveMonitors(monlength,monitors)
 
         if tracelen > 0 :
-            self.saveStackTrace(tracelen,stacktrace)
+            self.saveStackTrace(tracelen,thread,stacktrace)
        
         print "saved " , thread.name 
        
@@ -99,21 +100,297 @@
             self.output.write(header)
     
             
-    def saveStackTrace(self,count,list):
+    def saveStackTrace(self,count,thread,list):
         
         print "stacktrace=",count
         header=struct.pack("!hi",103,count)
         self.output.write(header)
         
+        depth=0
+        
         for frame in list :
-            a=frame[0]
-            b=frame[1]
-            if a==None : a=-1
-            if b==None:  b= -1
-            header=struct.pack("!ii",a,b)
+            methodid=frame[0]
+            locationid=frame[1]
+            if methodid==None : a=-1
+            if locationid==None:  b= -1
+            
+            method=JMethod.JMethod(methodid)
+            
+            # given thread number of slots we find the data
+            localvars=method.localVariableTable
+            count=len(localvars)
+            
+             
+            header=struct.pack("!iii",methodid,locationid,count)
             self.output.write(header)
-               
             
+            if count > 0 :
+                print "saving ",count," vars"
+                self.saveVariables(thread.threadid,localvars,depth)
+            
+            depth=depth+1
+            
+    
+    def getVariables(self,threadid,method,depth): 
+        '''
+        Returns a list of local variable values for the provided method  
+        '''
+        localvars=method.localVariableTable
+        
+        results=[]
+        
+        for entry in localvars  :
+            
+          signature=entry.signature
+          try :
+                
+            if signature=='Z' :
+                boolvalue=jvmti.getLocalInt(threadid,depth,entry.slot)
+                results=results + [signature,boolvalue]
+            
+            elif signature=='C' :
+                charvalue=jvmti.getLocalInt(threadid,depth,entry.slot)
+                results=results + [ signature,charvalue]
+                
+            elif signature=='I' :
+                intvalue=jvmti.getLocalInt(threadid,depth,entry.slot)
+                results=results + [signature, intvalue]
+            
+            elif signature=='B' :
+                bytevalue=jvmti.getLocalInt(threadid,depth,entry.slot)
+                results=results + [signature, bytevalue]
+            
+            elif signature=='S' :
+                shortvalue=jvmti.getLocalInt(threadid,depth,entry.slot)
+                results=results + [ signature,shortvalue]
+            
+            elif signature=='J' :
+                longvalue=jvmti.getLocalLong(threadid,depth,entry.slot)
+                results=results + [ signature,longvalue]
+            
+            elif signature=='[C' :
+                 objvalue=jvmti.getLocalObject(threadid,depth,entry.slot)
+                 chararray=jvmti.getCharArrayElements(objvalue)
+                 results=results + [ signature,chararray]
+             
+            elif signature=='[I' :
+                 objvalue=jvmti.getLocalObject(threadid,depth,entry.slot)
+                 intarray=jvmti.getIntArrayElements(objvalue)
+                 results=results + [ signature,intarray]
+            
+            elif signature=='[B' :
+                 objvalue=jvmti.getLocalObject(threadid,depth,entry.slot)
+                 array=jvmti.getByteArrayElements(objvalue)
+                 results=results + [ signature,array]
+                
+            elif signature=='[S' :
+                 objvalue=jvmti.getLocalObject(threadid,depth,entry.slot)
+                 shortarray=jvmti.getShortArrayElements(objvalue)
+                 results=results + [ signature,shortarray]
+                 
+            elif signature=='[J' :
+                 objvalue=jvmti.getLocalObject(threadid,depth,entry.slot)
+                 array=jvmti.getLongArrayElements(objvalue)
+                 results=results + [ signature,array]
+            
+            elif signature=='[C' :
+                 objvalue=jvmti.getLocalObject(threadid,depth,entry.slot)
+                 array=jvmti.getCharArrayElements(objvalue)
+                 results=results + [ signature,array]
+            
+            elif signature=='[F' :
+                 objvalue=jvmti.getLocalObject(threadid,depth,entry.slot)
+                 array=jvmti.getFloatArrayElements(objvalue)
+                 results=results + [ signature,array]
+            
+            elif signature=='[D' :
+                 objvalue=jvmti.getLocalObject(threadid,depth,entry.slot)
+                 array=jvmti.getDoubleArrayElements(objvalue)
+                 results=results + [ signature,array]
+                 
+            elif signature[0]=='[' :
+                objvalue=jvmti.getLocalObject(threadid,depth,entry.slot)
+                arrayLength=jvmti.getArrayLength(objvalue)
+                results=results + [ "array:"+signature,arrayLength,objvalue]
+                
+            else :
+                objvalue=jvmti.getLocalObject(threadid,depth,entry.slot)
+                results=results + [ signature,objvalue]
+                
+          except jvmti.error :
+                print "err..." , jvmti.error
+            
+        print results
+        return results
+    
+    def saveVariables(self,threadid,localvars,depth): 
+        '''
+        Saves all the local variables of slot...
+          
+        '''
+        
+        
+        for entry in localvars  :
+        
+          header=struct.pack("!hi",501,entry.slot)
+          self.output.write(header)
+          signature=entry.signature
+          print "saving ",signature,entry.slot
+          try :
+            
+            
+        
+                
+            if signature=='Z' :
+                boolvalue=jvmti.getLocalInt(threadid,depth,entry.slot)
+                header=struct.pack("!h",boolvalue)
+                self.writeName(signature)
+                self.output.write(header)
+            
+            elif signature=='C' :
+                charvalue=jvmti.getLocalInt(threadid,depth,entry.slot)
+                header=struct.pack("!c",charvalue)
+                self.writeName(signature)
+                self.output.write(header)
+                
+            elif signature=='I' :
+                intvalue=jvmti.getLocalInt(threadid,depth,entry.slot)
+                header=struct.pack("!i",intvalue)
+                self.writeName(signature)
+                self.output.write(header)
+            
+            elif signature=='B' :
+                bytevalue=jvmti.getLocalInt(threadid,depth,entry.slot)
+                header=struct.pack("!h",bytevalue)
+                self.writeName(signature)
+                self.output.write(header)
+            
+            elif signature=='S' :
+                shortvalue=jvmti.getLocalInt(threadid,depth,entry.slot)
+                header=struct.pack("!h",shortvalue)
+                self.writeName(signature)
+                self.output.write(header)
+            
+            elif signature=='J' :
+                longvalue=jvmti.getLocalLong(threadid,depth,entry.slot)
+                header=struct.pack("!q",longvalue)
+                print "length of len=",len(header)
+                self.writeName(signature)
+                self.output.write(header)
+            
+            elif signature=='[C' :
+                 objvalue=jvmti.getLocalObject(threadid,depth,entry.slot)
+                 chararray=jvmti.getCharArrayElements(objvalue)
+                 arraylen=len(chararray)
+                 
+                 header=struct.pack("!i",arraylen)
+                 self.writeName(signature)
+                 self.output.write(header)
+                 
+                 print chararray
+                 for element in chararray :
+                     header=struct.pack("!c",element)
+                     self.output.write(header)
+                     
+             
+            elif signature=='[I' :
+                 objvalue=jvmti.getLocalObject(threadid,depth,entry.slot)
+                 intarray=jvmti.getIntArrayElements(objvalue)
+                 arraylen=len(intarray)
+                 header=struct.pack("!i",arraylen)
+                 self.writeName(signature)
+                 self.output.write(header)
+                 print intarray
+                 for element in intarray :
+                     header=struct.pack("!i",element)
+                     self.output.write(header)
+                 
+            
+            elif signature=='[B' :
+                 objvalue=jvmti.getLocalObject(threadid,depth,entry.slot)
+                 array=jvmti.getByteArrayElements(objvalue)
+                 arraylen=len(array)
+                 self.writeName(signature)
+                 header=struct.pack("!i",arraylen)
+                 self.output.write(header)
+                 for element in array :
+                     header=struct.pack("!h",element)
+                     self.output.write(header)
+                 print array
+                
+            elif signature=='[S' :
+                 objvalue=jvmti.getLocalObject(threadid,depth,entry.slot)
+                 array=jvmti.getShortArrayElements(objvalue)
+                 arraylen=len(array)
+                 header=struct.pack("!i",arraylen)
+                 self.writeName(signature)
+                 self.output.write(header)
+                 for element in array :
+                     header=struct.pack("!h",element)
+                     self.output.write(header)
+                 print array
+                 
+            elif signature=='[J' :
+                 objvalue=jvmti.getLocalObject(threadid,depth,entry.slot)
+                 array=jvmti.getLongArrayElements(objvalue)
+                 arraylen=len(array)
+                 header=struct.pack("!i",arraylen)
+                 self.writeName(signature)
+                 self.output.write(header)
+                 for element in array :
+                     header=struct.pack("!q",element)
+                     self.output.write(header)
+                 print array
+         
+            
+            elif signature=='[F' :
+                 objvalue=jvmti.getLocalObject(threadid,depth,entry.slot)
+                 array=jvmti.getFloatArrayElements(objvalue)
+                 arraylen=len(array)
+                 header=struct.pack("!i",arraylen)
+                 self.writeName(signature)
+                 self.output.write(header)
+                 for element in array :
+                     header=struct.pack("!f",element)
+                     self.output.write(header)
+                 print array
+            
+            elif signature=='[D' :
+                 objvalue=jvmti.getLocalObject(threadid,depth,entry.slot)
+                 array=jvmti.getDoubleArrayElements(objvalue)
+                 arraylen=len(array)
+                 header=struct.pack("!i",arraylen)
+                 self.writeName(signature)
+                 self.output.write(header)
+                 for element in array :
+                     header=struct.pack("!d",element)
+                     print "len of d=",len(header)
+                     self.output.write(header)
+                 print array 
+                 
+            elif signature[0]=='[' :
+                objvalue=jvmti.getLocalObject(threadid,depth,entry.slot)
+                arrayLength=jvmti.getArrayLength(objvalue)
+                header=struct.pack("!i",arrayLength)
+                self.writeName(signature)
+                self.output.write(header)
+                
+                
+                
+            else :
+                objvalue=jvmti.getLocalObject(threadid,depth,entry.slot)
+                header=struct.pack("!i",objvalue)
+                self.writeName(signature)
+                self.output.write(header)
+                
+          except jvmti.error :
+                self.writeName("!"+signature)
+                #self.output.write(header)
+                
+                print "err..." , jvmti.error
+            
+        
+    
     def startClassSave(self,count):
         
         # write a classes meta record
@@ -189,11 +466,11 @@
            
            if tablesize > 0 :
                for entry in vartable :
-                   header=struct.pack("!hiii",206,entry[0],entry[1],entry[5])
+                   header=struct.pack("!hiii",206,entry.start,entry.length,entry.slot)
                    self.output.write(header)
-                   self. writeName(entry[2]) # name
-                   self. writeName(entry[3]) #sig
-                   self. writeName(entry[4]) # generi sig
+                   self. writeName(entry.name) # name
+                   self. writeName(entry.signature) #sig
+                   self. writeName(entry.genericsignature) # generi sig
             
     def writeName(self,name):
         length=0

Modified: incubator/kato/branches/experimental/PyJVMTI/kato/JMethod.py
URL: http://svn.apache.org/viewvc/incubator/kato/branches/experimental/PyJVMTI/kato/JMethod.py?rev=777072&r1=777071&r2=777072&view=diff
==============================================================================
--- incubator/kato/branches/experimental/PyJVMTI/kato/JMethod.py (original)
+++ incubator/kato/branches/experimental/PyJVMTI/kato/JMethod.py Thu May 21 11:24:00 2009
@@ -110,6 +110,9 @@
         if self.vartable == None :
             try :
                 self.vartable=jvmti.getLocalVariableTable(self.methodid)
+                for i in range(0,len(self.vartable)) :
+                    self.vartable[i]=LocalVariableTableEntry(self.vartable[i])
+                
             except jvmti.error :
                 self.vartable=[]
                 
@@ -123,4 +126,35 @@
         if self.native==None :
             self.native=jvmti.isMethodNative(self.methodid)
             
-        return self.native
\ No newline at end of file
+        return self.native
+    
+class LocalVariableTableEntry(object):
+    
+    info=None
+    
+    def __init__(self,data):
+        self.info=data
+        
+    @property 
+    def name(self):
+        return self.info[2]
+    
+    @property
+    def signature(self):
+        return self.info[3]
+
+    @property
+    def genericsignature(self):
+        return self.info[4]
+    
+    @property
+    def start(self):
+        return self.info[0]
+    
+    @property
+    def length(self):
+        return self.info[1]
+    @property
+    def slot(self):
+        return self.info[5]
+    
\ No newline at end of file

Modified: incubator/kato/branches/experimental/PyJVMTI/kato/PauseJVM.java
URL: http://svn.apache.org/viewvc/incubator/kato/branches/experimental/PyJVMTI/kato/PauseJVM.java?rev=777072&r1=777071&r2=777072&view=diff
==============================================================================
--- incubator/kato/branches/experimental/PyJVMTI/kato/PauseJVM.java (original)
+++ incubator/kato/branches/experimental/PyJVMTI/kato/PauseJVM.java Thu May 21 11:24:00 2009
@@ -29,6 +29,13 @@
 	public static void main(String[] args) {
 		
 			
+			int[]  data=new int[]{1,2,3,4,5,6};
+			long[]  ldata=new long[]{-1,-2,500,1000};
+			char[]  cdata=new char[]{'X','Y','Z'};
+			float[]  fdata=new float[]{-1.5f,-2.5f,500.5f,1000.999f};
+			double[]  ddata=new double[]{-1.5f,-2.5f,500.5f,1000.999f};
+			boolean[] tdata=new boolean[]{true,true,false};
+			byte[]    bdata=new byte[]{55,54,53,52};
 			
 			PauseJVM jvm=new PauseJVM();
 			jvm.execute(args);
@@ -37,6 +44,8 @@
 	public  void execute(String[] args) {
 		
 		
+		
+		
 		SyncObject sync=new SyncObject();
 		
 		WaitingThread w=new WaitingThread(sync);
@@ -45,7 +54,8 @@
 		try {
 			Thread.sleep(1000);
 		} catch (InterruptedException e) {
-
+			
+			
 			
 		}
 		
@@ -79,7 +89,7 @@
 	class SyncObject {
 		
 		public synchronized void enter() {
-			long me=1000000;
+			long me=999999;
 			
 			try {
 				Thread.sleep(me);

Modified: incubator/kato/branches/experimental/PyJVMTI/kato/console.py
URL: http://svn.apache.org/viewvc/incubator/kato/branches/experimental/PyJVMTI/kato/console.py?rev=777072&r1=777071&r2=777072&view=diff
==============================================================================
--- incubator/kato/branches/experimental/PyJVMTI/kato/console.py (original)
+++ incubator/kato/branches/experimental/PyJVMTI/kato/console.py Thu May 21 11:24:00 2009
@@ -94,12 +94,20 @@
                     
             except TypeError as (errno):
                     json.dump([depth,"n/a"],output) 
-       
+
+def count(): 
+    print jvmti.iterateOverReachableObjects(foo)
+    
+    
 def classloaders():
     '''
     List class loaders..
     '''
     
+def foo(reference_kind,class_tag,size,tag_ptr,referrer_tag,referrer_index) :
+    
+    print reference_kind,class_tag,size,tag_ptr,referrer_tag,referrer_index
+    
     
 def threads():
     """

Modified: incubator/kato/branches/experimental/PyJVMTI/pyjvmti.c
URL: http://svn.apache.org/viewvc/incubator/kato/branches/experimental/PyJVMTI/pyjvmti.c?rev=777072&r1=777071&r2=777072&view=diff
==============================================================================
--- incubator/kato/branches/experimental/PyJVMTI/pyjvmti.c (original)
+++ incubator/kato/branches/experimental/PyJVMTI/pyjvmti.c Thu May 21 11:24:00 2009
@@ -23,7 +23,39 @@
 static JavaVM *vmptr=NULL;
 static JNIEnv *jniptr=NULL;
 static PyObject *PYJVMTIError;
+static int objectcounter=0;
+static PyObject *my_callback = NULL;
 
+JNICALL myjvmtiHeapObjectCallback(jlong class_tag,
+     jlong size,
+     jlong* tag_ptr,
+     void* user_data) {
+	printf("called...");
+}
+
+
+static jvmtiIterationControl JNICALL
+object_ref_callback(jvmtiObjectReferenceKind reference_kind,
+		jlong class_tag, jlong size, jlong* tag_ptr,
+		jlong referrer_tag, jint referrer_index, void *user_data)
+{
+
+	PyObject *arglist;
+	PyObject *result;
+
+	arglist = Py_BuildValue("(illlli)",reference_kind,class_tag,size,tag_ptr,referrer_tag,referrer_index);
+	result = PyObject_CallObject(my_callback, arglist);
+	Py_DECREF(arglist);
+
+	if (result != NULL) {
+		Py_DECREF(result);
+		objectcounter++;
+	}
+
+
+	return JVMTI_ITERATION_CONTINUE;
+
+}
 
 #define getStringValue(FUNC,DESC)  \
 	CHECK_VALID(); \
@@ -91,12 +123,58 @@
 
 
 
-JNICALL myjvmtiHeapObjectCallback(jlong class_tag,
-     jlong size,
-     jlong* tag_ptr,
-     void* user_data) {
-	printf("called...");
-}
+#define getArray(FUNC,JNITYPE,CTYPE,PYTYPE) \
+	CHECK_VALID();  \
+\
+		int arrayid=0;\
+		int offset=0; \
+		int length=0; \
+		PyArg_ParseTuple(args, "i|ii", &arrayid,&offset,&length);\
+		if(length>0) { \
+			getArrayRegion(FUNC,JNITYPE,CTYPE,PYTYPE)\
+        }\
+        else {\
+       	getFullArray(FUNC,JNITYPE,CTYPE,PYTYPE)  \
+        } \
+		return NULL;
+
+#define getFullArray(FUNC,JNITYPE,CTYPE,PYTYPE) \
+\
+		    JNITYPE##Array array=(JNITYPE##Array)arrayid;\
+			jsize sizej=(*jniptr)->GetArrayLength(jniptr,array);\
+			int size=sizej;\
+			PyObject* list= PyList_New(size);\
+			if(size>0) {\
+			JNITYPE *result=(*jniptr)->Get##FUNC##ArrayElements(jniptr,array,0);\
+			if(result==NULL) ERROR(-100);\
+			  int i=0; \
+			  for (i=0; i<size; i++) { \
+				  CTYPE entry=result[i]; \
+			      PyList_SetItem(list,i,Py_BuildValue(PYTYPE,entry));\
+			  }\
+			} \
+			return list;
+
+
+#define getArrayRegion(FUNC,JNITYPE,CTYPE,PYTYPE) \
+\
+		    JNITYPE##Array array=(JNITYPE##Array)arrayid;\
+			int size=length;\
+			jint sizej=size; \
+			jint offsetj=offset;\
+			PyObject* list= PyList_New(size);\
+			if(size==0) return list; \
+			JNITYPE *result=(JNITYPE *)malloc( sizeof(JNITYPE) * size); \
+		    if(result==NULL) ERROR(-101); \
+		    (*jniptr)->Get##FUNC##ArrayRegion(jniptr,array, offsetj, sizej, result); \
+			  int i=0; \
+			  for (i=0; i<size; i++) { \
+				  CTYPE entry=result[i]; \
+			      PyList_SetItem(list,i,Py_BuildValue(PYTYPE,entry));\
+			  }\
+			 free(result);\
+			return list;
+
 
 static char * getErrorMessage(jvmtiError err,char *usrmsg) {
 
@@ -116,10 +194,81 @@
 
 		return result;
 }
+static PyObject *  jvmti_getArrayLength(PyObject *self, PyObject *args) {
+
+	CHECK_VALID();
+
+	int arrayid=0;
+
+	PyArg_ParseTuple(args, "i", &arrayid);
+
+	jarray array=(jarray)arrayid;
+
+	jsize result=(*jniptr)->GetArrayLength(jniptr,array);
+
+    return Py_BuildValue("i", result);
+
+}
+
+static PyObject *  jvmti_getIntArrayElements(PyObject *self, PyObject *args) {
+
+	getArray(Int,jint,int,"i")
+}
+static PyObject *  jvmti_getByteArrayElements(PyObject *self, PyObject *args) {
+
+	getArray(Byte,jbyte,int,"i")
+}
+static PyObject *  jvmti_getCharArrayElements(PyObject *self, PyObject *args) {
 
+	getArray(Char,jchar,char,"c")
+}
+static PyObject *  jvmti_getShortArrayElements(PyObject *self, PyObject *args) {
 
+	getArray(Short,jshort,short,"h")
+}
+static PyObject *  jvmti_getLongArrayElements(PyObject *self, PyObject *args) {
 
+	getArray(Long,jlong,long,"l")
+}
+static PyObject *  jvmti_getFloatArrayElements(PyObject *self, PyObject *args) {
 
+	getArray(Float,jfloat,float,"f")
+}
+static PyObject *  jvmti_getDoubleArrayElements(PyObject *self, PyObject *args) {
+
+	getArray(Double,jdouble,double,"d")
+}
+
+static PyObject *  jvmti_iterateOverReachableObjects(PyObject *self, PyObject *args) {
+
+	CHECK_VALID();
+	objectcounter=0;
+    PyObject *temp=NULL;
+    PyObject *result = NULL;
+
+    if (PyArg_ParseTuple(args, "O", &temp)) {
+			printf("\ntemp=%p\n",temp);
+	        if (!PyCallable_Check(temp)) {
+	            PyErr_SetString(PyExc_TypeError, "parameter must be callable");
+	            return NULL;
+	        }
+	        Py_XINCREF(temp);         /* Add a reference to new callback */
+	        Py_XDECREF(my_callback);  /* Dispose of previous callback */
+	        my_callback = temp;       /* Remember new callback */
+	        /* Boilerplate to return "None" */
+	        Py_INCREF(Py_None);
+	        result = Py_None;
+    }
+    else {
+        PyErr_SetString(PyExc_TypeError, "can get function");
+        return NULL;
+    }
+	jvmtiError err=(*jvmtiptr)->IterateOverReachableObjects(jvmtiptr,NULL,NULL,&object_ref_callback,NULL);
+	CHECK_OK("iterate over reachable objects");
+
+	 return Py_BuildValue("i", objectcounter);
+
+}
 static PyObject *  jvmti_getStackTrace(PyObject *self, PyObject *args) {
 
 
@@ -476,6 +625,36 @@
 
     return Py_BuildValue("l", result);
 }
+
+
+static PyObject *
+jvmti_getLocalValue(PyObject *self, PyObject *args)
+{
+	int threadID=0;
+	int depth=0;
+	int slot=0;
+
+	PyArg_ParseTuple(args, "iii", &threadID,&depth,&slot);
+
+	jthread threadj=(jthread)threadID;
+	jint    depthj=depth;
+	jint    slotj=slot;
+	jobject oresult;
+	jint 	iresult;
+	jlong 	lresult;
+
+	jvmtiError err=(*jvmtiptr)->GetLocalObject(jvmtiptr,threadj,depthj,slotj,&oresult);
+	if(err==JNI_OK) 	return Py_BuildValue("l", oresult);
+
+	err=(*jvmtiptr)->GetLocalInt(jvmtiptr,threadj,depthj,slotj,&iresult);
+	if(err==JNI_OK) 	return Py_BuildValue("l", iresult);
+
+	err=(*jvmtiptr)->GetLocalInt(jvmtiptr,threadj,depthj,slotj,&lresult);
+	if(err==JNI_OK) 	return Py_BuildValue("l", lresult);
+
+	CHECK_OK("Get Local Value");
+
+}
 /**
  * Get Local Variable that is an Object
  */
@@ -840,6 +1019,7 @@
      {"getTime",              jvmti_gettime, METH_VARARGS,             "Get JVMTI Time."},
      {"getSystemProperties",  jvmti_getsystemproperties, METH_VARARGS, "Get JVMTI System Properties."},
      {"getThread",            jvmti_getThread, METH_VARARGS,           "Get JVMTI Thread."},
+     {"getBytecodes",         jvmti_getBytecodes, METH_VARARGS,        "Get Bytecodes."},
      {"getAllThreads",        jvmti_getAllThreads, METH_VARARGS,       "Get JVMTI Threads."},
      {"getTopThreadGroups",   jvmti_getTopThreadGroups, METH_VARARGS,  "Get Top Thread Groups."},
      {"getThreadGroupInfo",   jvmti_getThreadGroupInfo, METH_VARARGS,  "Get Thread Group Info."},
@@ -853,6 +1033,7 @@
      {"getMethodName",        jvmti_getMethodName, METH_VARARGS,      "Get method name and sig."},
      {"getLocalVariableTable",jvmti_getLocalVariableTable, METH_VARARGS,"Get Local Variable Table."},
      {"getObjectSize",        jvmti_getObjectSize, METH_VARARGS,       "Get Object Size"},
+     {"getArrayLength",       jvmti_getArrayLength, METH_VARARGS,       "Get Array Length"},
      {"getLoadedClasses",     jvmti_getLoadedClasses, METH_VARARGS,    "Get Loaded Classes."},
      {"getClassSignature",    jvmti_getClassSignature, METH_VARARGS,   "Get Class Signature."},
      {"getClassStatus",       jvmti_getClassStatus, METH_VARARGS,   "Get Class Status."},
@@ -869,6 +1050,16 @@
      {"getMaxLocals",         jvmti_getMaxLocals, METH_VARARGS,   "Get Max Locas."},
      {"getArgumentsSize",     jvmti_getArgumentsSize, METH_VARARGS,   "Get Argumens Size."},
      {"isMethodNative",       jvmti_isMethodNative, METH_VARARGS,   "Is method native"},
+     {"getLocalValue",        jvmti_getLocalValue, METH_VARARGS,   "Get Local Value"},
+     {"getIntArrayElements",  jvmti_getIntArrayElements, METH_VARARGS,   "Get Int Array Elements"},
+     {"getCharArrayElements", jvmti_getCharArrayElements, METH_VARARGS,   "Get Char Array Elements"},
+     {"getByteArrayElements", jvmti_getByteArrayElements, METH_VARARGS,   "Get Byte Array Elements"},
+     {"getShortArrayElements",jvmti_getShortArrayElements, METH_VARARGS,   "Get Short Array Elements"},
+     {"getLongArrayElements", jvmti_getLongArrayElements, METH_VARARGS,   "Get Long Array Elements"},
+     {"getFloatArrayElements",jvmti_getFloatArrayElements, METH_VARARGS,   "Get Float Array Elements"},
+     {"getDoubleArrayElements",jvmti_getDoubleArrayElements, METH_VARARGS,   "Get Double Array Elements"},
+     {"iterateOverReachableObjects",       jvmti_iterateOverReachableObjects, METH_VARARGS,   "Iterate over reachable objects"},
+
 
      {NULL, NULL, 0, NULL}        /* Sentinel */
 };
@@ -1024,6 +1215,7 @@
 	     caps.can_get_owned_monitor_info=1;
 	     caps.can_get_current_contended_monitor=1;
 	     caps.can_access_local_variables=1;
+	     caps.can_tag_objects=1;
 
 	    err=(*jvmtiptr)->AddCapabilities(jvmtiptr, &caps);
 

Modified: incubator/kato/branches/experimental/PyJVMTI/pyjvmti.h
URL: http://svn.apache.org/viewvc/incubator/kato/branches/experimental/PyJVMTI/pyjvmti.h?rev=777072&r1=777071&r2=777072&view=diff
==============================================================================
--- incubator/kato/branches/experimental/PyJVMTI/pyjvmti.h (original)
+++ incubator/kato/branches/experimental/PyJVMTI/pyjvmti.h Thu May 21 11:24:00 2009
@@ -28,6 +28,12 @@
 		 return NULL; \
 	}
 
+#define ERROR(err) {\
+	PyObject *presult=Py_BuildValue("i", err); \
+		 PyErr_SetObject(PYJVMTIError,presult); \
+		 return NULL; \
+}
+
 #define WARN(error_msg) \
 if(err!=JNI_OK) { \
 		char *msg=getErrorMessage(err,error_msg); \
@@ -47,6 +53,15 @@
 
 PyMODINIT_FUNC initjvmti(void);
 
+static PyObject *  jvmti_getIntArrayElements(PyObject *self, PyObject *args);
+static PyObject *  jvmti_getByteArrayElements(PyObject *self, PyObject *args);
+static PyObject *  jvmti_getCharArrayElements(PyObject *self, PyObject *args);
+static PyObject *  jvmti_getShortArrayElements(PyObject *self, PyObject *args);
+static PyObject *  jvmti_getLongArrayElements(PyObject *self, PyObject *args);
+static PyObject *  jvmti_getFloatArrayElements(PyObject *self, PyObject *args);
+static PyObject *  jvmti_getDoubleArrayElements(PyObject *self, PyObject *args);
+static PyObject *jvmti_getIntArrayElements(PyObject *self, PyObject *args);
+static PyObject *jvmti_getArrayLength(PyObject *self, PyObject *args);
 static PyObject *jvmti_getThread(PyObject *self, PyObject *args);
 static PyObject *jvmti_getAllThreads(PyObject *self, PyObject *args);
 static PyObject *jvmti_getsystemproperties(PyObject *self, PyObject *args);
@@ -73,7 +88,8 @@
 static PyObject *jvmti_getArgumentsSize(PyObject *self, PyObject *args);
 static PyObject *jvmti_getMethodModifiers(PyObject *self, PyObject *args);
 static PyObject *jvmti_isMethodNative(PyObject *self, PyObject *args);
-
+static PyObject *jvmti_iterateOverReachableObjects(PyObject *self, PyObject *args);
+static PyObject *jvmti_getLocalValue(PyObject *self, PyObject *args);
 void runScript(void);
 void startPython(void);
 void createObject(JNIEnv *env);