lucenenet-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From mhern...@apache.org
Subject git commit: all RamUsagEstimator tests are now passing. Adding comments and renaming SystemProp to SySystemProps.
Date Thu, 24 Jul 2014 04:05:38 GMT
Repository: lucenenet
Updated Branches:
  refs/heads/pcl bde2c1400 -> ed43cd6fe


all RamUsagEstimator tests are now passing. Adding comments and renaming SystemProp to SySystemProps.


Project: http://git-wip-us.apache.org/repos/asf/lucenenet/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucenenet/commit/ed43cd6f
Tree: http://git-wip-us.apache.org/repos/asf/lucenenet/tree/ed43cd6f
Diff: http://git-wip-us.apache.org/repos/asf/lucenenet/diff/ed43cd6f

Branch: refs/heads/pcl
Commit: ed43cd6fe50ca3a42ee64ddb07a776e62045c761
Parents: bde2c14
Author: Michael Herndon <mherndon@michaelherndon.com>
Authored: Thu Jul 24 00:04:57 2014 -0400
Committer: Michael Herndon <mherndon@michaelherndon.com>
Committed: Thu Jul 24 00:04:57 2014 -0400

----------------------------------------------------------------------
 src/Lucene.Net.Core/Lucene.Net.Core.csproj      |  2 +-
 src/Lucene.Net.Core/Lucene.Net.Core.kproj       |  2 +-
 src/Lucene.Net.Core/Util/Constants.cs           |  2 +-
 src/Lucene.Net.Core/Util/RamUsageEstimator.cs   | 91 ++++++-------------
 src/Lucene.Net.Core/Util/SystemProp.cs          | 76 ----------------
 src/Lucene.Net.Core/Util/SystemProps.cs         | 94 ++++++++++++++++++++
 .../Util/TestRamEstimatorUsage.cs               | 25 ++----
 .../Util/RamUsageTester.cs                      | 20 ++---
 8 files changed, 139 insertions(+), 173 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucenenet/blob/ed43cd6f/src/Lucene.Net.Core/Lucene.Net.Core.csproj
----------------------------------------------------------------------
diff --git a/src/Lucene.Net.Core/Lucene.Net.Core.csproj b/src/Lucene.Net.Core/Lucene.Net.Core.csproj
index 61206c3..03fa1d0 100644
--- a/src/Lucene.Net.Core/Lucene.Net.Core.csproj
+++ b/src/Lucene.Net.Core/Lucene.Net.Core.csproj
@@ -76,7 +76,7 @@
     <Compile Include="Util\InPlaceMergeSorter.cs" />
     <Compile Include="Util\RamUsageEstimator.cs" />
     <Compile Include="Util\Sorter.cs" />
-    <Compile Include="Util\SystemProp.cs" />
+    <Compile Include="Util\SystemProps.cs" />
     <Compile Include="Util\Version.cs" />
   </ItemGroup>
   <ItemGroup>

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/ed43cd6f/src/Lucene.Net.Core/Lucene.Net.Core.kproj
----------------------------------------------------------------------
diff --git a/src/Lucene.Net.Core/Lucene.Net.Core.kproj b/src/Lucene.Net.Core/Lucene.Net.Core.kproj
index 9bb051d..a28d0cb 100644
--- a/src/Lucene.Net.Core/Lucene.Net.Core.kproj
+++ b/src/Lucene.Net.Core/Lucene.Net.Core.kproj
@@ -71,7 +71,7 @@
     <Compile Include="Util\InPlaceMergeSorter.cs" />
     <Compile Include="Util\RamUsageEstimator.cs" />
     <Compile Include="Util\Sorter.cs" />
-    <Compile Include="Util\SystemProp.cs" />
+    <Compile Include="Util\SystemProps.cs" />
     <Compile Include="Util\Version.cs" />
   </ItemGroup>
   <Import Project="$(VSToolsPath)\AspNet\Microsoft.Web.AspNet.targets" Condition="'$(VSToolsPath)'
!= ''" />

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/ed43cd6f/src/Lucene.Net.Core/Util/Constants.cs
----------------------------------------------------------------------
diff --git a/src/Lucene.Net.Core/Util/Constants.cs b/src/Lucene.Net.Core/Util/Constants.cs
index f8c48d9..274ed2d 100644
--- a/src/Lucene.Net.Core/Util/Constants.cs
+++ b/src/Lucene.Net.Core/Util/Constants.cs
@@ -45,7 +45,7 @@ namespace Lucene.Net.Util
             LUCENE_VERSION = version;
         }
 
-        // TODO 5.9 see if the constants for JVM & JAVA are actually needed.
+        // TODO 5.9 determine if the constants for JVM & JAVA are actually needed.
         // public static readonly String JVM_VENDOR = AppSettings.Get("java.vm.vendor", "");
         // public static readonly String JVM_VERSION = AppSettings.Get("java.vm.version",
"");
         // public static readonly String JVM_NAME = AppSettings.Get("java.vm.name", "");

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/ed43cd6f/src/Lucene.Net.Core/Util/RamUsageEstimator.cs
----------------------------------------------------------------------
diff --git a/src/Lucene.Net.Core/Util/RamUsageEstimator.cs b/src/Lucene.Net.Core/Util/RamUsageEstimator.cs
index 3ba534e..4d5e2a4 100644
--- a/src/Lucene.Net.Core/Util/RamUsageEstimator.cs
+++ b/src/Lucene.Net.Core/Util/RamUsageEstimator.cs
@@ -30,26 +30,12 @@ namespace Lucene.Net.Util
 
 
     /// <summary> 
-    /// Estimates the size of a given object using a given MemoryModel for primitive
-    /// size information. 
-    /// 
-    /// Higher level languages abstract Memory Management away. <see cref="RamUsageEstimator"/>
-    /// attempts to estimate the object's actual size, even though the size of the object
-    /// cannot be accurately computed due to the barrier that languages like C# and Java
have.  
-    /// 
-    /// Resource Usage: 
-    /// 
-    /// Internally uses a Map to temporally hold a reference to every
-    /// object seen. 
-    /// 
-    /// If checkIntered, all Strings checked will be interned, but those
-    /// that were not already interned will be released for GC when the
-    /// estimate is complete.
+    ///  <see cref="RamUsageEstimator"/> estimate the size of memory allocation for
an object, even though the size of the object
+    /// cannot be accurately computed due to the barrier that higher level languages like
C# and Java have. 
     /// </summary>
     /// <remarks>
     ///     <para>
-    ///         The JVM FEATURE should only be ported if mono or different version of the

-    ///         .NET framework handle memory allocation differently.
+    ///        References on .NET memory allocation for objects and arrays: 
     ///     </para>
     ///     <list type="">
     ///         <item>
@@ -75,10 +61,10 @@ namespace Lucene.Net.Util
     ///         </item>
     ///     </list>
     /// </remarks>
+    // The JVM FEATURE enum should only be ported if mono or different version of the 
+    // .NET framework handle memory allocation differently.
     public sealed class RamUsageEstimator
     {
-        public static readonly string JVM_INFO_STRING;
-
         /// <summary>
         /// The number of bytes for one killabyte. 
         /// </summary>
@@ -226,14 +212,9 @@ namespace Lucene.Net.Util
             // The Java Version references "sun.misc.Unsafe", the closest class to have one
or two of the
             // methods that Unsafe has is System.Runtime.InteropServices.Marshal
 
-            // Based on various sources, here are basic building blocks for estimating the

-            // memory of objects for .NET 
-
-            // .NET has a different overhead for arrays of value types than
-            // it does for arrays of reference types. 
-
-            // The logic is written differently than its Java Counterpart in hopes
-            // to be more clear in how the ram estimates are calculated.
+            // The logic below is written different than the Java Version so
+            // a developer can visually see how the number of bytes are actually
+            // added up.
 
             int typeObjectPointer = 4; // 4 bytes  32 bit
             int syncBlock = 4;
@@ -260,24 +241,18 @@ namespace Lucene.Net.Util
 
             NUM_BYTES_OBJECT_REF = referenceTypeSize;
             NUM_BYTES_OBJECT_HEADER = objectHeader;
-            NUM_BYTES_VALUE_TYPE_ARRAY_HEADER = valueTypeArrayHeader;
-            NUM_BYTES_REFERENCE_TYPE_ARRAY_HEADER = referenceTypeArrayHeader;
             NUM_BYTES_OBJECT_ALIGNMENT = memoryAlignmentSize;
 
-            /*
-            JVM_INFO_STRING = "[JVM: " +
-                Constants.JVM_NAME + ", " + Constants.JVM_VERSION + ", " + Constants.JVM_VENDOR
+ ", " +
-                Constants.JAVA_VENDOR + ", " + Constants.JAVA_VERSION + "]"; */
+            // .NET has a different overhead for arrays of value types than
+            // it does for arrays of reference types.
+
+            NUM_BYTES_VALUE_TYPE_ARRAY_HEADER = valueTypeArrayHeader;
+            NUM_BYTES_REFERENCE_TYPE_ARRAY_HEADER = referenceTypeArrayHeader;
         }
 
         public static long AdjustForField(long sizeSoFar, FieldInfo f)
         {
             var typeInfo = f.FieldType.GetTypeInfo();
-            if (f.FieldType == typeof(string))
-            {
-
-            }
-
             int fsize = typeInfo.IsPrimitive ? primitiveSizes[f.FieldType] : NUM_BYTES_OBJECT_REF;
 
             if (f.DeclaringType != null && f.DeclaringType.GetTypeInfo().IsValueType)
@@ -359,7 +334,7 @@ namespace Lucene.Net.Util
         /// arrays.
         /// </summary>
         /// <param name="array">The object array.</param>
-        /// <returns>The size in bytes.</returns>
+        /// <returns>The size of the array in bytes.</returns>
         public static long ShallowSizeOf(Object[] array)
         {
 
@@ -371,12 +346,12 @@ namespace Lucene.Net.Util
 
 
         /// <summary>
-        /// Estimates a "shallow" memory usage of the given object. For arrays, this will
be the
+        /// Returns the "shallow" size of memory allocation in bytes for the given object.
For arrays, this will be the
         /// memory taken by array storage(no subreferences will be followed). For objects,
this
         /// will be the memory taken by the fields.
         /// </summary>
-        /// <param name="obj"></param>
-        /// <returns></returns>
+        /// <param name="obj">The object.</param>
+        /// <returns>The size of the object in bytes.</returns>
         public static long ShallowSizeOf(Object obj)
         {
             if (obj == null)
@@ -388,10 +363,6 @@ namespace Lucene.Net.Util
             {
                 return ShallowSizeOfArray((Array)obj);
             }
-            if(type == typeof(string))
-            {
-                return ShallowSizeOfArray(obj.ToString().ToCharArray());
-            }
             else
             {
                 return ShallowSizeOfInstance(type);
@@ -399,11 +370,11 @@ namespace Lucene.Net.Util
         }
 
         /// <summary>
-        /// Returns the shallow instance size in bytes of the memory allocated that an object
+        /// Returns the shallow size of memory allocation in bytes of the memory allocated
that an object
         /// of the specified type could occupy.
         /// </summary>
         /// <param name="instanceType">The type information used to estimate memory
allocation.</param>
-        /// <returns></returns>
+        /// <returns>The size of the object in bytes.</returns>
         /// <exception cref="ArgumentException">Throws when the <paramref name="instanceType"/>
is an <see cref="System.Array"/>.</exception>
         public static long ShallowSizeOfInstance(Type instanceType)
         {
@@ -419,14 +390,11 @@ namespace Lucene.Net.Util
 
             long size = NUM_BYTES_OBJECT_HEADER;
 
-            // Walk type hierarchy
-            for (; type != null; type = type.GetTypeInfo().BaseType)
+            // GetRuntimeFields includes inherited fields. 
+            var fields = type.GetRuntimeFields().Where(o => !o.IsStatic);
+            foreach (FieldInfo f in fields)
             {
-                var fields = type.GetRuntimeFields().Where(o => !o.IsStatic);
-                foreach (FieldInfo f in fields)
-                {
-                    size = AdjustForField(size, f);
-                }
+                size = AdjustForField(size, f);
             }
 
             return AlignObjectSize(size);
@@ -446,6 +414,7 @@ namespace Lucene.Net.Util
                     size = NUM_BYTES_VALUE_TYPE_ARRAY_HEADER;
                     size += (long)length * primitiveSizes[arrayElementType];
                 }
+      
                 else
                 {
                     size = NUM_BYTES_REFERENCE_TYPE_ARRAY_HEADER;
@@ -457,7 +426,7 @@ namespace Lucene.Net.Util
         }
 
         /// <summary>
-        /// Retrns the size of the memory allocatio for a string.
+        /// Retrns the size of the memory allocation for a string.
         /// </summary>
         /// <param name="array">The string.</param>
         /// <returns>The size of the memory allocation.</returns>
@@ -503,15 +472,5 @@ namespace Lucene.Net.Util
 
             return size;
         }
-    
-
-      
-      
-
-       
-
-
-        
-
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/ed43cd6f/src/Lucene.Net.Core/Util/SystemProp.cs
----------------------------------------------------------------------
diff --git a/src/Lucene.Net.Core/Util/SystemProp.cs b/src/Lucene.Net.Core/Util/SystemProp.cs
deleted file mode 100644
index 16902f8..0000000
--- a/src/Lucene.Net.Core/Util/SystemProp.cs
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-namespace Lucene.Net.Util
-{
-    using Microsoft.Framework.ConfigurationModel;
-    using System;
-
-    /// <summary>
-    /// SystemProps gets configuration properties for Lucene.Net. By default, it loads 
-    /// <see cref="EnvironmentVariablesConfigurationSource"/> for the <see cref="Constants"/>
class.
-    /// Other configuration sources may be added at runtime. 
-    /// </summary>
-    public static class SystemProps
-    {
-        private static Configuration s_config = new Configuration();
-
-        static SystemProps()
-        {
-            s_config.Add(new EnvironmentVariablesConfigurationSource());
-        }
-
-#pragma warning disable "CS3001"
-        /// <summary>
-        /// 
-        /// </summary>
-        /// <param name="configurationSource"></param>
-        public static void Add(IConfigurationSource configurationSource)
-#pragma warning restore "CS3001"
-        {
-           
-            s_config.Add(configurationSource);
-        }
-
-        public static string Get(string key)
-        {
-            return s_config.Get(key);
-        }
-
-        public static T Get<T>(string key)
-        {
-            return Get<T>(key, default(T));
-        }
-
-        public static T Get<T>(string key, T defaultValue)
-        {
-            var value = s_config.Get(key);
-            if (value == null)
-                return defaultValue;
-
-            return (T)Convert.ChangeType(value, typeof(T));
-        }
-
-#pragma warning disable "CS3001"
-        // TODO: <Insert justification for suppressing CS3001>
-        public static void UseConfiguration(Configuration configuration)
-#pragma warning restore "CS3001"
-        {
-            s_config = configuration;
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/ed43cd6f/src/Lucene.Net.Core/Util/SystemProps.cs
----------------------------------------------------------------------
diff --git a/src/Lucene.Net.Core/Util/SystemProps.cs b/src/Lucene.Net.Core/Util/SystemProps.cs
new file mode 100644
index 0000000..b62df21
--- /dev/null
+++ b/src/Lucene.Net.Core/Util/SystemProps.cs
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Lucene.Net.Util
+{
+    using Microsoft.Framework.ConfigurationModel;
+    using System;
+
+    /// <summary>
+    /// SystemProps gets configuration properties for Lucene.Net. By default, it loads 
+    /// <see cref="EnvironmentVariablesConfigurationSource"/> for the <see cref="Constants"/>
class.
+    /// Other configuration sources may be added at runtime. 
+    /// </summary>
+    [CLSCompliant(false)]
+    public static class SystemProps
+    {
+        private static Configuration s_config = new Configuration();
+
+        static SystemProps()
+        {
+            s_config.Add(new EnvironmentVariablesConfigurationSource());
+        }
+
+        /// <summary>
+        /// Adds the <see cref="IConfigurationSource"/> to what is available in <see
cref="SystemProps"/>.
+        /// </summary>
+        /// <param name="configurationSource"></param>
+        public static void Add(IConfigurationSource configurationSource)
+        {
+            s_config.Add(configurationSource);
+        }
+
+        /// <summary>
+        /// Gets the string value associated with the specified <paramref name="key"/>.
+        /// </summary>
+        /// <param name="key">The identifier associated with a value.</param>
+        /// <returns>The <see cref="System.String"/> value.</returns>
+        public static string Get(string key)
+        {
+            return s_config.Get(key);
+        }
+
+        /// <summary>
+        /// Gets the <typeparamref name="T"/> value associated with the specified <paramref
name="key"/>.
+        /// </summary>
+        /// <typeparam name="T">The expected value type.</typeparam>
+        /// <param name="key">The identifier associated with a value.</param>
+        /// <returns>The <typeparamref name="T"/> value.</returns>
+        public static T Get<T>(string key)
+        {
+            return Get<T>(key, default(T));
+        }
+
+        /// <summary>
+        ///  Gets the <typeparamref name="T"/> value associated with the specified
<paramref name="key"/>.
+        /// </summary>
+        /// <typeparam name="T">The expected value type</typeparam>
+        /// <param name="key">The identifier associated with a value.</param>
+        /// <param name="defaultValue">The default value that will be supplied if the
key returns null.</param>
+        /// <returns>The <typeparamref name="T"/> value.</returns>
+        public static T Get<T>(string key, T defaultValue)
+        {
+            var value = s_config.Get(key);
+            if (value == null)
+                return defaultValue;
+
+            return (T)Convert.ChangeType(value, typeof(T));
+        }
+
+
+        /// <summary>
+        /// Instructs the SystemProps to use this configuration object for Lucene.Net
+        /// </summary>
+        /// <param name="configuration">The <see cref="Configuration"/> object.</param>
+        public static void UseConfiguration(Configuration configuration)
+        {
+            s_config = configuration;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/ed43cd6f/test/Lucene.Net.Core.Tests/Util/TestRamEstimatorUsage.cs
----------------------------------------------------------------------
diff --git a/test/Lucene.Net.Core.Tests/Util/TestRamEstimatorUsage.cs b/test/Lucene.Net.Core.Tests/Util/TestRamEstimatorUsage.cs
index ba19645..bc17c14 100644
--- a/test/Lucene.Net.Core.Tests/Util/TestRamEstimatorUsage.cs
+++ b/test/Lucene.Net.Core.Tests/Util/TestRamEstimatorUsage.cs
@@ -26,7 +26,7 @@ namespace Lucene.Net.Util
     public class TestRamUsageEstimator : LuceneTestCase
     {
 
-        //[Test(Skip = "Verifying that RamUsageEstimator works as expected.")]
+        [Test]
         public void TestSanity()
         {
             Func<object, long> sizeOf = RamUsageTester.SizeOf;
@@ -38,26 +38,17 @@ namespace Lucene.Net.Util
             Ok(size > shallowSize, "the size {0} must be greater than the shallow size
{1}", size, shallowSize);
 
             var holder = new Holder { holder = new Holder("string2", 5000L) };
-            /**
-                TODO: account for actual values of fields for RamEstimatorUsage.   
-             
-                This test will fail as RamUsageTest.SizeOf and RamUsageEstimator.ShallowSizeOfInstance
-                do the exact same thing. 
-            
-                SizeOf doesn't 
-                currently transerve the objects and get an accurate memory count of the values
of the fields on the 
-                objects which is why it is failing. 
-                
-
-                var left = sizeOf(holder);
-                var right = RamUsageEstimator.ShallowSizeOfInstance(holder.GetType());
-                Ok(left > right, "sizeOf(holder) {0} must be greater than the shallow
size {1}", left, right);
-            */
 
+            var left = sizeOf(holder);
+                var right = RamUsageEstimator.ShallowSizeOfInstance(holder.GetType());
+            Ok(left > right, "sizeOf(holder) {0} must be greater than the shallow size
{1}", left, right);
             Ok(sizeOf(holder) > sizeOf(holder.holder));
 
             Ok(RamUsageEstimator.ShallowSizeOfInstance(typeof(HolderSubclass)) >= RamUsageEstimator.ShallowSizeOfInstance(typeof(Holder)));
-            Ok(RamUsageEstimator.ShallowSizeOfInstance(typeof(Holder)) == RamUsageEstimator.ShallowSizeOfInstance(typeof(HolderSubclass2)));
+
+            var holderShallow = RamUsageEstimator.ShallowSizeOfInstance(typeof(Holder));
+            var holder2Shallow = RamUsageEstimator.ShallowSizeOfInstance(typeof(HolderSubclass2));
+            Ok(holderShallow ==  holder2Shallow, "Holder {0} should be equal to HolderSubclass2
{1}", holderShallow, holder2Shallow);
 
             var strings = new string[] {
                     "test string",

http://git-wip-us.apache.org/repos/asf/lucenenet/blob/ed43cd6f/test/Lucene.Net.TestFramework/Util/RamUsageTester.cs
----------------------------------------------------------------------
diff --git a/test/Lucene.Net.TestFramework/Util/RamUsageTester.cs b/test/Lucene.Net.TestFramework/Util/RamUsageTester.cs
index 23755ee..d944be0 100644
--- a/test/Lucene.Net.TestFramework/Util/RamUsageTester.cs
+++ b/test/Lucene.Net.TestFramework/Util/RamUsageTester.cs
@@ -137,20 +137,18 @@ namespace Lucene.Net.Util
             ClassCache cachedInfo;
             long shallowInstanceSize = RamUsageEstimator.NUM_BYTES_OBJECT_HEADER;
             List<FieldInfo> referenceFields = new List<FieldInfo>(32);
-            for (Type c = instanceType; c != null; c = c.GetTypeInfo().BaseType)
+
+            // GetRuntimeFields includes inherited fields. 
+            var fields = instanceType.GetRuntimeFields().Where(o => !o.IsStatic);
+            foreach (FieldInfo f in fields)
             {
-                var fields = c.GetRuntimeFields().Where(o => !o.IsStatic);
-                foreach (FieldInfo f in fields)
-                {
-                   
-                    shallowInstanceSize = RamUsageEstimator.AdjustForField(shallowInstanceSize,
f);
+                shallowInstanceSize = RamUsageEstimator.AdjustForField(shallowInstanceSize,
f);
 
-                    if (!f.FieldType.GetTypeInfo().IsPrimitive)
-                    {
-                        referenceFields.Add(f);
-                    }
-                    
+                if (!f.FieldType.GetTypeInfo().IsPrimitive)
+                {
+                    referenceFields.Add(f);
                 }
+
             }
 
             cachedInfo = new ClassCache(RamUsageEstimator.AlignObjectSize(shallowInstanceSize),
referenceFields.ToArray());


Mime
View raw message