package js.tinyvm; import java.io.IOException; import js.tinyvm.io.IByteWriter; import js.tinyvm.io.IOUtilities; /** * Master record. */ public class MasterRecord implements WritableData { /** * The binary. */ Binary _binary; int runTimeOptions = 0; /** * Constructor. * * @param binary */ public MasterRecord (Binary binary) { assert binary != null: "Precondition: binary != null"; _binary = binary; } public void setRunTimeOptions(int opt) { runTimeOptions = opt; } public String getRunTimeOptions() { String opts = ""; for(RunTimeOptions opt : RunTimeOptions.values()) { if ((opt.getValue() & runTimeOptions) != 0) opts = opts + opt + " "; } if (opts.equals("")) opts = "<NONE>"; return opts; } // // Writable interface // /** * Dump. */ public void dump (IByteWriter writer) throws TinyVMException { assert writer != null: "Precondition: writer != null"; int pMagicNumber = TinyVMConstants.MAGIC_MASK; int pConstantTableOffset = _binary.iConstantTable.getOffset(); int pNumConstantRecords = _binary.iConstantTable.size(); int pConstantValuesOffset = _binary.iConstantValues.getOffset(); int pStaticFieldsOffset = _binary.iStaticFields.getOffset(); int pStaticStateLength = _binary.iStaticState.getLength(); int pNumStaticFields = _binary.iStaticFields.size(); int pEntryClassesOffset = _binary.iEntryClassIndices.getOffset(); int pNumEntryClasses = _binary.iEntryClassIndices.size(); assert pNumEntryClasses < TinyVMConstants.MAX_CLASSES: "Check: not too much classes"; int pLastClass = _binary.iClassTable.size() - 1; assert pLastClass >= 0 && pLastClass < TinyVMConstants.MAX_CLASSES: "Check: class index in range"; try { writer.writeU2(pMagicNumber); writer.writeU2(pConstantTableOffset); writer.writeU2(pConstantValuesOffset); writer.writeU2(pNumConstantRecords); writer.writeU2(pStaticFieldsOffset); writer.writeU2(pStaticStateLength); writer.writeU2(pNumStaticFields); writer.writeU2(pEntryClassesOffset); writer.writeU1(pNumEntryClasses); writer.writeU1(pLastClass); writer.writeU2(runTimeOptions); IOUtilities.writePadding(writer, 4); } catch (IOException e) { throw new TinyVMException(e.getMessage(), e); } } /** * Length. */ public int getLength () { return IOUtilities.adjustedSize(20, 4); } }