[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