ProcAddress.java revision 9883:903a2e023ffb
1132451Sroberto/*
2132451Sroberto * Copyright (c) 2002, 2008, Oracle and/or its affiliates. All rights reserved.
3200576Sroberto * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4132451Sroberto *
5200576Sroberto * This code is free software; you can redistribute it and/or modify it
6200576Sroberto * under the terms of the GNU General Public License version 2 only, as
7200576Sroberto * published by the Free Software Foundation.
8200576Sroberto *
9200576Sroberto * This code is distributed in the hope that it will be useful, but WITHOUT
10200576Sroberto * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11132451Sroberto * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12132451Sroberto * version 2 for more details (a copy is included in the LICENSE file that
13200576Sroberto * accompanied this code).
14200576Sroberto *
15200576Sroberto * You should have received a copy of the GNU General Public License version
16132451Sroberto * 2 along with this work; if not, write to the Free Software Foundation,
17200576Sroberto * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18200576Sroberto *
19200576Sroberto * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20132451Sroberto * or visit www.oracle.com if you need additional information or have any
21132451Sroberto * questions.
22200576Sroberto *
23132451Sroberto */
24132451Sroberto
25200576Srobertopackage sun.jvm.hotspot.debugger.proc;
26200576Sroberto
27200576Srobertoimport sun.jvm.hotspot.debugger.*;
28200576Sroberto
29200576Srobertoclass ProcAddress implements Address {
30200576Sroberto  protected ProcDebugger debugger;
31200576Sroberto  protected long addr;
32200576Sroberto
33132451Sroberto  ProcAddress(ProcDebugger debugger, long addr) {
34132451Sroberto    this.debugger = debugger;
35200576Sroberto    this.addr = addr;
36200576Sroberto  }
37200576Sroberto
38200576Sroberto  //
39200576Sroberto  // Basic Java routines
40200576Sroberto  //
41200576Sroberto
42200576Sroberto  public boolean equals(Object arg) {
43200576Sroberto    if (arg == null) {
44200576Sroberto      return false;
45200576Sroberto    }
46200576Sroberto
47200576Sroberto    if (!(arg instanceof ProcAddress)) {
48200576Sroberto      return false;
49200576Sroberto    }
50200576Sroberto
51200576Sroberto    return (addr == ((ProcAddress) arg).addr);
52132451Sroberto  }
53200576Sroberto
54200576Sroberto  public int hashCode() {
55200576Sroberto    // FIXME: suggestions on a better hash code?
56200576Sroberto    return (int) addr;
57200576Sroberto  }
58200576Sroberto
59200576Sroberto  public String toString() {
60200576Sroberto    return debugger.addressValueToString(addr);
61200576Sroberto  }
62200576Sroberto
63200576Sroberto  //
64200576Sroberto  // C/C++-related routines
65200576Sroberto  //
66200576Sroberto
67200576Sroberto  public long getCIntegerAt(long offset, long numBytes, boolean isUnsigned) throws UnalignedAddressException, UnmappedAddressException {
68200576Sroberto    return debugger.readCInteger(addr + offset, numBytes, isUnsigned);
69200576Sroberto  }
70200576Sroberto
71200576Sroberto  public Address getAddressAt(long offset) throws UnalignedAddressException, UnmappedAddressException {
72132451Sroberto    return debugger.readAddress(addr + offset);
73132451Sroberto  }
74200576Sroberto
75200576Sroberto  public Address getCompOopAddressAt(long offset) throws UnalignedAddressException, UnmappedAddressException {
76200576Sroberto    return debugger.readCompOopAddress(addr + offset);
77200576Sroberto  }
78200576Sroberto
79200576Sroberto  public Address getCompKlassAddressAt(long offset) throws UnalignedAddressException, UnmappedAddressException {
80200576Sroberto    return debugger.readCompKlassAddress(addr + offset);
81200576Sroberto  }
82132451Sroberto
83200576Sroberto  //
84200576Sroberto  // Java-related routines
85200576Sroberto  //
86200576Sroberto
87200576Sroberto  public boolean getJBooleanAt(long offset) throws UnalignedAddressException, UnmappedAddressException {
88200576Sroberto    return debugger.readJBoolean(addr + offset);
89200576Sroberto  }
90200576Sroberto
91200576Sroberto  public byte getJByteAt(long offset) throws UnalignedAddressException, UnmappedAddressException {
92200576Sroberto    return debugger.readJByte(addr + offset);
93200576Sroberto  }
94200576Sroberto
95200576Sroberto  public char getJCharAt(long offset) throws UnalignedAddressException, UnmappedAddressException {
96200576Sroberto    return debugger.readJChar(addr + offset);
97200576Sroberto  }
98200576Sroberto
99200576Sroberto  public double getJDoubleAt(long offset) throws UnalignedAddressException, UnmappedAddressException {
100200576Sroberto    return debugger.readJDouble(addr + offset);
101200576Sroberto  }
102200576Sroberto
103200576Sroberto  public float getJFloatAt(long offset) throws UnalignedAddressException, UnmappedAddressException {
104200576Sroberto    return debugger.readJFloat(addr + offset);
105200576Sroberto  }
106200576Sroberto
107200576Sroberto  public int getJIntAt(long offset) throws UnalignedAddressException, UnmappedAddressException {
108200576Sroberto    return debugger.readJInt(addr + offset);
109200576Sroberto  }
110200576Sroberto
111200576Sroberto  public long getJLongAt(long offset) throws UnalignedAddressException, UnmappedAddressException {
112200576Sroberto    return debugger.readJLong(addr + offset);
113200576Sroberto  }
114200576Sroberto
115200576Sroberto  public short getJShortAt(long offset) throws UnalignedAddressException, UnmappedAddressException {
116200576Sroberto    return debugger.readJShort(addr + offset);
117200576Sroberto  }
118200576Sroberto
119200576Sroberto  public OopHandle getOopHandleAt(long offset)
120200576Sroberto    throws UnalignedAddressException, UnmappedAddressException, NotInHeapException {
121200576Sroberto    return debugger.readOopHandle(addr + offset);
122200576Sroberto  }
123132451Sroberto  public OopHandle getCompOopHandleAt(long offset)
124132451Sroberto    throws UnalignedAddressException, UnmappedAddressException, NotInHeapException {
125132451Sroberto    return debugger.readCompOopHandle(addr + offset);
126132451Sroberto  }
127132451Sroberto
128200576Sroberto  // Mutators -- not implemented for now (FIXME)
129200576Sroberto  public void setCIntegerAt(long offset, long numBytes, long value) {
130200576Sroberto    throw new DebuggerException("Unimplemented");
131200576Sroberto  }
132200576Sroberto  public void setAddressAt(long offset, Address value) {
133200576Sroberto    throw new DebuggerException("Unimplemented");
134200576Sroberto  }
135200576Sroberto  public void       setJBooleanAt      (long offset, boolean value)
136200576Sroberto    throws UnmappedAddressException, UnalignedAddressException {
137200576Sroberto    throw new DebuggerException("Unimplemented");
138200576Sroberto  }
139200576Sroberto  public void       setJByteAt         (long offset, byte value)
140200576Sroberto    throws UnmappedAddressException, UnalignedAddressException {
141200576Sroberto    throw new DebuggerException("Unimplemented");
142200576Sroberto  }
143200576Sroberto  public void       setJCharAt         (long offset, char value)
144200576Sroberto    throws UnmappedAddressException, UnalignedAddressException {
145200576Sroberto    throw new DebuggerException("Unimplemented");
146200576Sroberto  }
147200576Sroberto  public void       setJDoubleAt       (long offset, double value)
148200576Sroberto    throws UnmappedAddressException, UnalignedAddressException {
149200576Sroberto    throw new DebuggerException("Unimplemented");
150200576Sroberto  }
151200576Sroberto  public void       setJFloatAt        (long offset, float value)
152200576Sroberto    throws UnmappedAddressException, UnalignedAddressException {
153200576Sroberto    throw new DebuggerException("Unimplemented");
154200576Sroberto  }
155200576Sroberto  public void       setJIntAt          (long offset, int value)
156200576Sroberto    throws UnmappedAddressException, UnalignedAddressException {
157200576Sroberto    throw new DebuggerException("Unimplemented");
158200576Sroberto  }
159200576Sroberto  public void       setJLongAt         (long offset, long value)
160200576Sroberto    throws UnmappedAddressException, UnalignedAddressException {
161200576Sroberto    throw new DebuggerException("Unimplemented");
162200576Sroberto  }
163200576Sroberto  public void       setJShortAt        (long offset, short value)
164200576Sroberto    throws UnmappedAddressException, UnalignedAddressException {
165200576Sroberto    throw new DebuggerException("Unimplemented");
166200576Sroberto  }
167200576Sroberto  public void       setOopHandleAt     (long offset, OopHandle value)
168200576Sroberto    throws UnmappedAddressException, UnalignedAddressException {
169200576Sroberto    throw new DebuggerException("Unimplemented");
170200576Sroberto  }
171200576Sroberto
172200576Sroberto  //
173200576Sroberto  // Arithmetic operations -- necessary evil.
174200576Sroberto  //
175200576Sroberto
176200576Sroberto  public Address    addOffsetTo       (long offset) throws UnsupportedOperationException {
177200576Sroberto    long value = addr + offset;
178200576Sroberto    if (value == 0) {
179200576Sroberto      return null;
180200576Sroberto    }
181200576Sroberto    return new ProcAddress(debugger, value);
182200576Sroberto  }
183200576Sroberto
184200576Sroberto  public OopHandle  addOffsetToAsOopHandle(long offset) throws UnsupportedOperationException {
185200576Sroberto    long value = addr + offset;
186132451Sroberto    if (value == 0) {
187200576Sroberto      return null;
188200576Sroberto    }
189200576Sroberto    return new ProcOopHandle(debugger, value);
190200576Sroberto  }
191200576Sroberto
192200576Sroberto  /** (FIXME: any signed/unsigned issues? Should this work for
193200576Sroberto      OopHandles?) */
194200576Sroberto  public long       minus(Address arg) {
195200576Sroberto    if (arg == null) {
196200576Sroberto      return addr;
197200576Sroberto    }
198200576Sroberto    return addr - ((ProcAddress) arg).addr;
199200576Sroberto  }
200200576Sroberto
201200576Sroberto  // Two's complement representation.
202200576Sroberto  // All negative numbers are larger than positive numbers.
203200576Sroberto  // Numbers with the same sign can be compared normally.
204200576Sroberto  // Test harness is below in main().
205200576Sroberto
206200576Sroberto  public boolean    lessThan          (Address arg) {
207200576Sroberto    if (arg == null) {
208200576Sroberto      return false;
209200576Sroberto    }
210200576Sroberto    ProcAddress dbxArg = (ProcAddress) arg;
211200576Sroberto    if ((addr >= 0) && (dbxArg.addr < 0)) {
212200576Sroberto      return true;
213200576Sroberto    }
214200576Sroberto    if ((addr < 0) && (dbxArg.addr >= 0)) {
215200576Sroberto      return false;
216200576Sroberto    }
217200576Sroberto    return (addr < dbxArg.addr);
218200576Sroberto  }
219200576Sroberto
220200576Sroberto  public boolean    lessThanOrEqual   (Address arg) {
221200576Sroberto    if (arg == null) {
222200576Sroberto      return false;
223200576Sroberto    }
224200576Sroberto    ProcAddress dbxArg = (ProcAddress) arg;
225200576Sroberto    if ((addr >= 0) && (dbxArg.addr < 0)) {
226200576Sroberto      return true;
227200576Sroberto    }
228200576Sroberto    if ((addr < 0) && (dbxArg.addr >= 0)) {
229200576Sroberto      return false;
230132451Sroberto    }
231200576Sroberto    return (addr <= dbxArg.addr);
232200576Sroberto  }
233200576Sroberto
234200576Sroberto  public boolean    greaterThan       (Address arg) {
235132451Sroberto    if (arg == null) {
236200576Sroberto      return true;
237200576Sroberto    }
238200576Sroberto    ProcAddress dbxArg = (ProcAddress) arg;
239200576Sroberto    if ((addr >= 0) && (dbxArg.addr < 0)) {
240200576Sroberto      return false;
241200576Sroberto    }
242200576Sroberto    if ((addr < 0) && (dbxArg.addr >= 0)) {
243200576Sroberto      return true;
244200576Sroberto    }
245132451Sroberto    return (addr > dbxArg.addr);
246200576Sroberto  }
247200576Sroberto
248200576Sroberto  public boolean    greaterThanOrEqual(Address arg) {
249200576Sroberto    if (arg == null) {
250200576Sroberto      return true;
251200576Sroberto    }
252200576Sroberto    ProcAddress dbxArg = (ProcAddress) arg;
253200576Sroberto    if ((addr >= 0) && (dbxArg.addr < 0)) {
254200576Sroberto      return false;
255200576Sroberto    }
256200576Sroberto    if ((addr < 0) && (dbxArg.addr >= 0)) {
257200576Sroberto      return true;
258200576Sroberto    }
259200576Sroberto    return (addr >= dbxArg.addr);
260200576Sroberto  }
261200576Sroberto
262200576Sroberto  public Address    andWithMask(long mask) throws UnsupportedOperationException {
263200576Sroberto    long value = addr & mask;
264200576Sroberto    if (value == 0) {
265200576Sroberto      return null;
266200576Sroberto    }
267200576Sroberto    return new ProcAddress(debugger, value);
268200576Sroberto  }
269200576Sroberto
270200576Sroberto  public Address    orWithMask(long mask) throws UnsupportedOperationException {
271200576Sroberto    long value = addr | mask;
272200576Sroberto    if (value == 0) {
273200576Sroberto      return null;
274200576Sroberto    }
275200576Sroberto    return new ProcAddress(debugger, value);
276200576Sroberto  }
277200576Sroberto
278200576Sroberto  public Address    xorWithMask(long mask) throws UnsupportedOperationException {
279200576Sroberto    long value = addr ^ mask;
280200576Sroberto    if (value == 0) {
281200576Sroberto      return null;
282200576Sroberto    }
283200576Sroberto    return new ProcAddress(debugger, value);
284200576Sroberto  }
285200576Sroberto
286200576Sroberto  public long asLongValue() { return addr; }
287200576Sroberto  //--------------------------------------------------------------------------------
288200576Sroberto  // Internals only below this point
289200576Sroberto  //
290200576Sroberto
291200576Sroberto  long getValue() {
292200576Sroberto    return addr;
293200576Sroberto  }
294200576Sroberto
295200576Sroberto
296200576Sroberto  private static void check(boolean arg, String failMessage) {
297200576Sroberto    if (!arg) {
298200576Sroberto      System.err.println(failMessage + ": FAILED");
299200576Sroberto      System.exit(1);
300200576Sroberto    }
301200576Sroberto  }
302200576Sroberto
303200576Sroberto  // Test harness
304200576Sroberto  public static void main(String[] args) {
305200576Sroberto    // p/n indicates whether the interior address is really positive
306200576Sroberto    // or negative. In unsigned terms, p1 < p2 < n1 < n2.
307200576Sroberto
308200576Sroberto    ProcAddress p1 = new ProcAddress(null, 0x7FFFFFFFFFFFFFF0L);
309200576Sroberto    ProcAddress p2 = (ProcAddress) p1.addOffsetTo(10);
310200576Sroberto    ProcAddress n1 = (ProcAddress) p2.addOffsetTo(10);
311200576Sroberto    ProcAddress n2 = (ProcAddress) n1.addOffsetTo(10);
312200576Sroberto
313200576Sroberto    // lessThan positive tests
314200576Sroberto    check(p1.lessThan(p2), "lessThan 1");
315200576Sroberto    check(p1.lessThan(n1), "lessThan 2");
316200576Sroberto    check(p1.lessThan(n2), "lessThan 3");
317200576Sroberto    check(p2.lessThan(n1), "lessThan 4");
318200576Sroberto    check(p2.lessThan(n2), "lessThan 5");
319200576Sroberto    check(n1.lessThan(n2), "lessThan 6");
320200576Sroberto
321200576Sroberto    // lessThan negative tests
322200576Sroberto    check(!p1.lessThan(p1), "lessThan 7");
323200576Sroberto    check(!p2.lessThan(p2), "lessThan 8");
324200576Sroberto    check(!n1.lessThan(n1), "lessThan 9");
325200576Sroberto    check(!n2.lessThan(n2), "lessThan 10");
326200576Sroberto
327200576Sroberto    check(!p2.lessThan(p1), "lessThan 11");
328200576Sroberto    check(!n1.lessThan(p1), "lessThan 12");
329200576Sroberto    check(!n2.lessThan(p1), "lessThan 13");
330200576Sroberto    check(!n1.lessThan(p2), "lessThan 14");
331200576Sroberto    check(!n2.lessThan(p2), "lessThan 15");
332200576Sroberto    check(!n2.lessThan(n1), "lessThan 16");
333200576Sroberto
334200576Sroberto    // lessThanOrEqual positive tests
335200576Sroberto    check(p1.lessThanOrEqual(p1), "lessThanOrEqual 1");
336200576Sroberto    check(p2.lessThanOrEqual(p2), "lessThanOrEqual 2");
337200576Sroberto    check(n1.lessThanOrEqual(n1), "lessThanOrEqual 3");
338200576Sroberto    check(n2.lessThanOrEqual(n2), "lessThanOrEqual 4");
339200576Sroberto
340200576Sroberto    check(p1.lessThanOrEqual(p2), "lessThanOrEqual 5");
341200576Sroberto    check(p1.lessThanOrEqual(n1), "lessThanOrEqual 6");
342200576Sroberto    check(p1.lessThanOrEqual(n2), "lessThanOrEqual 7");
343200576Sroberto    check(p2.lessThanOrEqual(n1), "lessThanOrEqual 8");
344200576Sroberto    check(p2.lessThanOrEqual(n2), "lessThanOrEqual 9");
345200576Sroberto    check(n1.lessThanOrEqual(n2), "lessThanOrEqual 10");
346200576Sroberto
347200576Sroberto    // lessThanOrEqual negative tests
348200576Sroberto    check(!p2.lessThanOrEqual(p1), "lessThanOrEqual 11");
349200576Sroberto    check(!n1.lessThanOrEqual(p1), "lessThanOrEqual 12");
350200576Sroberto    check(!n2.lessThanOrEqual(p1), "lessThanOrEqual 13");
351200576Sroberto    check(!n1.lessThanOrEqual(p2), "lessThanOrEqual 14");
352200576Sroberto    check(!n2.lessThanOrEqual(p2), "lessThanOrEqual 15");
353200576Sroberto    check(!n2.lessThanOrEqual(n1), "lessThanOrEqual 16");
354200576Sroberto
355200576Sroberto    // greaterThan positive tests
356200576Sroberto    check(n2.greaterThan(p1), "greaterThan 1");
357200576Sroberto    check(n2.greaterThan(p2), "greaterThan 2");
358200576Sroberto    check(n2.greaterThan(n1), "greaterThan 3");
359200576Sroberto    check(n1.greaterThan(p1), "greaterThan 4");
360200576Sroberto    check(n1.greaterThan(p2), "greaterThan 5");
361200576Sroberto    check(p2.greaterThan(p1), "greaterThan 6");
362200576Sroberto
363200576Sroberto    // greaterThan negative tests
364200576Sroberto    check(!p1.greaterThan(p1), "greaterThan 7");
365200576Sroberto    check(!p2.greaterThan(p2), "greaterThan 8");
366200576Sroberto    check(!n1.greaterThan(n1), "greaterThan 9");
367200576Sroberto    check(!n2.greaterThan(n2), "greaterThan 10");
368200576Sroberto
369200576Sroberto    check(!p1.greaterThan(n2), "greaterThan 11");
370200576Sroberto    check(!p2.greaterThan(n2), "greaterThan 12");
371200576Sroberto    check(!n1.greaterThan(n2), "greaterThan 13");
372200576Sroberto    check(!p1.greaterThan(n1), "greaterThan 14");
373200576Sroberto    check(!p2.greaterThan(n1), "greaterThan 15");
374200576Sroberto    check(!p1.greaterThan(p2), "greaterThan 16");
375200576Sroberto
376200576Sroberto    // greaterThanOrEqual positive tests
377132451Sroberto    check(p1.greaterThanOrEqual(p1), "greaterThanOrEqual 1");
378132451Sroberto    check(p2.greaterThanOrEqual(p2), "greaterThanOrEqual 2");
379132451Sroberto    check(n1.greaterThanOrEqual(n1), "greaterThanOrEqual 3");
380132451Sroberto    check(n2.greaterThanOrEqual(n2), "greaterThanOrEqual 4");
381132451Sroberto
382200576Sroberto    check(n2.greaterThanOrEqual(p1), "greaterThanOrEqual 5");
383132451Sroberto    check(n2.greaterThanOrEqual(p2), "greaterThanOrEqual 6");
384132451Sroberto    check(n2.greaterThanOrEqual(n1), "greaterThanOrEqual 7");
385132451Sroberto    check(n1.greaterThanOrEqual(p1), "greaterThanOrEqual 8");
386132451Sroberto    check(n1.greaterThanOrEqual(p2), "greaterThanOrEqual 9");
387132451Sroberto    check(p2.greaterThanOrEqual(p1), "greaterThanOrEqual 10");
388200576Sroberto
389200576Sroberto    // greaterThanOrEqual negative tests
390200576Sroberto    check(!p1.greaterThanOrEqual(n2), "greaterThanOrEqual 11");
391200576Sroberto    check(!p2.greaterThanOrEqual(n2), "greaterThanOrEqual 12");
392200576Sroberto    check(!n1.greaterThanOrEqual(n2), "greaterThanOrEqual 13");
393132451Sroberto    check(!p1.greaterThanOrEqual(n1), "greaterThanOrEqual 14");
394200576Sroberto    check(!p2.greaterThanOrEqual(n1), "greaterThanOrEqual 15");
395132451Sroberto    check(!p1.greaterThanOrEqual(p2), "greaterThanOrEqual 16");
396132451Sroberto
397200576Sroberto    System.err.println("ProcAddress: all tests passed successfully.");
398200576Sroberto  }
399200576Sroberto}
400200576Sroberto