diff options
Diffstat (limited to 'src/mscorlib/src/System/Resources/RuntimeResourceSet.cs')
-rw-r--r-- | src/mscorlib/src/System/Resources/RuntimeResourceSet.cs | 122 |
1 files changed, 75 insertions, 47 deletions
diff --git a/src/mscorlib/src/System/Resources/RuntimeResourceSet.cs b/src/mscorlib/src/System/Resources/RuntimeResourceSet.cs index a94ac82781..e9c038a498 100644 --- a/src/mscorlib/src/System/Resources/RuntimeResourceSet.cs +++ b/src/mscorlib/src/System/Resources/RuntimeResourceSet.cs @@ -12,7 +12,9 @@ ** ** ===========================================================*/ -namespace System.Resources { + +namespace System.Resources +{ using System; using System.IO; using System.Collections; @@ -162,7 +164,7 @@ namespace System.Resources { internal sealed class RuntimeResourceSet : ResourceSet, IEnumerable { internal const int Version = 2; // File format version number - + // Cache for resources. Key is the resource name, which can be cached // for arbitrarily long times, since the object is usually a string // literal that will live for the lifetime of the appdomain. The @@ -217,11 +219,14 @@ namespace System.Resources { { if (Reader == null) return; - - if (disposing) { - lock(Reader) { + + if (disposing) + { + lock (Reader) + { _resCache = null; - if (_defaultReader != null) { + if (_defaultReader != null) + { _defaultReader.Close(); _defaultReader = null; } @@ -229,8 +234,9 @@ namespace System.Resources { // Set Reader to null to avoid a race in GetObject. base.Dispose(disposing); } - } - else { + } + else + { // Just to make sure we always clear these fields in the future... _resCache = null; _caseInsensitiveTable = null; @@ -253,7 +259,7 @@ namespace System.Resources { { IResourceReader copyOfReader = Reader; if (copyOfReader == null || _resCache == null) - throw new ObjectDisposedException(null, Environment.GetResourceString("ObjectDisposed_ResourceSet")); + throw new ObjectDisposedException(null, SR.ObjectDisposed_ResourceSet); return copyOfReader.GetEnumerator(); } @@ -262,13 +268,13 @@ namespace System.Resources { public override String GetString(String key) { Object o = GetObject(key, false, true); - return (String) o; + return (String)o; } public override String GetString(String key, bool ignoreCase) { Object o = GetObject(key, ignoreCase, true); - return (String) o; + return (String)o; } public override Object GetObject(String key) @@ -283,34 +289,39 @@ namespace System.Resources { private Object GetObject(String key, bool ignoreCase, bool isString) { - if (key==null) + if (key == null) throw new ArgumentNullException(nameof(key)); if (Reader == null || _resCache == null) - throw new ObjectDisposedException(null, Environment.GetResourceString("ObjectDisposed_ResourceSet")); + throw new ObjectDisposedException(null, SR.ObjectDisposed_ResourceSet); Contract.EndContractBlock(); Object value = null; ResourceLocator resLocation; - - lock(Reader) { + + lock (Reader) + { if (Reader == null) - throw new ObjectDisposedException(null, Environment.GetResourceString("ObjectDisposed_ResourceSet")); - - if (_defaultReader != null) { + throw new ObjectDisposedException(null, SR.ObjectDisposed_ResourceSet); + + if (_defaultReader != null) + { BCLDebug.Log("RESMGRFILEFORMAT", "Going down fast path in RuntimeResourceSet::GetObject"); - + // Find the offset within the data section int dataPos = -1; - if (_resCache.TryGetValue(key, out resLocation)) { + if (_resCache.TryGetValue(key, out resLocation)) + { value = resLocation.Value; dataPos = resLocation.DataPosition; } - - if (dataPos == -1 && value == null) { + + if (dataPos == -1 && value == null) + { dataPos = _defaultReader.FindPosForResource(key); } - if (dataPos != -1 && value == null) { + if (dataPos != -1 && value == null) + { Debug.Assert(dataPos >= 0, "data section offset cannot be negative!"); // Normally calling LoadString or LoadObject requires // taking a lock. Note that in this case, we took a @@ -318,28 +329,32 @@ namespace System.Resources { // sufficient since we never pass this ResourceReader // to anyone else. ResourceTypeCode typeCode; - if (isString) { + if (isString) + { value = _defaultReader.LoadString(dataPos); typeCode = ResourceTypeCode.String; } - else { + else + { value = _defaultReader.LoadObject(dataPos, out typeCode); } resLocation = new ResourceLocator(dataPos, (ResourceLocator.CanCache(typeCode)) ? value : null); - lock(_resCache) { + lock (_resCache) + { _resCache[key] = resLocation; } } - - if (value != null || !ignoreCase) { + + if (value != null || !ignoreCase) + { #if LOOSELY_LINKED_RESOURCE_REFERENCE if (Assembly != null && (value is LooselyLinkedResourceReference)) { LooselyLinkedResourceReference assRef = (LooselyLinkedResourceReference) value; value = assRef.Resolve(Assembly); } #endif // LOOSELY_LINKED_RESOURCE_REFERENCE - + return value; // may be null } } // if (_defaultReader != null) @@ -347,20 +362,24 @@ namespace System.Resources { // At this point, we either don't have our default resource reader // or we haven't found the particular resource we're looking for // and may have to search for it in a case-insensitive way. - if (!_haveReadFromReader) { + if (!_haveReadFromReader) + { // If necessary, init our case insensitive hash table. - if (ignoreCase && _caseInsensitiveTable == null) { + if (ignoreCase && _caseInsensitiveTable == null) + { _caseInsensitiveTable = new Dictionary<String, ResourceLocator>(StringComparer.OrdinalIgnoreCase); } #if _DEBUG - BCLDebug.Perf(!ignoreCase, "Using case-insensitive lookups is bad perf-wise. Consider capitalizing "+key+" correctly in your source"); + BCLDebug.Perf(!ignoreCase, "Using case-insensitive lookups is bad perf-wise. Consider capitalizing " + key + " correctly in your source"); #endif - if (_defaultReader == null) { + if (_defaultReader == null) + { IDictionaryEnumerator en = Reader.GetEnumerator(); - while (en.MoveNext()) { + while (en.MoveNext()) + { DictionaryEntry entry = en.Entry; - String readKey = (String) entry.Key; + String readKey = (String)entry.Key; ResourceLocator resLoc = new ResourceLocator(-1, entry.Value); _resCache.Add(readKey, resLoc); if (ignoreCase) @@ -371,12 +390,14 @@ namespace System.Resources { if (!ignoreCase) Reader.Close(); } - else { + else + { Debug.Assert(ignoreCase, "This should only happen for case-insensitive lookups"); ResourceReader.ResourceEnumerator en = _defaultReader.GetEnumeratorInternal(); - while (en.MoveNext()) { + while (en.MoveNext()) + { // Note: Always ask for the resource key before the data position. - String currentKey = (String) en.Key; + String currentKey = (String)en.Key; int dataPos = en.DataPosition; ResourceLocator resLoc = new ResourceLocator(dataPos, null); _caseInsensitiveTable.Add(currentKey, resLoc); @@ -387,19 +408,23 @@ namespace System.Resources { Object obj = null; bool found = false; bool keyInWrongCase = false; - if (_defaultReader != null) { - if (_resCache.TryGetValue(key, out resLocation)) { + if (_defaultReader != null) + { + if (_resCache.TryGetValue(key, out resLocation)) + { found = true; - obj = ResolveResourceLocator(resLocation, key, _resCache, keyInWrongCase); + obj = ResolveResourceLocator(resLocation, key, _resCache, keyInWrongCase); } } - if (!found && ignoreCase) { - if (_caseInsensitiveTable.TryGetValue(key, out resLocation)) { + if (!found && ignoreCase) + { + if (_caseInsensitiveTable.TryGetValue(key, out resLocation)) + { found = true; keyInWrongCase = true; obj = ResolveResourceLocator(resLocation, key, _resCache, keyInWrongCase); } - } + } return obj; } // lock(Reader) } @@ -412,12 +437,15 @@ namespace System.Resources { // We need to explicitly resolve loosely linked manifest // resources, and we need to resolve ResourceLocators with null objects. Object value = resLocation.Value; - if (value == null) { + if (value == null) + { ResourceTypeCode typeCode; - lock(Reader) { + lock (Reader) + { value = _defaultReader.LoadObject(resLocation.DataPosition, out typeCode); } - if (!keyInWrongCase && ResourceLocator.CanCache(typeCode)) { + if (!keyInWrongCase && ResourceLocator.CanCache(typeCode)) + { resLocation.Value = value; copyOfCache[key] = resLocation; } |