89
90
91 Handle SystemDictionaryShared::get_shared_jar_manifest(int shared_path_index, TRAPS) {
92 Handle empty;
93 Handle manifest ;
94 if (shared_jar_manifest(shared_path_index) == NULL) {
95 SharedClassPathEntryExt* ent = (SharedClassPathEntryExt*)FileMapInfo::shared_path(shared_path_index);
96 long size = ent->manifest_size();
97 if (size <= 0) {
98 return empty; // No manifest - return NULL handle
99 }
100
101 // ByteArrayInputStream bais = new ByteArrayInputStream(buf);
102 InstanceKlass* bais_klass = SystemDictionary::ByteArrayInputStream_klass();
103 Handle bais = bais_klass->allocate_instance_handle(CHECK_(empty));
104 {
105 const char* src = ent->manifest();
106 assert(src != NULL, "No Manifest data");
107 typeArrayOop buf = oopFactory::new_byteArray(size, CHECK_(empty));
108 typeArrayHandle bufhandle(THREAD, buf);
109 char* dst = (char*)(buf->byte_at_addr(0));
110 memcpy(dst, src, (size_t)size);
111
112 JavaValue result(T_VOID);
113 JavaCalls::call_special(&result, bais, bais_klass,
114 vmSymbols::object_initializer_name(),
115 vmSymbols::byte_array_void_signature(),
116 bufhandle, CHECK_(empty));
117 }
118
119 // manifest = new Manifest(bais)
120 InstanceKlass* manifest_klass = SystemDictionary::Jar_Manifest_klass();
121 manifest = manifest_klass->allocate_instance_handle(CHECK_(empty));
122 {
123 JavaValue result(T_VOID);
124 JavaCalls::call_special(&result, manifest, manifest_klass,
125 vmSymbols::object_initializer_name(),
126 vmSymbols::input_stream_void_signature(),
127 bais, CHECK_(empty));
128 }
129 atomic_set_shared_jar_manifest(shared_path_index, manifest());
130 }
|
89
90
91 Handle SystemDictionaryShared::get_shared_jar_manifest(int shared_path_index, TRAPS) {
92 Handle empty;
93 Handle manifest ;
94 if (shared_jar_manifest(shared_path_index) == NULL) {
95 SharedClassPathEntryExt* ent = (SharedClassPathEntryExt*)FileMapInfo::shared_path(shared_path_index);
96 long size = ent->manifest_size();
97 if (size <= 0) {
98 return empty; // No manifest - return NULL handle
99 }
100
101 // ByteArrayInputStream bais = new ByteArrayInputStream(buf);
102 InstanceKlass* bais_klass = SystemDictionary::ByteArrayInputStream_klass();
103 Handle bais = bais_klass->allocate_instance_handle(CHECK_(empty));
104 {
105 const char* src = ent->manifest();
106 assert(src != NULL, "No Manifest data");
107 typeArrayOop buf = oopFactory::new_byteArray(size, CHECK_(empty));
108 typeArrayHandle bufhandle(THREAD, buf);
109 HeapAccess<>::arraycopy<jbyte>(NULL, 0, reinterpret_cast<const jbyte*>(src),
110 buf, typeArrayOopDesc::element_offset<jbyte>(0), NULL, size);
111
112 JavaValue result(T_VOID);
113 JavaCalls::call_special(&result, bais, bais_klass,
114 vmSymbols::object_initializer_name(),
115 vmSymbols::byte_array_void_signature(),
116 bufhandle, CHECK_(empty));
117 }
118
119 // manifest = new Manifest(bais)
120 InstanceKlass* manifest_klass = SystemDictionary::Jar_Manifest_klass();
121 manifest = manifest_klass->allocate_instance_handle(CHECK_(empty));
122 {
123 JavaValue result(T_VOID);
124 JavaCalls::call_special(&result, manifest, manifest_klass,
125 vmSymbols::object_initializer_name(),
126 vmSymbols::input_stream_void_signature(),
127 bais, CHECK_(empty));
128 }
129 atomic_set_shared_jar_manifest(shared_path_index, manifest());
130 }
|