[vmkit-commits] [vmkit] r180325 - Added class file version check.

Peter Senna Tschudin peter.senna at gmail.com
Thu Apr 25 09:56:50 PDT 2013


Author: peter.senna
Date: Thu Apr 25 11:55:15 2013
New Revision: 180325

URL: http://llvm.org/viewvc/llvm-project?rev=180325&view=rev
Log:
Added class file version check.
(cherry picked from commit 9ad83d15513986e3aea71c755bc77f9618cd2784)

Modified:
    vmkit/trunk/lib/j3/VMCore/JavaClass.cpp

Modified: vmkit/trunk/lib/j3/VMCore/JavaClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaClass.cpp?rev=180325&r1=180324&r2=180325&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaClass.cpp Thu Apr 25 11:55:15 2013
@@ -18,7 +18,6 @@
 #include "JavaArray.h"
 #include "JavaClass.h"
 #include "JavaCompiler.h"
-#include "JavaString.h"
 #include "JavaConstantPool.h"
 #include "JavaObject.h"
 #include "JavaThread.h"
@@ -30,15 +29,6 @@
 
 #include <cstring>
 
-#if 0
-using namespace vmkit;
-#define dprintf(...) do { printf("JavaClass: "); printf(__VA_ARGS__); } while(0)
-#define ddprintf(...) do { printf(__VA_ARGS__); } while(0)
-#else
-#define dprintf(...)
-#define ddprintf(...)
-#endif
-
 using namespace j3;
 using namespace std;
 
@@ -343,8 +333,6 @@ JavaMethod* Class::lookupSpecialMethodDo
 JavaMethod* Class::lookupMethodDontThrow(const UTF8* name, const UTF8* type,
                                          bool isStatic, bool recurse,
                                          Class** methodCl) {
-  // This is a dirty hack because of a dirty usage pattern. See UPCALL_METHOD macro...
-  if (this == NULL) return NULL;
   
   JavaMethod* methods = 0;
   uint32 nb = 0;
@@ -901,7 +889,8 @@ void Class::readClass() {
 
   uint16 minor = reader.readU2();
   uint16 major = reader.readU2();
-  this->isClassVersionSupported(major, minor);
+  if (major > (uint16)0x31)        // 0x31 for Java 1.5
+    cerr << "WARNING: Class file '" << *name << "' requires a Java version that is unsupported by this JVM." << endl;
 
   uint32 ctpSize = reader.readU2();
   ctpInfo = new(classLoader->allocator, ctpSize) JavaConstantPool(this, reader,
@@ -923,36 +912,6 @@ void Class::readClass() {
   attributes = readAttributes(reader, nbAttributes);
 }
 
-void Class::getMinimalJDKVersion(uint16 major, uint16 minor, unsigned int& JDKMajor, unsigned int& JDKMinor, unsigned int& JDKBuild)
-{
-	JDKMajor = 1;
-	JDKBuild = 0;
-	if (major == 45 && minor <= 3) {			// Supported by Java 1.0.2
-		JDKMinor = 0;
-		JDKBuild = 2;
-	} else if (major == 45 && minor <= 65535) {	// Supported by Java 1.1
-		JDKMinor = 1;
-	} else {									// Supported by Java 1.x (x >= 2)
-		JDKMinor = major - 43;
-		if (minor == 0) --JDKMinor;
-	}
-}
-
-bool Class::isClassVersionSupported(uint16 major, uint16 minor)
-{
-	const int supportedJavaMinorVersion = 5;	// Java 1.5
-
-	unsigned int JDKMajor, JDKMinor, JDKBuild;
-	Class::getMinimalJDKVersion(major, minor, JDKMajor, JDKMinor, JDKBuild);
-
-	bool res = (JDKMajor <= 1) && (JDKMinor <= supportedJavaMinorVersion);
-	if (!res) {
-		cerr << "WARNING: Class file '" << *name << "' requires Java version " << JDKMajor << '.' << JDKMinor <<
-			". This JVM only supports Java versions up to 1." << supportedJavaMinorVersion << '.' << endl;
-	}
-	return res;
-}
-
 void UserClass::resolveParents() {
   if (super != NULL) {
     super->resolveClass();
@@ -1722,15 +1681,6 @@ void AnnotationReader::readAnnotation()
   AnnotationNameIndex = typeIndex;
 }
 
-void AnnotationReader::readAnnotationElementValues() {
-  uint16 numPairs = reader.readU2();
-
-  for (uint16 j = 0; j < numPairs; ++j) {
-    reader.readU2();
-    readElementValue();
-  }
-}
-
 void AnnotationReader::readElementValue() {
   uint8 tag = reader.readU1();
   if ((tag == 'B') || (tag == 'C') || (tag == 'D') || (tag == 'F') ||
@@ -1752,135 +1702,6 @@ void AnnotationReader::readElementValue(
   }
 }
 
-JavaObject* AnnotationReader::createElementValue() {
-  uint8 tag = reader.readU1();
-  JavaObject* res = 0;
-  JavaObject* tmp = 0;
-  llvm_gcroot(res, 0);
-  llvm_gcroot(tmp, 0);
-	
-	Jnjvm* vm = JavaThread::get()->getJVM();
-  Classpath* upcalls = JavaThread::get()->getJVM()->upcalls;
-  ddprintf("value:");
-
-  if (tag == 'B') {
-    uint32 val = cl->ctpInfo->IntegerAt(reader.readU2());
-    ddprintf("B=%d", val);
-    res = upcalls->boolClass->doNew(vm);
-    upcalls->boolValue->setInstanceInt8Field(res, val);
-
-  } else if (tag == 'C') {
-    uint32 val = cl->ctpInfo->IntegerAt(reader.readU2());
-    ddprintf("C=%c", val);
-    res = upcalls->intClass->doNew(vm);
-    upcalls->intValue->setInstanceInt32Field(res, val);
-
-  } else if (tag == 'D') {
-    double val = cl->ctpInfo->DoubleAt(reader.readU2());
-    ddprintf("D=%f", val);
-    res = upcalls->doubleClass->doNew(vm);
-    upcalls->doubleValue->setInstanceDoubleField(res, val);
-
-  } else if (tag == 'F') {
-    float val = cl->ctpInfo->FloatAt(reader.readU2());
-    ddprintf("F=%f", val);
-    res = upcalls->floatClass->doNew(vm);
-    upcalls->floatValue->setInstanceFloatField(res, val);
-
-  } else if (tag == 'J') {
-    sint64 val = cl->ctpInfo->LongAt(reader.readU2());
-    ddprintf("J=%lld", val);
-    res = upcalls->longClass->doNew(vm);
-    upcalls->longValue->setInstanceLongField(res, val);
-
-  } else if (tag == 'S') {
-    uint32 val = cl->ctpInfo->IntegerAt(reader.readU2());
-    ddprintf("S=%d", val);
-    res = upcalls->shortClass->doNew(vm);
-    upcalls->shortValue->setInstanceInt16Field(res, val);
-    
-  } else if (tag == 'I') {
-    uint32 val = cl->ctpInfo->IntegerAt(reader.readU2());
-    ddprintf("I=%d", val);
-    res = upcalls->intClass->doNew(vm);
-    upcalls->intValue->setInstanceInt32Field(res, val);
-
-  } else if (tag == 'Z') {
-    bool val = cl->ctpInfo->IntegerAt(reader.readU2());
-    ddprintf("Z=%d", val);
-    res = upcalls->boolClass->doNew(vm);
-    upcalls->boolValue->setInstanceInt8Field(res, val);
-
-  } else if (tag == 's') {
-    const UTF8* s = cl->ctpInfo->UTF8At(reader.readU2());
-    ddprintf("s=%s", PrintBuffer(s).cString());
-    res = JavaString::internalToJava(s, JavaThread::get()->getJVM());
-
-  } else if (tag == 'e') {
-    // Element_value Enumeration not implemented
-    const UTF8* n = cl->ctpInfo->UTF8At(reader.readU2());
-    ddprintf("%s", PrintBuffer(n).cString());
-    const UTF8* m = cl->ctpInfo->UTF8At(reader.readU2());
-    ddprintf("%s", PrintBuffer(m).cString());
-    fprintf(stderr, "Annotation not supported for %c type\n", tag);
-    abort();
-
-  } else if (tag == 'c') {
-    ddprintf("class=");
-    const UTF8* m = cl->ctpInfo->UTF8At(reader.readU2());
-    ddprintf("%s", PrintBuffer(m).cString());
-
-  } else if (tag == '[') {
-    uint16 numValues = reader.readU2();
-    UserClassArray* array = upcalls->annotationArrayClass;
-    res = array->doNew(numValues, vm);
-
-    ddprintf("Tableau de %d elements\n", numValues);
-    for (uint32 i = 0; i < numValues; ++i) {
-      tmp = createElementValue();
-      ArrayObject::setElement((ArrayObject *)res, tmp, i);
-    }
-    ddprintf("Fin du Tableau");
-  } else {
-    // Element_value Annotation not implemented
-    fprintf(stderr, "Annotation not supported for %c type\n", tag);
-    abort();
-  }
-  ddprintf("\n");
-
-  return res;
-}
-
-JavaObject* AnnotationReader::createAnnotationMapValues() {
-  std::pair<JavaObject*, JavaObject*> pair;
-  JavaObject* tmp = 0;
-  JavaString* str = 0;
-  JavaObject* newHashMap = 0;
-  llvm_gcroot(tmp, 0);
-  llvm_gcroot(str, 0);
-  llvm_gcroot(newHashMap, 0);
-
-	Jnjvm * vm = JavaThread::get()->getJVM();
-  Classpath* upcalls = vm->upcalls;
-  UserClass* HashMap = upcalls->newHashMap;
-  newHashMap = HashMap->doNew(vm);
-  upcalls->initHashMap->invokeIntSpecial(vm, HashMap, newHashMap);
-
-  uint16 numPairs = reader.readU2();
-  dprintf("numPairs:%d\n", numPairs);
-  for (uint16 j = 0; j < numPairs; ++j) {
-    uint16 nameIndex = reader.readU2();
-    const UTF8* key = cl->ctpInfo->UTF8At(nameIndex);
-    dprintf("keyAn:%s|", PrintBuffer(key).cString());
-
-    tmp = createElementValue();
-    str = JavaString::internalToJava(key, JavaThread::get()->getJVM());
-    upcalls->putHashMap->invokeJavaObjectVirtual(vm, HashMap, newHashMap, &str, &tmp);
-  }
-
-  return newHashMap;
-}
-
 uint16 JavaMethod::lookupLineNumber(vmkit::FrameInfo* info) {
   JavaAttribute* codeAtt = lookupAttribute(JavaAttribute::codeAttribute);      
   if (codeAtt == NULL) return 0;
@@ -1951,7 +1772,7 @@ std::string& CommonClass::getName(std::s
 {
 	name->toString(nameBuffer);
 
-	for (int32_t i=0; i < name->size; ++i) {
+	for (size_t i=0; i < name->size; ++i) {
 		if (name->elements[i] == '/')
 			nameBuffer[i] = linkageName ? '_' : '.';
 	}





More information about the vmkit-commits mailing list