pyquadp 2.0.2__tar.gz → 2.0.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. {pyquadp-2.0.2 → pyquadp-2.0.4}/.github/workflows/bandit.yml +1 -1
  2. {pyquadp-2.0.2 → pyquadp-2.0.4}/.github/workflows/black.yml +1 -1
  3. {pyquadp-2.0.2 → pyquadp-2.0.4}/.github/workflows/codeql.yml +3 -3
  4. {pyquadp-2.0.2 → pyquadp-2.0.4}/.github/workflows/coveralls.yml +1 -2
  5. {pyquadp-2.0.2 → pyquadp-2.0.4}/.github/workflows/linux-arm.yml +1 -2
  6. {pyquadp-2.0.2 → pyquadp-2.0.4}/.github/workflows/linux.yml +1 -2
  7. {pyquadp-2.0.2 → pyquadp-2.0.4}/.github/workflows/macos.yml +1 -2
  8. {pyquadp-2.0.2 → pyquadp-2.0.4}/.github/workflows/mypy.yml +2 -3
  9. {pyquadp-2.0.2 → pyquadp-2.0.4}/.github/workflows/old-numpy.yml +1 -2
  10. {pyquadp-2.0.2 → pyquadp-2.0.4}/.github/workflows/pypi.yml +1 -2
  11. {pyquadp-2.0.2 → pyquadp-2.0.4}/.github/workflows/pypy.yml +1 -2
  12. {pyquadp-2.0.2 → pyquadp-2.0.4}/.github/workflows/windows.yml +1 -2
  13. {pyquadp-2.0.2 → pyquadp-2.0.4}/.github/workflows/zizmor.yml +1 -1
  14. {pyquadp-2.0.2 → pyquadp-2.0.4}/PKG-INFO +1 -1
  15. {pyquadp-2.0.2 → pyquadp-2.0.4}/pyquadp/constant.py +2 -0
  16. {pyquadp-2.0.2 → pyquadp-2.0.4}/pyquadp/qiarray.c +27 -4
  17. {pyquadp-2.0.2 → pyquadp-2.0.4}/pyquadp/qint.c +33 -22
  18. {pyquadp-2.0.2 → pyquadp-2.0.4}/pyquadp.egg-info/PKG-INFO +1 -1
  19. {pyquadp-2.0.2 → pyquadp-2.0.4}/tests/qarray_test.py +48 -47
  20. {pyquadp-2.0.2 → pyquadp-2.0.4}/tests/qcarray_test.py +53 -52
  21. {pyquadp-2.0.2 → pyquadp-2.0.4}/tests/qiarray_test.py +52 -30
  22. {pyquadp-2.0.2 → pyquadp-2.0.4}/tests/qint_test.py +10 -0
  23. {pyquadp-2.0.2 → pyquadp-2.0.4}/.gitattributes +0 -0
  24. {pyquadp-2.0.2 → pyquadp-2.0.4}/.github/copilot-instructions.md +0 -0
  25. {pyquadp-2.0.2 → pyquadp-2.0.4}/.github/dependabot.yml +0 -0
  26. {pyquadp-2.0.2 → pyquadp-2.0.4}/.github/workflows/isort.yml +0 -0
  27. {pyquadp-2.0.2 → pyquadp-2.0.4}/.github/zizmor.yml +0 -0
  28. {pyquadp-2.0.2 → pyquadp-2.0.4}/.gitignore +0 -0
  29. {pyquadp-2.0.2 → pyquadp-2.0.4}/.pre-commit-config.yaml +0 -0
  30. {pyquadp-2.0.2 → pyquadp-2.0.4}/COPYING.txt +0 -0
  31. {pyquadp-2.0.2 → pyquadp-2.0.4}/MANIFEST.in +0 -0
  32. {pyquadp-2.0.2 → pyquadp-2.0.4}/README.md +0 -0
  33. {pyquadp-2.0.2 → pyquadp-2.0.4}/build.sh +0 -0
  34. {pyquadp-2.0.2 → pyquadp-2.0.4}/build_and_test.sh +0 -0
  35. {pyquadp-2.0.2 → pyquadp-2.0.4}/coverage.sh +0 -0
  36. {pyquadp-2.0.2 → pyquadp-2.0.4}/lint.sh +0 -0
  37. {pyquadp-2.0.2 → pyquadp-2.0.4}/pyproject.toml +0 -0
  38. {pyquadp-2.0.2 → pyquadp-2.0.4}/pyquadp/__init__.py +0 -0
  39. {pyquadp-2.0.2 → pyquadp-2.0.4}/pyquadp/__init__.pyi +0 -0
  40. {pyquadp-2.0.2 → pyquadp-2.0.4}/pyquadp/constant.pyi +0 -0
  41. {pyquadp-2.0.2 → pyquadp-2.0.4}/pyquadp/py.typed +0 -0
  42. {pyquadp-2.0.2 → pyquadp-2.0.4}/pyquadp/pyquadp.h +0 -0
  43. {pyquadp-2.0.2 → pyquadp-2.0.4}/pyquadp/qarray.pyi +0 -0
  44. {pyquadp-2.0.2 → pyquadp-2.0.4}/pyquadp/qcarray.c +0 -0
  45. {pyquadp-2.0.2 → pyquadp-2.0.4}/pyquadp/qcarray.h +0 -0
  46. {pyquadp-2.0.2 → pyquadp-2.0.4}/pyquadp/qcarray.pyi +0 -0
  47. {pyquadp-2.0.2 → pyquadp-2.0.4}/pyquadp/qcmath.py +0 -0
  48. {pyquadp-2.0.2 → pyquadp-2.0.4}/pyquadp/qcmath.pyi +0 -0
  49. {pyquadp-2.0.2 → pyquadp-2.0.4}/pyquadp/qcmathc.c +0 -0
  50. {pyquadp-2.0.2 → pyquadp-2.0.4}/pyquadp/qcmathc.h +0 -0
  51. {pyquadp-2.0.2 → pyquadp-2.0.4}/pyquadp/qcmplx.c +0 -0
  52. {pyquadp-2.0.2 → pyquadp-2.0.4}/pyquadp/qcmplx.h +0 -0
  53. {pyquadp-2.0.2 → pyquadp-2.0.4}/pyquadp/qfloat.c +0 -0
  54. {pyquadp-2.0.2 → pyquadp-2.0.4}/pyquadp/qfloat.h +0 -0
  55. {pyquadp-2.0.2 → pyquadp-2.0.4}/pyquadp/qfloatarray.c +0 -0
  56. {pyquadp-2.0.2 → pyquadp-2.0.4}/pyquadp/qfloatarray.h +0 -0
  57. {pyquadp-2.0.2 → pyquadp-2.0.4}/pyquadp/qiarray.h +0 -0
  58. {pyquadp-2.0.2 → pyquadp-2.0.4}/pyquadp/qiarray.pyi +0 -0
  59. {pyquadp-2.0.2 → pyquadp-2.0.4}/pyquadp/qint.h +0 -0
  60. {pyquadp-2.0.2 → pyquadp-2.0.4}/pyquadp/qmath.py +0 -0
  61. {pyquadp-2.0.2 → pyquadp-2.0.4}/pyquadp/qmath.pyi +0 -0
  62. {pyquadp-2.0.2 → pyquadp-2.0.4}/pyquadp/qmathc.c +0 -0
  63. {pyquadp-2.0.2 → pyquadp-2.0.4}/pyquadp/qmathc.h +0 -0
  64. {pyquadp-2.0.2 → pyquadp-2.0.4}/pyquadp/qmcmplx.pyi +0 -0
  65. {pyquadp-2.0.2 → pyquadp-2.0.4}/pyquadp/qmfloat.pyi +0 -0
  66. {pyquadp-2.0.2 → pyquadp-2.0.4}/pyquadp/qmint.pyi +0 -0
  67. {pyquadp-2.0.2 → pyquadp-2.0.4}/pyquadp.egg-info/SOURCES.txt +0 -0
  68. {pyquadp-2.0.2 → pyquadp-2.0.4}/pyquadp.egg-info/dependency_links.txt +0 -0
  69. {pyquadp-2.0.2 → pyquadp-2.0.4}/pyquadp.egg-info/requires.txt +0 -0
  70. {pyquadp-2.0.2 → pyquadp-2.0.4}/pyquadp.egg-info/top_level.txt +0 -0
  71. {pyquadp-2.0.2 → pyquadp-2.0.4}/setup.cfg +0 -0
  72. {pyquadp-2.0.2 → pyquadp-2.0.4}/setup.py +0 -0
  73. {pyquadp-2.0.2 → pyquadp-2.0.4}/tests/Makefile +0 -0
  74. {pyquadp-2.0.2 → pyquadp-2.0.4}/tests/conftest.py +0 -0
  75. {pyquadp-2.0.2 → pyquadp-2.0.4}/tests/fortran_test.py +0 -0
  76. {pyquadp-2.0.2 → pyquadp-2.0.4}/tests/import_order_test.py +0 -0
  77. {pyquadp-2.0.2 → pyquadp-2.0.4}/tests/qcmath_test.py +0 -0
  78. {pyquadp-2.0.2 → pyquadp-2.0.4}/tests/qcmplx_test.py +0 -0
  79. {pyquadp-2.0.2 → pyquadp-2.0.4}/tests/qfloat_test.py +0 -0
  80. {pyquadp-2.0.2 → pyquadp-2.0.4}/tests/qmath_test.py +0 -0
  81. {pyquadp-2.0.2 → pyquadp-2.0.4}/tests/quad.f90 +0 -0
  82. {pyquadp-2.0.2 → pyquadp-2.0.4}/tox.ini +0 -0
@@ -28,6 +28,6 @@ jobs:
28
28
  bandit -c pyproject.toml -r . -f sarif -o results.sarif || true
29
29
 
30
30
  - name: Upload SARIF file
31
- uses: github/codeql-action/upload-sarif@e46ed2cbd01164d986452f91f178727624ae40d7 # v4.35.3
31
+ uses: github/codeql-action/upload-sarif@9e0d7b8d25671d64c341c19c0152d693099fb5ba # v4.35.5
32
32
  with:
33
33
  sarif_file: results.sarif
@@ -16,6 +16,6 @@ jobs:
16
16
  - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
17
17
  with:
18
18
  python-version: "3.14"
19
- - uses: psf/black@c6755bb741b6481d6b3d3bb563c83fa060db96c9 # 26.3.1
19
+ - uses: psf/black@87928e6d6761a4a6d22250e1fee5601b3998086e # 26.5.1
20
20
  with:
21
21
  options: "--check --verbose"
@@ -52,7 +52,7 @@ jobs:
52
52
 
53
53
  # Initializes the CodeQL tools for scanning.
54
54
  - name: Initialize CodeQL
55
- uses: github/codeql-action/init@e46ed2cbd01164d986452f91f178727624ae40d7 # v4.35.3
55
+ uses: github/codeql-action/init@9e0d7b8d25671d64c341c19c0152d693099fb5ba # v4.35.5
56
56
  with:
57
57
  languages: ${{ matrix.language }}
58
58
  # If you wish to specify custom queries, you can do so here or in a config file.
@@ -70,7 +70,7 @@ jobs:
70
70
  pip-compile -o requirements.txt --extra test --strip-extras
71
71
  python -m pip install -r requirements.txt
72
72
 
73
- - uses: fortran-lang/setup-fortran@2a1b9c55897d827a9dfeb114408f3615e53b2b72 # v1
73
+ - uses: fortran-lang/setup-fortran@2a1b9c55897d827a9dfeb114408f3615e53b2b72 # v1.9.0
74
74
  id: setup-fortran
75
75
  with:
76
76
  compiler: gcc
@@ -82,6 +82,6 @@ jobs:
82
82
  python -m pip install dist/pyquadp*.whl
83
83
 
84
84
  - name: Perform CodeQL Analysis
85
- uses: github/codeql-action/analyze@e46ed2cbd01164d986452f91f178727624ae40d7 # v4.35.3
85
+ uses: github/codeql-action/analyze@9e0d7b8d25671d64c341c19c0152d693099fb5ba # v4.35.5
86
86
  with:
87
87
  category: "/language:${{matrix.language}}"
@@ -29,13 +29,12 @@ jobs:
29
29
 
30
30
  - name: Install dependencies
31
31
  run: |
32
- python -m pip install --upgrade pip==25.2
33
32
  python -m pip install build wheel pip-tools
34
33
  pip-compile -o requirements.txt --extra test --extra coverage --strip-extras
35
34
  python -m pip install -r requirements.txt
36
35
 
37
36
  - name: Setup fortran
38
- uses: fortran-lang/setup-fortran@2a1b9c55897d827a9dfeb114408f3615e53b2b72 # v1
37
+ uses: fortran-lang/setup-fortran@2a1b9c55897d827a9dfeb114408f3615e53b2b72 # v1.9.0
39
38
  with:
40
39
  compiler: ${{ matrix.toolchain.compiler }}
41
40
  version: ${{ matrix.toolchain.version }}
@@ -20,7 +20,7 @@ jobs:
20
20
  - {compiler: gcc, version: 15}
21
21
 
22
22
  steps:
23
- - uses: fortran-lang/setup-fortran@2a1b9c55897d827a9dfeb114408f3615e53b2b72 # v1
23
+ - uses: fortran-lang/setup-fortran@2a1b9c55897d827a9dfeb114408f3615e53b2b72 # v1.9.0
24
24
  id: setup-fortran
25
25
  with:
26
26
  compiler: ${{ matrix.toolchain.compiler }}
@@ -38,7 +38,6 @@ jobs:
38
38
 
39
39
  - name: Install dependencies
40
40
  run: |
41
- python -m pip install --upgrade pip==25.2
42
41
  python -m pip install build wheel pip-tools
43
42
  pip-compile -o requirements.txt --extra test --strip-extras
44
43
  python -m pip install -r requirements.txt
@@ -33,12 +33,11 @@ jobs:
33
33
 
34
34
  - name: Install dependencies
35
35
  run: |
36
- python -m pip install --upgrade pip==25.2
37
36
  python -m pip install build wheel pip-tools
38
37
  pip-compile -o requirements.txt --extra test --strip-extras
39
38
  python -m pip install -r requirements.txt
40
39
 
41
- - uses: fortran-lang/setup-fortran@2a1b9c55897d827a9dfeb114408f3615e53b2b72 # v1
40
+ - uses: fortran-lang/setup-fortran@2a1b9c55897d827a9dfeb114408f3615e53b2b72 # v1.9.0
42
41
  id: setup-fortran
43
42
  with:
44
43
  compiler: ${{ matrix.toolchain.compiler }}
@@ -32,12 +32,11 @@ jobs:
32
32
 
33
33
  - name: Install dependencies
34
34
  run: |
35
- python -m pip install --upgrade pip==25.2
36
35
  python -m pip install build wheel pip-tools
37
36
  pip-compile -o requirements.txt --extra test --strip-extras
38
37
  python -m pip install -r requirements.txt
39
38
 
40
- - uses: fortran-lang/setup-fortran@2a1b9c55897d827a9dfeb114408f3615e53b2b72 # v1
39
+ - uses: fortran-lang/setup-fortran@2a1b9c55897d827a9dfeb114408f3615e53b2b72 # v1.9.0
41
40
  id: setup-fortran
42
41
  with:
43
42
  compiler: ${{ matrix.toolchain.compiler }}
@@ -17,7 +17,7 @@ jobs:
17
17
  - {compiler: gcc, version: 14}
18
18
 
19
19
  steps:
20
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
20
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
21
21
  with:
22
22
  persist-credentials: false
23
23
  - name: Set up Python
@@ -28,10 +28,9 @@ jobs:
28
28
 
29
29
  - name: Install dependencies
30
30
  run: |
31
- python -m pip install --upgrade pip==25.2
32
31
  python -m pip install build wheel
33
32
 
34
- - uses: fortran-lang/setup-fortran@2a1b9c55897d827a9dfeb114408f3615e53b2b72 # v1
33
+ - uses: fortran-lang/setup-fortran@2a1b9c55897d827a9dfeb114408f3615e53b2b72 # v1.9.0
35
34
  id: setup-fortran
36
35
  with:
37
36
  compiler: ${{ matrix.toolchain.compiler }}
@@ -29,13 +29,12 @@ jobs:
29
29
 
30
30
  - name: Install dependencies
31
31
  run: |
32
- python -m pip install --upgrade pip==25.2
33
32
  python -m pip install build wheel pip-tools
34
33
  pip-compile -o requirements.txt --extra test --strip-extras
35
34
  python -m pip install -r requirements.txt
36
35
  python -m pip install numpy==2.1.0
37
36
 
38
- - uses: fortran-lang/setup-fortran@2a1b9c55897d827a9dfeb114408f3615e53b2b72 # v1
37
+ - uses: fortran-lang/setup-fortran@2a1b9c55897d827a9dfeb114408f3615e53b2b72 # v1.9.0
39
38
  id: setup-fortran
40
39
  with:
41
40
  compiler: ${{ matrix.toolchain.compiler }}
@@ -29,7 +29,7 @@ jobs:
29
29
  with:
30
30
  persist-credentials: false
31
31
 
32
- - uses: fortran-lang/setup-fortran@2a1b9c55897d827a9dfeb114408f3615e53b2b72 # v1
32
+ - uses: fortran-lang/setup-fortran@2a1b9c55897d827a9dfeb114408f3615e53b2b72 # v1.9.0
33
33
  id: setup-fortran
34
34
  with:
35
35
  compiler: gcc
@@ -40,7 +40,6 @@ jobs:
40
40
 
41
41
  - name: Install dependencies
42
42
  run: |
43
- python -m pip install --upgrade pip==25.2
44
43
  python -m pip install build wheel pip-tools auditwheel pipx
45
44
  pip-compile -o requirements.txt --extra test --strip-extras
46
45
  python -m pip install -r requirements.txt
@@ -29,13 +29,12 @@ jobs:
29
29
  - name: Install dependencies
30
30
  run: |
31
31
  sudo apt-get install -y libopenblas-dev
32
- pypy3 -m pip install --upgrade pip==25.2
33
32
  pypy3 -m pip install build wheel pip-tools
34
33
  pip-compile -o requirements.txt --extra test --strip-extras
35
34
  pypy3 -m pip install -r requirements.txt
36
35
 
37
36
 
38
- - uses: fortran-lang/setup-fortran@2a1b9c55897d827a9dfeb114408f3615e53b2b72 # v1
37
+ - uses: fortran-lang/setup-fortran@2a1b9c55897d827a9dfeb114408f3615e53b2b72 # v1.9.0
39
38
  id: setup-fortran
40
39
  with:
41
40
  compiler: ${{ matrix.toolchain.compiler }}
@@ -17,7 +17,7 @@ jobs:
17
17
 
18
18
 
19
19
  steps:
20
- - uses: fortran-lang/setup-fortran@2a1b9c55897d827a9dfeb114408f3615e53b2b72 # v1
20
+ - uses: fortran-lang/setup-fortran@2a1b9c55897d827a9dfeb114408f3615e53b2b72 # v1.9.0
21
21
  id: setup-fortran
22
22
  with:
23
23
  compiler: gcc
@@ -33,7 +33,6 @@ jobs:
33
33
 
34
34
  - name: Install dependencies
35
35
  run: |
36
- python -m pip install --upgrade pip==25.2
37
36
  python -m pip install build wheel pip-tools delvewheel
38
37
  pip-compile -o requirements.txt --extra test --strip-extras
39
38
  python -m pip install -r requirements.txt
@@ -34,7 +34,7 @@ jobs:
34
34
  GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
35
35
 
36
36
  - name: Upload SARIF file
37
- uses: github/codeql-action/upload-sarif@e46ed2cbd01164d986452f91f178727624ae40d7 # v4.35.3
37
+ uses: github/codeql-action/upload-sarif@9e0d7b8d25671d64c341c19c0152d693099fb5ba # v4.35.5
38
38
  with:
39
39
  sarif_file: results.sarif
40
40
  category: zizmor
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyquadp
3
- Version: 2.0.2
3
+ Version: 2.0.4
4
4
  Summary: Python's bindings for gcc's libquadmath
5
5
  Author-email: Robert Farmer <robert.j.farmer37@gmail.com>
6
6
  License-Expression: GPL-2.0-or-later
@@ -51,6 +51,7 @@ nanj = qcmplx(0.0, qfloat("nan"))
51
51
 
52
52
  # Ctype data
53
53
  c_qfloat = _ctypes.c_byte * 16
54
+ c_qint = _ctypes.c_byte * 16
54
55
 
55
56
 
56
57
  class c_qcmplx(_ctypes.Structure):
@@ -95,4 +96,5 @@ __all__ = [
95
96
  "nanj",
96
97
  "c_qfloat",
97
98
  "c_qcmplx",
99
+ "c_qint",
98
100
  ]
@@ -1573,18 +1573,41 @@ static int
1573
1573
  QuadIArray_setitem(PyObject *item, __int128 *data, void *array)
1574
1574
  {
1575
1575
  QuadIObject tmp;
1576
+ PyObject *index_obj = NULL;
1576
1577
 
1577
1578
  (void)array;
1578
1579
 
1579
1580
  if (PyObject_to_QuadIObject(item, &tmp, false)) {
1580
1581
  *data = tmp.value;
1581
- } else {
1582
- if (!PyErr_Occurred()) {
1583
- PyErr_SetString(PyExc_TypeError, "Failed to setitem in QuadIArray");
1582
+ return 0;
1583
+ }
1584
+
1585
+ if (PyErr_ExceptionMatches(PyExc_TypeError)) {
1586
+ PyErr_Clear();
1587
+ } else if (PyErr_Occurred()) {
1588
+ return -1;
1589
+ }
1590
+
1591
+ index_obj = PyNumber_Index(item);
1592
+ if (index_obj != NULL) {
1593
+ if (PyObject_to_QuadIObject(index_obj, &tmp, false)) {
1594
+ *data = tmp.value;
1595
+ Py_DECREF(index_obj);
1596
+ return 0;
1584
1597
  }
1598
+
1599
+ Py_DECREF(index_obj);
1585
1600
  return -1;
1586
1601
  }
1587
- return 0;
1602
+
1603
+ if (PyErr_ExceptionMatches(PyExc_TypeError)) {
1604
+ PyErr_Clear();
1605
+ PyErr_SetString(PyExc_TypeError, "Failed to setitem in QuadIArray");
1606
+ } else if (!PyErr_Occurred()) {
1607
+ PyErr_SetString(PyExc_TypeError, "Failed to setitem in QuadIArray");
1608
+ }
1609
+
1610
+ return -1;
1588
1611
  }
1589
1612
 
1590
1613
  static PyObject *
@@ -1049,6 +1049,8 @@ static __int128 QuadIObject_int128(QuadIObject * out) {
1049
1049
  bool
1050
1050
  PyObject_to_QuadIObject(PyObject * in, QuadIObject * out, const bool alloc)
1051
1051
  {
1052
+ PyObject *int_obj;
1053
+
1052
1054
  (void)alloc;
1053
1055
 
1054
1056
  if(QuadIObject_Check(in)){
@@ -1073,32 +1075,41 @@ PyObject_to_QuadIObject(PyObject * in, QuadIObject * out, const bool alloc)
1073
1075
  return true;
1074
1076
  }
1075
1077
 
1076
- if(PyNumber_Check(in)) {
1077
- // Is a number
1078
- if(PyLong_Check(in)){
1079
- // int
1080
- // Convert to string as we may be to big for PyLong
1081
- PyObject * str = PyUnicode_FromFormat("%S",in);
1082
- if (str == NULL) {
1083
- return false;
1084
- }
1085
- Py_ssize_t len;
1086
- const char *buf = PyUnicode_AsUTF8AndSize(str, &len);
1087
- if (buf==NULL){
1088
- Py_DECREF(str);
1089
- return false;
1090
- }
1091
-
1092
- if(!str_to_int128(buf,len,&out->value)){
1093
- Py_DECREF(str);
1094
- PyErr_SetString(PyExc_TypeError, "Could not convert int to integer quad precision.");
1095
- return false;
1096
- }
1078
+ int_obj = PyNumber_Index(in);
1079
+ if (int_obj != NULL) {
1080
+ // Convert integer-like values (including numpy integer scalars)
1081
+ // to string first so values outside C long long still parse correctly.
1082
+ PyObject *str = PyUnicode_FromFormat("%S", int_obj);
1083
+ if (str == NULL) {
1084
+ Py_DECREF(int_obj);
1085
+ return false;
1086
+ }
1097
1087
 
1088
+ Py_ssize_t len;
1089
+ const char *buf = PyUnicode_AsUTF8AndSize(str, &len);
1090
+ if (buf == NULL) {
1098
1091
  Py_DECREF(str);
1092
+ Py_DECREF(int_obj);
1093
+ return false;
1094
+ }
1099
1095
 
1100
- return true;
1096
+ if (!str_to_int128(buf, len, &out->value)) {
1097
+ Py_DECREF(str);
1098
+ Py_DECREF(int_obj);
1099
+ PyErr_SetString(PyExc_TypeError, "Could not convert int to integer quad precision.");
1100
+ return false;
1101
1101
  }
1102
+
1103
+ Py_DECREF(str);
1104
+ Py_DECREF(int_obj);
1105
+ return true;
1106
+ }
1107
+
1108
+ // Non-integral numerics (e.g., float, numpy floating scalars) are not valid qint inputs.
1109
+ if (PyErr_ExceptionMatches(PyExc_TypeError)) {
1110
+ PyErr_Clear();
1111
+ } else if (PyErr_Occurred()) {
1112
+ return false;
1102
1113
  }
1103
1114
 
1104
1115
  return false;
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyquadp
3
- Version: 2.0.2
3
+ Version: 2.0.4
4
4
  Summary: Python's bindings for gcc's libquadmath
5
5
  Author-email: Robert Farmer <robert.j.farmer37@gmail.com>
6
6
  License-Expression: GPL-2.0-or-later