annotate src/share/vm/classfile/classFileStream.hpp @ 3762:5c0a3c1858b1

7048782: CMS: assert(last_chunk_index_to_check<= last_chunk_index) failed: parCardTableModRefBS.cpp:359 Summary: The LNC array is sized before the start of a scavenge, while the heap may expand during a scavenge. With CMS, the last block of an arbitrary suffice of the LNC array may expand due to coalition with the expansion delta. We now take care not to attempt access past the end of the LNC array. LNC array code will be cleaned up and suitably encapsulated as part of the forthcoming performance RFE 7043675. Reviewed-by: brutisso
author ysr
date Thu, 02 Jun 2011 10:23:36 -0700
parents 1d1603768966
children ade95d680b42
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
2426
1d1603768966 7010070: Update all 2010 Oracle-changed OpenJDK files to have the proper copyright dates - second pass
trims
parents: 2192
diff changeset
2 * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
25 #ifndef SHARE_VM_CLASSFILE_CLASSFILESTREAM_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
26 #define SHARE_VM_CLASSFILE_CLASSFILESTREAM_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
27
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
28 #include "utilities/top.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
29 #ifdef TARGET_ARCH_x86
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
30 # include "bytes_x86.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
31 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
32 #ifdef TARGET_ARCH_sparc
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
33 # include "bytes_sparc.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
34 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
35 #ifdef TARGET_ARCH_zero
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
36 # include "bytes_zero.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
37 #endif
2192
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 1972
diff changeset
38 #ifdef TARGET_ARCH_arm
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 1972
diff changeset
39 # include "bytes_arm.hpp"
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 1972
diff changeset
40 #endif
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 1972
diff changeset
41 #ifdef TARGET_ARCH_ppc
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 1972
diff changeset
42 # include "bytes_ppc.hpp"
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 1972
diff changeset
43 #endif
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
44
0
a61af66fc99e Initial load
duke
parents:
diff changeset
45 // Input stream for reading .class file
a61af66fc99e Initial load
duke
parents:
diff changeset
46 //
a61af66fc99e Initial load
duke
parents:
diff changeset
47 // The entire input stream is present in a buffer allocated by the caller.
a61af66fc99e Initial load
duke
parents:
diff changeset
48 // The caller is responsible for deallocating the buffer and for using
a61af66fc99e Initial load
duke
parents:
diff changeset
49 // ResourceMarks appropriately when constructing streams.
a61af66fc99e Initial load
duke
parents:
diff changeset
50
a61af66fc99e Initial load
duke
parents:
diff changeset
51 class ClassFileStream: public ResourceObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
52 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
53 u1* _buffer_start; // Buffer bottom
a61af66fc99e Initial load
duke
parents:
diff changeset
54 u1* _buffer_end; // Buffer top (one past last element)
a61af66fc99e Initial load
duke
parents:
diff changeset
55 u1* _current; // Current buffer position
a61af66fc99e Initial load
duke
parents:
diff changeset
56 char* _source; // Source of stream (directory name, ZIP/JAR archive name)
a61af66fc99e Initial load
duke
parents:
diff changeset
57 bool _need_verify; // True if verification is on for the class file
a61af66fc99e Initial load
duke
parents:
diff changeset
58
a61af66fc99e Initial load
duke
parents:
diff changeset
59 void truncated_file_error(TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
60 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
61 // Constructor
a61af66fc99e Initial load
duke
parents:
diff changeset
62 ClassFileStream(u1* buffer, int length, char* source);
a61af66fc99e Initial load
duke
parents:
diff changeset
63
a61af66fc99e Initial load
duke
parents:
diff changeset
64 // Buffer access
a61af66fc99e Initial load
duke
parents:
diff changeset
65 u1* buffer() const { return _buffer_start; }
a61af66fc99e Initial load
duke
parents:
diff changeset
66 int length() const { return _buffer_end - _buffer_start; }
a61af66fc99e Initial load
duke
parents:
diff changeset
67 u1* current() const { return _current; }
a61af66fc99e Initial load
duke
parents:
diff changeset
68 void set_current(u1* pos) { _current = pos; }
a61af66fc99e Initial load
duke
parents:
diff changeset
69 char* source() const { return _source; }
a61af66fc99e Initial load
duke
parents:
diff changeset
70 void set_verify(bool flag) { _need_verify = flag; }
a61af66fc99e Initial load
duke
parents:
diff changeset
71
a61af66fc99e Initial load
duke
parents:
diff changeset
72 void check_truncated_file(bool b, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
73 if (b) {
a61af66fc99e Initial load
duke
parents:
diff changeset
74 truncated_file_error(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
75 }
a61af66fc99e Initial load
duke
parents:
diff changeset
76 }
a61af66fc99e Initial load
duke
parents:
diff changeset
77
a61af66fc99e Initial load
duke
parents:
diff changeset
78 void guarantee_more(int size, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
79 size_t remaining = (size_t)(_buffer_end - _current);
a61af66fc99e Initial load
duke
parents:
diff changeset
80 unsigned int usize = (unsigned int)size;
a61af66fc99e Initial load
duke
parents:
diff changeset
81 check_truncated_file(usize > remaining, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
82 }
a61af66fc99e Initial load
duke
parents:
diff changeset
83
a61af66fc99e Initial load
duke
parents:
diff changeset
84 // Read u1 from stream
a61af66fc99e Initial load
duke
parents:
diff changeset
85 u1 get_u1(TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
86 u1 get_u1_fast() {
a61af66fc99e Initial load
duke
parents:
diff changeset
87 return *_current++;
a61af66fc99e Initial load
duke
parents:
diff changeset
88 }
a61af66fc99e Initial load
duke
parents:
diff changeset
89
a61af66fc99e Initial load
duke
parents:
diff changeset
90 // Read u2 from stream
a61af66fc99e Initial load
duke
parents:
diff changeset
91 u2 get_u2(TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
92 u2 get_u2_fast() {
a61af66fc99e Initial load
duke
parents:
diff changeset
93 u2 res = Bytes::get_Java_u2(_current);
a61af66fc99e Initial load
duke
parents:
diff changeset
94 _current += 2;
a61af66fc99e Initial load
duke
parents:
diff changeset
95 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
96 }
a61af66fc99e Initial load
duke
parents:
diff changeset
97
a61af66fc99e Initial load
duke
parents:
diff changeset
98 // Read u4 from stream
a61af66fc99e Initial load
duke
parents:
diff changeset
99 u4 get_u4(TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
100 u4 get_u4_fast() {
a61af66fc99e Initial load
duke
parents:
diff changeset
101 u4 res = Bytes::get_Java_u4(_current);
a61af66fc99e Initial load
duke
parents:
diff changeset
102 _current += 4;
a61af66fc99e Initial load
duke
parents:
diff changeset
103 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
104 }
a61af66fc99e Initial load
duke
parents:
diff changeset
105
a61af66fc99e Initial load
duke
parents:
diff changeset
106 // Read u8 from stream
a61af66fc99e Initial load
duke
parents:
diff changeset
107 u8 get_u8(TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
108 u8 get_u8_fast() {
a61af66fc99e Initial load
duke
parents:
diff changeset
109 u8 res = Bytes::get_Java_u8(_current);
a61af66fc99e Initial load
duke
parents:
diff changeset
110 _current += 8;
a61af66fc99e Initial load
duke
parents:
diff changeset
111 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
112 }
a61af66fc99e Initial load
duke
parents:
diff changeset
113
a61af66fc99e Initial load
duke
parents:
diff changeset
114 // Get direct pointer into stream at current position.
a61af66fc99e Initial load
duke
parents:
diff changeset
115 // Returns NULL if length elements are not remaining. The caller is
a61af66fc99e Initial load
duke
parents:
diff changeset
116 // responsible for calling skip below if buffer contents is used.
a61af66fc99e Initial load
duke
parents:
diff changeset
117 u1* get_u1_buffer() {
a61af66fc99e Initial load
duke
parents:
diff changeset
118 return _current;
a61af66fc99e Initial load
duke
parents:
diff changeset
119 }
a61af66fc99e Initial load
duke
parents:
diff changeset
120
a61af66fc99e Initial load
duke
parents:
diff changeset
121 u2* get_u2_buffer() {
a61af66fc99e Initial load
duke
parents:
diff changeset
122 return (u2*) _current;
a61af66fc99e Initial load
duke
parents:
diff changeset
123 }
a61af66fc99e Initial load
duke
parents:
diff changeset
124
a61af66fc99e Initial load
duke
parents:
diff changeset
125 // Skip length u1 or u2 elements from stream
a61af66fc99e Initial load
duke
parents:
diff changeset
126 void skip_u1(int length, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
127 void skip_u1_fast(int length) {
a61af66fc99e Initial load
duke
parents:
diff changeset
128 _current += length;
a61af66fc99e Initial load
duke
parents:
diff changeset
129 }
a61af66fc99e Initial load
duke
parents:
diff changeset
130
a61af66fc99e Initial load
duke
parents:
diff changeset
131 void skip_u2(int length, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
132 void skip_u2_fast(int length) {
a61af66fc99e Initial load
duke
parents:
diff changeset
133 _current += 2 * length;
a61af66fc99e Initial load
duke
parents:
diff changeset
134 }
a61af66fc99e Initial load
duke
parents:
diff changeset
135
a61af66fc99e Initial load
duke
parents:
diff changeset
136 // Tells whether eos is reached
a61af66fc99e Initial load
duke
parents:
diff changeset
137 bool at_eos() const { return _current == _buffer_end; }
a61af66fc99e Initial load
duke
parents:
diff changeset
138 };
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
139
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
140 #endif // SHARE_VM_CLASSFILE_CLASSFILESTREAM_HPP