[S.R.Serialization] fix reader interpreter: "required" check was broken.
authorAtsushi Eno <atsushieno@gmail.com>
Mon, 6 Apr 2015 18:39:48 +0000 (03:39 +0900)
committerAtsushi Eno <atsushieno@gmail.com>
Fri, 24 Apr 2015 05:36:52 +0000 (14:36 +0900)
Now it should match referencesource behavior.

mcs/class/System.Runtime.Serialization/ReferenceSources/XmlFormatReaderGenerator_static.cs

index 8ff6ccb1696c661431c391615a535a73aa715010..ebede5aec679bbcc8069c74904a66c3b358a179c 100644 (file)
@@ -212,8 +212,7 @@ namespace System.Runtime.Serialization
                        int firstRequiredMember;
                        bool[] requiredMembers = GetRequiredMembers (classContract, out firstRequiredMember);
                        bool hasRequiredMembers = (firstRequiredMember < memberCount);
-                       // FIXME: here I converted null as -1 but that may be wrong.
-                       int requiredIndex = hasRequiredMembers ? firstRequiredMember : -1;
+                       int requiredIndex = hasRequiredMembers ? firstRequiredMember : memberCount;
 
                        while (XmlObjectSerializerReadContext.MoveToNextElement (xmlReader)) {
                                int idx; // used as in "switch (idx)" in the original source.
@@ -242,10 +241,10 @@ namespace System.Runtime.Serialization
                                DataMember dataMember = classContract.Members [index];
                                Type memberType = dataMember.MemberType;
                                if (dataMember.IsRequired) {
-                                       int nextRequiredIndex = memberCount + 1;
+                                       int nextRequiredIndex = index + 1;
                                        for (; nextRequiredIndex < requiredMembers.Length; nextRequiredIndex++)
-                                       if (requiredMembers [nextRequiredIndex])
-                                               break;
+                                               if (requiredMembers [nextRequiredIndex])
+                                                       break;
                                        requiredIndex = nextRequiredIndex;
                                }