annotate src/share/vm/utilities/xmlstream.hpp @ 1721:413ad0331a0c

6977924: Changes for 6975078 produce build error with certain gcc versions Summary: The changes introduced for 6975078 assign badHeapOopVal to the _allocation field in the ResourceObj class. In 32 bit linux builds with certain versions of gcc this assignment will be flagged as an error while compiling allocation.cpp. In 32 bit builds the constant value badHeapOopVal (which is cast to an intptr_t) is negative. The _allocation field is typed as an unsigned intptr_t and gcc catches this as an error. Reviewed-by: jcoomes, ysr, phh
author johnc
date Wed, 18 Aug 2010 10:59:06 -0700
parents c18cbe5936b8
children f95d63e2154a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
diff changeset
2 * Copyright (c) 2002, 2005, 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
a61af66fc99e Initial load
duke
parents:
diff changeset
25 class xmlStream;
a61af66fc99e Initial load
duke
parents:
diff changeset
26 class defaultStream;
a61af66fc99e Initial load
duke
parents:
diff changeset
27
a61af66fc99e Initial load
duke
parents:
diff changeset
28 // Sub-stream for writing quoted text, as opposed to markup.
a61af66fc99e Initial load
duke
parents:
diff changeset
29 // Characters written to this stream are subject to quoting,
a61af66fc99e Initial load
duke
parents:
diff changeset
30 // as '<' => "&lt;", etc.
a61af66fc99e Initial load
duke
parents:
diff changeset
31 class xmlTextStream : public outputStream {
a61af66fc99e Initial load
duke
parents:
diff changeset
32 friend class xmlStream;
a61af66fc99e Initial load
duke
parents:
diff changeset
33 friend class defaultStream; // tty
a61af66fc99e Initial load
duke
parents:
diff changeset
34 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
35
a61af66fc99e Initial load
duke
parents:
diff changeset
36 xmlStream* _outer_xmlStream;
a61af66fc99e Initial load
duke
parents:
diff changeset
37
a61af66fc99e Initial load
duke
parents:
diff changeset
38 xmlTextStream() { _outer_xmlStream = NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
39
a61af66fc99e Initial load
duke
parents:
diff changeset
40 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
41 virtual void flush(); // _outer.flush();
a61af66fc99e Initial load
duke
parents:
diff changeset
42 virtual void write(const char* str, size_t len); // _outer->write_text()
a61af66fc99e Initial load
duke
parents:
diff changeset
43 };
a61af66fc99e Initial load
duke
parents:
diff changeset
44
a61af66fc99e Initial load
duke
parents:
diff changeset
45
a61af66fc99e Initial load
duke
parents:
diff changeset
46 // Output stream for writing XML-structured logs.
a61af66fc99e Initial load
duke
parents:
diff changeset
47 // To write markup, use special calls elem, head/tail, etc.
a61af66fc99e Initial load
duke
parents:
diff changeset
48 // Use the xmlStream::text() stream to write unmarked text.
a61af66fc99e Initial load
duke
parents:
diff changeset
49 // Text written that way will be quoted as necessary using '&lt;', etc.
a61af66fc99e Initial load
duke
parents:
diff changeset
50 // Characters written directly to an xmlStream via print_cr, etc.,
a61af66fc99e Initial load
duke
parents:
diff changeset
51 // are directly written to the encapsulated stream, xmlStream::out().
a61af66fc99e Initial load
duke
parents:
diff changeset
52 // This can be used to produce markup directly, character by character.
a61af66fc99e Initial load
duke
parents:
diff changeset
53 // (Such writes are not checked for markup syntax errors.)
a61af66fc99e Initial load
duke
parents:
diff changeset
54
a61af66fc99e Initial load
duke
parents:
diff changeset
55 class xmlStream : public outputStream {
a61af66fc99e Initial load
duke
parents:
diff changeset
56 friend class defaultStream; // tty
a61af66fc99e Initial load
duke
parents:
diff changeset
57 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
58 enum MarkupState { BODY, // after end_head() call, in text
a61af66fc99e Initial load
duke
parents:
diff changeset
59 HEAD, // after begin_head() call, in attrs
a61af66fc99e Initial load
duke
parents:
diff changeset
60 ELEM }; // after begin_elem() call, in attrs
a61af66fc99e Initial load
duke
parents:
diff changeset
61
a61af66fc99e Initial load
duke
parents:
diff changeset
62 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
63 outputStream* _out; // file stream by which it goes
a61af66fc99e Initial load
duke
parents:
diff changeset
64 julong _last_flush; // last position of flush
a61af66fc99e Initial load
duke
parents:
diff changeset
65 MarkupState _markup_state; // where in the elem/head/tail dance
a61af66fc99e Initial load
duke
parents:
diff changeset
66 outputStream* _text; // text stream
a61af66fc99e Initial load
duke
parents:
diff changeset
67 xmlTextStream _text_init;
a61af66fc99e Initial load
duke
parents:
diff changeset
68
a61af66fc99e Initial load
duke
parents:
diff changeset
69 // for subclasses
a61af66fc99e Initial load
duke
parents:
diff changeset
70 xmlStream() {}
a61af66fc99e Initial load
duke
parents:
diff changeset
71 void initialize(outputStream* out);
a61af66fc99e Initial load
duke
parents:
diff changeset
72
a61af66fc99e Initial load
duke
parents:
diff changeset
73 // protect this from public use:
a61af66fc99e Initial load
duke
parents:
diff changeset
74 outputStream* out() { return _out; }
a61af66fc99e Initial load
duke
parents:
diff changeset
75
a61af66fc99e Initial load
duke
parents:
diff changeset
76 // helpers for writing XML elements
a61af66fc99e Initial load
duke
parents:
diff changeset
77 void va_tag(bool push, const char* format, va_list ap);
a61af66fc99e Initial load
duke
parents:
diff changeset
78 virtual void see_tag(const char* tag, bool push) NOT_DEBUG({});
a61af66fc99e Initial load
duke
parents:
diff changeset
79 virtual void pop_tag(const char* tag) NOT_DEBUG({});
a61af66fc99e Initial load
duke
parents:
diff changeset
80
a61af66fc99e Initial load
duke
parents:
diff changeset
81 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
82 // in debug mode, we verify matching of opening and closing tags
a61af66fc99e Initial load
duke
parents:
diff changeset
83 int _element_depth; // number of unfinished elements
a61af66fc99e Initial load
duke
parents:
diff changeset
84 char* _element_close_stack_high; // upper limit of down-growing stack
a61af66fc99e Initial load
duke
parents:
diff changeset
85 char* _element_close_stack_low; // upper limit of down-growing stack
a61af66fc99e Initial load
duke
parents:
diff changeset
86 char* _element_close_stack_ptr; // pointer of down-growing stack
a61af66fc99e Initial load
duke
parents:
diff changeset
87 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
88
a61af66fc99e Initial load
duke
parents:
diff changeset
89 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
90 // creation
a61af66fc99e Initial load
duke
parents:
diff changeset
91 xmlStream(outputStream* out) { initialize(out); }
a61af66fc99e Initial load
duke
parents:
diff changeset
92 DEBUG_ONLY(virtual ~xmlStream();)
a61af66fc99e Initial load
duke
parents:
diff changeset
93
a61af66fc99e Initial load
duke
parents:
diff changeset
94 bool is_open() { return _out != NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
95
a61af66fc99e Initial load
duke
parents:
diff changeset
96 // text output
a61af66fc99e Initial load
duke
parents:
diff changeset
97 bool inside_attrs() { return _markup_state != BODY; }
a61af66fc99e Initial load
duke
parents:
diff changeset
98
a61af66fc99e Initial load
duke
parents:
diff changeset
99 // flushing
a61af66fc99e Initial load
duke
parents:
diff changeset
100 virtual void flush(); // flushes out, sets _last_flush = count()
a61af66fc99e Initial load
duke
parents:
diff changeset
101 virtual void write(const char* s, size_t len);
a61af66fc99e Initial load
duke
parents:
diff changeset
102 void write_text(const char* s, size_t len); // used by xmlTextStream
a61af66fc99e Initial load
duke
parents:
diff changeset
103 int unflushed_count() { return (int)(out()->count() - _last_flush); }
a61af66fc99e Initial load
duke
parents:
diff changeset
104
a61af66fc99e Initial load
duke
parents:
diff changeset
105 // writing complete XML elements
a61af66fc99e Initial load
duke
parents:
diff changeset
106 void elem(const char* format, ...);
a61af66fc99e Initial load
duke
parents:
diff changeset
107 void begin_elem(const char* format, ...);
a61af66fc99e Initial load
duke
parents:
diff changeset
108 void end_elem(const char* format, ...);
a61af66fc99e Initial load
duke
parents:
diff changeset
109 void end_elem();
a61af66fc99e Initial load
duke
parents:
diff changeset
110 void head(const char* format, ...);
a61af66fc99e Initial load
duke
parents:
diff changeset
111 void begin_head(const char* format, ...);
a61af66fc99e Initial load
duke
parents:
diff changeset
112 void end_head(const char* format, ...);
a61af66fc99e Initial load
duke
parents:
diff changeset
113 void end_head();
a61af66fc99e Initial load
duke
parents:
diff changeset
114 void done(const char* format, ...); // xxx_done event, plus tail
a61af66fc99e Initial load
duke
parents:
diff changeset
115 void done_raw(const char * kind);
a61af66fc99e Initial load
duke
parents:
diff changeset
116 void tail(const char* kind);
a61af66fc99e Initial load
duke
parents:
diff changeset
117
a61af66fc99e Initial load
duke
parents:
diff changeset
118 // va_list versions
a61af66fc99e Initial load
duke
parents:
diff changeset
119 void va_elem(const char* format, va_list ap);
a61af66fc99e Initial load
duke
parents:
diff changeset
120 void va_begin_elem(const char* format, va_list ap);
a61af66fc99e Initial load
duke
parents:
diff changeset
121 void va_head(const char* format, va_list ap);
a61af66fc99e Initial load
duke
parents:
diff changeset
122 void va_begin_head(const char* format, va_list ap);
a61af66fc99e Initial load
duke
parents:
diff changeset
123 void va_done(const char* format, va_list ap);
a61af66fc99e Initial load
duke
parents:
diff changeset
124
a61af66fc99e Initial load
duke
parents:
diff changeset
125 // write text (with quoting of special XML characters <>&'" etc.)
a61af66fc99e Initial load
duke
parents:
diff changeset
126 outputStream* text() { return _text; }
a61af66fc99e Initial load
duke
parents:
diff changeset
127 void text(const char* format, ...);
a61af66fc99e Initial load
duke
parents:
diff changeset
128 void va_text(const char* format, va_list ap) {
a61af66fc99e Initial load
duke
parents:
diff changeset
129 text()->vprint(format, ap);
a61af66fc99e Initial load
duke
parents:
diff changeset
130 }
a61af66fc99e Initial load
duke
parents:
diff changeset
131
a61af66fc99e Initial load
duke
parents:
diff changeset
132 // commonly used XML attributes
a61af66fc99e Initial load
duke
parents:
diff changeset
133 void stamp(); // stamp='1.234'
a61af66fc99e Initial load
duke
parents:
diff changeset
134 void method(methodHandle m); // method='k n s' ...
a61af66fc99e Initial load
duke
parents:
diff changeset
135 void klass(KlassHandle k); // klass='name'
a61af66fc99e Initial load
duke
parents:
diff changeset
136 void name(symbolHandle s); // name='name'
a61af66fc99e Initial load
duke
parents:
diff changeset
137 void object(const char* attr, Handle val);
a61af66fc99e Initial load
duke
parents:
diff changeset
138
a61af66fc99e Initial load
duke
parents:
diff changeset
139 // print the text alone (sans ''):
a61af66fc99e Initial load
duke
parents:
diff changeset
140 void method_text(methodHandle m);
a61af66fc99e Initial load
duke
parents:
diff changeset
141 void klass_text(KlassHandle k); // klass='name'
a61af66fc99e Initial load
duke
parents:
diff changeset
142 void name_text(symbolHandle s); // name='name'
a61af66fc99e Initial load
duke
parents:
diff changeset
143 void object_text(Handle x);
a61af66fc99e Initial load
duke
parents:
diff changeset
144
a61af66fc99e Initial load
duke
parents:
diff changeset
145 /* Example uses:
a61af66fc99e Initial load
duke
parents:
diff changeset
146
a61af66fc99e Initial load
duke
parents:
diff changeset
147 // Empty element, simple case.
a61af66fc99e Initial load
duke
parents:
diff changeset
148 elem("X Y='Z'"); <X Y='Z'/> \n
a61af66fc99e Initial load
duke
parents:
diff changeset
149
a61af66fc99e Initial load
duke
parents:
diff changeset
150 // Empty element, general case.
a61af66fc99e Initial load
duke
parents:
diff changeset
151 begin_elem("X Y='Z'"); <X Y='Z'
a61af66fc99e Initial load
duke
parents:
diff changeset
152 ...attrs... ...attrs...
a61af66fc99e Initial load
duke
parents:
diff changeset
153 end_elem(); />
a61af66fc99e Initial load
duke
parents:
diff changeset
154
a61af66fc99e Initial load
duke
parents:
diff changeset
155 // Compound element, simple case.
a61af66fc99e Initial load
duke
parents:
diff changeset
156 head("X Y='Z'"); <X Y='Z'> \n
a61af66fc99e Initial load
duke
parents:
diff changeset
157 ...body... ...body...
a61af66fc99e Initial load
duke
parents:
diff changeset
158 tail("X"); </X> \n
a61af66fc99e Initial load
duke
parents:
diff changeset
159
a61af66fc99e Initial load
duke
parents:
diff changeset
160 // Compound element, general case.
a61af66fc99e Initial load
duke
parents:
diff changeset
161 begin_head("X Y='Z'"); <X Y='Z'
a61af66fc99e Initial load
duke
parents:
diff changeset
162 ...attrs... ...attrs...
a61af66fc99e Initial load
duke
parents:
diff changeset
163 end_head(); > \n
a61af66fc99e Initial load
duke
parents:
diff changeset
164 ...body... ...body...
a61af66fc99e Initial load
duke
parents:
diff changeset
165 tail("X"); </X> \n
a61af66fc99e Initial load
duke
parents:
diff changeset
166
a61af66fc99e Initial load
duke
parents:
diff changeset
167 // Printf-style formatting:
a61af66fc99e Initial load
duke
parents:
diff changeset
168 elem("X Y='%s'", "Z"); <X Y='Z'/> \n
a61af66fc99e Initial load
duke
parents:
diff changeset
169
a61af66fc99e Initial load
duke
parents:
diff changeset
170 */
a61af66fc99e Initial load
duke
parents:
diff changeset
171
a61af66fc99e Initial load
duke
parents:
diff changeset
172 };
a61af66fc99e Initial load
duke
parents:
diff changeset
173
a61af66fc99e Initial load
duke
parents:
diff changeset
174 // Standard log file, null if no logging is happening.
a61af66fc99e Initial load
duke
parents:
diff changeset
175 extern xmlStream* xtty;
a61af66fc99e Initial load
duke
parents:
diff changeset
176
a61af66fc99e Initial load
duke
parents:
diff changeset
177 // Note: If ::xtty != NULL, ::tty == ::xtty->text().