public void IncludeString(string value) { var label = $@"""{value}"""; if (LabelDefs.ContainsKey(label)) { return; } Compilation.ConstData.Add(ConstRef(typeof(string).Id(), this)); ConstDef(label).Label(label); Compilation.ConstData.Add(value.Length); Compilation.ConstData.AddRange(value.Select(c => (int)c)); }
public void PatchLabels() { foreach (var labelRef in LabelRefs) { if (labelRef.RemoveCall) { CurrentLabelAddress = labelRef.Value; while (Compilation.Opcodes[CurrentLabelAddress] == Opcode.PFX0) { EmitOpcodes(Opcode.NOP); } if (Compilation.Opcodes[CurrentLabelAddress] == Opcode.PSH && Compilation.Opcodes[CurrentLabelAddress + 1] == Opcode.JSR) { EmitOpcodes(Opcode.NOP, Opcode.NOP); } continue; } Debug.Assert(LabelDefs.ContainsKey(labelRef.Name)); var labelDef = LabelDefs[labelRef.Name]; var labelValue = labelDef.IsAddressSlot ? Config.AddrIdxToAddrSlot(labelDef.Value) : labelDef.Value; if (labelRef.IsAddressSlot) { CurrentLabelAddress = labelRef.Value; EmitValue(labelValue, Config.BitsPerMemoryUnit); } else { Debug.Assert(labelRef.Value >= Config.ConstStart && labelRef.Value < Config.ConstStart + Config.ConstSize); Compilation.ConstData[labelRef.Value - Config.ConstStart] = labelValue; } } }