[runtime] Fix 'skip_nested_brace' to not read past the string. Fixes #15253. (#15257)

Fix 'skip_nested_brace' to not double skip characters.

Also add a test.

Fixes https://github.com/xamarin/xamarin-macios/issues/15253.
This commit is contained in:
Rolf Bjarne Kvinge 2022-06-14 14:26:07 +02:00 коммит произвёл GitHub
Родитель 28d286f91f
Коммит 8adbefdac8
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
3 изменённых файлов: 43 добавлений и 2 удалений

Просмотреть файл

@ -425,7 +425,6 @@ skip_nested_brace (const char *type)
case '}':
return type++;
default:
type++;
break;
}
}

Просмотреть файл

@ -260,5 +260,18 @@ namespace ObjCRuntime
[DllImport (LIBOBJC_DYLIB, EntryPoint = "objc_msgSend")]
public extern static void void_objc_msgSend_IntPtr_IntPtr_BlockLiteral (IntPtr receiver, IntPtr selector, IntPtr p1, IntPtr p2, ref BlockLiteral p3);
[DllImport (LIBOBJC_DYLIB, EntryPoint = "objc_msgSend")]
public extern static void void_objc_msgSend_NSRange_out_NSRange_ref_NSRange (IntPtr receiver, IntPtr selector, _LongNSRange p1, out _LongNSRange p2, ref _LongNSRange p3);
}
public struct _LongNSRange {
public long Location;
public long Length;
public _LongNSRange (long location, long length)
{
Location = location;
Length = length;
}
}
}

Просмотреть файл

@ -77,6 +77,36 @@ namespace MonoTouchFixtures.ObjCRuntime {
}
}
[Test]
public void NSRangeOutParameter ()
{
using var obj = new NSRangeOutParameterClass ();
var a = new _LongNSRange (-1, -2);
var c = new _LongNSRange (-5, -6);
Messaging.void_objc_msgSend_NSRange_out_NSRange_ref_NSRange (obj.Handle, Selector.GetHandle ("passRange:getRange:refRange:"), a, out var b, ref c);
Assert.AreEqual (a.Location, (long) (-1), "post a Location");
Assert.AreEqual (a.Length, (long) (-2), "post a Length");
Assert.AreEqual (b.Location, (long) 3, "post b Location");
Assert.AreEqual (b.Length, (long) 4, "post b Length");
Assert.AreEqual (c.Location, (long) 5, "post c Location");
Assert.AreEqual (c.Length, (long) 6, "post c Length");
}
class NSRangeOutParameterClass : NSObject {
[Export ("passRange:getRange:refRange:")]
public void DoIt (_LongNSRange a, out _LongNSRange b, ref _LongNSRange c)
{
Assert.AreEqual (a.Location, (long) (-1), "a Location");
Assert.AreEqual (a.Length, (long) (-2), "a Length");
Assert.AreEqual (c.Location, (long) (-5), "c Location");
Assert.AreEqual (c.Length, (long) (-6), "c Length");
a = new _LongNSRange (1, 2);
b = new _LongNSRange (3, 4);
c = new _LongNSRange (5, 6);
}
}
[Test]
public void RegistrarRemoval ()
{
@ -5426,7 +5456,6 @@ namespace MonoTouchFixtures.ObjCRuntime {
}
}
#endif // !__WATCHOS__ && !__TVOS__
}
#if !__WATCHOS__