< prev index next >
src/share/vm/classfile/classFileStream.cpp
Print this page
@@ -28,16 +28,16 @@
void ClassFileStream::truncated_file_error(TRAPS) {
THROW_MSG(vmSymbols::java_lang_ClassFormatError(), "Truncated class file");
}
-ClassFileStream::ClassFileStream(u1* buffer, int length, const char* source) {
+ClassFileStream::ClassFileStream(u1* buffer, int length, const char* source, bool need_verify) {
_buffer_start = buffer;
_buffer_end = buffer + length;
_current = buffer;
_source = source;
- _need_verify = false;
+ _need_verify = need_verify;
}
u1 ClassFileStream::get_u1(TRAPS) {
if (_need_verify) {
guarantee_more(1, CHECK_0);
@@ -98,5 +98,33 @@
if (_need_verify) {
guarantee_more(length * 4, CHECK);
}
_current += length * 4;
}
+
+#if INCLUDE_JFR
+
+u1* ClassFileStream::clone_buffer() const {
+ u1* const new_buffer_start = NEW_RESOURCE_ARRAY(u1, length());
+ memcpy(new_buffer_start, _buffer_start, length());
+ return new_buffer_start;
+}
+
+const char* const ClassFileStream::clone_source() const {
+ const char* const src = source();
+ char* source_copy = NULL;
+ if (src != NULL) {
+ size_t source_len = strlen(src);
+ source_copy = NEW_RESOURCE_ARRAY(char, source_len + 1);
+ strncpy(source_copy, src, source_len + 1);
+ }
+ return source_copy;
+}
+
+ClassFileStream* ClassFileStream::clone() const {
+ u1* const new_buffer_start = clone_buffer();
+ return new ClassFileStream(new_buffer_start,
+ length(),
+ clone_source(),
+ need_verify());
+}
+#endif // INCLUDE_JFR
< prev index next >