[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