Imported Upstream version 5.10.0.78

Former-commit-id: 46737382176d7b811604042c613d5df6eef74f33
This commit is contained in:
Xamarin Public Jenkins (auto-signing)
2018-01-31 19:21:06 +00:00
parent b7cd5de421
commit 6db692b74b
55 changed files with 740 additions and 362 deletions

View File

@@ -391,9 +391,21 @@ namespace Mono.CSharp {
return System.Linq.Expressions.Expression.Assign (target_object, source_object);
}
protected virtual Expression ResolveConversions (ResolveContext ec)
protected virtual Expression ResolveConversions (ResolveContext rc)
{
source = Convert.ImplicitConversionRequired (ec, source, target.Type, source.Location);
var ttype = target.Type;
var stackAlloc = source as StackAlloc;
if (stackAlloc != null && ttype.Arity == 1 && ttype.GetDefinition () == rc.Module.PredefinedTypes.SpanGeneric.TypeSpec &&
rc.Module.Compiler.Settings.Version >= LanguageVersion.V_7_2) {
var etype = ttype.TypeArguments [0];
var stype = ((PointerContainer)source.Type).Element;
if (etype == stype && stackAlloc.ResolveSpanConversion (rc, ttype)) {
return this;
}
}
source = Convert.ImplicitConversionRequired (rc, source, ttype, source.Location);
if (source == null)
return null;

View File

@@ -628,59 +628,113 @@ namespace Mono.CSharp
protected override bool DoDefineMembers ()
{
PredefinedType builder_type;
PredefinedMember<MethodSpec> bf;
PredefinedMember<MethodSpec> bs;
PredefinedMember<MethodSpec> sr;
PredefinedMember<MethodSpec> se;
PredefinedMember<MethodSpec> sm;
TypeSpec bt;
bool has_task_return_type = false;
var pred_members = Module.PredefinedMembers;
if (return_type.Kind == MemberKind.Void) {
builder_type = Module.PredefinedTypes.AsyncVoidMethodBuilder;
bf = pred_members.AsyncVoidMethodBuilderCreate;
bs = pred_members.AsyncVoidMethodBuilderStart;
sr = pred_members.AsyncVoidMethodBuilderSetResult;
se = pred_members.AsyncVoidMethodBuilderSetException;
sm = pred_members.AsyncVoidMethodBuilderSetStateMachine;
} else if (return_type == Module.PredefinedTypes.Task.TypeSpec) {
builder_type = Module.PredefinedTypes.AsyncTaskMethodBuilder;
bf = pred_members.AsyncTaskMethodBuilderCreate;
bs = pred_members.AsyncTaskMethodBuilderStart;
sr = pred_members.AsyncTaskMethodBuilderSetResult;
se = pred_members.AsyncTaskMethodBuilderSetException;
sm = pred_members.AsyncTaskMethodBuilderSetStateMachine;
task = pred_members.AsyncTaskMethodBuilderTask.Get ();
} else {
builder_type = Module.PredefinedTypes.AsyncTaskMethodBuilderGeneric;
bf = pred_members.AsyncTaskMethodBuilderGenericCreate;
bs = pred_members.AsyncTaskMethodBuilderGenericStart;
sr = pred_members.AsyncTaskMethodBuilderGenericSetResult;
se = pred_members.AsyncTaskMethodBuilderGenericSetException;
sm = pred_members.AsyncTaskMethodBuilderGenericSetStateMachine;
task = pred_members.AsyncTaskMethodBuilderGenericTask.Get ();
has_task_return_type = true;
}
set_result = sr.Get ();
set_exception = se.Get ();
builder_factory = bf.Get ();
builder_start = bs.Get ();
var istate_machine = Module.PredefinedTypes.IAsyncStateMachine;
var set_statemachine = sm.Get ();
MethodSpec set_statemachine;
if (!builder_type.Define () || !istate_machine.Define () || set_result == null || builder_factory == null ||
set_exception == null || set_statemachine == null || builder_start == null ||
!Module.PredefinedTypes.INotifyCompletion.Define ()) {
Report.Error (1993, Location,
"Cannot find compiler required types for asynchronous functions support. Are you targeting the wrong framework version?");
return base.DoDefineMembers ();
if (return_type.IsCustomTaskType ()) {
//
// TODO: Would be nice to cache all this on per-type basis
//
var btypes = Compiler.BuiltinTypes;
bt = return_type.MemberDefinition.GetAsyncMethodBuilder ();
TypeSpec bt_inflated;
if (return_type.IsGeneric) {
bt_inflated = bt.MakeGenericType (Module, bt.MemberDefinition.TypeParameters);
} else {
bt_inflated = bt;
}
var set_result_sign = MemberFilter.Method ("SetResult", 0, ParametersCompiled.CreateFullyResolved (bt.MemberDefinition.TypeParameters), btypes.Void);
set_result = new PredefinedMember<MethodSpec> (Module, bt, set_result_sign).Resolve (Location);
var set_exception_sign = MemberFilter.Method ("SetException", 0, ParametersCompiled.CreateFullyResolved (btypes.Exception), btypes.Void);
set_exception = new PredefinedMember<MethodSpec> (Module, bt, set_exception_sign).Resolve (Location);
var builder_factory_sign = MemberFilter.Method ("Create", 0, ParametersCompiled.EmptyReadOnlyParameters, bt_inflated);
builder_factory = new PredefinedMember<MethodSpec> (Module, bt, builder_factory_sign).Resolve (Location);
if (builder_factory?.IsStatic == false)
throw new NotImplementedException ("report better error message");
var builder_start_sign = MemberFilter.Method ("Start", 1, new ParametersImported (
new [] {
new ParameterData (null, Parameter.Modifier.REF),
},
new [] {
new TypeParameterSpec (0, null, SpecialConstraint.None, Variance.None, null),
}, false),
btypes.Void);
builder_start = new PredefinedMember<MethodSpec> (Module, bt, builder_start_sign).Resolve (Location);
if (!istate_machine.Define ())
return false;
var set_statemachine_sign = MemberFilter.Method ("SetStateMachine", 0, ParametersCompiled.CreateFullyResolved (istate_machine.TypeSpec), btypes.Void);
set_statemachine = new PredefinedMember<MethodSpec> (Module, bt, set_statemachine_sign).Resolve (Location); ;
var task_sign = MemberFilter.Property ("Task", return_type.MemberDefinition as TypeSpec);
task = new PredefinedMember<PropertySpec> (Module, bt, task_sign).Resolve (Location);
if (set_result == null || set_exception == null || builder_factory == null || builder_start == null || set_statemachine == null || task == null ||
!Module.PredefinedTypes.INotifyCompletion.Define ()) {
return false;
}
has_task_return_type = return_type.IsGeneric;
} else {
PredefinedType builder_type;
PredefinedMember<MethodSpec> bf;
PredefinedMember<MethodSpec> bs;
PredefinedMember<MethodSpec> sr;
PredefinedMember<MethodSpec> se;
PredefinedMember<MethodSpec> sm;
var pred_members = Module.PredefinedMembers;
if (return_type.Kind == MemberKind.Void) {
builder_type = Module.PredefinedTypes.AsyncVoidMethodBuilder;
bf = pred_members.AsyncVoidMethodBuilderCreate;
bs = pred_members.AsyncVoidMethodBuilderStart;
sr = pred_members.AsyncVoidMethodBuilderSetResult;
se = pred_members.AsyncVoidMethodBuilderSetException;
sm = pred_members.AsyncVoidMethodBuilderSetStateMachine;
} else if (return_type == Module.PredefinedTypes.Task.TypeSpec) {
builder_type = Module.PredefinedTypes.AsyncTaskMethodBuilder;
bf = pred_members.AsyncTaskMethodBuilderCreate;
bs = pred_members.AsyncTaskMethodBuilderStart;
sr = pred_members.AsyncTaskMethodBuilderSetResult;
se = pred_members.AsyncTaskMethodBuilderSetException;
sm = pred_members.AsyncTaskMethodBuilderSetStateMachine;
task = pred_members.AsyncTaskMethodBuilderTask.Get ();
} else {
builder_type = Module.PredefinedTypes.AsyncTaskMethodBuilderGeneric;
bf = pred_members.AsyncTaskMethodBuilderGenericCreate;
bs = pred_members.AsyncTaskMethodBuilderGenericStart;
sr = pred_members.AsyncTaskMethodBuilderGenericSetResult;
se = pred_members.AsyncTaskMethodBuilderGenericSetException;
sm = pred_members.AsyncTaskMethodBuilderGenericSetStateMachine;
task = pred_members.AsyncTaskMethodBuilderGenericTask.Get ();
has_task_return_type = true;
}
set_result = sr.Get ();
set_exception = se.Get ();
builder_factory = bf.Get ();
builder_start = bs.Get ();
set_statemachine = sm.Get ();
if (!builder_type.Define () || !istate_machine.Define () || set_result == null || builder_factory == null ||
set_exception == null || set_statemachine == null || builder_start == null ||
!Module.PredefinedTypes.INotifyCompletion.Define ()) {
Report.Error (1993, Location,
"Cannot find compiler required types for asynchronous functions support. Are you targeting the wrong framework version?");
return base.DoDefineMembers ();
}
bt = builder_type.TypeSpec;
}
var bt = builder_type.TypeSpec;
//
// Inflate generic Task types
//
@@ -825,9 +879,26 @@ namespace Mono.CSharp
predefined = unsafeVersion ? pm.AsyncVoidMethodBuilderOnCompletedUnsafe : pm.AsyncVoidMethodBuilderOnCompleted;
} else if (return_type == Module.PredefinedTypes.Task.TypeSpec) {
predefined = unsafeVersion ? pm.AsyncTaskMethodBuilderOnCompletedUnsafe : pm.AsyncTaskMethodBuilderOnCompleted;
} else {
} else if (return_type.IsGenericTask) {
predefined = unsafeVersion ? pm.AsyncTaskMethodBuilderGenericOnCompletedUnsafe : pm.AsyncTaskMethodBuilderGenericOnCompleted;
has_task_return_type = true;
} else {
var parameters = new ParametersImported (
new [] {
new ParameterData (null, Parameter.Modifier.REF),
new ParameterData (null, Parameter.Modifier.REF)
},
new [] {
new TypeParameterSpec (0, null, SpecialConstraint.None, Variance.None, null),
new TypeParameterSpec (1, null, SpecialConstraint.None, Variance.None, null)
}, false);
var on_completed_sign = unsafeVersion ?
MemberFilter.Method ("AwaitUnsafeOnCompleted", 2, parameters, Compiler.BuiltinTypes.Void) :
MemberFilter.Method ("AwaitOnCompleted", 2, parameters, Compiler.BuiltinTypes.Void);
predefined = new PredefinedMember<MethodSpec> (Module, return_type.MemberDefinition.GetAsyncMethodBuilder (), on_completed_sign);
has_task_return_type = return_type.IsGeneric;
}
var on_completed = predefined.Resolve (Location);
@@ -887,11 +958,14 @@ namespace Mono.CSharp
// stateMachine.$builder.Start<{storey-type}>(ref stateMachine);
//
instance.AddressOf (ec, AddressOp.Store);
ec.Emit (OpCodes.Ldflda, builder_field);
bool struct_builder = builder.MemberType.IsStruct;
ec.Emit (struct_builder ? OpCodes.Ldflda : OpCodes.Ldfld, builder_field);
if (Task != null)
ec.Emit (OpCodes.Dup);
instance.AddressOf (ec, AddressOp.Store);
ec.Emit (OpCodes.Call, builder_start.MakeGenericMethod (Module, instance.Type));
ec.Emit (struct_builder ? OpCodes.Call : OpCodes.Callvirt, builder_start.MakeGenericMethod (Module, instance.Type));
//
// Emits return stateMachine.$builder.Task;
@@ -1029,4 +1103,20 @@ namespace Mono.CSharp
EmitAssign (ec, new NullConstant (type, loc), false, false);
}
}
static class TypeSpecAsyncExtensions
{
public static bool IsCustomTaskType (this TypeSpec type)
{
// LAMESPEC: Arity is not mentioned
if (type.Arity > 1)
return false;
var amb = type.MemberDefinition.GetAsyncMethodBuilder ();
if (amb == null)
return false;
return amb.Arity == type.Arity;
}
}
}

View File

@@ -789,6 +789,17 @@ namespace Mono.CSharp {
return ((BoolConstant) pos_args[0].Expr).Value;
}
public TypeSpec GetAsyncMethodBuilderValue ()
{
if (!arg_resolved)
Resolve ();
if (resolve_error)
return null;
return GetArgumentType ();
}
public TypeSpec GetCoClassAttributeValue ()
{
if (!arg_resolved)
@@ -1754,6 +1765,7 @@ namespace Mono.CSharp {
// New in .NET 4.7
public readonly PredefinedTupleElementNamesAttribute TupleElementNames;
public readonly PredefinedAttribute AsyncMethodBuilder;
// New in .NET 4.7.1
public readonly PredefinedAttribute IsReadOnly;
@@ -1838,6 +1850,7 @@ namespace Mono.CSharp {
CallerLineNumberAttribute = new PredefinedAttribute (module, "System.Runtime.CompilerServices", "CallerLineNumberAttribute");
CallerFilePathAttribute = new PredefinedAttribute (module, "System.Runtime.CompilerServices", "CallerFilePathAttribute");
AsyncMethodBuilder = new PredefinedAttribute (module, "System.Runtime.CompilerServices", "AsyncMethodBuilderAttribute");
TupleElementNames = new PredefinedTupleElementNamesAttribute (module, "System.Runtime.CompilerServices", "TupleElementNamesAttribute");
IsReadOnly = new PredefinedAttribute (module, "System.Runtime.CompilerServices", "IsReadOnlyAttribute");
IsByRefLike = new PredefinedAttribute (module, "System.Runtime.CompilerServices", "IsByRefLikeAttribute");

View File

@@ -1 +1 @@
da3ec32d6fb042738c08224ca2367f0262506c27
6b1adc297a3831c9f1efbe0d0eb0b1af7230f911

View File

@@ -1 +1 @@
b6a508cffc61cadc2e4ab73e7cc62af1fc2793d6
20ee9e73b19c3cf415315fbd67fcaeb787ac8ef6

View File

@@ -1 +1 @@
51f268737c01310008f6ef3be4705ffc0373b7ed
518ccc8ef43fb3e1a0902069579690ac6875696a

View File

@@ -693,6 +693,11 @@ namespace Mono.CSharp {
GetSignatureForError (), mc.GetSignatureForError (), input_variance, gtype_variance, parameters);
}
public TypeSpec GetAsyncMethodBuilder ()
{
return null;
}
public TypeSpec GetAttributeCoClass ()
{
return null;

View File

@@ -1405,6 +1405,7 @@ namespace Mono.CSharp
public string DefaultIndexerName;
public bool? CLSAttributeValue;
public TypeSpec CoClass;
public TypeSpec AsyncMethodBuilder;
static bool HasMissingType (ConstructorInfo ctor)
{
@@ -1446,7 +1447,14 @@ namespace Mono.CSharp
if (args.Count == 1) {
bag.Obsolete = new ObsoleteAttribute ((string) args[0].Value);
} else if (args.Count == 2) {
bag.Obsolete = new ObsoleteAttribute ((string) args[0].Value, (bool) args[1].Value);
const string ByRefLikeMarker = "Types with embedded references are not supported in this version of your compiler.";
var msg = (string)args[0].Value;
if (msg == ByRefLikeMarker)
continue;
bag.Obsolete = new ObsoleteAttribute (msg, (bool) args[1].Value);
} else {
bag.Obsolete = new ObsoleteAttribute ();
}
@@ -1526,6 +1534,20 @@ namespace Mono.CSharp
bag.CoClass = importer.ImportType ((MetaType) a.ConstructorArguments[0].Value);
continue;
}
if (name == "AsyncMethodBuilderAttribute") {
if (dt.Namespace != "System.Runtime.CompilerServices")
continue;
if (HasMissingType (a.Constructor))
continue;
if (bag == null)
bag = new AttributesBag ();
bag.AsyncMethodBuilder = importer.ImportType ((MetaType)a.ConstructorArguments [0].Value);
continue;
}
}
}
@@ -2133,6 +2155,14 @@ namespace Mono.CSharp
}
}
public TypeSpec GetAsyncMethodBuilder ()
{
if (cattrs == null)
ReadAttributes ();
return cattrs.AsyncMethodBuilder;
}
public TypeSpec GetAttributeCoClass ()
{
if (cattrs == null)
@@ -2449,6 +2479,11 @@ namespace Mono.CSharp
#endregion
public TypeSpec GetAsyncMethodBuilder ()
{
return null;
}
public TypeSpec GetAttributeCoClass ()
{
return null;

View File

@@ -1267,8 +1267,9 @@ namespace Mono.CSharp {
if ((ModFlags & Modifiers.ASYNC) != 0) {
if (ReturnType.Kind != MemberKind.Void &&
ReturnType != Module.PredefinedTypes.Task.TypeSpec &&
!ReturnType.IsGenericTask) {
Report.Error (1983, Location, "The return type of an async method must be void, Task, or Task<T>");
!ReturnType.IsGenericTask &&
!ReturnType.IsCustomTaskType ()) {
Report.Error (1983, Location, "The return type of an async method must be void or task type");
}
block = (ToplevelBlock) block.ConvertToAsyncTask (this, Parent.PartialContainer, parameters, ReturnType, null, Location);

View File

@@ -1 +1 @@
6f86db260bf6516fe48fce41e5197b299a5cfc88
9c51128548f7bf24c42648a23fef1bf5dbc67fa8

View File

@@ -242,6 +242,7 @@ namespace Mono.CSharp
// C# 7.0
public readonly PredefinedType[] Tuples;
public readonly PredefinedType SpanGeneric;
public PredefinedTypes (ModuleContainer module)
{
@@ -301,6 +302,8 @@ namespace Mono.CSharp
FormattableString = new PredefinedType (module, MemberKind.Class, "System", "FormattableString");
FormattableStringFactory = new PredefinedType (module, MemberKind.Class, "System.Runtime.CompilerServices", "FormattableStringFactory");
SpanGeneric = new PredefinedType (module, MemberKind.Struct, "System", "Span", 1);
//
// Define types which are used for comparison. It does not matter
// if they don't exist as no error report is needed
@@ -348,6 +351,8 @@ namespace Mono.CSharp
if (pt.Define ())
pt.TypeSpec.IsTupleType = true;
}
SpanGeneric.Define ();
}
}
@@ -430,6 +435,7 @@ namespace Mono.CSharp
ArrayEmpty = new PredefinedMember<MethodSpec> (module, types.Array,
MemberFilter.Method ("Empty", 1, ParametersCompiled.EmptyReadOnlyParameters, null));
// TODO: Must me static
AsyncTaskMethodBuilderCreate = new PredefinedMember<MethodSpec> (module, types.AsyncTaskMethodBuilder,
MemberFilter.Method ("Create", 0, ParametersCompiled.EmptyReadOnlyParameters, types.AsyncTaskMethodBuilder.TypeSpec));
@@ -485,6 +491,7 @@ namespace Mono.CSharp
AsyncTaskMethodBuilderTask = new PredefinedMember<PropertySpec> (module, types.AsyncTaskMethodBuilder,
MemberFilter.Property ("Task", null));
// TODO: Must me static
AsyncTaskMethodBuilderGenericCreate = new PredefinedMember<MethodSpec> (module, types.AsyncTaskMethodBuilderGeneric,
MemberFilter.Method ("Create", 0, ParametersCompiled.EmptyReadOnlyParameters, types.AsyncVoidMethodBuilder.TypeSpec));
@@ -542,6 +549,7 @@ namespace Mono.CSharp
AsyncTaskMethodBuilderGenericTask = new PredefinedMember<PropertySpec> (module, types.AsyncTaskMethodBuilderGeneric,
MemberFilter.Property ("Task", null));
// TODO: Must me static
AsyncVoidMethodBuilderCreate = new PredefinedMember<MethodSpec> (module, types.AsyncVoidMethodBuilder,
MemberFilter.Method ("Create", 0, ParametersCompiled.EmptyReadOnlyParameters, types.AsyncVoidMethodBuilder.TypeSpec));
@@ -1006,9 +1014,6 @@ namespace Mono.CSharp
public T Resolve (Location loc)
{
if (member != null)
return member;
if (Get () != null)
return member;

View File

@@ -1454,6 +1454,7 @@ namespace Mono.CSharp
int TypeParametersCount { get; }
TypeParameterSpec[] TypeParameters { get; }
TypeSpec GetAsyncMethodBuilder ();
TypeSpec GetAttributeCoClass ();
string GetAttributeDefaultMember ();
AttributeUsageAttribute GetAttributeUsage (PredefinedAttribute pa);
@@ -1588,6 +1589,11 @@ namespace Mono.CSharp
#region ITypeDefinition Members
TypeSpec ITypeDefinition.GetAsyncMethodBuilder ()
{
return null;
}
TypeSpec ITypeDefinition.GetAttributeCoClass ()
{
return null;
@@ -1776,6 +1782,11 @@ namespace Mono.CSharp
}
}
public TypeSpec GetAsyncMethodBuilder ()
{
return null;
}
public TypeSpec GetAttributeCoClass ()
{
return Element.MemberDefinition.GetAttributeCoClass ();