[llvm-commits] CVS: llvm-java/lib/Compiler/Resolver.h Resolver.cpp Compiler.cpp Class.h Class.cpp
Alkis Evlogimenos
alkis at cs.uiuc.edu
Sat Mar 26 16:04:21 PST 2005
Changes in directory llvm-java/lib/Compiler:
Resolver.h updated: 1.4 -> 1.5
Resolver.cpp updated: 1.4 -> 1.5
Compiler.cpp updated: 1.254 -> 1.255
Class.h updated: 1.9 -> 1.10
Class.cpp updated: 1.9 -> 1.10
---
Log message:
Add ability to load an array class given its component class. Add a
name field to Class.
---
Diffs of the changes: (+48 -45)
Class.cpp | 16 +++++++++++++---
Class.h | 3 +++
Compiler.cpp | 17 ++++++++---------
Resolver.cpp | 41 +++++++++++------------------------------
Resolver.h | 16 +++++++++++++---
5 files changed, 48 insertions(+), 45 deletions(-)
Index: llvm-java/lib/Compiler/Resolver.h
diff -u llvm-java/lib/Compiler/Resolver.h:1.4 llvm-java/lib/Compiler/Resolver.h:1.5
--- llvm-java/lib/Compiler/Resolver.h:1.4 Sat Mar 26 11:15:47 2005
+++ llvm-java/lib/Compiler/Resolver.h Sat Mar 26 18:04:10 2005
@@ -39,14 +39,21 @@
unsigned& i,
bool memberMethod = false) const;
- std::string canonicalizeClassName(const std::string& className) {
+ std::pair<ClassMap::iterator, bool> insertClass(const Class& clazz) {
+ return classMap_.insert(std::make_pair(clazz.getName(), clazz));
+ }
+ ClassMap::iterator insertClass(ClassMap::iterator i, const Class& clazz) {
+ return classMap_.insert(i, std::make_pair(clazz.getName(), clazz));
+ }
+
+ public:
+ static std::string canonicalizeClassName(const std::string& className) {
if (className[0] == '[')
return className;
else
return 'L' + className + ';';
}
- public:
Resolver(Module* module);
const Type* getObjectBaseType() const { return objectBaseType_; }
@@ -71,7 +78,10 @@
return getClassForDesc(field.getDescriptor()->str());
}
const Class* getClass(JType type);
- const Class* getArrayClass(JType type);
+
+ const Class* getArrayClass(const Class* clazz) {
+ return getClassForDesc('[' + clazz->getName());
+ }
unsigned getNextInterfaceIndex() { return nextInterfaceIndex_++; }
Module* getModule() { return module_; }
Index: llvm-java/lib/Compiler/Resolver.cpp
diff -u llvm-java/lib/Compiler/Resolver.cpp:1.4 llvm-java/lib/Compiler/Resolver.cpp:1.5
--- llvm-java/lib/Compiler/Resolver.cpp:1.4 Sat Mar 26 11:15:47 2005
+++ llvm-java/lib/Compiler/Resolver.cpp Sat Mar 26 18:04:10 2005
@@ -27,15 +27,15 @@
objectBaseType_(OpaqueType::get()),
objectBaseRefType_(PointerType::get(objectBaseType_))
{
- classMap_.insert(std::make_pair("B", Class(this, Type::SByteTy)));
- classMap_.insert(std::make_pair("C", Class(this, Type::UShortTy)));
- classMap_.insert(std::make_pair("D", Class(this, Type::DoubleTy)));
- classMap_.insert(std::make_pair("F", Class(this, Type::FloatTy)));
- classMap_.insert(std::make_pair("I", Class(this, Type::IntTy)));
- classMap_.insert(std::make_pair("J", Class(this, Type::LongTy)));
- classMap_.insert(std::make_pair("S", Class(this, Type::ShortTy)));
- classMap_.insert(std::make_pair("Z", Class(this, Type::BoolTy)));
- classMap_.insert(std::make_pair("V", Class(this, Type::VoidTy)));
+ insertClass(Class(this, Type::SByteTy));
+ insertClass(Class(this, Type::UShortTy));
+ insertClass(Class(this, Type::DoubleTy));
+ insertClass(Class(this, Type::FloatTy));
+ insertClass(Class(this, Type::IntTy));
+ insertClass(Class(this, Type::LongTy));
+ insertClass(Class(this, Type::ShortTy));
+ insertClass(Class(this, Type::BoolTy));
+ insertClass(Class(this, Type::VoidTy));
module_->addTypeName("struct.llvm_java_object_base", objectBaseType_);
}
@@ -108,16 +108,12 @@
case 'L': {
unsigned pos = descriptor.find(';', 1);
const std::string& className = descriptor.substr(1, pos - 1);
- it = classMap_.insert(
- it, std::make_pair(descriptor,
- Class(this, className)));
+ it = insertClass(it, Class(this, className));
break;
}
case '[': {
const std::string& componentDescriptor = descriptor.substr(1);
- it = classMap_.insert(
- it, std::make_pair(descriptor,
- Class(this, getClassForDesc(componentDescriptor))));
+ it = insertClass(it, Class(this, getClassForDesc(componentDescriptor)));
break;
}
default:
@@ -147,21 +143,6 @@
}
}
-const Class* Resolver::getArrayClass(JType type)
-{
- switch (type) {
- case BOOLEAN: return getClassForDesc("[Z");
- case CHAR: return getClassForDesc("[C");
- case FLOAT: return getClassForDesc("[F");
- case DOUBLE: return getClassForDesc("[D");
- case BYTE: return getClassForDesc("[B");
- case SHORT: return getClassForDesc("[S");
- case INT: return getClassForDesc("[I");
- case LONG: return getClassForDesc("[J");
- default: assert(0 && "Unhandled JType!"); abort();
- }
-}
-
const Type* Resolver::getStorageType(const Type* type) const
{
if (isa<PointerType>(type))
Index: llvm-java/lib/Compiler/Compiler.cpp
diff -u llvm-java/lib/Compiler/Compiler.cpp:1.254 llvm-java/lib/Compiler/Compiler.cpp:1.255
--- llvm-java/lib/Compiler/Compiler.cpp:1.254 Sat Mar 26 13:14:02 2005
+++ llvm-java/lib/Compiler/Compiler.cpp Sat Mar 26 18:04:10 2005
@@ -2106,22 +2106,21 @@
void do_newarray(JType type) {
Value* count = pop(Type::UIntTy);
- const Class* clazz = resolver_->getArrayClass(type);
- const VTableInfo* vi = getVTableInfoGeneric(clazz);
+ const Class* clazz = resolver_->getClass(type);
+ const Class* arrayClass = resolver_->getArrayClass(clazz);
+ const VTableInfo* vi = getVTableInfoGeneric(arrayClass);
- push(allocateArray(clazz, vi, count, currentBB_));
+ push(allocateArray(arrayClass, vi, count, currentBB_));
}
void do_anewarray(unsigned index) {
Value* count = pop(Type::UIntTy);
- // FIXME: Need to handle different element types. This now
- // assumes that all arrays of reference type are arrays of
- // java/lang/Object's.
- const Class* clazz = resolver_->getClass("[Ljava/lang/Object;");
- const VTableInfo* vi = getVTableInfoGeneric(clazz);
+ const Class* clazz = class_->getClass(index);
+ const Class* arrayClass = resolver_->getArrayClass(clazz);
+ const VTableInfo* vi = getVTableInfoGeneric(arrayClass);
- push(allocateArray(clazz, vi, count, currentBB_));
+ push(allocateArray(arrayClass, vi, count, currentBB_));
}
void do_arraylength() {
Index: llvm-java/lib/Compiler/Class.h
diff -u llvm-java/lib/Compiler/Class.h:1.9 llvm-java/lib/Compiler/Class.h:1.10
--- llvm-java/lib/Compiler/Class.h:1.9 Sat Mar 26 11:15:47 2005
+++ llvm-java/lib/Compiler/Class.h Sat Mar 26 18:04:10 2005
@@ -19,6 +19,7 @@
#include <llvm/Module.h>
#include <llvm/Type.h>
#include <map>
+#include <string>
#include <vector>
namespace llvm { namespace Java {
@@ -29,6 +30,7 @@
class Class {
static const unsigned INVALID_INTERFACE_INDEX = 0xFFFFFFFF;
+ const std::string name_;
Resolver* resolver_;
const ClassFile* classFile_;
const Class* superClass_;
@@ -66,6 +68,7 @@
void initialize();
public:
+ const std::string& getName() const { return name_; }
const Type* getStructType() const { return structType_; }
const Type* getType() const { return type_; }
const ClassFile* getClassFile() const { return classFile_; }
Index: llvm-java/lib/Compiler/Class.cpp
diff -u llvm-java/lib/Compiler/Class.cpp:1.9 llvm-java/lib/Compiler/Class.cpp:1.10
--- llvm-java/lib/Compiler/Class.cpp:1.9 Sat Mar 26 11:15:47 2005
+++ llvm-java/lib/Compiler/Class.cpp Sat Mar 26 18:04:10 2005
@@ -27,7 +27,8 @@
using namespace llvm::Java;
Class::Class(Resolver* resolver, const std::string& className)
- : resolver_(resolver),
+ : name_(Resolver::canonicalizeClassName(className)),
+ resolver_(resolver),
classFile_(ClassFile::get(className)),
superClass_(NULL),
componentClass_(NULL),
@@ -40,7 +41,8 @@
}
Class::Class(Resolver* resolver, const Class* componentClass)
- : resolver_(resolver),
+ : name_('[' + componentClass->getName()),
+ resolver_(resolver),
classFile_(NULL),
superClass_(NULL),
componentClass_(componentClass),
@@ -52,7 +54,15 @@
}
Class::Class(Resolver* resolver, const Type* type)
- : resolver_(resolver),
+ : name_(type == Type::SByteTy ? "B" :
+ type == Type::UShortTy ? "C" :
+ type == Type::DoubleTy ? "D" :
+ type == Type::FloatTy ? "F" :
+ type == Type::IntTy ? "I" :
+ type == Type::LongTy ? "J" :
+ type == Type::ShortTy ? "S" :
+ type == Type::BoolTy ? "Z" : "V"),
+ resolver_(resolver),
classFile_(NULL),
superClass_(NULL),
componentClass_(NULL),
More information about the llvm-commits
mailing list