From a0f4c33b7d0b829737122a377f7995185155ad91 Mon Sep 17 00:00:00 2001 From: ywg16-pc Date: Thu, 10 May 2018 17:56:18 +0800 Subject: [PATCH 01/12] fixed bug of method PyString_FromString --- src/runtime/runtime.cs | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index abd0661a4..92eaad442 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -1193,7 +1193,26 @@ internal static bool PyString_Check(IntPtr ob) internal static IntPtr PyString_FromString(string value) { - return PyString_FromStringAndSize(value, value.Length); + if (value == null) + { + return IntPtr.Zero; + } + + byte[] bStr = Encoding.UTF8.GetBytes(value); + IntPtr mem = Marshal.AllocHGlobal(bStr.Length); + try + { + Marshal.Copy(bStr, 0, mem, bStr.Length); + } + catch (Exception) + { + Marshal.FreeHGlobal(mem); + throw; + } + + IntPtr result = PyString_FromStringAndSize(mem, bStr.Length); + Marshal.FreeHGlobal(mem); + return result; } #if PYTHON3 @@ -1211,7 +1230,7 @@ internal static IntPtr PyBytes_AS_STRING(IntPtr ob) [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl, EntryPoint = "PyUnicode_FromStringAndSize")] internal static extern IntPtr PyString_FromStringAndSize( - [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Utf8Marshaler))] string value, + IntPtr value, int size ); From e9451db9a3d126ec23e213cbb300550fd92ff33f Mon Sep 17 00:00:00 2001 From: ywg16-pc Date: Fri, 11 May 2018 08:39:16 +0800 Subject: [PATCH 02/12] fixup! fixed bug of method PyString_FromString --- src/runtime/runtime.cs | 34 ++++++---------------------------- 1 file changed, 6 insertions(+), 28 deletions(-) diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index 92eaad442..2ea4db2fb 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -1193,26 +1193,11 @@ internal static bool PyString_Check(IntPtr ob) internal static IntPtr PyString_FromString(string value) { - if (value == null) - { - return IntPtr.Zero; - } - - byte[] bStr = Encoding.UTF8.GetBytes(value); - IntPtr mem = Marshal.AllocHGlobal(bStr.Length); - try - { - Marshal.Copy(bStr, 0, mem, bStr.Length); - } - catch (Exception) - { - Marshal.FreeHGlobal(mem); - throw; - } - - IntPtr result = PyString_FromStringAndSize(mem, bStr.Length); - Marshal.FreeHGlobal(mem); - return result; +#if PYTHON3 + return PyUnicode_FromKindAndData(_UCS, value, value.Length); +#elif PYTHON2 + return PyString_FromStringAndSize(value, value.Length); +#endif } #if PYTHON3 @@ -1226,14 +1211,7 @@ internal static IntPtr PyBytes_AS_STRING(IntPtr ob) { return ob + BytesOffset.ob_sval; } - - [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl, - EntryPoint = "PyUnicode_FromStringAndSize")] - internal static extern IntPtr PyString_FromStringAndSize( - IntPtr value, - int size - ); - + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyUnicode_FromStringAndSize(IntPtr value, int size); #elif PYTHON2 From 7aaa6446c4ff6c02bd958f85fb93cb8717cdd6d9 Mon Sep 17 00:00:00 2001 From: ywg16-pc Date: Fri, 11 May 2018 08:43:37 +0800 Subject: [PATCH 03/12] removed spaces --- src/runtime/runtime.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index 2ea4db2fb..186acaf8d 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -1211,7 +1211,7 @@ internal static IntPtr PyBytes_AS_STRING(IntPtr ob) { return ob + BytesOffset.ob_sval; } - + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyUnicode_FromStringAndSize(IntPtr value, int size); #elif PYTHON2 From 083abfcae5ffd0e1c7a5f528587b53f46e31c599 Mon Sep 17 00:00:00 2001 From: Denis Akhiyarov Date: Fri, 11 May 2018 09:00:14 -0500 Subject: [PATCH 04/12] Update appveyor.yml --- appveyor.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/appveyor.yml b/appveyor.yml index 8178f173f..9fd2b1f0e 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -41,6 +41,7 @@ init: - set PATH=%PYTHON%;%PYTHON%\Scripts;%PATH% install: + - python -m pip install -U pip - pip install --upgrade -r requirements.txt --quiet # Install OpenCover. Can't put on `packages.config`, not Mono compatible From 9c724e3174dba0e1d03160fd3bee82e03d95a76c Mon Sep 17 00:00:00 2001 From: Denis Akhiyarov Date: Fri, 11 May 2018 10:48:47 -0500 Subject: [PATCH 05/12] Update requirements.txt --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 24679b2af..81adc3672 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,6 +6,6 @@ coverage codecov # Platform specific requirements -pip; sys_platform == 'win32' +# pip; sys_platform == 'win32' wheel; sys_platform == 'win32' pycparser; sys_platform != 'win32' From 42999f7281b78c96dfa828beeb33de1b180889f2 Mon Sep 17 00:00:00 2001 From: Denis Akhiyarov Date: Sun, 3 Jun 2018 05:19:37 -0500 Subject: [PATCH 06/12] Update conversiontest.cs --- src/testing/conversiontest.cs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/testing/conversiontest.cs b/src/testing/conversiontest.cs index 36294594c..06ab7cb4e 100644 --- a/src/testing/conversiontest.cs +++ b/src/testing/conversiontest.cs @@ -60,4 +60,19 @@ public string GetValue() return value; } } + + public class UnicodeString + { + public string value = "안녕"; + + public string GetString() + { + return value; + } + + public override string ToString() + { + return value; + } + } } From 1f3255afe7c7702fec294720691fca43f2a796bb Mon Sep 17 00:00:00 2001 From: Denis Akhiyarov Date: Sun, 3 Jun 2018 05:25:32 -0500 Subject: [PATCH 07/12] Update test_conversion.py --- src/tests/test_conversion.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/tests/test_conversion.py b/src/tests/test_conversion.py index 53e5d8051..48010d9d8 100644 --- a/src/tests/test_conversion.py +++ b/src/tests/test_conversion.py @@ -4,7 +4,7 @@ import System import pytest -from Python.Test import ConversionTest +from Python.Test import ConversionTest, UnicodeString from ._compat import indexbytes, long, unichr @@ -535,6 +535,11 @@ def test_string_conversion(): with pytest.raises(TypeError): ConversionTest().StringField = 1 + + world = UnicodeString() + assert "안녕" = str(world.value) + assert "안녕" = str(world.GetString()) + assert "안녕" = str(world) def test_interface_conversion(): From 36def5d5005781ca8404d1a57faf6531301430d8 Mon Sep 17 00:00:00 2001 From: Denis Akhiyarov Date: Sun, 3 Jun 2018 05:33:45 -0500 Subject: [PATCH 08/12] Update test_conversion.py --- src/tests/test_conversion.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/tests/test_conversion.py b/src/tests/test_conversion.py index 48010d9d8..1c20daba5 100644 --- a/src/tests/test_conversion.py +++ b/src/tests/test_conversion.py @@ -537,9 +537,9 @@ def test_string_conversion(): ConversionTest().StringField = 1 world = UnicodeString() - assert "안녕" = str(world.value) - assert "안녕" = str(world.GetString()) - assert "안녕" = str(world) + assert "안녕" == str(world.value) + assert "안녕" == str(world.GetString()) + assert "안녕" == str(world) def test_interface_conversion(): From 084d7439b189fc9294ac4c55a4441d8fd89be0c8 Mon Sep 17 00:00:00 2001 From: Denis Akhiyarov Date: Sun, 3 Jun 2018 05:49:33 -0500 Subject: [PATCH 09/12] Update test_conversion.py --- src/tests/test_conversion.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/tests/test_conversion.py b/src/tests/test_conversion.py index 1c20daba5..2dc5ccd3b 100644 --- a/src/tests/test_conversion.py +++ b/src/tests/test_conversion.py @@ -6,7 +6,7 @@ import pytest from Python.Test import ConversionTest, UnicodeString -from ._compat import indexbytes, long, unichr +from ._compat import indexbytes, long, unichr, text_type def test_bool_conversion(): @@ -537,9 +537,9 @@ def test_string_conversion(): ConversionTest().StringField = 1 world = UnicodeString() - assert "안녕" == str(world.value) - assert "안녕" == str(world.GetString()) - assert "안녕" == str(world) + assert "안녕" == text_type(world.value) + assert "안녕" == text_type(world.GetString()) + assert "안녕" == text_type(world) def test_interface_conversion(): From 92ea629eb31eaa645fb4aa08f08179e3722509ea Mon Sep 17 00:00:00 2001 From: Denis Akhiyarov Date: Sun, 3 Jun 2018 06:06:06 -0500 Subject: [PATCH 10/12] Update test_conversion.py --- src/tests/test_conversion.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/tests/test_conversion.py b/src/tests/test_conversion.py index 2dc5ccd3b..fa8756912 100644 --- a/src/tests/test_conversion.py +++ b/src/tests/test_conversion.py @@ -2,6 +2,7 @@ """Test CLR <-> Python type conversions.""" +from __future__ import unicode_literals import System import pytest from Python.Test import ConversionTest, UnicodeString From 947cb01b9f0ba6c56149b623da03d06327ba6dae Mon Sep 17 00:00:00 2001 From: Denis Akhiyarov Date: Sun, 3 Jun 2018 17:24:48 -0500 Subject: [PATCH 11/12] Update test_conversion.py --- src/tests/test_conversion.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/tests/test_conversion.py b/src/tests/test_conversion.py index fa8756912..0b0a5b38a 100644 --- a/src/tests/test_conversion.py +++ b/src/tests/test_conversion.py @@ -538,9 +538,10 @@ def test_string_conversion(): ConversionTest().StringField = 1 world = UnicodeString() - assert "안녕" == text_type(world.value) - assert "안녕" == text_type(world.GetString()) - assert "안녕" == text_type(world) + test_unicode_str = u"안녕" + assert test_unicode_str == text_type(world.value) + assert test_unicode_str == text_type(world.GetString()) + assert test_unicode_str == text_type(world) def test_interface_conversion(): From c5ec6b3f5c540bfd6d552f7561ed1460716921a6 Mon Sep 17 00:00:00 2001 From: Denis Akhiyarov Date: Mon, 11 Jun 2018 23:46:52 -0500 Subject: [PATCH 12/12] Update test_conversion.py --- src/tests/test_conversion.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/tests/test_conversion.py b/src/tests/test_conversion.py index 0b0a5b38a..0ba10a80e 100644 --- a/src/tests/test_conversion.py +++ b/src/tests/test_conversion.py @@ -7,7 +7,7 @@ import pytest from Python.Test import ConversionTest, UnicodeString -from ._compat import indexbytes, long, unichr, text_type +from ._compat import indexbytes, long, unichr, text_type, PY2, PY3 def test_bool_conversion(): @@ -541,7 +541,9 @@ def test_string_conversion(): test_unicode_str = u"안녕" assert test_unicode_str == text_type(world.value) assert test_unicode_str == text_type(world.GetString()) - assert test_unicode_str == text_type(world) + # TODO: not sure what to do for Python 2 here (GH PR #670) + if PY3: + assert test_unicode_str == text_type(world) def test_interface_conversion():