Beispiel #1
0
        private void ConvertNestedInMethodFunctionHeader(ICommonNestedInFunctionFunctionNode func, Type decl_type)
        {
            num_scope++; //увеличиваем глубину обл. видимости
            TypeBuilder tb = null, tmp_type = cur_type;
            Frame frm = null;
            //func.functions_nodes.Length > 0 - имеет вложенные
            //funcs.Count > 0 - сама вложенная
            frm = MakeAuxType(func);//создаем запись активации
            tb = frm.tb;
            cur_type = tb;
            Type ret_type = null;
            //получаем тип возвр. значения
            if (func.return_value_type == null)
                ret_type = TypeFactory.VoidType;
            else
                ret_type = helper.GetTypeReference(func.return_value_type).tp;
            //получаем типы параметров
            Type[] tmp_param_types = GetParamTypes(func);
            Type[] param_types = new Type[tmp_param_types.Length + 1];
            if (decl_type.IsValueType)
                param_types[0] = decl_type.MakeByRefType();
            else
                param_types[0] = decl_type;
            tmp_param_types.CopyTo(param_types, 1);
            MethodAttributes attrs = MethodAttributes.Public | MethodAttributes.Static;
            //определяем саму процедуру/функцию
            MethodBuilder methb = null;
            methb = tb.DefineMethod(func.name, attrs, ret_type, param_types);
            MethInfo mi = null;
            if (smi.Count != 0)
                mi = helper.AddMethod(func, methb, smi.Peek());
            else
                mi = helper.AddMethod(func, methb);
            mi.num_scope = num_scope;
            mi.disp = frm;
            mi.is_in_class = true;//процедура вложена в метод
            smi.Push(mi);
            ParameterBuilder pb = null;
            int num = 0;
            ILGenerator tmp_il = il;
            il = methb.GetILGenerator();
            //if (ret_type != typeof(void)) mi.ret_val = il.DeclareLocal(ret_type);
            mi.nested = true;
            methb.DefineParameter(1, ParameterAttributes.None, "$obj$");
            methb.DefineParameter(2, ParameterAttributes.None, "$up$");
            num = 2;
            IParameterNode[] parameters = func.parameters;
            //
            FieldBuilder[] fba = new FieldBuilder[parameters.Length];
            for (int i = 0; i < parameters.Length; i++)
            {
                //if (func.parameters[i].parameter_type == parameter_type.var)
                //	pb = methb.DefineParameter(i + num + 1, ParameterAttributes.Retval, func.parameters[i].name);
                //else
                pb = methb.DefineParameter(i + num + 1, ParameterAttributes.None, parameters[i].name);
                if (parameters[i].is_params)
                    pb.SetCustomAttribute(TypeFactory.ParamArrayAttributeConstructor, new byte[] { 0x1, 0x0, 0x0, 0x0 });
                if (func.functions_nodes.Length > 0)
                {
                    FieldBuilder fb = null;
                    if (parameters[i].parameter_type == parameter_type.value)
                        fb = frm.tb.DefineField(parameters[i].name, param_types[i + num], FieldAttributes.Public);
                    else
                    {
                        Type pt = param_types[i + num].Module.GetType(param_types[i + num].FullName.Substring(0, param_types[i + num].FullName.IndexOf('&')) + "*");
                        if (pt == null) mb.GetType(param_types[i + num].FullName.Substring(0, param_types[i + num].FullName.IndexOf('&')) + "*");
                        fb = frm.tb.DefineField(parameters[i].name, pt, FieldAttributes.Public);
                    }
                    helper.AddGlobalParameter(parameters[i], fb).meth = smi.Peek();
                    fba[i] = fb;
                }
                else helper.AddParameter(parameters[i], pb).meth = smi.Peek();
            }

            LocalBuilder frame = il.DeclareLocal(cur_type);
            mi.frame = frame;
            if (doc != null) frame.SetLocalSymInfo("$disp$");
            il.Emit(OpCodes.Ldarg_1);
            il.Emit(OpCodes.Newobj, frm.cb);
            il.Emit(OpCodes.Stloc, frame);

            //инициализация полей записи активации нелокальными параметрами
            if (func.functions_nodes.Length > 0)
                for (int j = 0; j < fba.Length; j++)
                {
                    il.Emit(OpCodes.Ldloc_0);
                    if (parameters[j].parameter_type == parameter_type.value)
                    {
                        il.Emit(OpCodes.Ldarg_S, (byte)(j + 2));
                    }
                    else
                    {
                        il.Emit(OpCodes.Ldarga_S, (byte)(j + 2));
                    }
                    il.Emit(OpCodes.Stfld, fba[j]);
                }
            funcs.Add(func);
            MethodBuilder tmp = cur_meth;
            cur_meth = methb;
            //переводим переменные как нелокальные
            ConvertNonLocalVariables(func.var_definition_nodes, frm.mb);
            //переводим описания вложенных процедур
            ConvertNestedInMethodFunctionHeaders(func.functions_nodes, decl_type);
            foreach (ICommonNestedInFunctionFunctionNode f in func.functions_nodes)
                ConvertFunctionBody(f);
            if (frm != null)
                frm.mb.GetILGenerator().Emit(OpCodes.Ret);

            cur_type = tmp_type;
            num_scope--;
            smi.Pop();
            funcs.RemoveAt(funcs.Count - 1);
        }
 public virtual void visit(ICommonNestedInFunctionFunctionNode value)
 {
 }
Beispiel #3
0
 private void ConvertNestedInMethodFunctionHeaders(ICommonNestedInFunctionFunctionNode[] funcs, Type decl_type)
 {
     foreach (ICommonNestedInFunctionFunctionNode func in funcs)
     {
         ConvertNestedInMethodFunctionHeader(func, decl_type);
     }
 }
Beispiel #4
0
 private void ConvertNestedFunctionHeaders(ICommonNestedInFunctionFunctionNode[] funcs)
 {
     for (int i = 0; i < funcs.Length; i++)
         ConvertFunctionHeader(funcs[i]);
 }
Beispiel #5
0
 public void visit(ICommonNestedInFunctionFunctionNode value)
 {
     string s = value.GetType().Name + ".";
     prepare_string_node(value.name, s + "name");
     prepare_collection(value.constants, s + "constants", "constants", value.constants.Length);
     //value.function
     prepare_node(value.function_code, s + "function_code");
     prepare_collection(value.functions_nodes, s + "function_nodes", "function_nodes", value.functions_nodes.Length);
     prepare_string_node(value.node_kind.ToString(), s + "node_kind");
     prepare_string_node(value.node_location_kind.ToString(), s + "node_location_kind");
     prepare_collection(value.parameters, s + "parametrs", "parametrs", value.parameters.Length);
     prepare_node(value.return_value_type, s + "return_value_type");
     //prepare_node(value.return_variable, s + "return_variable");
     prepare_string_node(value.SpecialFunctionKind.ToString(), s + "SpecialFunctionKind");
     prepare_collection(value.var_definition_nodes, s + "var_definition_nodes", "var_definition_nodes", value.var_definition_nodes.Length);
 }
		public virtual void visit(ICommonNestedInFunctionFunctionNode value)
		{
		}
Beispiel #7
0
 public void visit(ICommonNestedInFunctionFunctionNode value)
 {
     throw new System.NotSupportedException(value.GetType().ToString());
 }