public virtual void visit(ICommonNamespaceFunctionCallNode value)
 {
 }
 private MethInfo MakeStandardFunc(ICommonNamespaceFunctionCallNode value)
 {
     ICommonNamespaceFunctionNode func = value.namespace_function;
     MethodBuilder methodb;
     ParameterBuilder pb;
     ILGenerator il;
     MethInfo mi;
     switch (func.SpecialFunctionKind)
     {
         case SpecialFunctionKind.New:
             methodb = cur_type.DefineMethod(func.name, MethodAttributes.Public | MethodAttributes.Static, null, new Type[2] { Type.GetType("System.Void*&"), TypeFactory.Int32Type });
             pb = methodb.DefineParameter(1, ParameterAttributes.None, "ptr");
             pb = methodb.DefineParameter(2, ParameterAttributes.None, "size");
             il = methodb.GetILGenerator();
             il.Emit(OpCodes.Ldarg_0);
             il.Emit(OpCodes.Ldarg_1);
             il.Emit(OpCodes.Call, typeof(Marshal).GetMethod("AllocHGlobal", new Type[1] { TypeFactory.Int32Type }));
             il.Emit(OpCodes.Stind_I);
             LocalBuilder lb = il.DeclareLocal(typeof(byte[]));
             il.Emit(OpCodes.Ldarg_1);
             il.Emit(OpCodes.Newarr, TypeFactory.ByteType);
             il.Emit(OpCodes.Stloc, lb);
             il.Emit(OpCodes.Ldloc, lb);
             il.Emit(OpCodes.Ldc_I4_0);
             il.Emit(OpCodes.Ldarg_0);
             il.Emit(OpCodes.Ldind_I);
             il.Emit(OpCodes.Ldarg_1);
             il.Emit(OpCodes.Call, typeof(Marshal).GetMethod("Copy", new Type[4] { typeof(byte[]), TypeFactory.Int32Type, TypeFactory.IntPtr, TypeFactory.Int32Type }));
             il.Emit(OpCodes.Ret);
             mi = helper.AddMethod(func, methodb);
             mi.stand = true;
             return mi;
         case SpecialFunctionKind.Dispose:
             methodb = cur_type.DefineMethod(func.name, MethodAttributes.Public | MethodAttributes.Static, null, new Type[2] { Type.GetType("System.Void*&"), TypeFactory.Int32Type });
             pb = methodb.DefineParameter(1, ParameterAttributes.None, "ptr");
             pb = methodb.DefineParameter(2, ParameterAttributes.None, "size");
             il = methodb.GetILGenerator();
             il.Emit(OpCodes.Ldarg_0);
             il.Emit(OpCodes.Ldind_I);
             il.Emit(OpCodes.Call, typeof(Marshal).GetMethod("FreeHGlobal", new Type[1] { typeof(IntPtr) }));
             il.Emit(OpCodes.Ldarg_0);
             il.Emit(OpCodes.Ldnull);
             il.Emit(OpCodes.Stind_I);
             il.Emit(OpCodes.Ret);
             mi = helper.AddMethod(func, methodb);
             mi.stand = true;
             return mi;
     }
     return null;
 }
        //это не очень нравится - у некоторых
        private bool GenerateStandardFuncCall(ICommonNamespaceFunctionCallNode value, ILGenerator il)
        {
            IExpressionNode[] real_parameters = value.real_parameters;
            switch (value.namespace_function.SpecialFunctionKind)
            {
                case SpecialFunctionKind.NewArray:
                    //первый параметр - ITypeOfOperator
                    TypeInfo ti = helper.GetTypeReference(((ITypeOfOperator)real_parameters[0]).oftype);
                    int rank = (real_parameters[1] as IIntConstantNode).constant_value;

                    if (ti.tp.IsValueType && ti.init_meth != null || ti.is_arr || ti.is_set || ti.is_typed_file || ti.is_text_file || ti.tp == TypeFactory.StringType)
                    {
                        //value.real_parameters[1].visit(this);
                        if (rank == 0)
                        {
                            CreateUnsizedArray(il, ti, real_parameters[1]);
                        }
                        else if (rank == 1)
                        {
                            real_parameters[2].visit(this);
                            LocalBuilder size = NETGeneratorTools.CreateLocal(il, helper.GetTypeReference(real_parameters[2].type).tp);
                            CreateUnsizedArray(il, ti, size);
                            CreateInitCodeForUnsizedArray(il, ti, ((ITypeOfOperator)real_parameters[0]).oftype, size);
                        }
                        else
                        {
                            if (real_parameters.Length <= 2 + rank)
                            {
                                CreateNDimUnsizedArray(il, ti, ((ITypeOfOperator)real_parameters[0]).oftype, rank, real_parameters);
                                List<IExpressionNode> prms = new List<IExpressionNode>();
                                prms.AddRange(real_parameters);
                                prms.RemoveRange(0, 2);
                                CreateInitCodeForNDimUnsizedArray(il, ti, ((ITypeOfOperator)real_parameters[0]).oftype, rank, prms.ToArray());
                            }
                        }
                    }
                    else
                    {
                        if (rank == 0)
                        {
                            CreateUnsizedArray(il, ti, real_parameters[1]);
                        }
                        else if (rank == 1)
                        {
                            CreateUnsizedArray(il, ti, real_parameters[2]);
                        }
                        else
                        {
                            if (real_parameters.Length <= 2 + rank)
                                CreateNDimUnsizedArray(il, ti, ((ITypeOfOperator)real_parameters[0]).oftype, rank, real_parameters);
                        }
                    }
                    if (real_parameters.Length > 2 + rank)
                        if (rank == 1)
                            InitializeUnsizedArray(il, ti, ((ITypeOfOperator)real_parameters[0]).oftype, real_parameters, rank);
                        else if (rank != 0)
                            InitializeNDimUnsizedArray(il, ti, ((ITypeOfOperator)real_parameters[0]).oftype, real_parameters, rank);
                    return true;
            }
            return false;
        }
Exemple #4
0
        public void visit(ICommonNamespaceFunctionCallNode value)
        {
            string s = value.GetType().Name + ".";

            //prepare_up_link_node(value.function.name.ToString(), s + "function", value.function);            

            //myTreeNode from = treeView.SelectedNode.Nodes[treeView.SelectedNode.Nodes.Count - 1] as myTreeNode;
            //myTreeNode to = table_subnodes[value.function] as myTreeNode;
            //table_for_up_links.Add(from, to);

            //prepare_up_link_node(value.namespace_function.name.ToString(), s + "namespace_function", value.namespace_function);           

            //from = treeView.SelectedNode.Nodes[treeView.SelectedNode.Nodes.Count - 1] as myTreeNode;
            //to = table_subnodes[value.namespace_function] as myTreeNode;
            //table_for_up_links.Add(from, to);

            prepare_string_node(value.last_result_function_call.ToString(), s + "last_result_function_call");
            prepare_base_node_collection(value.real_parameters, s + "real_parametrs", "real_parametrs", value.real_parameters.Length);
            prepare_node(value.type, s + "type");            
        }
		public virtual void visit(ICommonNamespaceFunctionCallNode value)
		{
		}
Exemple #6
0
 public void visit(ICommonNamespaceFunctionCallNode value)
 {
     StringBuilder bodyBlock = new StringBuilder("");
     foreach (IExpressionNode nodeParameter in value.real_parameters)
     {
         nodeParameter.visit(this);
         bodyBlock.Append(ISemanticNodeConverter.SourceTextBuilder.GetNodeFromStack());
         if (value.real_parameters[value.real_parameters.Length-1] != nodeParameter)
             bodyBlock.Append(", ");
     }
     if (bodyBlock.ToString() == "")
         ISemanticNodeConverter.SourceTextBuilder.AddNodeInToStack("%empty%");
     ISemanticNodeConverter.SourceTextBuilder.AddNodeInToStack(bodyBlock.ToString());
     ISemanticNodeConverter.SourceTextBuilder.AddNodeInToStack(ISemanticNodeConverter.ConvertPABCNETNodeFunctionCall("function_call", value));
 }