changeset 3638:e53cfcb230a7

Fixed an issue with the runtime queried escape analysis field array.
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Wed, 16 Nov 2011 01:52:31 +0100
parents ff6a991c6e3c
children 2fd96b3040b9
files src/share/vm/graal/graalVMEntries.cpp
diffstat 1 files changed, 8 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/vm/graal/graalVMEntries.cpp	Wed Nov 16 01:48:25 2011 +0100
+++ b/src/share/vm/graal/graalVMEntries.cpp	Wed Nov 16 01:52:31 2011 +0100
@@ -774,28 +774,30 @@
   VM_ENTRY_MARK;
 
   instanceKlassHandle k = java_lang_Class::as_klassOop(HotSpotTypeResolved::javaMirror(klass));
-  objArrayHandle field_array = oopFactory::new_objArray(SystemDictionary::RiField_klass(), k->fields()->length() / instanceKlass::next_offset, CHECK_NULL);
   class MyFieldClosure : public FieldClosure {
    public:
     instanceKlassHandle _holder;
     Handle _resolved_type_holder;
-    objArrayHandle _field_array;
-    int _current;
+    GrowableArray<Handle> _field_array;
 
-    MyFieldClosure(instanceKlassHandle& holder, Handle resolved_type_holder, objArrayHandle field_array) : _holder(holder), _resolved_type_holder(resolved_type_holder), _field_array(field_array), _current(0) { }
+    MyFieldClosure(instanceKlassHandle& holder, Handle resolved_type_holder) : _holder(holder), _resolved_type_holder(resolved_type_holder) { }
     
     virtual void do_field(fieldDescriptor* fd) {
       if (!Thread::current()->has_pending_exception()) {
         if (fd->field_holder() == _holder()) {
           Handle type = GraalCompiler::get_RiTypeFromSignature(fd->constants(), fd->signature_index(), fd->field_holder(), Thread::current());
           Handle field = VMExits::createRiField(_resolved_type_holder, VmIds::toString<Handle>(fd->name(), Thread::current()), type, fd->offset(), fd->access_flags().as_int(), Thread::current());
-          _field_array->obj_at_put(_current++, field());
+          _field_array.append(field());
         }
       }
     }
   };
-  MyFieldClosure closure(k, JNIHandles::resolve(klass), field_array);
+  MyFieldClosure closure(k, JNIHandles::resolve(klass));
   k->do_nonstatic_fields(&closure);
+  objArrayHandle field_array = oopFactory::new_objArray(SystemDictionary::RiField_klass(), closure._field_array.length(), CHECK_NULL);
+  for (int i=0; i<closure._field_array.length(); ++i) {
+    field_array->obj_at_put(i, closure._field_array.at(i)());
+  }
   return JNIHandles::make_local(field_array());
 }