コード例 #1
0
        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());
            }
        }
コード例 #2
0
        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);
            }
        }