Example #1
0
        public void Set_Value(numbers.value value_index, numbers.value v)
        {
            if (!numbers_pkg.is_integer(value_index))
            {
                throw new Exception(numbers_pkg.msstring_image(value_index) +
                                    " is not a valid array index.");
            }
            int index = numbers_pkg.integer_of(value_index);

            if (index > values.Count)
            {
                for (int i = values.Count; i <= index - 1; i++)
                {
                    values.Add(numbers_pkg.make_value__2(0.0));
                }
            }
            try
            {
                values[index - 1] = v._deep_clone();
            }
            catch
            {
                System.Exception f = new System.Exception("can't do array assign to: " +
                                                          (index - 1));
                throw f;
            }
        }
Example #2
0
        public static void Set_Value_String(
            numbers.value s,
            numbers.value value_index,
            numbers.value v)
        {
            if (!numbers_pkg.is_integer(value_index))
            {
                throw new Exception(numbers_pkg.msstring_image(value_index) +
                                    " is not a valid string index.");
            }
            int index = numbers_pkg.integer_of(value_index);

            if (index > s.s.Length)
            {
                s.s = s.s +
                      new String(' ', index - s.s.Length - 1) +
                      (char)numbers_pkg.integer_of(v);
            }
            else
            {
                s.s = s.s.Remove(index - 1, 1)
                      .Insert(index - 1, "" +
                              (char)numbers_pkg.integer_of(v));
            }
        }
Example #3
0
        public void Set_Value(numbers.value value_index1, numbers.value value_index2, numbers.value v)
        {
            if (!numbers_pkg.is_integer(value_index1))
            {
                throw new Exception(numbers_pkg.msstring_image(value_index1) +
                                    " is not a valid array index.");
            }
            if (!numbers_pkg.is_integer(value_index2))
            {
                throw new Exception(numbers_pkg.msstring_image(value_index2) +
                                    " is not a valid array index.");
            }
            int index1   = numbers_pkg.integer_of(value_index1);
            int index2   = numbers_pkg.integer_of(value_index2);
            int num_rows = values.Count;
            int num_cols = 0;

            if (num_rows > 0)
            {
                num_cols = ((System.Collections.ArrayList)values[0]).Count;
            }
            // add rows as needed
            if (index1 > num_rows)
            {
                for (int i = num_rows; i <= index1 - 1; i++)
                {
                    values.Add(new System.Collections.ArrayList());
                    for (int j = 0; j < num_cols; j++)
                    {
                        ((System.Collections.ArrayList)values[i]).Add(numbers_pkg.make_value__2(0.0));
                    }
                }
                num_rows = index1;
            }
            // add columns as needed
            if (index2 > num_cols)
            {
                for (int i = 0; i < num_rows; i++)
                {
                    for (int j = num_cols; j <= index2 - 1; j++)
                    {
                        ((System.Collections.ArrayList)values[i]).Add(numbers_pkg.make_value__2(0.0));
                    }
                }
            }
            try
            {
                ((System.Collections.ArrayList)values[index1 - 1])[index2 - 1] = v._deep_clone();
            }
            catch
            {
                System.Exception f = new System.Exception("can't do 2D assign to: " +
                                                          (index1 - 1) + "," + (index2 - 1));
                throw f;
            }
        }
Example #4
0
        public numbers.value Get_Value(numbers.value value_index)
        {
            if (!numbers_pkg.is_integer(value_index))
            {
                throw new Exception(numbers_pkg.msstring_image(value_index) +
                                    " is not a valid array index.");
            }
            int index = numbers_pkg.integer_of(value_index);

            return((numbers.value)values[index - 1]);
        }
Example #5
0
        public static numbers.value Get_Value_String(
            numbers.value s, numbers.value value_index)
        {
            if (!numbers_pkg.is_integer(value_index))
            {
                throw new Exception(numbers_pkg.msstring_image(value_index) +
                                    " is not a valid string index.");
            }
            int  index = numbers_pkg.integer_of(value_index);
            char c     = s.s[index - 1];

            return(numbers_pkg.make_value__4(c));
        }
Example #6
0
        public numbers.value Get_Value(numbers.value value_index1, numbers.value value_index2)
        {
            if (!numbers_pkg.is_integer(value_index1))
            {
                throw new Exception(numbers_pkg.msstring_image(value_index1) +
                                    " is not a valid array index.");
            }
            if (!numbers_pkg.is_integer(value_index2))
            {
                throw new Exception(numbers_pkg.msstring_image(value_index2) +
                                    " is not a valid array index.");
            }
            int index1 = numbers_pkg.integer_of(value_index1);
            int index2 = numbers_pkg.integer_of(value_index2);

            return((numbers.value)((System.Collections.ArrayList)values[index1 - 1])[index2 - 1]);
        }
Example #7
0
 internal void addValue(numbers.value v)
 {
     values.Add(v);
 }
Example #8
0
        internal static Component Step_Once(Component currentObj, Visual_Flow_Form form)
        {
            Component next;

            if (currentObj.need_to_decrease_scope)
            {
                Runtime.Decrease_Scope();
                currentObj.need_to_decrease_scope = false;
                if (parse_tree_pkg.did_function_call)
                {
                    if (Runtime.method_return_value != null)
                    {
                        currentObj.values.Add(Runtime.method_return_value);
                    }
                    Runtime.method_return_value = null;
                }
            }
            while (currentObj.number_method_expressions_run <
                   currentObj.method_expressions.Count)
            {
                CallStack.Push(currentObj, (Subchart)form.running_tab);
                Step_Helpers.Set_State_Entering();
                bool b = interpreter_pkg.run_expon(
                    currentObj.method_expressions[currentObj.number_method_expressions_run]
                    as parse_tree.expon,
                    currentObj.Text,
                    currentObj);
                currentObj.number_method_expressions_run++;
                if (b)
                {
                    currentObj.need_to_decrease_scope = true;
                    form.Possible_Tab_Update(form.running_tab);
                    form.currentObj         = ((Subchart)form.running_tab).Start;
                    form.currentObj.running = true;
                    return(form.currentObj);
                }
                else
                {
                    CallStack.Pop();
                }
            }
            if (currentObj.Name == "Oval")
            {
                if (currentObj.Successor != null)
                {
                    next = currentObj.Successor.First_Of();
                    next.reset_this_method_expressions_run();
                    return(next);
                }
                else
                {
                    return(null);
                }
            }
            else if (currentObj.Name == "Return")
            {
                numbers.value v = interpreter_pkg.run_return_value(currentObj.parse_tree,
                                                                   currentObj.Text);
                Runtime.method_return_value = v;
                return(null);
            }
            else if (currentObj.Name == "Rectangle")
            {
                // when running belownormal, upgrade priority to close graphics window
                if (currentObj.Text.ToLower() == "close_graph_window")
                {
                    System.Threading.ThreadPriority p = System.Threading.Thread.CurrentThread.Priority;
                    System.Threading.Thread.CurrentThread.Priority = System.Threading.ThreadPriority.AboveNormal;
                    interpreter_pkg.run_assignment(currentObj.parse_tree,
                                                   currentObj.Text);
                    System.Threading.Thread.CurrentThread.Priority = p;
                }
                else
                {
                    interpreter_pkg.run_assignment(currentObj.parse_tree,
                                                   currentObj.Text);
                }
                next = Find_Successor(currentObj);
                next.reset_this_method_expressions_run();
                return(next);
            }
            else if (currentObj.Name == "IF_Control")
            {
                bool choice = interpreter_pkg.run_boolean(
                    currentObj.parse_tree,
                    currentObj.Text);
                if (choice == true)
                {
                    // go to left child if possible, otherwise
                    // go to the successor of the if
                    if (((IF_Control)currentObj).yes_child != null)
                    {
                        next = ((IF_Control)currentObj).
                               yes_child.First_Of();
                        next.reset_this_method_expressions_run();
                        return(next);
                    }
                    else
                    {
                        next = Find_Successor(currentObj);
                        next.reset_this_method_expressions_run();
                        return(next);
                    }
                }
                else
                {
                    if (((IF_Control)currentObj).no_child != null)
                    {
                        next = ((IF_Control)currentObj).
                               no_child.First_Of();
                        next.reset_this_method_expressions_run();
                        return(next);
                    }
                    else
                    {
                        next = Find_Successor(currentObj);
                        next.reset_this_method_expressions_run();
                        return(next);
                    }
                }
            }
            else if (currentObj.Name == "Parallelogram")
            {
                if (((Parallelogram)currentObj).is_input)
                {
                    interpreter_pkg.run_input(currentObj.parse_tree,
                                              currentObj.Text,
                                              ((Parallelogram)currentObj).prompt,
                                              ((Parallelogram)currentObj).input_is_expression,
                                              ((Parallelogram)currentObj).prompt_tree);
                }
                else
                {
                    interpreter_pkg.run_output(currentObj.parse_tree,
                                               currentObj.Text);
                }
                next = Find_Successor(currentObj);
                next.reset_this_method_expressions_run();
                return(next);
            }
            else if ((currentObj.Name == "Loop") &&
                     (((Loop)currentObj).light_head))
            {
                ((Loop)currentObj).light_head = false;
                if (((Loop)currentObj).before_Child != null)
                {
                    next = ((Loop)currentObj).before_Child.First_Of();
                    next.reset_this_method_expressions_run();
                    return(next);
                }
                else
                {
                    return(currentObj);
                }
            }
            else if (currentObj.Name == "Loop")
            {
                bool choice = interpreter_pkg.run_boolean(
                    currentObj.parse_tree,
                    currentObj.Text);
                // keep going on yes if loop logic reversed, no if not
                if ((!choice && !Component.reverse_loop_logic) ||
                    (choice && Component.reverse_loop_logic))
                {
                    // on false, go to first of after_child if
                    // we can, otherwise back to the top of the loop!
                    if (((Loop)currentObj).after_Child != null)
                    {
                        next = ((Loop)currentObj).after_Child.First_Of();
                        next.reset_this_method_expressions_run();
                        return(next);
                    }
                    else
                    {
                        next = currentObj.First_Of();
                        next.reset_this_method_expressions_run();
                        return(next);
                    }
                }
                else
                {
                    // on true, go to successor of loop
                    next = Find_Successor(currentObj);
                    next.reset_this_method_expressions_run();
                    return(next);
                }
            }
            else
            {
                throw new System.Exception("unrecognized object: " +
                                           currentObj.Name);
            }
        }
Example #9
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]);
                    }
                }
            }
        }
Example #10
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;
        }
Example #11
0
 public static void addValue(object o, numbers.value v)
 {
     (o as Component).addValue(v);
 }