annotate src/share/vm/classfile/classFileStream.hpp @ 1091:6aa7255741f3

6906727: UseCompressedOops: some card-marking fixes related to object arrays Summary: Introduced a new write_ref_array(HeapWords* start, size_t count) method that does the requisite MemRegion range calculation so (some of the) clients of the erstwhile write_ref_array(MemRegion mr) do not need to worry. This removed all external uses of array_size(), which was also simplified and made private. Asserts were added to catch other possible issues. Further, less essential, fixes stemming from this investigation are deferred to CR 6904516 (to follow shortly in hs17). Reviewed-by: kvn, coleenp, jmasa
author ysr
date Thu, 03 Dec 2009 15:01:57 -0800
parents a61af66fc99e
children c18cbe5936b8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
a61af66fc99e Initial load
duke
parents:
diff changeset
2 * Copyright 1997-2005 Sun Microsystems, Inc. All Rights Reserved.
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 *
a61af66fc99e Initial load
duke
parents:
diff changeset
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
a61af66fc99e Initial load
duke
parents:
diff changeset
20 * CA 95054 USA or visit www.sun.com if you need additional information or
a61af66fc99e Initial load
duke
parents:
diff changeset
21 * have any questions.
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
a61af66fc99e Initial load
duke
parents:
diff changeset
25 // Input stream for reading .class file
a61af66fc99e Initial load
duke
parents:
diff changeset
26 //
a61af66fc99e Initial load
duke
parents:
diff changeset
27 // The entire input stream is present in a buffer allocated by the caller.
a61af66fc99e Initial load
duke
parents:
diff changeset
28 // The caller is responsible for deallocating the buffer and for using
a61af66fc99e Initial load
duke
parents:
diff changeset
29 // ResourceMarks appropriately when constructing streams.
a61af66fc99e Initial load
duke
parents:
diff changeset
30
a61af66fc99e Initial load
duke
parents:
diff changeset
31 class ClassFileStream: public ResourceObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
32 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
33 u1* _buffer_start; // Buffer bottom
a61af66fc99e Initial load
duke
parents:
diff changeset
34 u1* _buffer_end; // Buffer top (one past last element)
a61af66fc99e Initial load
duke
parents:
diff changeset
35 u1* _current; // Current buffer position
a61af66fc99e Initial load
duke
parents:
diff changeset
36 char* _source; // Source of stream (directory name, ZIP/JAR archive name)
a61af66fc99e Initial load
duke
parents:
diff changeset
37 bool _need_verify; // True if verification is on for the class file
a61af66fc99e Initial load
duke
parents:
diff changeset
38
a61af66fc99e Initial load
duke
parents:
diff changeset
39 void truncated_file_error(TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
40 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
41 // Constructor
a61af66fc99e Initial load
duke
parents:
diff changeset
42 ClassFileStream(u1* buffer, int length, char* source);
a61af66fc99e Initial load
duke
parents:
diff changeset
43
a61af66fc99e Initial load
duke
parents:
diff changeset
44 // Buffer access
a61af66fc99e Initial load
duke
parents:
diff changeset
45 u1* buffer() const { return _buffer_start; }
a61af66fc99e Initial load
duke
parents:
diff changeset
46 int length() const { return _buffer_end - _buffer_start; }
a61af66fc99e Initial load
duke
parents:
diff changeset
47 u1* current() const { return _current; }
a61af66fc99e Initial load
duke
parents:
diff changeset
48 void set_current(u1* pos) { _current = pos; }
a61af66fc99e Initial load
duke
parents:
diff changeset
49 char* source() const { return _source; }
a61af66fc99e Initial load
duke
parents:
diff changeset
50 void set_verify(bool flag) { _need_verify = flag; }
a61af66fc99e Initial load
duke
parents:
diff changeset
51
a61af66fc99e Initial load
duke
parents:
diff changeset
52 void check_truncated_file(bool b, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
53 if (b) {
a61af66fc99e Initial load
duke
parents:
diff changeset
54 truncated_file_error(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
55 }
a61af66fc99e Initial load
duke
parents:
diff changeset
56 }
a61af66fc99e Initial load
duke
parents:
diff changeset
57
a61af66fc99e Initial load
duke
parents:
diff changeset
58 void guarantee_more(int size, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
59 size_t remaining = (size_t)(_buffer_end - _current);
a61af66fc99e Initial load
duke
parents:
diff changeset
60 unsigned int usize = (unsigned int)size;
a61af66fc99e Initial load
duke
parents:
diff changeset
61 check_truncated_file(usize > remaining, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
62 }
a61af66fc99e Initial load
duke
parents:
diff changeset
63
a61af66fc99e Initial load
duke
parents:
diff changeset
64 // Read u1 from stream
a61af66fc99e Initial load
duke
parents:
diff changeset
65 u1 get_u1(TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
66 u1 get_u1_fast() {
a61af66fc99e Initial load
duke
parents:
diff changeset
67 return *_current++;
a61af66fc99e Initial load
duke
parents:
diff changeset
68 }
a61af66fc99e Initial load
duke
parents:
diff changeset
69
a61af66fc99e Initial load
duke
parents:
diff changeset
70 // Read u2 from stream
a61af66fc99e Initial load
duke
parents:
diff changeset
71 u2 get_u2(TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
72 u2 get_u2_fast() {
a61af66fc99e Initial load
duke
parents:
diff changeset
73 u2 res = Bytes::get_Java_u2(_current);
a61af66fc99e Initial load
duke
parents:
diff changeset
74 _current += 2;
a61af66fc99e Initial load
duke
parents:
diff changeset
75 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
76 }
a61af66fc99e Initial load
duke
parents:
diff changeset
77
a61af66fc99e Initial load
duke
parents:
diff changeset
78 // Read u4 from stream
a61af66fc99e Initial load
duke
parents:
diff changeset
79 u4 get_u4(TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
80 u4 get_u4_fast() {
a61af66fc99e Initial load
duke
parents:
diff changeset
81 u4 res = Bytes::get_Java_u4(_current);
a61af66fc99e Initial load
duke
parents:
diff changeset
82 _current += 4;
a61af66fc99e Initial load
duke
parents:
diff changeset
83 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
84 }
a61af66fc99e Initial load
duke
parents:
diff changeset
85
a61af66fc99e Initial load
duke
parents:
diff changeset
86 // Read u8 from stream
a61af66fc99e Initial load
duke
parents:
diff changeset
87 u8 get_u8(TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
88 u8 get_u8_fast() {
a61af66fc99e Initial load
duke
parents:
diff changeset
89 u8 res = Bytes::get_Java_u8(_current);
a61af66fc99e Initial load
duke
parents:
diff changeset
90 _current += 8;
a61af66fc99e Initial load
duke
parents:
diff changeset
91 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
92 }
a61af66fc99e Initial load
duke
parents:
diff changeset
93
a61af66fc99e Initial load
duke
parents:
diff changeset
94 // Get direct pointer into stream at current position.
a61af66fc99e Initial load
duke
parents:
diff changeset
95 // Returns NULL if length elements are not remaining. The caller is
a61af66fc99e Initial load
duke
parents:
diff changeset
96 // responsible for calling skip below if buffer contents is used.
a61af66fc99e Initial load
duke
parents:
diff changeset
97 u1* get_u1_buffer() {
a61af66fc99e Initial load
duke
parents:
diff changeset
98 return _current;
a61af66fc99e Initial load
duke
parents:
diff changeset
99 }
a61af66fc99e Initial load
duke
parents:
diff changeset
100
a61af66fc99e Initial load
duke
parents:
diff changeset
101 u2* get_u2_buffer() {
a61af66fc99e Initial load
duke
parents:
diff changeset
102 return (u2*) _current;
a61af66fc99e Initial load
duke
parents:
diff changeset
103 }
a61af66fc99e Initial load
duke
parents:
diff changeset
104
a61af66fc99e Initial load
duke
parents:
diff changeset
105 // Skip length u1 or u2 elements from stream
a61af66fc99e Initial load
duke
parents:
diff changeset
106 void skip_u1(int length, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
107 void skip_u1_fast(int length) {
a61af66fc99e Initial load
duke
parents:
diff changeset
108 _current += length;
a61af66fc99e Initial load
duke
parents:
diff changeset
109 }
a61af66fc99e Initial load
duke
parents:
diff changeset
110
a61af66fc99e Initial load
duke
parents:
diff changeset
111 void skip_u2(int length, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
112 void skip_u2_fast(int length) {
a61af66fc99e Initial load
duke
parents:
diff changeset
113 _current += 2 * length;
a61af66fc99e Initial load
duke
parents:
diff changeset
114 }
a61af66fc99e Initial load
duke
parents:
diff changeset
115
a61af66fc99e Initial load
duke
parents:
diff changeset
116 // Tells whether eos is reached
a61af66fc99e Initial load
duke
parents:
diff changeset
117 bool at_eos() const { return _current == _buffer_end; }
a61af66fc99e Initial load
duke
parents:
diff changeset
118 };