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