hotspot/src/share/vm/memory/oopFactory.cpp
author ysr
Thu, 03 Dec 2009 15:01:57 -0800
changeset 4461 c17c526d36ef
parent 3694 942b7bc7f28c
child 5547 f4b087cbb361
permissions -rw-r--r--
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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
2105
347008ce7984 6814575: Update copyright year
xdono
parents: 2006
diff changeset
     2
 * Copyright 1997-2009 Sun Microsystems, Inc.  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
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    19
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    20
 * CA 95054 USA or visit www.sun.com if you need additional information or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    21
 * have any questions.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
489c9b5090e2 Initial load
duke
parents:
diff changeset
    25
# include "incls/_precompiled.incl"
489c9b5090e2 Initial load
duke
parents:
diff changeset
    26
# include "incls/_oopFactory.cpp.incl"
489c9b5090e2 Initial load
duke
parents:
diff changeset
    27
489c9b5090e2 Initial load
duke
parents:
diff changeset
    28
489c9b5090e2 Initial load
duke
parents:
diff changeset
    29
typeArrayOop oopFactory::new_charArray(const char* utf8_str, TRAPS) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    30
  int length = utf8_str == NULL ? 0 : UTF8::unicode_length(utf8_str);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    31
  typeArrayOop result = new_charArray(length, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    32
  if (length > 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    33
    UTF8::convert_to_unicode(utf8_str, result->char_at_addr(0), length);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    34
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    35
  return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    36
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
typeArrayOop oopFactory::new_permanent_charArray(int length, TRAPS) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
  return typeArrayKlass::cast(Universe::charArrayKlassObj())->allocate_permanent(length, THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
typeArrayOop oopFactory::new_permanent_byteArray(int length, TRAPS) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
  return typeArrayKlass::cast(Universe::byteArrayKlassObj())->allocate_permanent(length, THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
typeArrayOop oopFactory::new_permanent_shortArray(int length, TRAPS) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
  return typeArrayKlass::cast(Universe::shortArrayKlassObj())->allocate_permanent(length, THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
typeArrayOop oopFactory::new_permanent_intArray(int length, TRAPS) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
  return typeArrayKlass::cast(Universe::intArrayKlassObj())->allocate_permanent(length, THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
typeArrayOop oopFactory::new_typeArray(BasicType type, int length, TRAPS) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
  klassOop type_asKlassOop = Universe::typeArrayKlassObj(type);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
  typeArrayKlass* type_asArrayKlass = typeArrayKlass::cast(type_asKlassOop);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
  typeArrayOop result = type_asArrayKlass->allocate(length, THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
  return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
objArrayOop oopFactory::new_objArray(klassOop klass, int length, TRAPS) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
  assert(klass->is_klass(), "must be instance class");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
  if (klass->klass_part()->oop_is_array()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
    return ((arrayKlass*)klass->klass_part())->allocate_arrayArray(1, length, THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
    assert (klass->klass_part()->oop_is_instance(), "new object array with klass not an instanceKlass");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
    return ((instanceKlass*)klass->klass_part())->allocate_objArray(1, length, THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
objArrayOop oopFactory::new_system_objArray(int length, TRAPS) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
  int size = objArrayOopDesc::object_size(length);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
  KlassHandle klass (THREAD, Universe::systemObjArrayKlassObj());
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
  objArrayOop o = (objArrayOop)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
    Universe::heap()->permanent_array_allocate(klass, size, length, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
  // initialization not needed, allocated cleared
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
  return o;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
1894
5c343868d071 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 1
diff changeset
    85
constantPoolOop oopFactory::new_constantPool(int length,
5c343868d071 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 1
diff changeset
    86
                                             bool is_conc_safe,
5c343868d071 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 1
diff changeset
    87
                                             TRAPS) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
  constantPoolKlass* ck = constantPoolKlass::cast(Universe::constantPoolKlassObj());
1894
5c343868d071 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 1
diff changeset
    89
  return ck->allocate(length, is_conc_safe, CHECK_NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
2006
f2d2f0f20063 6792421: assert(_bitMap->isMarked(addr+size-1),inconsistent Printezis mark)
jmasa
parents: 1894
diff changeset
    93
constantPoolCacheOop oopFactory::new_constantPoolCache(int length,
f2d2f0f20063 6792421: assert(_bitMap->isMarked(addr+size-1),inconsistent Printezis mark)
jmasa
parents: 1894
diff changeset
    94
                                                       bool is_conc_safe,
f2d2f0f20063 6792421: assert(_bitMap->isMarked(addr+size-1),inconsistent Printezis mark)
jmasa
parents: 1894
diff changeset
    95
                                                       TRAPS) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
  constantPoolCacheKlass* ck = constantPoolCacheKlass::cast(Universe::constantPoolCacheKlassObj());
2006
f2d2f0f20063 6792421: assert(_bitMap->isMarked(addr+size-1),inconsistent Printezis mark)
jmasa
parents: 1894
diff changeset
    97
  return ck->allocate(length, is_conc_safe, CHECK_NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
3694
942b7bc7f28c 6845368: large objects cause a crash or unexpected exception
jcoomes
parents: 3693
diff changeset
   101
klassOop oopFactory::new_instanceKlass(int vtable_len, int itable_len,
942b7bc7f28c 6845368: large objects cause a crash or unexpected exception
jcoomes
parents: 3693
diff changeset
   102
                                       int static_field_size,
942b7bc7f28c 6845368: large objects cause a crash or unexpected exception
jcoomes
parents: 3693
diff changeset
   103
                                       unsigned int nonstatic_oop_map_count,
942b7bc7f28c 6845368: large objects cause a crash or unexpected exception
jcoomes
parents: 3693
diff changeset
   104
                                       ReferenceType rt, TRAPS) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
  instanceKlassKlass* ikk = instanceKlassKlass::cast(Universe::instanceKlassKlassObj());
3693
af387bf37e8d 6861660: OopMapBlock count/size confusion
jcoomes
parents: 2105
diff changeset
   106
  return ikk->allocate_instance_klass(vtable_len, itable_len, static_field_size, nonstatic_oop_map_count, rt, CHECK_NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
constMethodOop oopFactory::new_constMethod(int byte_code_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
                                           int compressed_line_number_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
                                           int localvariable_table_length,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
                                           int checked_exceptions_length,
1894
5c343868d071 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 1
diff changeset
   114
                                           bool is_conc_safe,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
                                           TRAPS) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
  klassOop cmkObj = Universe::constMethodKlassObj();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
  constMethodKlass* cmk = constMethodKlass::cast(cmkObj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
  return cmk->allocate(byte_code_size, compressed_line_number_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
                       localvariable_table_length, checked_exceptions_length,
1894
5c343868d071 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 1
diff changeset
   120
                       is_conc_safe,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
                       CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
methodOop oopFactory::new_method(int byte_code_size, AccessFlags access_flags,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
                                 int compressed_line_number_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
                                 int localvariable_table_length,
1894
5c343868d071 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 1
diff changeset
   128
                                 int checked_exceptions_length,
5c343868d071 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 1
diff changeset
   129
                                 bool is_conc_safe,
5c343868d071 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 1
diff changeset
   130
                                 TRAPS) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
  methodKlass* mk = methodKlass::cast(Universe::methodKlassObj());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
  assert(!access_flags.is_native() || byte_code_size == 0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
         "native methods should not contain byte codes");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
  constMethodOop cm = new_constMethod(byte_code_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
                                      compressed_line_number_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
                                      localvariable_table_length,
1894
5c343868d071 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 1
diff changeset
   137
                                      checked_exceptions_length,
5c343868d071 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 1
diff changeset
   138
                                      is_conc_safe, CHECK_NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
  constMethodHandle rw(THREAD, cm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
  return mk->allocate(rw, access_flags, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
methodDataOop oopFactory::new_methodData(methodHandle method, TRAPS) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
  methodDataKlass* mdk = methodDataKlass::cast(Universe::methodDataKlassObj());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
  return mdk->allocate(method, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
compiledICHolderOop oopFactory::new_compiledICHolder(methodHandle method, KlassHandle klass, TRAPS) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
  compiledICHolderKlass* ck = (compiledICHolderKlass*) Universe::compiledICHolderKlassObj()->klass_part();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
  compiledICHolderOop c = ck->allocate(CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
  c->set_holder_method(method());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
  c->set_holder_klass(klass());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
  return c;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
}