private void add_intersection(function_node _func,function_intersection_node _func_intersec) { _func_intersections.Add(_func, _func_intersec); }
/* private static expression_node runtime_inc_int(location call_location, expression_node[] exprs) { if (exprs.Length != 1) { return null; } int_const_node icn = exprs[0] as int_const_node; if (icn == null) { return null; } return (new int_const_node(icn.constant_value + 1, call_location)); } private static expression_node runtime_dec_int(location call_location, expression_node[] exprs) { if (exprs.Length != 1) { return null; } int_const_node icn = exprs[0] as int_const_node; if (icn == null) { return null; } return (new int_const_node(icn.constant_value - 1, call_location)); } private static void mark_int_as_ordinal() { basic_function_node internal_inc_value = create_oti_method(SemanticTree.basic_function_type.iinc, _integer_type); internal_inc_value.compile_time_executor = runtime_inc_int; basic_function_node internal_dec_value = create_oti_method(SemanticTree.basic_function_type.idec, _integer_type); internal_dec_value.compile_time_executor = runtime_dec_int; basic_function_node inc_value_method = create_inc_value_method(SemanticTree.basic_function_type.iinc, _integer_type); basic_function_node dec_value_method = create_dec_value_method(SemanticTree.basic_function_type.idec, _integer_type); basic_function_node inc_method = create_inc_method(SemanticTree.basic_function_type.iinc, _integer_type); basic_function_node dec_method = create_dec_method(SemanticTree.basic_function_type.idec, _integer_type); //basic_function_node inc_method = create_oti_method(SemanticTree.basic_function_type.iinc, _integer_type); //basic_function_node dec_method = create_oti_method(SemanticTree.basic_function_type.idec, _integer_type); SymbolInfo si = _integer_type.find_in_type(compiler_string_consts.greq_name); basic_function_node greq = (basic_function_node)si.sym_info; si = _integer_type.find(compiler_string_consts.smeq_name); basic_function_node loeq = (basic_function_node)si.sym_info; //DarkStar Changed MinValue->MaxValue constant_node cn_max = new int_const_node(int.MaxValue,null); constant_node cn_min = new int_const_node(int.MinValue,null); basic_function_node i2i_method = create_emty_function(integer_type); ordinal_type_to_int ordinal_type_to_int = int_to_int; ordinal_type_interface oti = new ordinal_type_interface(inc_method,dec_method,inc_value_method,dec_value_method, internal_inc_value,internal_dec_value,loeq,greq,cn_min,cn_max,i2i_method,ordinal_type_to_int); _integer_type.add_internal_interface(oti); } private static expression_node runtime_inc_char(location call_location, expression_node[] exprs) { if (exprs.Length != 1) { return null; } char_const_node icn = exprs[0] as char_const_node; if (icn == null) { return null; } return (new int_const_node((icn.constant_value+1) , call_location)); } private static expression_node runtime_dec_char(location call_location, expression_node[] exprs) { if (exprs.Length != 1) { return null; } char_const_node icn = exprs[0] as char_const_node; if (icn == null) { return null; } return (new int_const_node((icn.constant_value-1), call_location)); } private static void mark_char_as_ordinal() { basic_function_node internal_inc_value = create_oti_method(SemanticTree.basic_function_type.cinc, _integer_type); internal_inc_value.compile_time_executor = runtime_inc_char; basic_function_node internal_dec_value = create_oti_method(SemanticTree.basic_function_type.cdec, _integer_type); internal_dec_value.compile_time_executor = runtime_dec_char; basic_function_node inc_value_method = create_inc_value_method(SemanticTree.basic_function_type.iinc, _integer_type); basic_function_node dec_value_method = create_dec_value_method(SemanticTree.basic_function_type.idec, _integer_type); basic_function_node inc_method = create_inc_method(SemanticTree.basic_function_type.iinc, _integer_type); basic_function_node dec_method = create_dec_method(SemanticTree.basic_function_type.iinc, _integer_type); SymbolInfo si = _char_type.find(compiler_string_consts.greq_name); basic_function_node greq = (basic_function_node)si.sym_info; si = _char_type.find(compiler_string_consts.smeq_name); basic_function_node loeq = (basic_function_node)si.sym_info; constant_node cn_max = new char_const_node(char.MaxValue,null); constant_node cn_min = new char_const_node(char.MinValue,null); basic_function_node c2i_method = new basic_function_node(SemanticTree.basic_function_type.chartoi, _integer_type,true); basic_parameter cp = new basic_parameter(compiler_string_consts.unary_param_name, _char_type, SemanticTree.parameter_type.value, c2i_method); //TODO: Сделано очень плохо. add_stand_type(SemanticTree.basic_function_type.chartoi, c2i_method); c2i_method.parameters.AddElement(cp); c2i_method.compile_time_executor = char_to_int; ordinal_type_to_int ordinal_type_to_int = char_to_int; ordinal_type_interface oti = new ordinal_type_interface(inc_method,dec_method,inc_value_method,dec_value_method, internal_inc_value,internal_dec_value,loeq,greq,cn_min,cn_max, c2i_method,ordinal_type_to_int); _char_type.add_internal_interface(oti); } */ private static void make_function_comparison(function_node left, function_node right, function_compare comp) { function_intersection_node fin = new function_intersection_node(left, right); fin.function_relation = comp; function_node.add_function_intersection(left,right,fin); }
public static void add_function_intersection(function_node left, function_node right, function_intersection_node intersec) { #if DEBUG function_intersection_node func_int_left = left.get_intersecion(right); if (func_int_left != null) { throw new TreeConverter.CompilerInternalError("Duplicate function intersection"); } #endif left.add_intersection(right, intersec); }