bug fix #833
This commit is contained in:
parent
1742140d85
commit
eb7bff3077
|
|
@ -6850,37 +6850,6 @@ namespace PascalABCCompiler.NETGenerator
|
||||||
bool is_comp_gen = false;
|
bool is_comp_gen = false;
|
||||||
IParameterNode[] parameters = value.static_method.parameters;
|
IParameterNode[] parameters = value.static_method.parameters;
|
||||||
EmitArguments(parameters, real_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);
|
il.EmitCall(OpCodes.Call, mi, null);
|
||||||
if (tmp_dot)
|
if (tmp_dot)
|
||||||
{
|
{
|
||||||
|
|
@ -6950,7 +6919,12 @@ namespace PascalABCCompiler.NETGenerator
|
||||||
{
|
{
|
||||||
il.Emit(OpCodes.Box, helper.GetTypeReference(value.obj.conversion_type).tp);
|
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;
|
is_dot_expr = false;
|
||||||
//bool is_comp_gen = false;
|
//bool is_comp_gen = false;
|
||||||
//bool need_fee = false;
|
//bool need_fee = false;
|
||||||
|
|
|
||||||
14
TestSuite/generics20.pas
Normal file
14
TestSuite/generics20.pas
Normal 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.
|
|
@ -95,11 +95,10 @@ begin
|
||||||
end;
|
end;
|
||||||
if i mod 20 = 0 then
|
if i mod 20 = 0 then
|
||||||
begin
|
begin
|
||||||
Print(i);
|
|
||||||
System.GC.Collect();
|
System.GC.Collect();
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
Println;
|
//Println;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure CompileAllCompilationTests(dir: string; withdll: boolean);
|
procedure CompileAllCompilationTests(dir: string; withdll: boolean);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue