hotspot/src/share/vm/code/scopeDesc.hpp
author sundar
Mon, 15 Apr 2013 20:12:50 +0530
changeset 17224 e3481336d8f7
parent 13728 882756847a04
child 22246 343c5c94b73b
permissions -rw-r--r--
8012240: Array.prototype.map.call({length: -1, get 0(){throw 0}}, function(){}).length does not throw error Reviewed-by: lagergren, jlaskey
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: 7397
diff changeset
     2
 * Copyright (c) 1997, 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: 4894
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 4894
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: 4894
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
#ifndef SHARE_VM_CODE_SCOPEDESC_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    26
#define SHARE_VM_CODE_SCOPEDESC_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    27
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    28
#include "code/debugInfo.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    29
#include "code/pcDesc.hpp"
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7397
diff changeset
    30
#include "oops/method.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    31
#include "utilities/growableArray.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    32
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    33
// SimpleScopeDesc is used when all you need to extract from
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7397
diff changeset
    34
// a given pc,nmethod pair is a Method* and a bci. This is
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    35
// quite a bit faster than allocating a full ScopeDesc, but
489c9b5090e2 Initial load
duke
parents:
diff changeset
    36
// very limited in abilities.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
class SimpleScopeDesc : public StackObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
 private:
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7397
diff changeset
    40
  Method* _method;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
  int _bci;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
  SimpleScopeDesc(nmethod* code,address pc) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
    PcDesc* pc_desc = code->pc_desc_at(pc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
    assert(pc_desc != NULL, "Must be able to find matching PcDesc");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
    DebugInfoReadStream buffer(code, pc_desc->scope_decode_offset());
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
    int ignore_sender = buffer.read_int();
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7397
diff changeset
    49
    _method           = buffer.read_method();
3686
69c1b5228547 6873116: Modify reexecute implementation to use pcDesc to record the reexecute bit
cfang
parents: 3600
diff changeset
    50
    _bci              = buffer.read_bci();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7397
diff changeset
    53
  Method* method() { return _method; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
  int bci() { return _bci; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
// ScopeDescs contain the information that makes source-level debugging of
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
// nmethods possible; each scopeDesc describes a method activation
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
class ScopeDesc : public ResourceObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
  // Constructor
4894
8a76fd3d098d 6910618: C2: Error: assert(d->is_oop(),"JVM_ArrayCopy: dst not an oop")
kvn
parents: 3686
diff changeset
    63
  ScopeDesc(const nmethod* code, int decode_offset, int obj_decode_offset, bool reexecute, bool return_oop);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
  // Calls above, giving default value of "serialized_null" to the
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
  // "obj_decode_offset" argument.  (We don't use a default argument to
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
  // avoid a .hpp-.hpp dependency.)
4894
8a76fd3d098d 6910618: C2: Error: assert(d->is_oop(),"JVM_ArrayCopy: dst not an oop")
kvn
parents: 3686
diff changeset
    68
  ScopeDesc(const nmethod* code, int decode_offset, bool reexecute, bool return_oop);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
  // JVM state
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7397
diff changeset
    71
  Method* method()      const { return _method; }
3600
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 1
diff changeset
    72
  int          bci()      const { return _bci;    }
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 1
diff changeset
    73
  bool should_reexecute() const { return _reexecute; }
4894
8a76fd3d098d 6910618: C2: Error: assert(d->is_oop(),"JVM_ArrayCopy: dst not an oop")
kvn
parents: 3686
diff changeset
    74
  bool return_oop()       const { return _return_oop; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
  GrowableArray<ScopeValue*>*   locals();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
  GrowableArray<ScopeValue*>*   expressions();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
  GrowableArray<MonitorValue*>* monitors();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
  GrowableArray<ScopeValue*>*   objects();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
  // Stack walking, returns NULL if this is the outer most scope.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
  ScopeDesc* sender() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
  // Returns where the scope was decoded
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
  int decode_offset() const { return _decode_offset; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
  // Tells whether sender() returns NULL
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
  bool is_top() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
  // Tells whether sd is equal to this
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
  bool is_equal(ScopeDesc* sd) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
  // Alternative constructor
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
  ScopeDesc(const ScopeDesc* parent);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
  // JVM state
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 7397
diff changeset
    97
  Method*       _method;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
  int           _bci;
3600
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 1
diff changeset
    99
  bool          _reexecute;
4894
8a76fd3d098d 6910618: C2: Error: assert(d->is_oop(),"JVM_ArrayCopy: dst not an oop")
kvn
parents: 3686
diff changeset
   100
  bool          _return_oop;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
  // Decoding offsets
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
  int _decode_offset;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
  int _sender_decode_offset;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
  int _locals_decode_offset;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
  int _expressions_decode_offset;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
  int _monitors_decode_offset;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
  // Object pool
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
  GrowableArray<ScopeValue*>* _objects;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
  // Nmethod information
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
  const nmethod* _code;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
  // Decoding operations
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
  void decode_body();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
  GrowableArray<ScopeValue*>* decode_scope_values(int decode_offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
  GrowableArray<MonitorValue*>* decode_monitor_values(int decode_offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
  GrowableArray<ScopeValue*>* decode_object_values(int decode_offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
  DebugInfoReadStream* stream_at(int decode_offset) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
  // Verification
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
  void verify();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
  // Printing support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
  void print_on(outputStream* st) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
  void print_on(outputStream* st, PcDesc* pd) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
  void print_value_on(outputStream* st) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
};
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   136
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   137
#endif // SHARE_VM_CODE_SCOPEDESC_HPP