This commit is contained in:
Бондарев Иван 2018-03-25 13:48:26 +02:00
parent fcdca8fc6b
commit 8736edb3df
3 changed files with 33 additions and 53 deletions

View file

@ -451,7 +451,9 @@ namespace CodeCompletion
private bool hasUsesCycle(SymScope unit) private bool hasUsesCycle(SymScope unit)
{ {
if (this.used_units != null) if (this.Name == "PABCSystem")
return false;
if (this.used_units != null)
for (int i = 0; i < this.used_units.Count; i++) for (int i = 0; i < this.used_units.Count; i++)
{ {
if (this.used_units[i] == unit) if (this.used_units[i] == unit)

View file

@ -9337,50 +9337,18 @@ namespace PascalABCCompiler.NETGenerator
bool need_fee = false; bool need_fee = false;
bool is_comp_gen = false; bool is_comp_gen = false;
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;
//ssyy добавил
//Мне плохо понятно, как это работает; написал по аналогии с кодом
//метода visit(ICommonMethodCall).
ITypeNode i_tn = real_parameters[i].type;
TypeInfo ti = null;
//(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) && value.type != null && (ctn3.is_value_type || ctn3.is_generic_parameter) && !(real_parameters[i] is SemanticTree.INullConstantNode);
if (!(real_parameters[i] is INullConstantNode))
{
ti = helper.GetTypeReference(i_tn);
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);
if (is_comp_gen) need_fee = true;
value.real_parameters[i].visit(this);
is_dot_expr = false;
ICommonTypeNode ctn = real_parameters[i].type as ICommonTypeNode;
CallCloneIfNeed(il, parameters[i], real_parameters[i]);
//(ssyy) изменил условие
if (box_awaited)
il.Emit(OpCodes.Box, helper.GetTypeReference(ctn3).tp);
is_addr = false;
}*/
/*if (save_debug_info && need_fee)
{
MarkSequencePoint(il, value.Location);
}*/
if (value.new_obj_awaited()) if (value.new_obj_awaited())
{ {
il.Emit(OpCodes.Newobj, cnstr); il.Emit(OpCodes.Newobj, cnstr);
var ti = helper.GetTypeReference(value.common_type);
if (ti != null && ti.init_meth != null && value.common_type.is_value_type)
{
LocalBuilder lb = il.DeclareLocal(ti.tp);
il.Emit(OpCodes.Stloc, lb);
il.Emit(OpCodes.Ldloca, lb);
il.Emit(OpCodes.Call, ti.init_meth);
il.Emit(OpCodes.Ldloc, lb);
}
} }
else else
{ {
@ -9454,17 +9422,6 @@ namespace PascalABCCompiler.NETGenerator
is_dot_expr = false; is_dot_expr = false;
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;
real_parameters[i].visit(this);
ICompiledTypeNode ctn2 = parameters[i].type as ICompiledTypeNode;
ITypeNode ctn3 = real_parameters[i].type;
if (ctn2 != null && !(real_parameters[i] is SemanticTree.INullConstantNode) && value.type != null && (ctn3.is_value_type || ctn3.is_generic_parameter) && ctn2.compiled_type == TypeFactory.ObjectType)
il.Emit(OpCodes.Box, helper.GetTypeReference(ctn3).tp);
is_addr = false;
}*/
//ssyy изменил //ssyy изменил
if (value.new_obj_awaited()) if (value.new_obj_awaited())
{ {

21
TestSuite/arrays10.pas Normal file
View file

@ -0,0 +1,21 @@
type
R1 = record
a: array[1..1] of byte;
end;
procedure Test(r: R1);
begin
r.a[1] := 2;
assert(r.a[1] = 2);
end;
var r2 := new R1;
begin
var r:=new R1;
r.a[1] := 2;
assert(r.a[1] = 2);
Test(new R1);
r2.a[1] := 2;
assert(r2.a[1] = 2);
end.