Ejemplo n.º 1
0
        private void DoCalculation()
        {
            if (!mainWindow.MakeUpToDate())
            {
                return;
            }

            SetUpSelection();

            PcodeRec  FuncCode;
            DataTypes ReturnType;

            if (!Compile(out FuncCode, out ReturnType))
            {
                return;
            }

            /* try to evaluate the code */

            StringBuilder Output = new StringBuilder();

            using (ParamStackRec ParamList = new ParamStackRec())
            {
                /* return address placeholder */
                ParamList.AddIntegerToStack(0);

                /* executing the actual code */
                EvalErrInfoRec ErrorInfo;
                EvalErrors     EvaluationError = PcodeSystem.EvaluatePcodeThread.EvaluatePcode(
                    ParamList,
                    FuncCode,
                    document.CodeCenter,
                    out ErrorInfo,
                    new PcodeExterns(mainWindow));
                if (EvaluationError != EvalErrors.eEvalNoError)
                {
                    PcodeEvaluationErrorInfo error = new PcodeEvaluationErrorInfo(
                        EvaluationError,
                        ErrorInfo,
                        FuncCode,
                        document.CodeCenter);
                    MessageBox.Show(error.CompositeErrorMessage, "Evaluation Error", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                    return;
                }
                Debug.Assert(ParamList.GetStackNumElements() == 1); // return value

                /* add new data to window */
                Output.AppendLine();
                switch (ReturnType)
                {
                default:
                    Debug.Assert(false);
                    throw new InvalidOperationException();

                case DataTypes.eBoolean:
                    Output.AppendLine(
                        ParamList.GetStackInteger(0) != 0
                                ? "returns boolean:  true"
                                : "returns boolean:  false");
                    break;

                case DataTypes.eInteger:
                    Output.AppendFormat("returns integer:  {0}", ParamList.GetStackInteger(0));
                    Output.AppendLine();
                    break;

                case DataTypes.eFloat:
                    Output.AppendFormat("returns float:  {0}", ParamList.GetStackFloat(0));
                    Output.AppendLine();
                    break;

                case DataTypes.eDouble:
                    Output.AppendFormat("returns double:  {0}", ParamList.GetStackDouble(0));
                    Output.AppendLine();
                    break;

                case DataTypes.eArrayOfBoolean:
                    Output.AppendFormat("returns array of booleans:");
                    Output.AppendLine();
                    goto ArrayMakePoint;

                case DataTypes.eArrayOfByte:
                    Output.AppendFormat("returns array of bytes:");
                    Output.AppendLine();
                    goto ArrayMakePoint;

                case DataTypes.eArrayOfInteger:
                    Output.AppendFormat("returns array of integers:");
                    Output.AppendLine();
                    goto ArrayMakePoint;

                case DataTypes.eArrayOfFloat:
                    Output.AppendFormat("returns array of floats:");
                    Output.AppendLine();
                    goto ArrayMakePoint;

                case DataTypes.eArrayOfDouble:
                    Output.AppendFormat("returns array of doubles:");
                    Output.AppendLine();
ArrayMakePoint:
                    if (ParamList.GetStackArray(0) == null)
                    {
                        Output.AppendFormat("NIL");
                        Output.AppendLine();
                    }
                    else
                    {
                        switch (ReturnType)
                        {
                        default:
                            Debug.Assert(false);
                            throw new InvalidOperationException();

                        case DataTypes.eArrayOfBoolean:
                        {
                            byte[] a = (byte[])ParamList.GetStackArray(0);
                            for (int i = 0; i < a.Length; i++)
                            {
                                int value = a[i];
                                Output.AppendFormat("{0,8}:  {1}", i, value != 0 ? "true" : "false");
                                Output.AppendLine();
                            }
                        }
                        break;

                        case DataTypes.eArrayOfByte:
                        {
                            byte[] a = (byte[])ParamList.GetStackArray(0);
                            for (int i = 0; i < a.Length; i++)
                            {
                                int value = a[i];
                                Output.AppendFormat("{0,8}:{1,3}", i, value);
                                Output.AppendLine();
                            }
                        }
                        break;

                        case DataTypes.eArrayOfInteger:
                        {
                            int[] a = (int[])ParamList.GetStackArray(0);
                            for (int i = 0; i < a.Length; i++)
                            {
                                int value = a[i];
                                Output.AppendFormat("{0,8}:{1,10}", i, value);
                                Output.AppendLine();
                            }
                        }
                        break;

                        case DataTypes.eArrayOfFloat:
                        {
                            float[] a = (float[])ParamList.GetStackArray(0);
                            for (int i = 0; i < a.Length; i++)
                            {
                                float value = a[i];
                                Output.AppendFormat("{0,8}:{1,12}", i, value);
                                Output.AppendLine();
                            }
                        }
                        break;

                        case DataTypes.eArrayOfDouble:
                        {
                            double[] a = (double[])ParamList.GetStackArray(0);
                            for (int i = 0; i < a.Length; i++)
                            {
                                double value = a[i];
                                Output.AppendFormat("{0,8}:{1,18}", i, value);
                                Output.AppendLine();
                            }
                        }
                        break;
                        }
                    }
                    break;
                }
            }

            Output.AppendLine();

            textBox.ReplaceRangeAndSelect(
                textBox.End,
                textBox.End,
                Output.ToString(),
                1);
            LastLine = textBox.Count - 1;
        }