Exemple #1
0
        private static void Invoke_Tab_Procedure_Enter(
            parse_tree.parameter_list parameters,
            Procedure_Chart chart,
            Runtime.Variable this_value)
        {
            parse_tree.parameter_list walk;
            int num_parameters = chart.num_params;

            numbers.value[] the_values = new numbers.value[num_parameters];
            //string[] param_strings = new string[num_parameters];
            bool[]   is_array              = new bool[num_parameters];
            bool[]   is_2d_array           = new bool[num_parameters];
            object[] array_values          = new object[num_parameters];
            int      call_site_param_count = 0;

            // count the parameters
            walk = parameters;
            while (walk != null)
            {
                call_site_param_count++;
                walk = walk.next;
            }
            // start walk at beginning again
            walk = parameters;
            if (call_site_param_count != num_parameters)
            {
                string paramstr, verb;
                if (num_parameters != 1)
                {
                    paramstr = "parameters";
                }
                else
                {
                    paramstr = "parameter";
                }
                if (call_site_param_count != 1)
                {
                    verb = "were";
                }
                else
                {
                    verb = "was";
                }
                throw new System.Exception(chart.Text + " requires " + num_parameters + " " + paramstr + " but " +
                                           call_site_param_count + " " + verb + " provided.");
            }
            for (int i = 0; i < num_parameters; i++)
            {
                if (chart.is_input_parameter(i))
                {
                    try
                    {
                        raptor.Runtime.processing_parameter_list = true;
                        the_values[i] = ((parse_tree.expr_output)
                                         walk.parameter).expr.execute();
                    }
                    catch
                    {
                        raptor.Runtime.processing_parameter_list = false;
                        throw;
                    }
                    raptor.Runtime.processing_parameter_list = false;

                    if (numbers_pkg.is_ref_1d(the_values[i]))
                    {
                        is_array[i]     = true;
                        is_2d_array[i]  = false;
                        array_values[i] = Runtime.getValueArray(
                            numbers_pkg.object_of(the_values[i]) as Runtime.Variable);
                    }
                    else if (numbers_pkg.is_ref_2d(the_values[i]))
                    {
                        is_array[i]     = false;
                        is_2d_array[i]  = true;
                        array_values[i] = Runtime.get2DValueArray(
                            numbers_pkg.object_of(the_values[i]) as Runtime.Variable);
                    }
                    else
                    {
                        is_array[i]    = false;
                        is_2d_array[i] = false;
                    }
                }
                walk = walk.next;
            }
            Runtime.Increase_Scope(chart.Text);
            if (this_value != null)
            {
                if (chart.method.IsStatic)
                {
                    if (this_value.Kind != Runtime.Variable_Kind.Class_Value)
                    {
                        throw new System.Exception("can't call static method " + chart.Text + " with object");
                    }
                }
                else if (this_value.Kind == Runtime.Variable_Kind.Heap_Object)
                {
                    Runtime.setVariable("this", this_value.Variable_Value);
                }
                else
                {
                    throw new System.Exception("can't call dispatching method " + chart.Text + " without object");
                }
            }
            for (int i = 0; i < num_parameters; i++)
            {
                if (chart.is_input_parameter(i))
                {
                    if (is_array[i])
                    {
                        numbers.value[] values = array_values[i] as numbers.value[];
                        for (int ind1 = values.Length - 1; ind1 >= 0; ind1--)
                        {
                            Runtime.setArrayElement(chart.parameter_name(i), ind1 + 1, values[ind1]);
                        }
                    }
                    else if (is_2d_array[i])
                    {
                        numbers.value[][] values = array_values[i] as numbers.value[][];
                        for (int ind1 = values.Length - 1; ind1 >= 0; ind1--)
                        {
                            for (int ind2 = values[0].Length - 1; ind2 >= 0; ind2--)
                            {
                                Runtime.set2DArrayElement(chart.parameter_name(i),
                                                          ind1 + 1, ind2 + 1, values[ind1][ind2]);
                            }
                        }
                    }
                    else
                    {
                        Runtime.setVariable(chart.parameter_name(i),
                                            the_values[i]);
                    }
                }
            }
        }
Exemple #2
0
        private static void Invoke_Tab_Procedure_Exit(
            parse_tree.parameter_list parameters,
            Procedure_Chart chart)
        {
            end_oval.running          = true;
            call_rect.running         = false;
            Runtime.parent.currentObj = end_oval;

            parse_tree.parameter_list walk;
            int num_parameters = chart.num_params;

            walk = parameters;
            numbers.value[] the_values    = new numbers.value[num_parameters];
            string[]        param_strings = new string[num_parameters];
            bool[]          is_array      = new bool[num_parameters];
            bool[]          is_2d_array   = new bool[num_parameters];
            object[]        old_values    = new object[num_parameters];
            for (int i = 0; i < num_parameters; i++)
            {
                if (chart.is_output_parameter(i))
                {
                    try
                    {
                        param_strings[i] = ((parse_tree.expr_output)
                                            walk.parameter).get_string();
                    }
                    catch
                    {
                        param_strings[i] = "";
                    }
                    if (Runtime.isArray(chart.parameter_name(i)))
                    {
                        is_array[i]    = true;
                        is_2d_array[i] = false;
                        old_values[i]  = Runtime.getValueArray(chart.parameter_name(i));
                    }
                    else if (Runtime.is_2D_Array(chart.parameter_name(i)))
                    {
                        is_array[i]    = false;
                        is_2d_array[i] = true;
                        old_values[i]  = Runtime.get2DValueArray(chart.parameter_name(i));
                    }
                    else
                    {
                        is_array[i]    = false;
                        is_2d_array[i] = false;
                        old_values[i]  = Runtime.getVariable(chart.parameter_name(i));
                    }
                }
                walk = walk.next;
            }
            Runtime.Decrease_Scope();
            end_oval.running          = false;
            call_rect.running         = true;
            Runtime.parent.currentObj = call_rect;
            Runtime.parent.Possible_Tab_Update(next_chart);

            walk = parameters;
            for (int i = 0; i < num_parameters; i++)
            {
                if (chart.is_output_parameter(i))
                {
                    if (is_array[i])
                    {
                        numbers.value[] values = (numbers.value [])old_values[i];
                        for (int ind1 = values.Length - 1; ind1 >= 0; ind1--)
                        {
                            Runtime.setArrayElement(param_strings[i], ind1 + 1, values[ind1]);
                        }
                    }
                    else if (is_2d_array[i])
                    {
                        numbers.value[][] values = old_values[i] as numbers.value[][];
                        for (int ind1 = values.Length - 1; ind1 >= 0; ind1--)
                        {
                            for (int ind2 = values[0].Length - 1; ind2 >= 0; ind2--)
                            {
                                Runtime.set2DArrayElement(param_strings[i],
                                                          ind1 + 1, ind2 + 1, values[ind1][ind2]);
                            }
                        }
                    }
                    else
                    {
                        numbers.value t = (numbers.value)old_values[i];
                        parse_tree_pkg.ms_assign_to(walk.parameter, t, "Parameter " + (i + 1) + ":");
                        //Runtime.setVariable(param_strings[i],
                        //    t);
                    }
                }
                walk = walk.next;
            }
            call_rect.running = false;
        }