Need a VM that accepts, if not understands, JVM_CONSTANT_ModuleId

Mark Reinhold mr at sun.com
Sun Mar 8 20:10:58 PDT 2009


I spent some time this weekend trying to get the basic end-to-end
module-loading mechanism working.  I pretty quickly ran up against the
fact that HotSpot -- not even in Karen's prototype version -- doesn't
grok constant-pool items with tag 13 for CONSTANT_ModuleId_info and
instead throws a ClassFormatError, as well it should in this case.

I tried hacking on jvm.h and classFileParser.cpp to make this work but
failed, most likely because I'm missing something obvious.

Karen, does the following patch make any sense?  If not, could you please
send me one -- or push one -- that does?

Note that right now I don't need the VM to do anything with these items,
I just need it not to give up when it does see them.

(For the moment I worked around this problem by using a hacked-up copy of
 the ASM library to strip the offending items and related attributes.)

Thanks,
- Mark

-------------- next part --------------
diff -r dae503d9f04c src/share/vm/classfile/classFileParser.cpp
--- a/src/share/vm/classfile/classFileParser.cpp	Thu Feb 26 10:57:13 2009 -0800
+++ b/src/share/vm/classfile/classFileParser.cpp	Sun Mar 08 20:02:11 2009 -0700
@@ -159,6 +159,14 @@
           cp->name_and_type_at_put(index, name_index, signature_index);
         }
         break;
+      case JVM_CONSTANT_ModuleId :
+        {
+          cfs->guarantee_more(5, CHECK);  // name_index, version_index, tag/access_flags
+          u2 name_index = cfs->get_u2_fast();
+          u2 version_index = cfs->get_u2_fast();
+          // ## cp->name_and_type_at_put(index, name_index, signature_index);
+        }
+	break;
       case JVM_CONSTANT_Utf8 :
         {
           cfs->guarantee_more(2, CHECK);  // utf8_length
@@ -301,6 +309,8 @@
           signature_ref_index, CHECK_(nullHandle));
         break;
       }
+      case JVM_CONSTANT_ModuleId : // ##
+	break;
       case JVM_CONSTANT_Utf8 :
         break;
       case JVM_CONSTANT_UnresolvedClass :         // fall-through
diff -r dae503d9f04c src/share/vm/prims/jvm.h
--- a/src/share/vm/prims/jvm.h	Thu Feb 26 10:57:13 2009 -0800
+++ b/src/share/vm/prims/jvm.h	Sun Mar 08 20:02:11 2009 -0700
@@ -1038,8 +1038,11 @@
     JVM_CONSTANT_Fieldref,
     JVM_CONSTANT_Methodref,
     JVM_CONSTANT_InterfaceMethodref,
-    JVM_CONSTANT_NameAndType
+    JVM_CONSTANT_NameAndType,
+    JVM_CONSTANT_ModuleId
 };
+
+#define JVM_CONSTANT_MAX JVM_CONSTANT_ModuleId
 
 /* Used in the newarray instruction. */
 
diff -r dae503d9f04c src/share/vm/utilities/constantTag.cpp
--- a/src/share/vm/utilities/constantTag.cpp	Thu Feb 26 10:57:13 2009 -0800
+++ b/src/share/vm/utilities/constantTag.cpp	Sun Mar 08 20:02:11 2009 -0700
@@ -59,6 +59,9 @@
     case JVM_CONSTANT_NameAndType :
       st->print("NameAndType");
       break;
+    case JVM_CONSTANT_ModuleId :
+      st-print("ModuleId");
+      break;
     case JVM_CONSTANT_Utf8 :
       st->print("Utf8");
       break;
diff -r dae503d9f04c src/share/vm/utilities/constantTag.hpp
--- a/src/share/vm/utilities/constantTag.hpp	Thu Feb 26 10:57:13 2009 -0800
+++ b/src/share/vm/utilities/constantTag.hpp	Sun Mar 08 20:02:11 2009 -0700
@@ -76,7 +76,7 @@
   bool is_symbol() const            { return is_utf8(); }
 
   constantTag(jbyte tag) {
-    assert((tag >= 0 && tag <= JVM_CONSTANT_NameAndType) ||
+    assert((tag >= 0 && tag <= JVM_CONSTANT_MAX) ||
            (tag >= JVM_CONSTANT_InternalMin && tag <= JVM_CONSTANT_InternalMax), "Invalid constant tag");
     _tag = tag;
   }


More information about the jigsaw-dev mailing list