Index: vm/gc_gen/src/common/gc_for_vm.cpp =================================================================== --- vm/gc_gen/src/common/gc_for_vm.cpp (revision 638258) +++ vm/gc_gen/src/common/gc_for_vm.cpp (working copy) @@ -154,6 +154,8 @@ STD_FREE(p_global_gc); + GCHelper_clss = NULL; + java_helper_inlined = 0; p_global_gc = NULL; INFO2("gc.process", "GC: end of GC wrapup\n"); } Index: vm/include/jit_runtime_support.h =================================================================== --- vm/include/jit_runtime_support.h (revision 638258) +++ vm/include/jit_runtime_support.h (working copy) @@ -64,6 +64,10 @@ DECLARE_OPEN(VM_RT_SUPPORT, vm_helper_get_by_name, (const char* name)); +void helper_magic_init_registry(Global_Env* vm_env); +jint helper_magic_init(Global_Env * vm_env); +void helper_magic_shutdown(); + DECLARE_OPEN(jint, vm_helper_register_magic_helper, (VM_RT_SUPPORT id, const char* class_name, const char* method_name)); Index: vm/vmcore/include/jarfile_support.h =================================================================== --- vm/vmcore/include/jarfile_support.h (revision 638258) +++ vm/vmcore/include/jarfile_support.h (working copy) @@ -250,6 +250,9 @@ static JarFile* GetJar(int idx) { return m_jars[idx]; } + static void InitJarSupport() { + m_jars.clear(); + } // handle of the jar file int jfh; Index: vm/vmcore/include/classloader.h =================================================================== --- vm/vmcore/include/classloader.h (revision 638258) +++ vm/vmcore/include/classloader.h (working copy) @@ -154,7 +154,8 @@ friend class GlobalClassLoaderIterator; public: ClassLoader() : m_loader(NULL), m_parent(NULL), m_name(NULL), m_package_table(NULL), - m_loadedClasses(NULL), m_loadingClasses(NULL), m_reportedClasses(NULL), + m_loadedClasses(NULL), m_initiatedClasses(NULL), + m_loadingClasses(NULL), m_reportedClasses(NULL), m_javaTypes(NULL), m_nativeLibraries(NULL), m_verifyData(NULL), m_markBit(false) { apr_pool_create(&pool, 0); Index: vm/vmcore/include/environment.h =================================================================== --- vm/vmcore/include/environment.h (revision 638258) +++ vm/vmcore/include/environment.h (working copy) @@ -53,6 +53,7 @@ void* portLib; // Classlib's port library DynamicCode* dcList; Assertion_Registry* assert_reg; + HelperInfoMap* helper_map; PoolManager* GlobalCodeMemoryManager; PoolManager* VTableMemoryManager; Index: vm/vmcore/include/vm_core_types.h =================================================================== --- vm/vmcore/include/vm_core_types.h (revision 638258) +++ vm/vmcore/include/vm_core_types.h (working copy) @@ -50,6 +50,7 @@ class Properties; struct StackIterator; struct TypeDesc; +class HelperInfoMap; typedef void (*GenericFunctionPointer)(); typedef LilCodeStub* (*NativeStubOverride)(LilCodeStub*, Method_Handle); Index: vm/vmcore/src/jni/jni.cpp =================================================================== --- vm/vmcore/src/jni/jni.cpp (revision 638258) +++ vm/vmcore/src/jni/jni.cpp (working copy) @@ -1510,7 +1510,7 @@ status = vm_destroy(java_vm, java_thread); // Destroy VM environment. - delete java_vm->vm_env; + java_vm->vm_env->~Global_Env(); java_vm->vm_env = NULL; // Destroy VM pool. Index: vm/vmcore/src/jit/rt_helper_info.cpp =================================================================== --- vm/vmcore/src/jit/rt_helper_info.cpp (revision 638258) +++ vm/vmcore/src/jit/rt_helper_info.cpp (working copy) @@ -40,205 +40,215 @@ Method_Handle magic_mh; }; -typedef std::map HelperInfoMap; - -static JIT_RT_Function_Entry _jit_rt_function_entries_base[] = { +static JIT_RT_Function_Entry jit_rt_function_entries_empty[] = { {VM_RT_NEW_RESOLVED_USING_VTABLE_AND_SIZE, "VM_RT_NEW_RESOLVED_USING_VTABLE_AND_SIZE", - INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 2, - NULL, NULL, "(Lorg/vmmagic/unboxed/Address;)Lorg/vmmagic/unboxed/Address;", NULL}, + INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 2, + NULL, NULL, "(Lorg/vmmagic/unboxed/Address;)Lorg/vmmagic/unboxed/Address;", NULL}, {VM_RT_NEW_VECTOR_USING_VTABLE, "VM_RT_NEW_VECTOR_USING_VTABLE", - INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 2, - NULL, NULL, "(Lorg/vmmagic/unboxed/Address;I)Lorg/vmmagic/unboxed/Address;", NULL}, + INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 2, + NULL, NULL, "(Lorg/vmmagic/unboxed/Address;I)Lorg/vmmagic/unboxed/Address;", NULL}, {VM_RT_MULTIANEWARRAY_RESOLVED, "VM_RT_MULTIANEWARRAY_RESOLVED", INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_MULTIARRAY, 8, NULL, NULL, NULL, NULL}, {VM_RT_LDC_STRING, "VM_RT_LDC_STRING", - INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 2, - NULL, NULL, NULL, NULL}, + INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 2, + NULL, NULL, NULL, NULL}, {VM_RT_THROW, "VM_RT_THROW", - INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 1, - NULL, NULL, NULL, NULL}, + INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 1, + NULL, NULL, NULL, NULL}, {VM_RT_THROW_LAZY, "VM_RT_THROW_LAZY", - INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_DRL, 8, - NULL, NULL, NULL, NULL}, + INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_DRL, 8, + NULL, NULL, NULL, NULL}, {VM_RT_IDX_OUT_OF_BOUNDS, "VM_RT_IDX_OUT_OF_BOUNDS", - INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 0, - NULL, NULL, NULL, NULL}, + INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 0, + NULL, NULL, NULL, NULL}, {VM_RT_NULL_PTR_EXCEPTION, "VM_RT_NULL_PTR_EXCEPTION", - INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 0, - NULL, NULL, NULL, NULL}, + INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 0, + NULL, NULL, NULL, NULL}, {VM_RT_DIVIDE_BY_ZERO_EXCEPTION, "VM_RT_DIVIDE_BY_ZERO_EXCEPTION", - INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 0, - NULL, NULL, NULL, NULL}, + INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 0, + NULL, NULL, NULL, NULL}, {VM_RT_ARRAY_STORE_EXCEPTION, "VM_RT_ARRAY_STORE_EXCEPTION", - INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 0, - NULL, NULL, NULL, NULL}, + INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 0, + NULL, NULL, NULL, NULL}, {VM_RT_THROW_LINKING_EXCEPTION, "VM_RT_THROW_LINKING_EXCEPTION", - INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 0, - NULL, NULL, NULL, NULL}, + INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 0, + NULL, NULL, NULL, NULL}, {VM_RT_THROW_SET_STACK_TRACE, "VM_RT_THROW_SET_STACK_TRACE", - INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 1, - NULL, NULL, NULL, NULL}, + INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 1, + NULL, NULL, NULL, NULL}, {VM_RT_MONITOR_ENTER, "VM_RT_MONITOR_ENTER", - INTERRUPTIBLE_SOMETIMES, CALLING_CONVENTION_STDCALL, 1, - "org/apache/harmony/drlvm/thread/ThreadHelper", "monitorEnterUseReservation", - "(Ljava/lang/Object;)V", NULL}, + INTERRUPTIBLE_SOMETIMES, CALLING_CONVENTION_STDCALL, 1, + "org/apache/harmony/drlvm/thread/ThreadHelper", "monitorEnterUseReservation", + "(Ljava/lang/Object;)V", NULL}, {VM_RT_MONITOR_ENTER_NON_NULL, "VM_RT_MONITOR_ENTER_NON_NULL", - INTERRUPTIBLE_SOMETIMES, CALLING_CONVENTION_STDCALL, 1, - "org/apache/harmony/drlvm/thread/ThreadHelper", "monitorEnterUseReservation", - "(Ljava/lang/Object;)V", NULL}, + INTERRUPTIBLE_SOMETIMES, CALLING_CONVENTION_STDCALL, 1, + "org/apache/harmony/drlvm/thread/ThreadHelper", "monitorEnterUseReservation", + "(Ljava/lang/Object;)V", NULL}, {VM_RT_MONITOR_EXIT, "VM_RT_MONITOR_EXIT", - INTERRUPTIBLE_SOMETIMES, CALLING_CONVENTION_STDCALL, 1, - "org/apache/harmony/drlvm/thread/ThreadHelper", "monitorExit", - "(Ljava/lang/Object;)V", NULL}, + INTERRUPTIBLE_SOMETIMES, CALLING_CONVENTION_STDCALL, 1, + "org/apache/harmony/drlvm/thread/ThreadHelper", "monitorExit", + "(Ljava/lang/Object;)V", NULL}, {VM_RT_MONITOR_EXIT_NON_NULL, "VM_RT_MONITOR_EXIT_NON_NULL", - INTERRUPTIBLE_SOMETIMES, CALLING_CONVENTION_STDCALL, 1, - "org/apache/harmony/drlvm/thread/ThreadHelper", "monitorExit", - "(Ljava/lang/Object;)V", NULL}, + INTERRUPTIBLE_SOMETIMES, CALLING_CONVENTION_STDCALL, 1, + "org/apache/harmony/drlvm/thread/ThreadHelper", "monitorExit", + "(Ljava/lang/Object;)V", NULL}, {VM_RT_MONITOR_ENTER_STATIC, "VM_RT_MONITOR_ENTER_STATIC", - INTERRUPTIBLE_SOMETIMES, CALLING_CONVENTION_STDCALL, 1, - "org/apache/harmony/drlvm/thread/ThreadHelper", "monitorEnterUseReservation", - "(Ljava/lang/Object;)V", NULL}, + INTERRUPTIBLE_SOMETIMES, CALLING_CONVENTION_STDCALL, 1, + "org/apache/harmony/drlvm/thread/ThreadHelper", "monitorEnterUseReservation", + "(Ljava/lang/Object;)V", NULL}, {VM_RT_MONITOR_EXIT_STATIC, "VM_RT_MONITOR_EXIT_STATIC", - INTERRUPTIBLE_SOMETIMES, CALLING_CONVENTION_STDCALL, 1, - "org/apache/harmony/drlvm/thread/ThreadHelper", "monitorExit", - "(Ljava/lang/Object;)V", NULL}, + INTERRUPTIBLE_SOMETIMES, CALLING_CONVENTION_STDCALL, 1, + "org/apache/harmony/drlvm/thread/ThreadHelper", "monitorExit", + "(Ljava/lang/Object;)V", NULL}, {VM_RT_CHECKCAST, "VM_RT_CHECKCAST", - INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 2, - "org/apache/harmony/drlvm/VMHelperFastPath", "checkCast", - "(Lorg/vmmagic/unboxed/Address;Ljava/lang/Object;)V", NULL}, + INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 2, + "org/apache/harmony/drlvm/VMHelperFastPath", "checkCast", + "(Lorg/vmmagic/unboxed/Address;Ljava/lang/Object;)V", NULL}, {VM_RT_INSTANCEOF, "VM_RT_INSTANCEOF", - INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 2, - "org/apache/harmony/drlvm/VMHelperFastPath", "instanceOf", - "(Lorg/vmmagic/unboxed/Address;Ljava/lang/Object;)Z", NULL}, + INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 2, + "org/apache/harmony/drlvm/VMHelperFastPath", "instanceOf", + "(Lorg/vmmagic/unboxed/Address;Ljava/lang/Object;)Z", NULL}, {VM_RT_AASTORE, "VM_RT_AASTORE", - INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 3, - NULL, NULL, NULL, NULL}, + INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 3, + NULL, NULL, NULL, NULL}, {VM_RT_AASTORE_TEST, "VM_RT_AASTORE_TEST", - INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 2, - NULL, NULL, NULL, NULL}, + INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 2, + NULL, NULL, NULL, NULL}, {VM_RT_GET_INTERFACE_VTABLE_VER0, "VM_RT_GET_INTERFACE_VTABLE_VER0", - INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 2, - "org/apache/harmony/drlvm/VMHelperFastPath", "getInterfaceVTable3", - "(Lorg/vmmagic/unboxed/Address;Ljava/lang/Object;)Lorg/vmmagic/unboxed/Address;", NULL}, + INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 2, + "org/apache/harmony/drlvm/VMHelperFastPath", "getInterfaceVTable3", + "(Lorg/vmmagic/unboxed/Address;Ljava/lang/Object;)Lorg/vmmagic/unboxed/Address;", NULL}, {VM_RT_INITIALIZE_CLASS, "VM_RT_INITIALIZE_CLASS", - INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 1, - NULL, NULL, NULL, NULL}, + INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 1, + NULL, NULL, NULL, NULL}, {VM_RT_GC_HEAP_WRITE_REF, "VM_RT_GC_HEAP_WRITE_REF", - INTERRUPTIBLE_NEVER, CALLING_CONVENTION_CDECL, 3, - NULL, NULL, "(Lorg/vmmagic/unboxed/Address;Lorg/vmmagic/unboxed/Address;Lorg/vmmagic/unboxed/Address;)V", NULL}, + INTERRUPTIBLE_NEVER, CALLING_CONVENTION_CDECL, 3, + NULL, NULL, "(Lorg/vmmagic/unboxed/Address;Lorg/vmmagic/unboxed/Address;Lorg/vmmagic/unboxed/Address;)V", NULL}, {VM_RT_GC_SAFE_POINT, "VM_RT_GC_SAFE_POINT", - INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 0, - NULL, NULL, NULL, NULL}, + INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 0, + NULL, NULL, NULL, NULL}, {VM_RT_GC_GET_TLS_BASE, "VM_RT_GET_TLS_BASE", - INTERRUPTIBLE_NEVER, CALLING_CONVENTION_STDCALL, 0, - NULL, NULL, NULL, NULL}, + INTERRUPTIBLE_NEVER, CALLING_CONVENTION_STDCALL, 0, + NULL, NULL, NULL, NULL}, {VM_RT_JVMTI_METHOD_ENTER_CALLBACK, "VM_RT_JVMTI_METHOD_ENTER_CALLBACK", - INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 1, - NULL, NULL, NULL, NULL}, + INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 1, + NULL, NULL, NULL, NULL}, {VM_RT_JVMTI_METHOD_EXIT_CALLBACK, "VM_RT_JVMTI_METHOD_EXIT_CALLBACK", - INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 2, - NULL, NULL, NULL, NULL}, + INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 2, + NULL, NULL, NULL, NULL}, {VM_RT_JVMTI_FIELD_ACCESS_CALLBACK, "VM_RT_JVMTI_FIELD_ACCESS_CALLBACK", - INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 4, - NULL, NULL, NULL, NULL}, + INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 4, + NULL, NULL, NULL, NULL}, {VM_RT_JVMTI_FIELD_MODIFICATION_CALLBACK, "VM_RT_JVMTI_FIELD_MODIFICATION_CALLBACK", - INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 5, - NULL, NULL, NULL, NULL}, + INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 5, + NULL, NULL, NULL, NULL}, {VM_RT_NEWOBJ_WITHRESOLVE, "VM_RT_NEWOBJ_WITHRESOLVE", - INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 2, - NULL, NULL, NULL, NULL}, + INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 2, + NULL, NULL, NULL, NULL}, {VM_RT_NEWARRAY_WITHRESOLVE, "VM_RT_NEWARRAY_WITHRESOLVE", - INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 3, - NULL, NULL, NULL, NULL}, + INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 3, + NULL, NULL, NULL, NULL}, {VM_RT_GET_NONSTATIC_FIELD_OFFSET_WITHRESOLVE, "VM_RT_GET_NONSTATIC_FIELD_OFFSET_WITHRESOLVE", - INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 2, - NULL, NULL, NULL, NULL}, + INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 2, + NULL, NULL, NULL, NULL}, {VM_RT_GET_STATIC_FIELD_ADDR_WITHRESOLVE, "VM_RT_GET_STATIC_FIELD_ADDR_WITHRESOLVE", - INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 2, - NULL, NULL, NULL, NULL}, + INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 2, + NULL, NULL, NULL, NULL}, {VM_RT_CHECKCAST_WITHRESOLVE, "VM_RT_CHECKCAST_WITHRESOLVE", - INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 3, - NULL, NULL, NULL, NULL}, + INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 3, + NULL, NULL, NULL, NULL}, {VM_RT_INSTANCEOF_WITHRESOLVE, "VM_RT_INSTANCEOF_WITHRESOLVE", - INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 3, - NULL, NULL, NULL, NULL}, + INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 3, + NULL, NULL, NULL, NULL}, {VM_RT_GET_INVOKESTATIC_ADDR_WITHRESOLVE, "VM_RT_GET_INVOKESTATIC_ADDR_WITHRESOLVE", - INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 2, - NULL, NULL, NULL, NULL}, + INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 2, + NULL, NULL, NULL, NULL}, {VM_RT_GET_INVOKEINTERFACE_ADDR_WITHRESOLVE, "VM_RT_GET_INVOKEINTERFACE_ADDR_WITHRESOLVE", - INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 3, - NULL, NULL, NULL, NULL}, + INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 3, + NULL, NULL, NULL, NULL}, {VM_RT_GET_INVOKEVIRTUAL_ADDR_WITHRESOLVE, "VM_RT_GET_INVOKEVIRTUAL_ADDR_WITHRESOLVE", - INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 3, - NULL, NULL, NULL, NULL}, + INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 3, + NULL, NULL, NULL, NULL}, {VM_RT_GET_INVOKE_SPECIAL_ADDR_WITHRESOLVE, "VM_RT_GET_INVOKE_SPECIAL_ADDR_WITHRESOLVE", - INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 2, - NULL, NULL, NULL, NULL}, + INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 2, + NULL, NULL, NULL, NULL}, {VM_RT_INITIALIZE_CLASS_WITHRESOLVE, "VM_RT_INITIALIZE_CLASS_WITHRESOLVE", - INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 2, - NULL, NULL, NULL, NULL}, + INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 2, + NULL, NULL, NULL, NULL}, - {VM_RT_F2I, "VM_RT_F2I", - INTERRUPTIBLE_NEVER, CALLING_CONVENTION_STDCALL, 1, - NULL, NULL, NULL, NULL}, + INTERRUPTIBLE_NEVER, CALLING_CONVENTION_STDCALL, 1, + NULL, NULL, NULL, NULL}, {VM_RT_F2L, "VM_RT_F2L", - INTERRUPTIBLE_NEVER, CALLING_CONVENTION_STDCALL, 1, - NULL, NULL, NULL, NULL}, + INTERRUPTIBLE_NEVER, CALLING_CONVENTION_STDCALL, 1, + NULL, NULL, NULL, NULL}, {VM_RT_D2I, "VM_RT_D2I", - INTERRUPTIBLE_NEVER, CALLING_CONVENTION_STDCALL, 1, - NULL, NULL, NULL, NULL}, + INTERRUPTIBLE_NEVER, CALLING_CONVENTION_STDCALL, 1, + NULL, NULL, NULL, NULL}, {VM_RT_D2L, "VM_RT_D2L", - INTERRUPTIBLE_NEVER, CALLING_CONVENTION_STDCALL, 1, - NULL, NULL, NULL, NULL}, + INTERRUPTIBLE_NEVER, CALLING_CONVENTION_STDCALL, 1, + NULL, NULL, NULL, NULL}, {VM_RT_FREM, "VM_RT_FREM", - INTERRUPTIBLE_NEVER, CALLING_CONVENTION_STDCALL, 2, - NULL, NULL, NULL, NULL}, + INTERRUPTIBLE_NEVER, CALLING_CONVENTION_STDCALL, 2, + NULL, NULL, NULL, NULL}, {VM_RT_DREM, "VM_RT_DREM", - INTERRUPTIBLE_NEVER, CALLING_CONVENTION_STDCALL, 2, - NULL, NULL, NULL, NULL}, + INTERRUPTIBLE_NEVER, CALLING_CONVENTION_STDCALL, 2, + NULL, NULL, NULL, NULL}, {VM_RT_CHAR_ARRAYCOPY_NO_EXC, "VM_RT_CHAR_ARRAYCOPY_NO_EXC", - INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 5, - NULL, NULL, NULL, NULL}, + INTERRUPTIBLE_ALWAYS, CALLING_CONVENTION_STDCALL, 5, + NULL, NULL, NULL, NULL}, }; -static JIT_RT_Function_Entry *jit_rt_function_entries = &(_jit_rt_function_entries_base[0]); -static int num_jit_rt_function_entries = sizeof(_jit_rt_function_entries_base) / sizeof(_jit_rt_function_entries_base[0]); +static int num_jit_rt_function_entries = sizeof(jit_rt_function_entries_empty) / sizeof(jit_rt_function_entries_empty[0]); -static HelperInfoMap* init_helper_map() { - // TODO: Use proper MM - HelperInfoMap *map = new HelperInfoMap(); +class HelperInfoMap : public std::map +{ +public: + JIT_RT_Function_Entry* jit_rt_function_entries; + HelperInfoMap(); + ~HelperInfoMap() { + clear(); + } +}; + +HelperInfoMap::HelperInfoMap() { + jit_rt_function_entries = new JIT_RT_Function_Entry[num_jit_rt_function_entries]; + memcpy(jit_rt_function_entries, jit_rt_function_entries_empty, + num_jit_rt_function_entries*sizeof(JIT_RT_Function_Entry)); for (int i = 0; i < num_jit_rt_function_entries; i++) { VM_RT_SUPPORT hid = jit_rt_function_entries[i].function; - assert(map->find(hid) == map->end()); - map->insert(HelperInfoMap::value_type(hid, jit_rt_function_entries + i)); + assert(find(hid) == end()); + insert(HelperInfoMap::value_type(hid, jit_rt_function_entries + i)); } - assert(map->size() == num_jit_rt_function_entries); - return map; + assert(size() == num_jit_rt_function_entries); } -static HelperInfoMap *helper_map = init_helper_map(); +void helper_magic_init_registry(Global_Env* vm_env) { + // TODO: Use proper MM + vm_env->helper_map = new HelperInfoMap(); +} VMEXPORT const char* vm_helper_get_name(VM_RT_SUPPORT id) { + HelperInfoMap* helper_map = VM_Global_State::loader_env->helper_map; HelperInfoMap::const_iterator it = helper_map->find(id); if (helper_map->end() != it) { assert(it->second); @@ -252,8 +262,8 @@ VMEXPORT VM_RT_SUPPORT vm_helper_get_by_name(const char* name) { for (int i = 0; i < num_jit_rt_function_entries; i++) { - if( !strcmpi(name, jit_rt_function_entries[i].name)) { - return jit_rt_function_entries[i].function; + if( !strcmpi(name, jit_rt_function_entries_empty[i].name)) { + return jit_rt_function_entries_empty[i].function; } } return VM_RT_UNKNOWN; @@ -262,6 +272,7 @@ VMEXPORT HELPER_INTERRUPTIBILITY_KIND vm_helper_get_interruptibility_kind(VM_RT_SUPPORT id) { + HelperInfoMap* helper_map = VM_Global_State::loader_env->helper_map; HelperInfoMap::const_iterator it = helper_map->find(id); if (helper_map->end() != it) { assert(it->second); @@ -275,6 +286,7 @@ VMEXPORT HELPER_CALLING_CONVENTION vm_helper_get_calling_convention(VM_RT_SUPPORT id) { + HelperInfoMap* helper_map = VM_Global_State::loader_env->helper_map; HelperInfoMap::const_iterator it = helper_map->find(id); if (helper_map->end() != it) { assert(it->second); @@ -287,6 +299,7 @@ U_32 vm_helper_get_numargs(VM_RT_SUPPORT id) { + HelperInfoMap* helper_map = VM_Global_State::loader_env->helper_map; HelperInfoMap::const_iterator it = helper_map->find(id); if (helper_map->end() != it) { assert(it->second); @@ -324,7 +337,7 @@ return class_lookup_method_recursive(magic_helper_class, method_name, method_descr); } -jint helper_magic_init(Global_Env * vm_env){ +jint helper_magic_init(Global_Env * vm_env) { #ifdef _IPF_ bool vmmagics_supported = false; #else @@ -337,13 +350,14 @@ //init VMHelper class - utility class for all VMHelpers Class* magic_helper_class = load_magic_helper_class(vm_env, "org/apache/harmony/drlvm/VMHelper"); init_magic_helper_class(magic_helper_class); - + + HelperInfoMap* helper_map = vm_env->helper_map; //cache Method_Handle for all registered magic helpers //init their classes for (int i = 0; i < num_jit_rt_function_entries; i++) { - const char* class_name = jit_rt_function_entries[i].magic_class_name; - const char* method_name = jit_rt_function_entries[i].magic_method_name; - const char* method_descr = jit_rt_function_entries[i].magic_method_descr; + const char* class_name = helper_map->jit_rt_function_entries[i].magic_class_name; + const char* method_name = helper_map->jit_rt_function_entries[i].magic_method_name; + const char* method_descr = helper_map->jit_rt_function_entries[i].magic_method_descr; if (method_name == NULL){ continue; @@ -358,18 +372,24 @@ ASSERT(method_handle, "Method " << class_name <<"."<< method_name << method_descr<<" not found."); return JNI_ERR; } - jit_rt_function_entries[i].magic_mh = method_handle; + helper_map->jit_rt_function_entries[i].magic_mh = method_handle; } return JNI_OK; } +void helper_magic_shutdown() { + delete VM_Global_State::loader_env->helper_map; + VM_Global_State::loader_env->helper_map = NULL; +} + VMEXPORT jint vm_helper_register_magic_helper(VM_RT_SUPPORT id, const char* class_name, const char* method_name) { assert (class_name); assert (method_name); - + + HelperInfoMap* helper_map = VM_Global_State::loader_env->helper_map; HelperInfoMap::const_iterator it = helper_map->find(id); if (helper_map->end() != it) { assert(it->second); @@ -389,6 +409,7 @@ VMEXPORT Method_Handle vm_helper_get_magic_helper(VM_RT_SUPPORT id) { + HelperInfoMap* helper_map = VM_Global_State::loader_env->helper_map; HelperInfoMap::const_iterator it = helper_map->find(id); if (helper_map->end() != it) { assert(it->second); Index: vm/vmcore/src/class_support/Environment.cpp =================================================================== --- vm/vmcore/src/class_support/Environment.cpp (revision 638258) +++ vm/vmcore/src/class_support/Environment.cpp (working copy) @@ -54,6 +54,8 @@ // TODO: Use proper MM. m_java_properties = new Properties(); m_vm_properties = new Properties(); + + JarFile::InitJarSupport(); bootstrap_class_loader = new BootstrapClassLoader(this); hythread_lib_create(&hythread_lib); Index: vm/vmcore/src/class_support/classloader.cpp =================================================================== --- vm/vmcore/src/class_support/classloader.cpp (revision 638258) +++ vm/vmcore/src/class_support/classloader.cpp (working copy) @@ -106,41 +106,49 @@ { Global_Env *env = VM_Global_State::loader_env; ClassTable::iterator it; - ClassTable* LoadedClasses = GetLoadedClasses(); - for (it = LoadedClasses->begin(); it != LoadedClasses->end(); it++) + if(m_loadedClasses) { - Class* c; - c = it->second; - assert(c); - ClassClearInternals(c); - } + for (it = m_loadedClasses->begin(); it != m_loadedClasses->end(); it++) + { + Class* c; + c = it->second; + assert(c); + ClassClearInternals(c); + } - if (GetLoadedClasses()) - { - VM_Global_State::loader_env->unloaded_class_count += GetLoadedClasses()->GetItemCount(); - delete GetLoadedClasses(); + VM_Global_State::loader_env->unloaded_class_count += m_loadedClasses->GetItemCount(); + m_loadedClasses->clear(); + delete m_loadedClasses; } - if (GetLoadingClasses()) - delete GetLoadingClasses(); - if (GetReportedClasses()) - delete GetReportedClasses(); - if (GetVerifyData()) - vf_release_verify_data(GetVerifyData()); - if (GetJavaTypes()) + if(m_loadingClasses) { + m_loadingClasses->clear(); + delete m_loadingClasses; + } + if(m_reportedClasses) { + m_reportedClasses->clear(); + delete m_reportedClasses; + } + if(m_verifyData) { + vf_release_verify_data(m_verifyData); + } + if(m_javaTypes) { JavaTypes::iterator itjt; - for (itjt = GetJavaTypes()->begin(); itjt != GetJavaTypes()->end(); itjt++) + for (itjt = m_javaTypes->begin(); itjt != m_javaTypes->end(); itjt++) { TypeDesc* td = itjt->second; delete td; } - delete GetJavaTypes(); + m_javaTypes->clear(); + delete m_javaTypes; } - if (m_package_table) + if(m_package_table) { + m_package_table->clear(); delete m_package_table; - + } + for(NativeLibInfo* info = m_nativeLibraries; info;info = info->next ) { - natives_unload_library(info->handle); + natives_unload_library(info->handle); } env->em_interface->ClassloaderUnloadingCallback((ClassLoaderHandle)this); Index: vm/vmcore/src/init/vm_init.cpp =================================================================== --- vm/vmcore/src/init/vm_init.cpp (revision 638258) +++ vm/vmcore/src/init/vm_init.cpp (working copy) @@ -870,6 +870,8 @@ /* END: Property processing. */ + helper_magic_init_registry(vm_env); + // Initialize memory allocation. status = gc_init(); if (status != JNI_OK) return status; Index: vm/vmcore/src/init/vm_shutdown.cpp =================================================================== --- vm/vmcore/src/init/vm_shutdown.cpp (revision 638258) +++ vm/vmcore/src/init/vm_shutdown.cpp (working copy) @@ -37,6 +37,7 @@ #include "thread_dump.h" #include "interpreter.h" #include "finalize.h" +#include "jit_runtime_support.h" #define LOG_DOMAIN "vm.core.shutdown" #include "cxxlog.h" @@ -292,6 +293,8 @@ // Block thread creation. // TODO: investigate how to achieve that with ThreadManager + helper_magic_shutdown(); + // Starting this moment any exception occurred in java thread will cause // entire java stack unwinding to the most recent native frame. // JNI is not available as well.