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) { }
private void ConvertNestedInMethodFunctionHeaders(ICommonNestedInFunctionFunctionNode[] funcs, Type decl_type) { foreach (ICommonNestedInFunctionFunctionNode func in funcs) { ConvertNestedInMethodFunctionHeader(func, decl_type); } }
private void ConvertNestedFunctionHeaders(ICommonNestedInFunctionFunctionNode[] funcs) { for (int i = 0; i < funcs.Length; i++) ConvertFunctionHeader(funcs[i]); }
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 void visit(ICommonNestedInFunctionFunctionNode value) { throw new System.NotSupportedException(value.GetType().ToString()); }