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/16 09:22:36 UTC

svn commit: r775440 - in /incubator/kato: branches/experimental/PyJVMTI/ branches/experimental/PyJVMTI/kato/ trunk/org.apache.kato.jvmti/src/org/apache/kato/jvmti/reader/ trunk/org.apache.kato.jvmti/testsrc/test/apache/kato/jvmti/

Author: spoole
Date: Sat May 16 09:22:33 2009
New Revision: 775440

URL: http://svn.apache.org/viewvc?rev=775440&view=rev
Log:
added dumping of methods and interfaces into pyjvmti project

Added:
    incubator/kato/branches/experimental/PyJVMTI/kato/JMethod.py   (with props)
Modified:
    incubator/kato/branches/experimental/PyJVMTI/kato/BinDump.py
    incubator/kato/branches/experimental/PyJVMTI/pyjvmti.c
    incubator/kato/branches/experimental/PyJVMTI/pyjvmti.h
    incubator/kato/trunk/org.apache.kato.jvmti/src/org/apache/kato/jvmti/reader/BinReader.java
    incubator/kato/trunk/org.apache.kato.jvmti/testsrc/test/apache/kato/jvmti/TestBinReader.java

Modified: incubator/kato/branches/experimental/PyJVMTI/kato/BinDump.py
URL: http://svn.apache.org/viewvc/incubator/kato/branches/experimental/PyJVMTI/kato/BinDump.py?rev=775440&r1=775439&r2=775440&view=diff
==============================================================================
--- incubator/kato/branches/experimental/PyJVMTI/kato/BinDump.py (original)
+++ incubator/kato/branches/experimental/PyJVMTI/kato/BinDump.py Sat May 16 09:22:33 2009
@@ -14,6 +14,7 @@
 import kato.Dump as Dump
 import kato.JField as JField
 import kato.JThreadGroup as JThreadGroup
+import kato.JMethod as JMethod
 
 import struct
 
@@ -136,8 +137,10 @@
         '''
         Save a single JClass
         '''
-         
-        header=struct.pack("!hiiihhhhh",201,clazz.classid,clazz.superclass,clazz.classloader,clazz.status,clazz.modifiers,len(clazz.fields),len(clazz.interfaces),len(clazz.methods))
+        interfaceCount=len(clazz.interfaces)
+        methodCount=len(clazz.methods)
+        
+        header=struct.pack("!hiiihhhhh",201,clazz.classid,clazz.superclass,clazz.classloader,clazz.status,clazz.modifiers,len(clazz.fields),interfaceCount,methodCount)
         self.output.write(header)
         namelength=struct.pack("!i",len(clazz.signature))
         self.output.write(namelength)
@@ -150,6 +153,47 @@
             field=JField.JField(clazz,fieldid)
             self.saveField(field)
     
+        # write interaces
+        
+        if interfaceCount>0 :
+            
+            header=struct.pack("!hi",203,interfaceCount)
+            self.output.write(header)
+            
+            for interfaceid in clazz.interfaces :
+                
+                header=struct.pack("!i",interfaceid)
+                self.output.write(header)
+                
+    
+       # write methods...
+        if methodCount>0 :
+            
+            self.saveMethods(clazz)
+            
+            
+        
+    def saveMethods(self,clazz):
+        
+            
+        for methodid in clazz.methods :
+           m=JMethod.JMethod(methodid)
+           vartable=m.localVariableTable
+           tablesize=len(vartable)
+           
+           header=struct.pack("!hiiiiii",204,methodid,m.modifiers,m.maxlocals,m.argumentsize,m.isnative,tablesize)
+           self.output.write(header)
+           self. writeName(m.name)
+           self. writeName(m.signature)
+           self. writeName(m.genericsignature)
+           
+           if tablesize > 0 :
+               for entry in vartable :
+                   header=struct.pack("!hiii",206,entry[0],entry[1],entry[5])
+                   self.output.write(header)
+                   self. writeName(entry[2]) # name
+                   self. writeName(entry[3]) #sig
+                   self. writeName(entry[4]) # generi sig
             
     def writeName(self,name):
         length=0

Added: incubator/kato/branches/experimental/PyJVMTI/kato/JMethod.py
URL: http://svn.apache.org/viewvc/incubator/kato/branches/experimental/PyJVMTI/kato/JMethod.py?rev=775440&view=auto
==============================================================================
--- incubator/kato/branches/experimental/PyJVMTI/kato/JMethod.py (added)
+++ incubator/kato/branches/experimental/PyJVMTI/kato/JMethod.py Sat May 16 09:22:33 2009
@@ -0,0 +1,126 @@
+#*******************************************************************************
+ #* Licensed under the Apache License, Version 2.0 (the "License");
+ #* you may not use this file except in compliance with the License.
+ #* You may obtain a copy of the License at
+ #* 
+ #*   http://www.apache.org/licenses/LICENSE-2.0
+ #* 
+ #* Unless required by applicable law or agreed to in writing, software
+ #* distributed under the License is distributed on an "AS IS" BASIS,
+ #* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ #* See the License for the specific language governing permissions and
+ #* limitations under the License.
+ #******************************************************************************"
+
+import jvmti
+
+class JMethod(object):
+    '''
+    Representation of a method
+    '''
+    methodid=0
+    info=None
+    mods=None
+    locals=None
+    args=None
+    native=None
+    vartable=None
+    
+    def __init__(self,mid=0):
+        '''
+        Constructor
+        '''
+        self.methodid=mid
+        
+        
+    def fill(self):
+        if self.info==None :
+            self.info=jvmti.getMethodName(self.methodid)
+        
+    @property
+    def name(self):
+        '''
+        return method name
+        '''
+        self.fill()
+        return self.info[0]
+    
+    @property
+    def signature(self):
+        '''
+        return method signature
+        '''
+        self.fill()
+        return self.info[1]
+        
+    @property
+    def genericsignature(self):
+        '''
+        return methods generic signature
+        '''
+        self.fill()
+        return self.info[2]
+    
+    @property
+    def modifiers(self):
+        '''
+        Return method modifiers
+        '''
+        if self.mods==None :
+            self.mods=jvmti.getMethodModifiers(self.methodid)
+            
+        return self.mods
+            
+    @property
+    def maxlocals(self):
+        '''
+        returns the number of local variable slots in the method
+        '''
+        if self.locals==None :
+            if self.isnative > 0 :
+                self.locals=-1
+            else :
+                self.locals=jvmti.getMaxLocals(self.methodid)
+            
+        return self.locals
+        
+    @property        
+    def argumentsize(self):
+        '''
+        returns the number of slots used by the methods arguments
+        '''
+        if self.args==None :
+            if self.isnative > 0 :
+                self.args=-1
+            else :
+                self.args=jvmti.getArgumentsSize(self.methodid)
+            
+        return self.args
+    
+    @property
+    def lineNumberTable(self):
+        '''
+        '''
+        return None
+    
+    @property    
+    def localVariableTable(self):
+        '''
+        '''
+        if self.vartable == None :
+            try :
+                self.vartable=jvmti.getLocalVariableTable(self.methodid)
+            except jvmti.error :
+                self.vartable=[]
+                
+        return self.vartable;
+        
+    @property
+    def isnative(self):
+        '''
+        returns true if this is a native method
+        '''
+        if self.native==None :
+            self.native=jvmti.isMethodNative(self.methodid)
+            
+        return self.native
\ No newline at end of file

Propchange: incubator/kato/branches/experimental/PyJVMTI/kato/JMethod.py
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: incubator/kato/branches/experimental/PyJVMTI/pyjvmti.c
URL: http://svn.apache.org/viewvc/incubator/kato/branches/experimental/PyJVMTI/pyjvmti.c?rev=775440&r1=775439&r2=775440&view=diff
==============================================================================
--- incubator/kato/branches/experimental/PyJVMTI/pyjvmti.c (original)
+++ incubator/kato/branches/experimental/PyJVMTI/pyjvmti.c Sat May 16 09:22:33 2009
@@ -789,6 +789,21 @@
 	getValue(GetClassLoader,jclass,"i","Get Class Loader")
 }
 
+static PyObject *  jvmti_getMethodModifiers(PyObject *self, PyObject *args) {
+		getValue(GetMethodModifiers,jint,"i","Get Method Modifiers")
+}
+
+static PyObject *  jvmti_getMaxLocals(PyObject *self, PyObject *args) {
+		getValue(GetMaxLocals,jint,"i","Get Max Locals")
+}
+
+static PyObject *  jvmti_getArgumentsSize(PyObject *self, PyObject *args) {
+		getValue(GetArgumentsSize,jint,"i","Get Arguments Size")
+}
+
+static PyObject *  jvmti_isMethodNative(PyObject *self, PyObject *args) {
+		getValue(IsMethodNative,jboolean,"i","Is method native")
+}
 static PyObject *  jvmti_getImplementedInterfaces(PyObject *self, PyObject *args) {
 	getList(GetImplementedInterfaces,jclass,"Get Implemented Interfaces")
 }
@@ -849,7 +864,11 @@
      {"getImplementedInterfaces", jvmti_getImplementedInterfaces, METH_VARARGS,   "Get Implemented Interfaces."},
      {"getSuperClass",        jvmti_getSuperClass, METH_VARARGS,   "Get Superclass."},
      {"getClassLoader",       jvmti_getClassLoader, METH_VARARGS,   "Get Class Loader."},
-     {"getFieldName",        jvmti_getFieldName, METH_VARARGS,   "Get Field Name."},
+     {"getFieldName",         jvmti_getFieldName, METH_VARARGS,   "Get Field Name."},
+     {"getMethodModifiers",   jvmti_getMethodModifiers, METH_VARARGS,   "Get Method Modifiers."},
+     {"getMaxLocals",         jvmti_getMaxLocals, METH_VARARGS,   "Get Max Locas."},
+     {"getArgumentsSize",     jvmti_getArgumentsSize, METH_VARARGS,   "Get Argumens Size."},
+     {"isMethodNative",       jvmti_isMethodNative, METH_VARARGS,   "Is method native"},
 
      {NULL, NULL, 0, NULL}        /* Sentinel */
 };

Modified: incubator/kato/branches/experimental/PyJVMTI/pyjvmti.h
URL: http://svn.apache.org/viewvc/incubator/kato/branches/experimental/PyJVMTI/pyjvmti.h?rev=775440&r1=775439&r2=775440&view=diff
==============================================================================
--- incubator/kato/branches/experimental/PyJVMTI/pyjvmti.h (original)
+++ incubator/kato/branches/experimental/PyJVMTI/pyjvmti.h Sat May 16 09:22:33 2009
@@ -69,6 +69,10 @@
 static PyObject *jvmti_getSuperClass(PyObject *self, PyObject *args);
 static PyObject *jvmti_getFieldName(PyObject *self, PyObject *args);
 static PyObject *jvmti_getClassLoader(PyObject *self, PyObject *args);
+static PyObject *jvmti_getMaxLocals(PyObject *self, PyObject *args);
+static PyObject *jvmti_getArgumentsSize(PyObject *self, PyObject *args);
+static PyObject *jvmti_getMethodModifiers(PyObject *self, PyObject *args);
+static PyObject *jvmti_isMethodNative(PyObject *self, PyObject *args);
 
 void runScript(void);
 void startPython(void);

Modified: incubator/kato/trunk/org.apache.kato.jvmti/src/org/apache/kato/jvmti/reader/BinReader.java
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/org.apache.kato.jvmti/src/org/apache/kato/jvmti/reader/BinReader.java?rev=775440&r1=775439&r2=775440&view=diff
==============================================================================
--- incubator/kato/trunk/org.apache.kato.jvmti/src/org/apache/kato/jvmti/reader/BinReader.java (original)
+++ incubator/kato/trunk/org.apache.kato.jvmti/src/org/apache/kato/jvmti/reader/BinReader.java Sat May 16 09:22:33 2009
@@ -170,11 +170,79 @@
 			readFields(c);
 		}
 		
+		if(c.interfaceCount>0) {
+			readInterfaces(c);
+		}
+		
+		if(c.methodsCount>0) {
+			readMethods(c);
+		}
 		
 		trace("read class - name ="+c.classSig);
 		classMap.put(c.classid, c);
 	}
 	
+	private void readMethods(JClass c) throws IOException {
+		trace("reading "+c.methodsCount+" methods");
+	
+	    
+		
+		
+		for(int i=0;i<c.methodsCount;i++) {
+			
+			int rid=in.readShort();
+			if(rid!=204) error("unexpected method record id of "+rid);
+			int id=in.readInt();
+			JMethod m=getMethod(id);
+			c.addMethod(m);   
+			
+			m.mods=in.readInt();
+			m.maxlocals=in.readInt();
+			m.argumentsize=in.readInt();
+			m.nativemethod=in.readInt();
+			
+			int tableSize=in.readInt();
+			
+			m.name=readName();
+			m.signature=readName();
+			m.genericsignature=readName();
+			 
+			
+			for(int j=0;j<tableSize;j++) {
+				int tid=in.readShort();
+				if(tid!=206) error("unexpected method table record id of "+tid);
+				JLocalVariableTableEntry entry=new JLocalVariableTableEntry();
+				 entry.start=in.readInt();
+				 entry.length=in.readInt();
+				 entry.slot=in.readInt();
+				 entry.name=readName();
+				 entry.sig=readName();
+				 entry.gensig=readName();
+				 
+				 m.addLocalVariableTableEntry(entry);
+			}
+		}
+		
+		
+	}
+	private void readInterfaces(JClass c) throws IOException {
+		
+		// record form is 203,count,ints[count]
+		
+		trace("reading "+c.interfaceCount+" interfaces");
+		
+		int rid=in.readShort();
+		if(rid!=203) error("unexpected interface record id of "+rid);
+		int count=in.readInt();
+		
+		for(int i=0;i<count;i++) {
+			int id=in.readInt();
+			JClass face=getClass(id);
+			c.addInterface(face);    
+		}
+		
+	}
+	
 	private JMonitor getMonitor(int monitorid) {
 		if(monitorid==0) return null;
 		JMonitor m=(JMonitor) monitorsMap.get(monitorid);
@@ -199,6 +267,7 @@
 		JMethod m=(JMethod) methodMap.get(methodid);
 		if(m==null) {
 			m=new JMethod();
+		
 			methodMap.put(methodid,m);
 		}
 		return m;
@@ -505,11 +574,27 @@
 		    short methodsCount=0;
 		    int   nameLength=0; 
 			String classSig=null;
+			private List<JClass> interfaces=null;
+			private List<JMethod> methods=null;
 			@Override
 			public JavaClassLoader getClassLoader() throws CorruptDataException {
 				
 				return classloader;
 			}
+			private void addInterface(JClass face) {
+				if(interfaces==null) {
+					interfaces=new LinkedList<JClass>();
+				}
+				interfaces.add(face);
+				
+			}
+			private void addMethod(JMethod m) {
+				if(methods==null) {
+					methods=new LinkedList<JMethod>();
+				}
+				methods.add(m);
+				
+			}
 			@Override
 			public JavaClass getComponentType() throws CorruptDataException {
 				// TODO Auto-generated method stub
@@ -746,16 +831,28 @@
 	class JMethod implements JavaMethod {
 
 		
+		public String genericsignature;
+		public int nativemethod;
+		public int argumentsize;
+		public int maxlocals;
 		private String name=null;
 		private String signature=null;
 		private int mods=0;
 		private JClass parent=null;
 		
-		
+		private List<JLocalVariableTableEntry> localVars=null;
 		public JMethod() {
 			
 		}
 		
+		private void addLocalVariableTableEntry(JLocalVariableTableEntry entry) {
+			if(localVars==null) {
+				localVars=new LinkedList<JLocalVariableTableEntry>();
+			}
+			
+			localVars.add(entry);
+		}
+
 		@Override
 		public Iterator getBytecodeSections() {
 		
@@ -791,4 +888,15 @@
 		}
 		
 	}
+	
+	class JLocalVariableTableEntry {
+
+		public String gensig;
+		public String sig;
+		public String name;
+		public int slot;
+		public int length;
+		public int start;
+		
+	}
 }

Modified: incubator/kato/trunk/org.apache.kato.jvmti/testsrc/test/apache/kato/jvmti/TestBinReader.java
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/org.apache.kato.jvmti/testsrc/test/apache/kato/jvmti/TestBinReader.java?rev=775440&r1=775439&r2=775440&view=diff
==============================================================================
--- incubator/kato/trunk/org.apache.kato.jvmti/testsrc/test/apache/kato/jvmti/TestBinReader.java (original)
+++ incubator/kato/trunk/org.apache.kato.jvmti/testsrc/test/apache/kato/jvmti/TestBinReader.java Sat May 16 09:22:33 2009
@@ -27,5 +27,6 @@
 	public void testOpenFile() throws IOException {
 		File f=new File("/home/spoole/workspace-javaone/PyJVMTI/kato.dump");
 		BinReader br=new BinReader(f);
+		int a=1;
 	}
 }