[vmkit-commits] [vmkit] r191886 - J3 now supports calling Object.toString() to better debug objects.

Koutheir Attouchi koutheir at gmail.com
Thu Oct 3 04:01:01 PDT 2013


Author: koutheir
Date: Thu Oct  3 06:01:01 2013
New Revision: 191886

URL: http://llvm.org/viewvc/llvm-project?rev=191886&view=rev
Log:
J3 now supports calling Object.toString() to better debug objects.

Modified:
    vmkit/trunk/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.cpp
    vmkit/trunk/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.h
    vmkit/trunk/lib/j3/ClassLib/OpenJDK/JavaUpcalls.cpp
    vmkit/trunk/lib/j3/ClassLib/OpenJDK/JavaUpcalls.h
    vmkit/trunk/lib/j3/VMCore/JavaClass.cpp
    vmkit/trunk/lib/j3/VMCore/JavaObject.cpp
    vmkit/trunk/lib/j3/VMCore/JavaObject.h
    vmkit/trunk/lib/j3/VMCore/JavaString.cpp
    vmkit/trunk/lib/j3/VMCore/JavaString.h

Modified: vmkit/trunk/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.cpp?rev=191886&r1=191885&r2=191886&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.cpp (original)
+++ vmkit/trunk/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.cpp Thu Oct  3 06:01:01 2013
@@ -206,6 +206,7 @@ JavaMethod* Classpath::InitArithmeticExc
 JavaMethod* Classpath::InitCloneNotSupportedException;
 JavaMethod* Classpath::InitObject;
 JavaMethod* Classpath::FinalizeObject;
+JavaMethod* Classpath::toString;
 JavaMethod* Classpath::IntToString;
 
 JavaMethod* Classpath::SystemArraycopy;
@@ -905,6 +906,9 @@ void Classpath::initialiseClasspath(Jnjv
   
   FinalizeObject = UPCALL_METHOD(loader, "java/lang/Object", "finalize", "()V",
                                  ACC_VIRTUAL);
+
+  toString = UPCALL_METHOD(loader, "java/lang/Object", "toString",
+          "()Ljava/lang/String;", ACC_VIRTUAL);
   
   IntToString = UPCALL_METHOD(loader, "java/lang/Integer", "toString",
                               "(II)Ljava/lang/String;", ACC_STATIC);

Modified: vmkit/trunk/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.h?rev=191886&r1=191885&r2=191886&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.h (original)
+++ vmkit/trunk/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.h Thu Oct  3 06:01:01 2013
@@ -251,6 +251,7 @@ public:
 
   ISOLATE_STATIC JavaMethod* InitObject;
   ISOLATE_STATIC JavaMethod* FinalizeObject;
+  ISOLATE_STATIC JavaMethod* toString;
 
   ISOLATE_STATIC JavaMethod* ErrorWithExcpNoClassDefFoundError;
   ISOLATE_STATIC JavaMethod* ErrorWithExcpExceptionInInitializerError;

Modified: vmkit/trunk/lib/j3/ClassLib/OpenJDK/JavaUpcalls.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/OpenJDK/JavaUpcalls.cpp?rev=191886&r1=191885&r2=191886&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/OpenJDK/JavaUpcalls.cpp (original)
+++ vmkit/trunk/lib/j3/ClassLib/OpenJDK/JavaUpcalls.cpp Thu Oct  3 06:01:01 2013
@@ -197,6 +197,7 @@ JavaMethod* Classpath::InitArithmeticExc
 JavaMethod* Classpath::InitCloneNotSupportedException;
 JavaMethod* Classpath::InitObject;
 JavaMethod* Classpath::FinalizeObject;
+JavaMethod* Classpath::toString;
 JavaMethod* Classpath::IntToString;
 
 JavaMethod* Classpath::SystemArraycopy;
@@ -787,6 +788,9 @@ void Classpath::initialiseClasspath(Jnjv
   FinalizeObject = UPCALL_METHOD(loader, "java/lang/Object", "finalize", "()V",
                                  ACC_VIRTUAL);
 
+  toString = UPCALL_METHOD(loader, "java/lang/Object", "toString",
+          "()Ljava/lang/String;", ACC_VIRTUAL);
+
   IntToString = UPCALL_METHOD(loader, "java/lang/Integer", "toString",
                               "(II)Ljava/lang/String;", ACC_STATIC);
 

Modified: vmkit/trunk/lib/j3/ClassLib/OpenJDK/JavaUpcalls.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/OpenJDK/JavaUpcalls.h?rev=191886&r1=191885&r2=191886&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/OpenJDK/JavaUpcalls.h (original)
+++ vmkit/trunk/lib/j3/ClassLib/OpenJDK/JavaUpcalls.h Thu Oct  3 06:01:01 2013
@@ -240,6 +240,7 @@ public:
 
   ISOLATE_STATIC JavaMethod* InitObject;
   ISOLATE_STATIC JavaMethod* FinalizeObject;
+  ISOLATE_STATIC JavaMethod* toString;
 
   ISOLATE_STATIC JavaMethod* ErrorWithExcpNoClassDefFoundError;
   ISOLATE_STATIC JavaMethod* ErrorWithExcpExceptionInInitializerError;

Modified: vmkit/trunk/lib/j3/VMCore/JavaClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaClass.cpp?rev=191886&r1=191885&r2=191886&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaClass.cpp Thu Oct  3 06:01:01 2013
@@ -2349,8 +2349,8 @@ void JavaField::setStaticField(JavaObjec
 
 std::ostream& j3::operator << (std::ostream& os, const CommonClass& ccl)
 {
-	os << *ccl.name;
-	return (!ccl.super) ? (os << ';') : (os << ':' << *ccl.super);
+	return os << *ccl.name << ';';
+//	return (!ccl.super) ? (os << ';') : (os << ':' << *ccl.super);
 }
 
 void CommonClass::dump() const

Modified: vmkit/trunk/lib/j3/VMCore/JavaObject.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaObject.cpp?rev=191886&r1=191885&r2=191886&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaObject.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaObject.cpp Thu Oct  3 06:01:01 2013
@@ -387,9 +387,11 @@ bool JavaObject::instanceOf(JavaObject*
 std::ostream& j3::operator << (std::ostream& os, const JavaObject& obj)
 {
 	JavaObject* javaLoader = NULL;
-	const JavaString* threadNameObj = NULL;
+	const JavaString* jstr = NULL;
+	const JavaObjectVMThread* vmthObj = NULL;
 	llvm_gcroot(javaLoader, 0);
-	llvm_gcroot(threadNameObj, 0);
+	llvm_gcroot(jstr, 0);
+	llvm_gcroot(vmthObj, 0);
 
 	if (VMClassLoader::isVMClassLoader(&obj)) {
 		JnjvmClassLoader* loader = ((const VMClassLoader&)obj).getClassLoader();
@@ -416,24 +418,31 @@ std::ostream& j3::operator << (std::ostr
 		os << &obj << "(class=" << *ccl;
 
 		if (ccl == vm->upcalls->newThread) {
-			threadNameObj = static_cast<const JavaString*>(
+			jstr = static_cast<const JavaString*>(
 				vm->upcalls->threadName->getInstanceObjectField(
 					const_cast<JavaObject*>(&obj)));
 
-			char *threadName = JavaString::strToAsciiz(threadNameObj);
-			os << ",name=\"" << threadName << '\"';
-			delete [] threadName;
+			os << ",name=" << *jstr;
 		}
 #ifndef	 OpenJDKPath
 		else if (ccl == vm->upcalls->newVMThread) {
-			const JavaObjectVMThread& vmthObj = (const JavaObjectVMThread&)obj;
-			for (int retries = 10; (!vmthObj.vmdata) && (retries >= 0); --retries)
+			vmthObj = static_cast<const JavaObjectVMThread*>(&obj);
+			for (int retries = 10; (!vmthObj->vmdata) && (retries >= 0); --retries)
 				usleep(100);
 
-			if (const JavaObject* thObj = vmthObj.vmdata->currentThread())
+			if (const JavaObject* thObj = vmthObj->vmdata->currentThread())
 				os << ",thread=" << *thObj;
 		}
 #endif
+		else if (ccl == vm->upcalls->newClass) {
+			ccl = JavaObjectClass::getClass(
+				const_cast<JavaObjectClass*>(
+					static_cast<const JavaObjectClass*>(&obj)));
+
+			os << ",name=\"" << *ccl->asClass() << '\"';
+		} else if (ccl == vm->upcalls->newString) {
+			os << ',' << static_cast<const JavaString&>(obj);
+		}
 
 		os << ')';
 	}
@@ -450,3 +459,22 @@ void JavaObject::dumpClass() const
 {
 	JavaObject::getClass(this)->dump();
 }
+
+void JavaObject::dumpToString() const
+{
+	JavaString* jstr = NULL;
+	llvm_gcroot(jstr, 0);
+
+	if (VMClassLoader::isVMClassLoader(this) || VMStaticInstance::isVMStaticInstance(this))
+	{cerr << "<invalid>" << endl; return;}
+
+	Class* cl = JavaObject::getClass(this)->asClass();
+	if (!cl) {cerr << "<invalid>" << endl; return;}
+
+	Jnjvm* vm = cl->classLoader->getJVM();
+	jstr = static_cast<JavaString*>(
+		vm->upcalls->toString->invokeJavaObjectVirtual(
+			vm, cl, const_cast<JavaObject*>(this)));
+
+	cerr << *jstr << endl;
+}

Modified: vmkit/trunk/lib/j3/VMCore/JavaObject.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaObject.h?rev=191886&r1=191885&r2=191886&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaObject.h (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaObject.h Thu Oct  3 06:01:01 2013
@@ -334,6 +334,7 @@ public:
   void dumpClass() const __attribute__((noinline));
   void dump() const __attribute__((noinline));
   friend std::ostream& operator << (std::ostream&, const JavaObject&);
+  void dumpToString() const __attribute__((noinline));
 };
 
 

Modified: vmkit/trunk/lib/j3/VMCore/JavaString.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaString.cpp?rev=191886&r1=191885&r2=191886&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaString.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaString.cpp Thu Oct  3 06:01:01 2013
@@ -120,4 +120,12 @@ const UTF8* JavaString::javaToInternal(c
   return res;
 }
 
+std::ostream& operator << (std::ostream& os, const JavaString& jstr)
+{
+	char *str = JavaString::strToAsciiz(&jstr);
+	os << '\"' << str << '\"';
+	delete [] str;
+	return os;
+}
+
 }

Modified: vmkit/trunk/lib/j3/VMCore/JavaString.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaString.h?rev=191886&r1=191885&r2=191886&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaString.h (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaString.h Thu Oct  3 06:01:01 2013
@@ -62,6 +62,8 @@ class JavaString : public JavaObject {
 
   /// javaToInternal - Replaces all '/' into '.'.
   static const UTF8* javaToInternal(const JavaString* self, UTF8Map* map);
+
+  friend std::ostream& operator << (std::ostream&, const JavaString&);
 };
 
 } // end namespace j3





More information about the vmkit-commits mailing list