private string ConvertToValueFrom(CallArgumentNode theArgument) { bool isNumeric = int.TryParse(theArgument.Value.GetValue(), out int n); if (isNumeric) { return(theArgument.Value.GetValue()); } if (theArgument.Name.Name == "x" || theArgument.Name.Name == "y") { var counterReference = this.context.GetCounterContextByName(theArgument.Value.GetValue()); return(Convert.ToString(counterReference.CurrentValue)); } else if (theArgument.Value.Inner is ValueReferenceStatementNode valueReferenceNode) { return(Convert.ToString(EvaluateValueReferenceExpression(valueReferenceNode))); } else { return(theArgument.Value.GetValue()); } }
private void InsertCallArgument(CallNode call, VariableData sVd, FunctionInOut arg, int argIndex, ref SArgData[] sArgList, ref int sArgCount) { int i; var aType = arg.VariableType; var sType = sVd.Type; // First locate or create sArgBase. for (i = 0; i < sArgCount; i++) { if (sArgList[i].Svd == sVd && sArgList[i].Cvd == null) { break; } } var sArgData = sArgList[i]; if (i == sArgCount) { sArgData.Svd = sVd; sArgData.Cvd = null; sArgData.Arg = null; sArgData.Type = VariableType.Invalid; sArgCount++; } var sInfo = sType.GetVariableInfo(); var sClass = sInfo.RegisterClass; if (SArgData.MustConvertSArg(aType, sType)) { var cType = SArgData.TypeOfConvertedSArg(aType, sType); var cInfo = cType.GetVariableInfo(); var cClass = cInfo.RegisterClass; while (++i < sArgCount) { sArgData = sArgList[i]; if (sArgData.Svd != sVd) { break; } if (sArgData.Cvd.Type != cType || sArgData.Type != aType) { continue; } sArgData.Arg.AffectedArguments |= Utils.Mask(argIndex); return; } var cVd = _compiler.CreateVariableData(cType, cInfo, null); var sArg = new CallArgumentNode(call, sVd, cVd); var map = new VariableMap(2); _variableContext.RegisterContextVariable(cVd); _variableContext.RegisterContextVariable(sVd); map.Count.Add(sClass); map.Count.Add(cClass); if (sClass <= cClass) { map.Attributes[0].Setup(sVd, VariableFlags.RReg, 0, _variableContext.GaRegs[sClass]); map.Attributes[1].Setup(cVd, VariableFlags.WReg, 0, _variableContext.GaRegs[cClass]); map.Start.Set(cClass, (sClass != cClass).AsInt()); } else { map.Attributes[0].Setup(cVd, VariableFlags.WReg, 0, _variableContext.GaRegs[cClass]); map.Attributes[1].Setup(sVd, VariableFlags.RReg, 0, _variableContext.GaRegs[sClass]); map.Start.Set(sClass, 1); } sArg.VariableMap = map; sArg.AffectedArguments |= Utils.Mask(argIndex); _compiler.AddNodeBefore(sArg, call); //::memmove(sArgData + 1, sArgData, (sArgCount - i) * sizeof(SArgData)); var tmp = new SArgData[sArgCount + 1]; Array.Copy(sArgList, 0, tmp, 0, i); Array.Copy(sArgList, i + 1, tmp, i + 1, sArgCount - i); sArgList = tmp; sArgData.Svd = sVd; sArgData.Cvd = cVd; sArgData.Arg = sArg; sArgData.Type = aType; sArgCount++; } else { var sArg = sArgData.Arg; _variableContext.RegisterContextVariable(sVd); if (sArg == null) { sArg = new CallArgumentNode(call, sVd, null); var map = new VariableMap(1); map.Count.Add(sClass); map.Attributes[0].Setup(sVd, VariableFlags.RReg, 0, _variableContext.GaRegs[sClass]); sArg.VariableMap = map; sArgData.Arg = sArg; _compiler.AddNodeBefore(sArg, call); } sArg.AffectedArguments |= Utils.Mask(argIndex); } }