001package serp.bytecode;
002
003import java.io.DataInput;
004import java.io.DataOutput;
005import java.io.IOException;
006import java.util.Arrays;
007
008import serp.bytecode.lowlevel.Entry;
009import serp.bytecode.lowlevel.MethodHandleEntry;
010
011// {   u2 bootstrap_method_ref;
012//     u2 num_bootstrap_arguments;
013//     u2 bootstrap_arguments[num_bootstrap_arguments];
014//  bootstrap_methods[num_bootstrap_methods];
015public class BootstrapMethodElement {
016    private BootstrapMethods _bootstrapMethodAttribute;
017    
018    private int _bootstrap_method_ref = 0;
019    private int[] _bootstrap_arguments = new int[0];
020    
021    public BootstrapMethodElement() {
022        
023    }
024
025    public BootstrapMethodElement(BootstrapMethods bootstrapmethodAttr, int bootstrap_method_ref, 
026            int num_bootstrap_arguments, int[] bootstrap_arguments) {
027        super();
028        _bootstrapMethodAttribute = bootstrapmethodAttr;
029        _bootstrap_method_ref = bootstrap_method_ref;
030       
031        _bootstrap_arguments = new int[num_bootstrap_arguments];
032        
033        for (int i = 0; i < num_bootstrap_arguments; i++) {
034            _bootstrap_arguments[i] = bootstrap_arguments[i];
035        }
036    }
037    
038    public BootstrapMethodElement(BootstrapMethods bootstrapmethodAttr, DataInput in) throws IOException {
039        _bootstrapMethodAttribute = bootstrapmethodAttr;
040        
041        _bootstrap_method_ref = in.readShort();
042        
043        int num_bootstrap_arguments = in.readShort();
044        _bootstrap_arguments = new int[num_bootstrap_arguments];
045        
046        for (int i = 0; i < num_bootstrap_arguments; i++) {
047            _bootstrap_arguments[i] = in.readShort();
048        }
049    }
050
051    public BootstrapMethods getBootstrapMethodAttribute() {
052        return _bootstrapMethodAttribute;
053    }
054
055    public void setBootstrapMethodAttribute(BootstrapMethods bootstrapMethodAttribute) {
056        _bootstrapMethodAttribute = bootstrapMethodAttribute;
057    }
058
059    
060    public int getBootstrapMethodRef() {
061        return _bootstrap_method_ref;
062    }
063    
064    public MethodHandleEntry getBootstrapMethod() {
065        if (_bootstrap_method_ref == 0) {
066            return null;
067        }
068        
069        Entry e = _bootstrapMethodAttribute.getPool().getEntry(_bootstrap_method_ref);
070        return (MethodHandleEntry) e;
071    }
072
073    public void setBootstrapMethodRef(int bootstrap_method_ref) {
074        _bootstrap_method_ref = bootstrap_method_ref;
075    }
076    
077    public void setBootstrapMethod(MethodHandleEntry mhe) {
078        if (mhe == null) {
079            _bootstrap_method_ref = 0;
080            return;
081        }
082        
083        _bootstrap_method_ref = mhe.getIndex();
084    }
085
086    
087    public int getNumBootstrapArguments() {
088        return _bootstrap_arguments.length;
089    }
090    
091    public int[] getBootstrapArgumentIndices() {
092        return Arrays.copyOf(_bootstrap_arguments, _bootstrap_arguments.length);
093    }
094    
095    public Entry[] getBootstrapArguments() {
096        Entry[] ceArr = new Entry[getNumBootstrapArguments()];
097        for (int i = 0; i < ceArr.length; i++) {
098            ceArr[i] = _bootstrapMethodAttribute.getPool().getEntry(_bootstrap_arguments[i]);
099        }
100        return ceArr;
101    }
102
103    public void setBootstrapArgumentIndices(int[] bootstrap_arguments) {
104        if (bootstrap_arguments == null || bootstrap_arguments.length == 0) {
105            _bootstrap_arguments = new int[0];
106            return;
107        }
108        
109        _bootstrap_arguments = Arrays.copyOf(bootstrap_arguments, bootstrap_arguments.length); 
110    }
111    
112    public void setBootstrapArguments(Entry[] bsArgs) {
113        if (bsArgs == null || bsArgs.length == 0) {
114            _bootstrap_arguments = new int[0];
115            return;
116        }
117        
118        _bootstrap_arguments = new int[bsArgs.length];
119        
120        for (int i = 0; i < bsArgs.length; i++) {
121            _bootstrap_arguments[i] = bsArgs[i].getIndex();
122        }
123    }
124    
125    public int getLength() {
126        return 4 + (2 * _bootstrap_arguments.length);
127    }
128    
129    public void write(DataOutput out) throws IOException {
130        out.writeShort(_bootstrap_method_ref);
131        out.writeShort(_bootstrap_arguments.length);
132        
133        for (int i = 0; i < _bootstrap_arguments.length; i++) {
134            out.writeShort(_bootstrap_arguments[i]);
135        }
136    }
137}