bug fix #682
This commit is contained in:
parent
e6b0fdfe7f
commit
7039ad3c4f
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
//
|
||||
|
|
|
|||
|
|
@ -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
|
|
@ -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))
|
||||
|
|
|
|||
|
|
@ -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}'
|
||||
|
|
|
|||
|
|
@ -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}'
|
||||
|
|
|
|||
|
|
@ -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}'
|
||||
|
|
|
|||
Loading…
Reference in a new issue