This commit is contained in:
Бондарев Иван 2018-05-20 14:18:29 +02:00
parent 1742140d85
commit eb7bff3077
4 changed files with 21 additions and 34 deletions

View file

@ -6850,37 +6850,6 @@ namespace PascalABCCompiler.NETGenerator
bool is_comp_gen = false;
IParameterNode[] parameters = value.static_method.parameters;
EmitArguments(parameters, real_parameters);
/*for (int i = 0; i < real_parameters.Length; i++)
{
if (parameters[i].parameter_type == parameter_type.var)
is_addr = true;
ITypeNode ctn = real_parameters[i].type;
TypeInfo ti = helper.GetTypeReference(ctn);
//(ssyy) moved up
ITypeNode tn2 = parameters[i].type;
ICompiledTypeNode ctn2 = tn2 as ICompiledTypeNode;
ITypeNode ctn3 = real_parameters[i].type;
//(ssyy) 07.12.2007 При боксировке нужно вызывать Ldsfld вместо Ldsflda.
//Дополнительная проверка введена именно для этого.
bool box_awaited =
(ctn2 != null && ctn2.compiled_type == TypeFactory.ObjectType || tn2.IsInterface) && !(real_parameters[i] is SemanticTree.INullConstantNode) && (ctn3.is_value_type || ctn3.is_generic_parameter);
if (ti.clone_meth != null && ti.tp != null && ti.tp.IsValueType && !box_awaited && !parameters[i].is_const)
is_dot_expr = true;
is_comp_gen = CheckForCompilerGenerated(real_parameters[i]);
//if (save_debug_info) MarkSequencePoint(il, 0xFeeFee, 1, 0xFeeFee, 1);
//вызов фактического параметра
real_parameters[i].visit(this);
is_dot_expr = false;
CallCloneIfNeed(il, parameters[i], real_parameters[i]);
if (box_awaited)
il.Emit(OpCodes.Box, helper.GetTypeReference(ctn3).tp);
is_addr = false;
}*/
//if (save_debug_info && need_fee)
// MarkSequencePoint(il, value.Location);
il.EmitCall(OpCodes.Call, mi, null);
if (tmp_dot)
{
@ -6950,7 +6919,12 @@ namespace PascalABCCompiler.NETGenerator
{
il.Emit(OpCodes.Box, helper.GetTypeReference(value.obj.conversion_type).tp);
}
else if (value.obj.type.is_value_type && !(value.obj is IAddressedExpressionNode) && !(value.obj is IThisNode))
{
LocalBuilder lb = il.DeclareLocal(helper.GetTypeReference(value.obj.type).tp);
il.Emit(OpCodes.Stloc, lb);
il.Emit(OpCodes.Ldloca, lb);
}
is_dot_expr = false;
//bool is_comp_gen = false;
//bool need_fee = false;

14
TestSuite/generics20.pas Normal file
View file

@ -0,0 +1,14 @@
function Deconstruct<K, V>(d: Dictionary<K, V>): (K, V);
begin
var kk := d.First.Key;
var vv := d.First.Value;
Result := (kk, vv);
end;
begin
var d := new Dictionary<integer,integer>;
d[1] := 2;
var t := Deconstruct(d);
assert(t.Item1 = 1);
assert(t.Item2 = 2);
end.

Binary file not shown.

View file

@ -95,11 +95,10 @@ begin
end;
if i mod 20 = 0 then
begin
Print(i);
System.GC.Collect();
end;
end;
Println;
//Println;
end;
procedure CompileAllCompilationTests(dir: string; withdll: boolean);