hotspot/src/share/vm/utilities/xmlstream.cpp
author minqi
Mon, 12 Nov 2012 14:03:53 -0800
changeset 14477 95e66ea71f71
parent 13728 882756847a04
child 24002 4e6a72032a99
permissions -rw-r--r--
6830717: replay of compilations would help with debugging Summary: When java process crashed in compiler thread, repeat the compilation process will help finding root cause. This is done with using SA dump application class data and replay data from core dump, then use debug version of jvm to recompile the problematic java method. Reviewed-by: kvn, twisti, sspitsyn Contributed-by: yumin.qi@oracle.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
     2
 * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5402
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5402
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5402
diff changeset
    21
 * questions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    25
#include "precompiled.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    26
#include "code/nmethod.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    27
#include "memory/allocation.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    28
#include "memory/allocation.inline.hpp"
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
    29
#include "oops/methodData.hpp"
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
    30
#include "oops/method.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    31
#include "oops/oop.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    32
#include "runtime/deoptimization.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    33
#include "runtime/vmThread.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    34
#include "utilities/xmlstream.hpp"
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    35
489c9b5090e2 Initial load
duke
parents:
diff changeset
    36
void xmlStream::initialize(outputStream* out) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
  _out = out;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
  _last_flush = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
  _markup_state = BODY;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
  _text_init._outer_xmlStream = this;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
  _text = &_text_init;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
  _element_depth = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
  int   init_len = 100;
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11727
diff changeset
    46
  char* init_buf = NEW_C_HEAP_ARRAY(char, init_len, mtInternal);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
  _element_close_stack_low  = init_buf;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
  _element_close_stack_high = init_buf + init_len;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
  _element_close_stack_ptr  = init_buf + init_len - 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
  _element_close_stack_ptr[0] = '\0';
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
  // Make sure each log uses the same base for time stamps.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
  if (is_open()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
    _out->time_stamp().update_to(1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
xmlStream::~xmlStream() {
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11727
diff changeset
    61
  FREE_C_HEAP_ARRAY(char, _element_close_stack_low, mtInternal);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
// Pass the given chars directly to _out.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
void xmlStream::write(const char* s, size_t len) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
  if (!is_open())  return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
  out()->write(s, len);
768
d0bebc7eefc2 6718676: putback for 6604014 is incomplete
never
parents: 1
diff changeset
    70
  update_position(s, len);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
// Pass the given chars directly to _out, except that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
// we watch for special "<&>" chars.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
// This is suitable for either attribute text or for body text.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
// We don't fool with "<![CDATA[" quotes, just single-character entities.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
// This makes it easier for dumb tools to parse the output.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
void xmlStream::write_text(const char* s, size_t len) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
  if (!is_open())  return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
  size_t written = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
  // All normally printed material goes inside XML quotes.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
  // This leaves the output free to include markup also.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
  // Scan the string looking for inadvertant "<&>" chars
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
  for (size_t i = 0; i < len; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
    char ch = s[i];
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
    // Escape special chars.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
    const char* esc = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
    switch (ch) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
      // These are important only in attrs, but we do them always:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
    case '\'': esc = "&apos;"; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
    case '"':  esc = "&quot;"; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
    case '<':  esc = "&lt;";   break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
    case '&':  esc = "&amp;";  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
      // This is a freebie.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
    case '>':  esc = "&gt;";   break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
    if (esc != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
      if (written < i) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
        out()->write(&s[written], i - written);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
        written = i;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
      out()->print_raw(esc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
      written++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
  // Print the clean remainder.  Usually, it is all of s.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
  if (written < len) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
    out()->write(&s[written], len - written);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
// Outputs XML text, with special characters quoted.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
void xmlStream::text(const char* format, ...) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
  va_list ap;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
  va_start(ap, format);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
  va_text(format, ap);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
  va_end(ap);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
#define BUFLEN 2*K   /* max size of output of individual print methods */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
void xmlStream::va_tag(bool push, const char* format, va_list ap) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
  assert_if_no_error(!inside_attrs(), "cannot print tag inside attrs");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
  char buffer[BUFLEN];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
  size_t len;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
  const char* kind = do_vsnprintf(buffer, BUFLEN, format, ap, false, len);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
  see_tag(kind, push);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
  print_raw("<");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
  write(kind, len);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
  _markup_state = (push ? HEAD : ELEM);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
/// Debugging goo to make sure element tags nest properly.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
void xmlStream::see_tag(const char* tag, bool push) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
  assert_if_no_error(!inside_attrs(), "cannot start new element inside attrs");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
  if (!push)  return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
  // tag goes up until either null or space:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
  const char* tag_end = strchr(tag, ' ');
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
  size_t tag_len = (tag_end == NULL) ? strlen(tag) : tag_end - tag;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
  assert(tag_len > 0, "tag must not be empty");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
  // push the tag onto the stack, pulling down the pointer
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
  char* old_ptr  = _element_close_stack_ptr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
  char* old_low  = _element_close_stack_low;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
  char* push_ptr = old_ptr - (tag_len+1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
  if (push_ptr < old_low) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
    int old_len = _element_close_stack_high - old_ptr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
    int new_len = old_len * 2;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
    if (new_len < 100)  new_len = 100;
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11727
diff changeset
   158
    char* new_low  = NEW_C_HEAP_ARRAY(char, new_len, mtInternal);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
    char* new_high = new_low + new_len;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
    char* new_ptr  = new_high - old_len;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
    memcpy(new_ptr, old_ptr, old_len);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
    _element_close_stack_high = new_high;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
    _element_close_stack_low  = new_low;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
    _element_close_stack_ptr  = new_ptr;
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 11727
diff changeset
   165
    FREE_C_HEAP_ARRAY(char, old_low, mtInternal);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
    push_ptr = new_ptr - (tag_len+1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
  assert(push_ptr >= _element_close_stack_low, "in range");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
  memcpy(push_ptr, tag, tag_len);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
  push_ptr[tag_len] = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
  _element_close_stack_ptr = push_ptr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
  _element_depth += 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
void xmlStream::pop_tag(const char* tag) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
  assert_if_no_error(!inside_attrs(), "cannot close element inside attrs");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
  assert(_element_depth > 0, "must be in an element to close");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
  assert(*tag != 0, "tag must not be empty");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
  char* cur_tag = _element_close_stack_ptr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
  bool  bad_tag = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
  while (*cur_tag != 0 && strcmp(cur_tag, tag) != 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
    this->print_cr("</%s> <!-- missing closing tag -->", cur_tag);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
    _element_close_stack_ptr = (cur_tag += strlen(cur_tag) + 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
    _element_depth -= 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
    bad_tag = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
  if (*cur_tag == 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
    bad_tag = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
    // Pop the stack, by skipping over the tag and its null.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
    _element_close_stack_ptr = cur_tag + strlen(cur_tag) + 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
    _element_depth -= 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
  }
11727
c5dfa2639359 7130319: C2: running with -XX:+PrintOptoAssembly crashes the VM with assert(false) failed: bad tag in log
dlong
parents: 8921
diff changeset
   195
  if (bad_tag && !VMThread::should_terminate() && !VM_Exit::vm_exited() &&
c5dfa2639359 7130319: C2: running with -XX:+PrintOptoAssembly crashes the VM with assert(false) failed: bad tag in log
dlong
parents: 8921
diff changeset
   196
      !is_error_reported())
c5dfa2639359 7130319: C2: running with -XX:+PrintOptoAssembly crashes the VM with assert(false) failed: bad tag in log
dlong
parents: 8921
diff changeset
   197
  {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
    assert(false, "bad tag in log");
11727
c5dfa2639359 7130319: C2: running with -XX:+PrintOptoAssembly crashes the VM with assert(false) failed: bad tag in log
dlong
parents: 8921
diff changeset
   199
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
// First word in formatted string is element kind, and any subsequent
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
// words must be XML attributes.  Outputs "<kind .../>".
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
void xmlStream::elem(const char* format, ...) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
  va_list ap;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
  va_start(ap, format);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
  va_elem(format, ap);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
  va_end(ap);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
void xmlStream::va_elem(const char* format, va_list ap) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
  va_begin_elem(format, ap);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
  end_elem();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
// First word in formatted string is element kind, and any subsequent
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
// words must be XML attributes.  Outputs "<kind ...", not including "/>".
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
void xmlStream::begin_elem(const char* format, ...) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
  va_list ap;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
  va_start(ap, format);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
  va_tag(false, format, ap);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
  va_end(ap);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
void xmlStream::va_begin_elem(const char* format, va_list ap) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
  va_tag(false, format, ap);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
// Outputs "/>".
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
void xmlStream::end_elem() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
  assert(_markup_state == ELEM, "misplaced end_elem");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
  print_raw("/>\n");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
  _markup_state = BODY;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
// Outputs formatted text, followed by "/>".
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
void xmlStream::end_elem(const char* format, ...) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
  va_list ap;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
  va_start(ap, format);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
  out()->vprint(format, ap);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
  va_end(ap);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
  end_elem();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
// First word in formatted string is element kind, and any subsequent
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
// words must be XML attributes.  Outputs "<kind ...>".
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
void xmlStream::head(const char* format, ...) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
  va_list ap;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
  va_start(ap, format);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
  va_head(format, ap);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
  va_end(ap);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
void xmlStream::va_head(const char* format, va_list ap) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
  va_begin_head(format, ap);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
  end_head();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
// First word in formatted string is element kind, and any subsequent
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
// words must be XML attributes.  Outputs "<kind ...", not including ">".
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
void xmlStream::begin_head(const char* format, ...) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
  va_list ap;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
  va_start(ap, format);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
  va_tag(true, format, ap);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
  va_end(ap);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
void xmlStream::va_begin_head(const char* format, va_list ap) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
  va_tag(true, format, ap);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
// Outputs ">".
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
void xmlStream::end_head() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
  assert(_markup_state == HEAD, "misplaced end_head");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
  print_raw(">\n");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
  _markup_state = BODY;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
// Outputs formatted text, followed by ">".
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
void xmlStream::end_head(const char* format, ...) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
  va_list ap;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
  va_start(ap, format);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
  out()->vprint(format, ap);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
  va_end(ap);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
  end_head();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
// Outputs "</kind>".
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
void xmlStream::tail(const char* kind) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
  pop_tag(kind);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
  print_raw("</");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
  print_raw(kind);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
  print_raw(">\n");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
// Outputs "<kind_done ... stamp='D.DD'/> </kind>".
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
void xmlStream::done(const char* format, ...) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
  va_list ap;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
  va_start(ap, format);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
  va_done(format, ap);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
  va_end(ap);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
// Outputs "<kind_done stamp='D.DD'/> </kind>".
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
// Because done_raw() doesn't need to format strings, it's simpler than
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
// done(), and can be called safely by fatal error handler.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
void xmlStream::done_raw(const char* kind) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
  print_raw("<");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
  print_raw(kind);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
  print_raw("_done stamp='");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
  out()->stamp();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
  print_raw_cr("'/>");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
  print_raw("</");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
  print_raw(kind);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
  print_raw_cr(">");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
void xmlStream::va_done(const char* format, va_list ap) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
  char buffer[200];
5402
c51fd0c1d005 6888953: some calls to function-like macros are missing semicolons
jcoomes
parents: 768
diff changeset
   342
  guarantee(strlen(format) + 10 < sizeof(buffer), "bigger format buffer");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
  const char* kind = format;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
  const char* kind_end = strchr(kind, ' ');
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
  size_t kind_len = (kind_end != NULL) ? (kind_end - kind) : strlen(kind);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
  strncpy(buffer, kind, kind_len);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
  strcpy(buffer + kind_len, "_done");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
  strcat(buffer, format + kind_len);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
  // Output the trailing event with the timestamp.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
  va_begin_elem(buffer, ap);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
  stamp();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
  end_elem();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
  // Output the tail-tag of the enclosing element.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
  buffer[kind_len] = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
  tail(buffer);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
// Output a timestamp attribute.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
void xmlStream::stamp() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
  assert_if_no_error(inside_attrs(), "stamp must be an attribute");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
  print_raw(" stamp='");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
  out()->stamp();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
  print_raw("'");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
// Output a method attribute, in the form " method='pkg/cls name sig'".
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
// This is used only when there is no ciMethod available.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
void xmlStream::method(methodHandle method) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
  assert_if_no_error(inside_attrs(), "printing attributes");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
  if (method.is_null())  return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
  print_raw(" method='");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
  method_text(method);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
  print("' bytes='%d'", method->code_size());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
  print(" count='%d'", method->invocation_count());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
  int bec = method->backedge_count();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
  if (bec != 0)  print(" backedge_count='%d'", bec);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
  print(" iicount='%d'", method->interpreter_invocation_count());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
  int throwouts = method->interpreter_throwout_count();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
  if (throwouts != 0)  print(" throwouts='%d'", throwouts);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   382
  MethodData* mdo = method->method_data();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
  if (mdo != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
    uint cnt;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
    cnt = mdo->decompile_count();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
    if (cnt != 0)  print(" decompiles='%d'", cnt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
    for (uint reason = 0; reason < mdo->trap_reason_limit(); reason++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
      cnt = mdo->trap_count(reason);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
      if (cnt != 0)  print(" %s_traps='%d'", Deoptimization::trap_reason_name(reason), cnt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   390
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
    cnt = mdo->overflow_trap_count();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
    if (cnt != 0)  print(" overflow_traps='%d'", cnt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   393
    cnt = mdo->overflow_recompile_count();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
    if (cnt != 0)  print(" overflow_recompiles='%d'", cnt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
void xmlStream::method_text(methodHandle method) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
  assert_if_no_error(inside_attrs(), "printing attributes");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
  if (method.is_null())  return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
  //method->print_short_name(text());
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   402
  method->method_holder()->name()->print_symbol_on(text());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
  print_raw(" ");  // " " is easier for tools to parse than "::"
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
  method->name()->print_symbol_on(text());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
  print_raw(" ");  // separator
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
  method->signature()->print_symbol_on(text());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
// Output a klass attribute, in the form " klass='pkg/cls'".
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
// This is used only when there is no ciKlass available.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
void xmlStream::klass(KlassHandle klass) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
  assert_if_no_error(inside_attrs(), "printing attributes");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
  if (klass.is_null())  return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
  print_raw(" klass='");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
  klass_text(klass);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
  print_raw("'");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
void xmlStream::klass_text(KlassHandle klass) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
  assert_if_no_error(inside_attrs(), "printing attributes");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   423
  if (klass.is_null())  return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   424
  //klass->print_short_name(log->out());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   425
  klass->name()->print_symbol_on(out());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   428
void xmlStream::name(const Symbol* name) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
  assert_if_no_error(inside_attrs(), "printing attributes");
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   430
  if (name == NULL)  return;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
  print_raw(" name='");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
  name_text(name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
  print_raw("'");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   436
void xmlStream::name_text(const Symbol* name) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
  assert_if_no_error(inside_attrs(), "printing attributes");
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   438
  if (name == NULL)  return;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
  //name->print_short_name(text());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
  name->print_symbol_on(text());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
void xmlStream::object(const char* attr, Handle x) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
  assert_if_no_error(inside_attrs(), "printing attributes");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   445
  if (x == NULL)  return;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
  print_raw(" ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
  print_raw(attr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
  print_raw("='");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
  object_text(x);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
  print_raw("'");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
void xmlStream::object_text(Handle x) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
  assert_if_no_error(inside_attrs(), "printing attributes");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   455
  if (x == NULL)  return;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   456
  x->print_value_on(text());
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   457
}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   458
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   459
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   460
void xmlStream::object(const char* attr, Metadata* x) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   461
  assert_if_no_error(inside_attrs(), "printing attributes");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   462
  if (x == NULL)  return;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   463
  print_raw(" ");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   464
  print_raw(attr);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   465
  print_raw("='");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   466
  object_text(x);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   467
  print_raw("'");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   468
}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   469
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   470
void xmlStream::object_text(Metadata* x) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   471
  assert_if_no_error(inside_attrs(), "printing attributes");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   472
  if (x == NULL)  return;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
  //x->print_value_on(text());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   474
  if (x->is_method())
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   475
    method_text((Method*)x);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   476
  else if (x->is_klass())
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   477
    klass_text((Klass*)x);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
  else
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13195
diff changeset
   479
    ShouldNotReachHere(); // Add impl if this is reached.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   480
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   481
489c9b5090e2 Initial load
duke
parents:
diff changeset
   482
489c9b5090e2 Initial load
duke
parents:
diff changeset
   483
void xmlStream::flush() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
  out()->flush();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   485
  _last_flush = count();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
489c9b5090e2 Initial load
duke
parents:
diff changeset
   488
void xmlTextStream::flush() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   489
  if (_outer_xmlStream == NULL)  return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
  _outer_xmlStream->flush();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   491
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   492
489c9b5090e2 Initial load
duke
parents:
diff changeset
   493
void xmlTextStream::write(const char* str, size_t len) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   494
  if (_outer_xmlStream == NULL)  return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   495
  _outer_xmlStream->write_text(str, len);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
  update_position(str, len);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
}