Imported Upstream version 5.16.0.163
Former-commit-id: 108ef693596ba53323fc750a7d4fdc946d0f5322
This commit is contained in:
parent
0875d0d9cd
commit
6b5644868c
@ -1 +1 @@
|
||||
a8a3dec4f955c24b4400ea1a0230a855d96b97cf
|
||||
328b4f0c7026773896f9b8f9431e22729d34c418
|
@ -1 +1 @@
|
||||
dae60eb72446d9ce5f213d3cb3678c206afba466
|
||||
1acb4ecc41015019c7f394aaf1b1025246bc3a01
|
@ -34,7 +34,7 @@ static class Consts
|
||||
// Use these assembly version constants to make code more maintainable.
|
||||
//
|
||||
|
||||
public const string MonoVersion = "5.16.0.160";
|
||||
public const string MonoVersion = "5.16.0.163";
|
||||
public const string MonoCompany = "Mono development team";
|
||||
public const string MonoProduct = "Mono Common Language Infrastructure";
|
||||
public const string MonoCopyright = "(c) Various Mono authors";
|
||||
|
@ -31,6 +31,8 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Threading;
|
||||
|
||||
namespace System.Runtime.CompilerServices
|
||||
{
|
||||
@ -375,11 +377,109 @@ namespace System.Runtime.CompilerServices
|
||||
}
|
||||
}
|
||||
|
||||
// IEnumerable implementation was copied from CoreCLR
|
||||
IEnumerator<KeyValuePair<TKey, TValue>> IEnumerable<KeyValuePair<TKey, TValue>>.GetEnumerator ()
|
||||
{
|
||||
throw new NotImplementedException ();
|
||||
lock (_lock)
|
||||
{
|
||||
return size == 0 ?
|
||||
((IEnumerable<KeyValuePair<TKey, TValue>>)Array.Empty<KeyValuePair<TKey, TValue>>()).GetEnumerator() :
|
||||
new Enumerator(this);
|
||||
}
|
||||
}
|
||||
|
||||
IEnumerator IEnumerable.GetEnumerator () => ((IEnumerable<KeyValuePair<TKey, TValue>>)this).GetEnumerator ();
|
||||
|
||||
/// <summary>Provides an enumerator for the table.</summary>
|
||||
private sealed class Enumerator : IEnumerator<KeyValuePair<TKey, TValue>>
|
||||
{
|
||||
// The enumerator would ideally hold a reference to the Container and the end index within that
|
||||
// container. However, the safety of the CWT depends on the only reference to the Container being
|
||||
// from the CWT itself; the Container then employs a two-phase finalization scheme, where the first
|
||||
// phase nulls out that parent CWT's reference, guaranteeing that the second time it's finalized there
|
||||
// can be no other existing references to it in use that would allow for concurrent usage of the
|
||||
// native handles with finalization. We would break that if we allowed this Enumerator to hold a
|
||||
// reference to the Container. Instead, the Enumerator holds a reference to the CWT rather than to
|
||||
// the Container, and it maintains the CWT._activeEnumeratorRefCount field to track whether there
|
||||
// are outstanding enumerators that have yet to be disposed/finalized. If there aren't any, the CWT
|
||||
// behaves as it normally does. If there are, certain operations are affected, in particular resizes.
|
||||
// Normally when the CWT is resized, it enumerates the contents of the table looking for indices that
|
||||
// contain entries which have been collected or removed, and it frees those up, effectively moving
|
||||
// down all subsequent entries in the container (not in the existing container, but in a replacement).
|
||||
// This, however, would cause the enumerator's understanding of indices to break. So, as long as
|
||||
// there is any outstanding enumerator, no compaction is performed.
|
||||
|
||||
private ConditionalWeakTable<TKey, TValue> _table; // parent table, set to null when disposed
|
||||
private int _currentIndex = -1; // the current index into the container
|
||||
private KeyValuePair<TKey, TValue> _current; // the current entry set by MoveNext and returned from Current
|
||||
|
||||
public Enumerator(ConditionalWeakTable<TKey, TValue> table)
|
||||
{
|
||||
// Store a reference to the parent table and increase its active enumerator count.
|
||||
_table = table;
|
||||
_currentIndex = -1;
|
||||
}
|
||||
|
||||
~Enumerator() { Dispose(); }
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
// Use an interlocked operation to ensure that only one thread can get access to
|
||||
// the _table for disposal and thus only decrement the ref count once.
|
||||
ConditionalWeakTable<TKey, TValue> table = Interlocked.Exchange(ref _table, null);
|
||||
if (table != null)
|
||||
{
|
||||
// Ensure we don't keep the last current alive unnecessarily
|
||||
_current = default;
|
||||
|
||||
// Finalization is purely to decrement the ref count. We can suppress it now.
|
||||
GC.SuppressFinalize(this);
|
||||
}
|
||||
}
|
||||
|
||||
public bool MoveNext()
|
||||
{
|
||||
// Start by getting the current table. If it's already been disposed, it will be null.
|
||||
ConditionalWeakTable<TKey, TValue> table = _table;
|
||||
if (table != null)
|
||||
{
|
||||
// Once have the table, we need to lock to synchronize with other operations on
|
||||
// the table, like adding.
|
||||
lock (table._lock)
|
||||
{
|
||||
var tombstone = GC.EPHEMERON_TOMBSTONE;
|
||||
while (_currentIndex < table.data.Length - 1)
|
||||
{
|
||||
_currentIndex++;
|
||||
var currentDataItem = table.data[_currentIndex];
|
||||
if (currentDataItem.key != null && currentDataItem.key != tombstone)
|
||||
{
|
||||
_current = new KeyValuePair<TKey, TValue>((TKey)currentDataItem.key, (TValue)currentDataItem.value);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Nothing more to enumerate.
|
||||
return false;
|
||||
}
|
||||
|
||||
public KeyValuePair<TKey, TValue> Current
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_currentIndex < 0)
|
||||
{
|
||||
ThrowHelper.ThrowInvalidOperationException_InvalidOperation_EnumOpCantHappen();
|
||||
}
|
||||
return _current;
|
||||
}
|
||||
}
|
||||
|
||||
object IEnumerator.Current => Current;
|
||||
|
||||
public void Reset() { }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -29,6 +29,7 @@
|
||||
|
||||
using NUnit.Framework;
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
@ -486,6 +487,20 @@ namespace MonoTests.System.Runtime.CompilerServices {
|
||||
Assert.IsTrue (table.Remove (key), "#2-" + i + "-k-" + key);
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ConditionalWeakTableEnumerable()
|
||||
{
|
||||
var cwt = new ConditionalWeakTable<string, string>();
|
||||
Assert.AreEqual(0, cwt.ToArray().Length);
|
||||
cwt.Add("test1", "foo1");
|
||||
cwt.Add("test2", "foo2");
|
||||
Assert.AreEqual(2, cwt.ToArray().Length);
|
||||
cwt.Remove("test1");
|
||||
Assert.AreEqual(1, cwt.ToArray().Length);
|
||||
cwt.Remove("test2");
|
||||
Assert.AreEqual(0, cwt.ToArray().Length);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1 +1 @@
|
||||
9340050d3e1d0b1811befe3ea863039a29991c05
|
||||
cbcd64cd77d070cd661473e23a4316790b765443
|
@ -1 +1 @@
|
||||
b5679a6f8a5199ca74d7143777f0742a5e0a00fd
|
||||
f481c6fb894fd7af68e77220f2c7493b67a4fcd6
|
Binary file not shown.
@ -1 +1 @@
|
||||
4131faad1c2afbbc0aab29999890df98c9a3b9bc
|
||||
9017348bf1891a3baea0087b4db14b694f7a3001
|
@ -1 +1 @@
|
||||
c2cb4d0ef943e31143821b8ef5f784d0cfd595f4
|
||||
dfd320e42236ccea92c0012a84d4a13d26467077
|
@ -1 +1 @@
|
||||
7c241e20526e563aa837c5a6a5e06ff3d71ce0a8
|
||||
0db065b891cf7add08bdba86fcc71a56615c35ba
|
@ -1 +1 @@
|
||||
89ffdbff17871bc72d84d1750e31ab3f03dab725
|
||||
d2ce1f246fb723c118ea12eee232a6b39800ecda
|
@ -1 +1 @@
|
||||
d8a0ffa13d365a4212d158f99ec3689f9d2d61e9
|
||||
a0159ead83b6724f17857a322578e51f3817329d
|
@ -1 +1 @@
|
||||
9340050d3e1d0b1811befe3ea863039a29991c05
|
||||
cbcd64cd77d070cd661473e23a4316790b765443
|
@ -1 +1 @@
|
||||
b5679a6f8a5199ca74d7143777f0742a5e0a00fd
|
||||
f481c6fb894fd7af68e77220f2c7493b67a4fcd6
|
Binary file not shown.
@ -1 +1 @@
|
||||
4131faad1c2afbbc0aab29999890df98c9a3b9bc
|
||||
9017348bf1891a3baea0087b4db14b694f7a3001
|
@ -1 +1 @@
|
||||
c2cb4d0ef943e31143821b8ef5f784d0cfd595f4
|
||||
dfd320e42236ccea92c0012a84d4a13d26467077
|
@ -1 +1 @@
|
||||
7c241e20526e563aa837c5a6a5e06ff3d71ce0a8
|
||||
0db065b891cf7add08bdba86fcc71a56615c35ba
|
@ -1 +1 @@
|
||||
89ffdbff17871bc72d84d1750e31ab3f03dab725
|
||||
d2ce1f246fb723c118ea12eee232a6b39800ecda
|
@ -1 +1 @@
|
||||
d8a0ffa13d365a4212d158f99ec3689f9d2d61e9
|
||||
a0159ead83b6724f17857a322578e51f3817329d
|
@ -1 +1 @@
|
||||
9340050d3e1d0b1811befe3ea863039a29991c05
|
||||
cbcd64cd77d070cd661473e23a4316790b765443
|
@ -1 +1 @@
|
||||
b5679a6f8a5199ca74d7143777f0742a5e0a00fd
|
||||
f481c6fb894fd7af68e77220f2c7493b67a4fcd6
|
Binary file not shown.
@ -1 +1 @@
|
||||
4131faad1c2afbbc0aab29999890df98c9a3b9bc
|
||||
9017348bf1891a3baea0087b4db14b694f7a3001
|
@ -1 +1 @@
|
||||
c2cb4d0ef943e31143821b8ef5f784d0cfd595f4
|
||||
dfd320e42236ccea92c0012a84d4a13d26467077
|
@ -1 +1 @@
|
||||
7c241e20526e563aa837c5a6a5e06ff3d71ce0a8
|
||||
0db065b891cf7add08bdba86fcc71a56615c35ba
|
@ -1 +1 @@
|
||||
89ffdbff17871bc72d84d1750e31ab3f03dab725
|
||||
d2ce1f246fb723c118ea12eee232a6b39800ecda
|
@ -1 +1 @@
|
||||
d8a0ffa13d365a4212d158f99ec3689f9d2d61e9
|
||||
a0159ead83b6724f17857a322578e51f3817329d
|
@ -56,6 +56,18 @@ namespace Xamarin.ApiDiff {
|
||||
change.AppendAdded ("[NonSerialized]\n");
|
||||
}
|
||||
}
|
||||
|
||||
var srcHasFieldMarshal = (source & FieldAttributes.HasFieldMarshal) != 0;
|
||||
var tgtHasFieldMarshal = (target & FieldAttributes.HasFieldMarshal) != 0;
|
||||
if (srcHasFieldMarshal != tgtHasFieldMarshal) {
|
||||
// this is not a breaking change, so only render it if it changed.
|
||||
if (srcHasFieldMarshal) {
|
||||
change.AppendRemoved ("[MarshalAs]", false);
|
||||
} else {
|
||||
change.AppendAdded ("[MarshalAs]", false);
|
||||
}
|
||||
change.Append (Environment.NewLine);
|
||||
}
|
||||
}
|
||||
|
||||
// the visibility values are the same for MethodAttributes and FieldAttributes, so just use the same method.
|
||||
|
@ -1 +1 @@
|
||||
#define FULL_VERSION "explicit/1b18f39"
|
||||
#define FULL_VERSION "explicit/7dd65f7"
|
||||
|
BIN
po/mcs/de.gmo
BIN
po/mcs/de.gmo
Binary file not shown.
@ -1 +1 @@
|
||||
c79de62e7047faa161d24ff1912a6c2ac71cb115
|
||||
b23fe7a470845f34b505db09db50688cfca8f327
|
BIN
po/mcs/es.gmo
BIN
po/mcs/es.gmo
Binary file not shown.
@ -1 +1 @@
|
||||
0a90ee9269b7b3bdb1dae367641177044a5284be
|
||||
4099b3cd62edc3c9968d3c37f3f63c8d8cc4b4cf
|
BIN
po/mcs/ja.gmo
BIN
po/mcs/ja.gmo
Binary file not shown.
@ -1 +1 @@
|
||||
1e28d035ed9a723fbeabc041fccf1cbc0d758970
|
||||
0463c8ff274c22f2e78d9f7eb0bdaf0ba337a87d
|
@ -6,9 +6,9 @@
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: mono 5.16.0.160\n"
|
||||
"Project-Id-Version: mono 5.16.0.163\n"
|
||||
"Report-Msgid-Bugs-To: http://www.mono-project.com/Bugs\n"
|
||||
"POT-Creation-Date: 2018-09-15 08:05+0000\n"
|
||||
"POT-Creation-Date: 2018-09-20 08:05+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
|
BIN
po/mcs/pt_BR.gmo
BIN
po/mcs/pt_BR.gmo
Binary file not shown.
@ -1 +1 @@
|
||||
8cb5d1b71ae515da2abb2ff33795521eae210424
|
||||
497cad09608c61d200b09d20a1a347f533cdca93
|
Loading…
x
Reference in New Issue
Block a user