This commit is contained in:
Бондарев Иван 2018-02-20 20:53:51 +01:00
parent e6b0fdfe7f
commit 7039ad3c4f
8 changed files with 1644 additions and 1581 deletions

View file

@ -2021,8 +2021,8 @@ namespace PascalABCCompiler.NETGenerator
if (func.return_value_type == null)
ret_type = null;//typeof(void);
else
ret_type = helper.GetTypeReference(funcs[i].return_value_type).tp;
Type[] param_types = GetParamTypes(funcs[i]);//получаем параметры процедуры
ret_type = helper.GetTypeReference(func.return_value_type).tp;
Type[] param_types = GetParamTypes(func);//получаем параметры процедуры
IExternalStatementNode esn = (IExternalStatementNode)statements[0];
string module_name = Tools.ReplaceAllKeys(esn.module_name, StandartDirectories);
@ -2031,8 +2031,8 @@ namespace PascalABCCompiler.NETGenerator
CallingConventions.Standard, ret_type, param_types, CallingConvention.Winapi,
CharSet.Ansi);//определяем PInvoke-метод
methb.SetImplementationFlags(MethodImplAttributes.PreserveSig);
helper.AddMethod(funcs[i], methb);
IParameterNode[] parameters = funcs[i].parameters;
helper.AddMethod(func, methb);
IParameterNode[] parameters = func.parameters;
//определяем параметры с указанием имени
for (int j = 0; j < parameters.Length; j++)
{
@ -5857,6 +5857,13 @@ namespace PascalABCCompiler.NETGenerator
ConvertConstructorBody(value);
return;
}
if (value.function_code is IStatementsListNode)
{
IStatementNode[] statements = (value.function_code as IStatementsListNode).statements;
if (statements.Length > 0 && statements[0] is IExternalStatementNode)
return;
}
num_scope++;
MakeAttribute(value);
MethodBuilder methb = helper.GetMethodBuilder(value);
@ -6357,6 +6364,38 @@ namespace PascalABCCompiler.NETGenerator
return comp_opt.target == TargetType.Dll && prop_accessors.ContainsKey(value);
}
private void ConvertExternalMethod(SemanticTree.ICommonMethodNode meth)
{
IStatementsListNode sl = (IStatementsListNode)meth.function_code;
IStatementNode[] statements = sl.statements;
//функция импортируется из dll
Type ret_type = null;
//получаем тип возвр. значения
if (meth.return_value_type == null)
ret_type = null;//typeof(void);
else
ret_type = helper.GetTypeReference(meth.return_value_type).tp;
Type[] param_types = GetParamTypes(meth);//получаем параметры процедуры
IExternalStatementNode esn = (IExternalStatementNode)statements[0];
string module_name = Tools.ReplaceAllKeys(esn.module_name, StandartDirectories);
MethodBuilder methb = cur_type.DefinePInvokeMethod(meth.name, module_name, esn.name,
MethodAttributes.Public | MethodAttributes.Static | MethodAttributes.PinvokeImpl | MethodAttributes.HideBySig,
CallingConventions.Standard, ret_type, param_types, CallingConvention.Winapi,
CharSet.Ansi);//определяем PInvoke-метод
methb.SetImplementationFlags(MethodImplAttributes.PreserveSig);
helper.AddMethod(meth, methb);
IParameterNode[] parameters = meth.parameters;
//определяем параметры с указанием имени
for (int j = 0; j < parameters.Length; j++)
{
ParameterAttributes pars = ParameterAttributes.None;
//if (func.parameters[j].parameter_type == parameter_type.var)
// pars = ParameterAttributes.Out;
methb.DefineParameter(j + 1, pars, parameters[j].name);
}
}
//перевод заголовка метода
private void ConvertMethodHeader(SemanticTree.ICommonMethodNode value)
{
@ -6366,8 +6405,18 @@ namespace PascalABCCompiler.NETGenerator
return;
}
if (helper.GetMethod(value) != null) return;
if (helper.GetMethod(value) != null)
return;
if (value.function_code is IStatementsListNode)
{
IStatementsListNode sl = (IStatementsListNode)value.function_code;
IStatementNode[] statements = sl.statements;
if (statements.Length > 0 && statements[0] is IExternalStatementNode)
{
ConvertExternalMethod(value);
return;
}
}
MethodBuilder methb = null;
bool is_prop_acc = IsPropertyAccessor(value);
MethodAttributes attrs = GetMethodAttributes(value, is_prop_acc);

View file

@ -1,9 +1,9 @@
//
// This CSharp output file generated by Gardens Point LEX
// Version: 1.1.3.301
// Machine: DESKTOP-A6LT9RI
// DateTime: 17.01.2018 0:27:09
// UserName: ?????????
// Machine: IVAN-PC
// DateTime: 19.02.2018 20:41:20
// UserName: Ivan
// GPLEX input file <ABCPascal.lex>
// GPLEX frame file <embedded resource>
//

View file

@ -2058,7 +2058,9 @@ proc_func_decl_noclass
inclass_proc_func_decl
: inclass_proc_func_decl_noclass
{ $$ = $1; }
{
$$ = $1;
}
| tkClass inclass_proc_func_decl_noclass
{
if (($2 as procedure_definition).proc_header != null)
@ -2215,6 +2217,8 @@ inclass_block
{
$$ = new block($1 as declarations, $2 as statement_list, @$);
}
| external_block
{ $$ = $1; }
;
fp_list

File diff suppressed because it is too large Load diff

View file

@ -16432,6 +16432,8 @@ namespace PascalABCCompiler.TreeConverter
{
string module_name = "";
string name = "";
if (context.converted_func_stack.top() is common_method_node && (context.converted_func_stack.top() as common_method_node).polymorphic_state != SemanticTree.polymorphic_state.ps_static)
AddError(context.top_function.loc, "EXTERNAL_METHOD_SHOULD_BE_STATIC");
if (_external_directive.modulename == null)
{
if (!has_dll_import_attribute(context.top_function))

View file

@ -136,6 +136,7 @@ RETURN_VALUE_IMPLICIT_EXPLICIT_EXPECTED=Can not declare implicit and explicit op
RETURN_TYPE_UNDEFINED_{0}=Return type of function {0} is not defined and cannot be deduced. Declare the return type explicitly.
OPERATOR_RETURN_TYPE_UNDEFINED_{0}=Return type of operator {0} is not defined and cannot be deduced. Declare the return type explicitly.
STRUCT_TYPE_DEFINITION_IN_AUTO_CLASS=Field types in auto classes cannot be record or array definition
EXTERNAL_METHOD_SHOULD_BE_STATIC=external-methods should be static
%PREFIX%=COMPILATIONERROR_
UNIT_MODULE_EXPECTED_LIBRARY_FOUND=Unit expected, library found
ASSEMBLY_{0}_READING_ERROR=Error by reading assembly '{0}'

View file

@ -131,6 +131,7 @@ RETURN_VALUE_IMPLICIT_EXPLICIT_EXPECTED=Тип возвращаемого зна
RETURN_TYPE_UNDEFINED_{0}=Тип возвращаемого значения функции {0} не определен и не может быть выведен в данный момент. Укажите тип явно.
OPERATOR_RETURN_TYPE_UNDEFINED_{0}=Тип возвращаемого значения оператора {0} не определен и не может быть выведен в данный момент. Укажите тип явно.
STRUCT_TYPE_DEFINITION_IN_AUTO_CLASS=Типы полей авто-класса не могут быть описанием записи или описанием массива с границами
EXTERNAL_METHOD_SHOULD_BE_STATIC=external-методы должны быть статическими
%PREFIX%=COMPILATIONERROR_
UNIT_MODULE_EXPECTED_LIBRARY_FOUND=Ожидался модуль, а встречена библиотека
ASSEMBLY_{0}_READING_ERROR=Ошибка при чтении сборки '{0}'

View file

@ -129,6 +129,7 @@ RETURN_VALUE_IMPLICIT_EXPLICIT_EXPECTED=Тип возвращаемого зна
RETURN_TYPE_UNDEFINED_{0}=Тип возвращаемого значения функции {0} не определен и не может быть выведен в данный момент. Укажите тип явно.
OPERATOR_RETURN_TYPE_UNDEFINED_{0}=Тип возвращаемого значения оператора {0} не определен и не может быть выведен в данный момент. Укажите тип явно.
STRUCT_TYPE_DEFINITION_IN_AUTO_CLASS=Типы полей авто-класса не могут быть описанием записи или описанием массива с границами
EXTERNAL_METHOD_SHOULD_BE_STATIC=external-методы должны быть статическими
%PREFIX%=COMPILATIONERROR_
UNIT_MODULE_EXPECTED_LIBRARY_FOUND=Очікувався модуль, а зустріли бібліотеку
ASSEMBLY_{0}_READING_ERROR=Помилка при читанні збірки '{0}'