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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  */
23 package jdk.vm.ci.code;
24 
25 /**
26  * Represents a compiled instance of a method. It may have been invalidated or removed in the
27  * meantime.
28  */
29 public class InstalledCode {
30 
31     /**
32      * Raw address address of entity representing this installed code.
33      */
34     protected long address;
35 
36     /**
37      * Raw address of entryPoint of this installed code.
38      */
39     protected long entryPoint;
40 
41     /**
42      * Counts how often the address field was reassigned.
43      */
44     protected long version;
45 
46     protected final String name;
47 
InstalledCode(String name)48     public InstalledCode(String name) {
49         this.name = name;
50     }
51 
52     /**
53      * @return the address of entity representing this installed code.
54      */
getAddress()55     public final long getAddress() {
56         return address;
57     }
58 
59     /**
60      * @return the address of the normal entry point of the installed code.
61      */
getEntryPoint()62     public final long getEntryPoint() {
63         return entryPoint;
64     }
65 
66     /**
67      * @return the version number of this installed code
68      */
getVersion()69     public final long getVersion() {
70         return version;
71     }
72 
73     /**
74      * Returns the name of this installed code.
75      */
getName()76     public String getName() {
77         return name;
78     }
79 
80     /**
81      * Returns the start address of this installed code if it is {@linkplain #isValid() valid}, 0
82      * otherwise.
83      */
getStart()84     public long getStart() {
85         return 0;
86     }
87 
88     /**
89      * @return true if the code represented by this object is still valid for invocation, false
90      *         otherwise (may happen due to deopt, etc.)
91      */
isValid()92     public boolean isValid() {
93         return entryPoint != 0;
94     }
95 
96     /**
97      * @return true if the code represented by this object still exists and might have live
98      *         activations, false otherwise (may happen due to deopt, etc.)
99      */
isAlive()100     public boolean isAlive() {
101         return address != 0;
102     }
103 
104     /**
105      * Returns a copy of this installed code if it is {@linkplain #isValid() valid}, null otherwise.
106      */
getCode()107     public byte[] getCode() {
108         return null;
109     }
110 
111     /**
112      * Invalidates this installed code such that any subsequent
113      * {@linkplain #executeVarargs(Object...) invocation} will throw an
114      * {@link InvalidInstalledCodeException} and all existing invocations will be deoptimized.
115      */
invalidate()116     public void invalidate() {
117         throw new UnsupportedOperationException();
118     }
119 
120     /**
121      * Executes the installed code with a variable number of arguments.
122      *
123      * @param args the array of object arguments
124      * @return the value returned by the executed code
125      */
126     @SuppressWarnings("unused")
executeVarargs(Object... args)127     public Object executeVarargs(Object... args) throws InvalidInstalledCodeException {
128         throw new UnsupportedOperationException();
129     }
130 }
131