//добавление конструктора public MethInfo AddConstructor(IFunctionNode func, ConstructorInfo ci) { //ConstrInfo m = new ConstrInfo(ci); MethInfo mi = new MethInfo(); mi.cnstr = ci; defs[func] = mi; return mi; }
//добавление функции, вложенной в функцию public MethInfo AddMethod(IFunctionNode func, MethodInfo mi, MethInfo up) { MethInfo m = new MethInfo(mi); m.up_meth = up; defs[func] = m; return m; }
//добавление функции (метода) public MethInfo AddMethod(IFunctionNode func, MethodInfo mi) { MethInfo m = new MethInfo(mi); defs[func] = m; return m; }
//добавление фиктивного метода (если метод содерж. вложенные, создается заглушка) //т. е. метод не добавл. в таблицу public MethInfo AddFictiveMethod(IFunctionNode func, MethodBuilder mi) { MethInfo m = new MethInfo(mi); //defs[func] = m; return m; }
//перевод тела функции private void ConvertFunctionBody(ICommonFunctionNode func, MethInfo mi, bool conv_first_stmt) { //if (is_in_unit && helper.IsUsed(func)==false) return; num_scope++; TypeBuilder tmp_type = cur_type; if (mi.disp != null) cur_type = mi.disp.tb; MethodBuilder tmp = cur_meth; cur_meth = (MethodBuilder)mi.mi; ILGenerator tmp_il = il; il = cur_meth.GetILGenerator(); smi.Push(mi); funcs.Add(func); if (conv_first_stmt) ConvertBody(func.function_code);//переводим тело else { ConvertStatementsListWithoutFirstStatement(func.function_code as IStatementsListNode); OptMakeExitLabel(); } //ivan for debug if (save_debug_info) { AddSpecialDebugVariables(); } //\ivan for debug if (cur_meth.ReturnType == TypeFactory.VoidType) il.Emit(OpCodes.Ret); //восстановление значений cur_meth = tmp; cur_type = tmp_type; il = tmp_il; smi.Pop(); funcs.RemoveAt(funcs.Count - 1); num_scope--; }
//получение конструктора public MethInfo GetConstructor(IFunctionNode func) { MethInfo mi = (MethInfo)defs[func]; return(mi); }