01: //
02: // Copyright (C) 2005 United States Government as represented by the
03: // Administrator of the National Aeronautics and Space Administration
04: // (NASA). All Rights Reserved.
05: //
06: // This software is distributed under the NASA Open Source Agreement
07: // (NOSA), version 1.3. The NOSA has been approved by the Open Source
08: // Initiative. See the file NOSA-1.3-JPF at the top of the distribution
09: // directory tree for the complete NOSA document.
10: //
11: // THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY OF ANY
12: // KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT
13: // LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM TO
14: // SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR
15: // A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT
16: // THE SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT
17: // DOCUMENTATION, IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE.
18: //
19: package gov.nasa.jpf.jvm.bytecode;
20:
21: import gov.nasa.jpf.jvm.ElementInfo;
22: import gov.nasa.jpf.jvm.KernelState;
23: import gov.nasa.jpf.jvm.SystemState;
24: import gov.nasa.jpf.jvm.ThreadInfo;
25:
26: import org.apache.bcel.classfile.ConstantPool;
27:
28: /**
29: * Create new multidimensional array
30: * ..., count1, [count2, ...] => ..., arrayref
31: */
32: public class MULTIANEWARRAY extends Instruction {
33: private String type;
34: private int dimensions;
35:
36: public void setPeer(org.apache.bcel.generic.Instruction i,
37: ConstantPool cp) {
38: type = cp
39: .constantToString(cp
40: .getConstant(((org.apache.bcel.generic.MULTIANEWARRAY) i)
41: .getIndex()));
42: dimensions = ((org.apache.bcel.generic.MULTIANEWARRAY) i)
43: .getDimensions();
44: }
45:
46: public int allocateArray(String type, int[] dim, ThreadInfo th,
47: int d) {
48: int l = dim[d++];
49: int arrayRef = th.list.ks.da.newArray(type.substring(d), l, th);
50: ElementInfo e = th.list.ks.da.get(arrayRef);
51:
52: if (dim.length > d) {
53: for (int i = 0; i < l; i++) {
54: e.setElement(i, allocateArray(type, dim, th, d));
55: }
56: } else {
57: for (int i = 0; i < l; i++) {
58: e.setElement(i, -1);
59: }
60: }
61:
62: return arrayRef;
63: }
64:
65: public Instruction execute(SystemState ss, KernelState ks,
66: ThreadInfo th) {
67: int[] dim = new int[dimensions];
68:
69: for (int i = dimensions - 1; i >= 0; i--) {
70: dim[i] = th.pop();
71: }
72:
73: int arrayRef = allocateArray(type, dim, th, 0);
74:
75: // put the result (the array reference) on the stack
76: th.push(arrayRef, true);
77:
78: return getNext(th);
79: }
80:
81: public int getByteCode() {
82: return 0xC5;
83: }
84: }
|