1 /*
   2  * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
  20  * CA 95054 USA or visit www.sun.com if you need additional information or
  21  * have any questions.
  22  *
  23  */
  24 
  25 package sun.jvm.hotspot.ci;
  26 
  27 import java.io.*;
  28 import java.util.*;
  29 import sun.jvm.hotspot.debugger.*;
  30 import sun.jvm.hotspot.code.*;
  31 import sun.jvm.hotspot.runtime.*;
  32 import sun.jvm.hotspot.oops.*;
  33 import sun.jvm.hotspot.types.*;
  34 
  35 public class ciMethod extends ciObject {
  36   static {
  37     VM.registerVMInitializedObserver(new Observer() {
  38         public void update(Observable o, Object data) {
  39           initialize(VM.getVM().getTypeDataBase());
  40         }
  41       });
  42   }
  43 
  44   private static synchronized void initialize(TypeDataBase db) throws WrongTypeException {
  45     Type type      = db.lookupType("ciMethod");
  46     interpreterThrowoutCountField = new CIntField(type.getCIntegerField("_interpreter_throwout_count"), 0);
  47     interpreterInvocationCountField = new CIntField(type.getCIntegerField("_interpreter_invocation_count"), 0);
  48     try {
  49         // XXX
  50         instructionsSizeField = new CIntField(type.getCIntegerField("_instructions_size"), 0);
  51     } catch (Exception e) {
  52     }
  53   }
  54 
  55   private static CIntField interpreterThrowoutCountField;
  56   private static CIntField interpreterInvocationCountField;
  57   private static CIntField instructionsSizeField;
  58 
  59   public ciMethod(Address addr) {
  60     super(addr);
  61   }
  62 
  63   public Method method() {
  64     return (Method)getOop();
  65   }
  66 
  67   public int interpreterThrowoutCount() {
  68     return (int) interpreterThrowoutCountField.getValue(getAddress());
  69   }
  70 
  71   public int interpreterInvocationCount() {
  72     return (int) interpreterInvocationCountField.getValue(getAddress());
  73   }
  74 
  75   public int instructionsSize() {
  76     if (instructionsSizeField == null) {
  77       // XXX
  78       Method method = (Method)getOop();
  79       NMethod nm = method.getNativeMethod();
  80       if (nm != null) return (int)nm.codeEnd().minus(nm.getVerifiedEntryPoint());
  81       return 0;
  82     }
  83     return (int) instructionsSizeField.getValue(getAddress());
  84   }
  85 
  86   public void printShortName(PrintStream st) {
  87     Method method = (Method)getOop();
  88     st.printf(" %s::%s", method.getMethodHolder().getName().asString().replace('/', '.'),
  89               method.getName().asString());
  90   }
  91 }