private static void DoFixups(GearsChunk chunk, int origin, Func <GearsValue, int> makeConstant, Func <string, int> makeConstant2, List <LoxCompiler> fns) { foreach (LoxCompiler fn in fns) { int codeBase = chunk.SizeCode; chunk.WriteCode(fn._Chunk._Code, fn._Chunk._Lines, fn._Chunk.SizeCode); chunk.WriteCodeAt(origin + fn._OriginAddress, (byte)(codeBase >> 8)); chunk.WriteCodeAt(origin + fn._OriginAddress + 1, (byte)(codeBase & 0xff)); foreach (LoxCompilerFixup fixup in fn._FixupConstants) { GearsValue value = fn._Chunk.ReadConstantValue(fixup.Value); int constantFixup = makeConstant(value); // as fixup chunk.WriteCodeAt(codeBase + fixup.Address, (byte)(constantFixup >> 8)); chunk.WriteCodeAt(codeBase + fixup.Address + 1, (byte)(constantFixup & 0xff)); } foreach (LoxCompilerFixup fixup in fn._FixupStrings) { string value = fn._Chunk.Strings.ReadStringConstant(fixup.Value); int constantFixup = makeConstant2(value); // as fixup chunk.WriteCodeAt(codeBase + fixup.Address, (byte)(constantFixup >> 8)); chunk.WriteCodeAt(codeBase + fixup.Address + 1, (byte)(constantFixup & 0xff)); } DoFixups(chunk, codeBase, makeConstant, makeConstant2, fn._FixupFns); chunk.Compress(); } }
// === Emit Infrastructure =================================================================================== // =========================================================================================================== private void EmitOpcode(int line, EGearsOpCode opcode) { _Chunk.WriteCode(opcode, line); }