pycall 1.5.0 → 1.5.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/dependabot.yml +11 -0
- data/.github/workflows/ci.yml +5 -4
- data/CHANGES.md +18 -0
- data/ext/pycall/extconf.rb +2 -0
- data/ext/pycall/gc.c +6 -2
- data/ext/pycall/libpython.c +4 -0
- data/ext/pycall/pycall.c +22 -9
- data/ext/pycall/pycall_internal.h +9 -0
- data/ext/pycall/range.c +8 -2
- data/ext/pycall/ruby_wrapper.c +22 -11
- data/lib/pycall/version.rb +1 -1
- metadata +7 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c0793d5cd5f93c4eb9cd5938b7999799649db72f2abd35b4ae3247c450aec7ce
|
4
|
+
data.tar.gz: 404e3c06167a752f94cfc9051734a259725366f7c981c654e4f8744a3613c907
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2c8f666bb616b01f69bcd33130991cd22f9f2bfea3b67946e87550c846327032bd14d69d2522d8b83ee18db5551cea3bf0fa51f7043d7cfcfd8a8490c6bf04df
|
7
|
+
data.tar.gz: 041600f566b4d8158dc4772830ab1a8eb00479a82b118f0f135e20130d05d9047dba53b8ab32701c2bee20ec770a48cd540cd259d369163e64f4da775e7e26ae
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# To get started with Dependabot version updates, you'll need to specify which
|
2
|
+
# package ecosystems to update and where the package manifests are located.
|
3
|
+
# Please see the documentation for all configuration options:
|
4
|
+
# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file
|
5
|
+
|
6
|
+
version: 2
|
7
|
+
updates:
|
8
|
+
- package-ecosystem: "bundler" # See documentation for possible values
|
9
|
+
directory: "/" # Location of package manifests
|
10
|
+
schedule:
|
11
|
+
interval: "daily"
|
data/.github/workflows/ci.yml
CHANGED
@@ -25,6 +25,7 @@ jobs:
|
|
25
25
|
- ubuntu-20.04
|
26
26
|
- macos-latest
|
27
27
|
ruby:
|
28
|
+
- "3.3"
|
28
29
|
- "3.2"
|
29
30
|
- "3.1"
|
30
31
|
- "3.0"
|
@@ -42,6 +43,7 @@ jobs:
|
|
42
43
|
- { os: ubuntu-20.04 , ruby: 2.4 , python: "3.x" , python_architecture: x64 , venv: "" }
|
43
44
|
|
44
45
|
# Ruby 2.7 with Each Python 3.x
|
46
|
+
- { os: ubuntu-20.04 , ruby: 2.7 , python: "3.12" , python_architecture: x64 , venv: "" }
|
45
47
|
- { os: ubuntu-20.04 , ruby: 2.7 , python: "3.11" , python_architecture: x64 , venv: "" }
|
46
48
|
- { os: ubuntu-20.04 , ruby: 2.7 , python: "3.10" , python_architecture: x64 , venv: "" }
|
47
49
|
- { os: ubuntu-20.04 , ruby: 2.7 , python: "3.9" , python_architecture: x64 , venv: "" }
|
@@ -52,12 +54,11 @@ jobs:
|
|
52
54
|
# Ruby-debug with the latest Python 3
|
53
55
|
- { os: ubuntu-20.04 , ruby: debug , python: "3.x" , python_architecture: x64 , venv: "" }
|
54
56
|
|
55
|
-
# Ruby
|
56
|
-
- { os: ubuntu-20.04 , ruby: "3.
|
57
|
+
# The latest stable Ruby with the latest Python 3 with venv
|
58
|
+
- { os: ubuntu-20.04 , ruby: "3.3" , python: "3.x" , python_architecture: x64 , venv: "venv:" }
|
57
59
|
|
58
60
|
# macOS with venv
|
59
|
-
- { os: macos-latest , ruby: "3.
|
60
|
-
- { os: macos-latest , ruby: "3.1" , python: "3.8" , python_architecture: x64 , venv: "venv:" }
|
61
|
+
- { os: macos-latest , ruby: "3.3" , python: "3.x" , python_architecture: x64 , venv: "venv:" }
|
61
62
|
|
62
63
|
#- { os: macos-latest , ruby: debug , python: "3.x" , python_architecture: x64 , venv: "" }
|
63
64
|
|
data/CHANGES.md
CHANGED
@@ -1,5 +1,23 @@
|
|
1
1
|
# The change history of PyCall
|
2
2
|
|
3
|
+
## 1.5.2
|
4
|
+
|
5
|
+
* Fix memory leak with str(list) (#169).
|
6
|
+
|
7
|
+
*mknkmyza*
|
8
|
+
|
9
|
+
* Fix SEGV occured on Ruby process finalization.
|
10
|
+
|
11
|
+
* Fix for supporting Ruby >= 3.3.
|
12
|
+
|
13
|
+
* Fix for supporting Python >= 3.2.
|
14
|
+
|
15
|
+
## 1.5.1
|
16
|
+
|
17
|
+
* Fix memory leak in rich compare methods (#167, #168).
|
18
|
+
|
19
|
+
*mknkmyza*
|
20
|
+
|
3
21
|
## 1.5.0
|
4
22
|
|
5
23
|
* Fix to prevent distutils deprecation warning (#159)
|
data/ext/pycall/extconf.rb
CHANGED
data/ext/pycall/gc.c
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
#include "pycall_internal.h"
|
2
2
|
|
3
|
+
static ID id_gcguard_table;
|
4
|
+
|
3
5
|
struct gcguard {
|
4
6
|
st_table *guarded_objects;
|
5
7
|
};
|
@@ -24,6 +26,7 @@ gcguard_free(void* ptr)
|
|
24
26
|
{
|
25
27
|
struct gcguard *gg = (struct gcguard *)ptr;
|
26
28
|
st_free_table(gg->guarded_objects);
|
29
|
+
rb_ivar_set(mPyCall, id_gcguard_table, Qnil);
|
27
30
|
}
|
28
31
|
|
29
32
|
static size_t
|
@@ -69,7 +72,6 @@ gcguard_delete(VALUE gcguard, PyObject *pyptr)
|
|
69
72
|
}
|
70
73
|
}
|
71
74
|
|
72
|
-
static ID id_gcguard_table;
|
73
75
|
static PyObject *weakref_callback_pyobj;
|
74
76
|
static PyObject *gcguard_weakref_destroyed(PyObject *self, PyObject *weakref);
|
75
77
|
|
@@ -98,7 +100,9 @@ void
|
|
98
100
|
pycall_gcguard_delete(PyObject *pyobj)
|
99
101
|
{
|
100
102
|
VALUE gcguard = rb_ivar_get(mPyCall, id_gcguard_table);
|
101
|
-
|
103
|
+
if (!NIL_P(gcguard)) {
|
104
|
+
gcguard_delete(gcguard, pyobj);
|
105
|
+
}
|
102
106
|
}
|
103
107
|
|
104
108
|
void
|
data/ext/pycall/libpython.c
CHANGED
@@ -217,6 +217,10 @@ pycall_init_libpython_api_table(VALUE libpython_handle)
|
|
217
217
|
INIT_API_TABLE_ENTRY2(PyUnicode_DecodeUTF8, PyUnicodeUCS2_DecodeUTF8, required);
|
218
218
|
INIT_API_TABLE_ENTRY2(PyUnicode_FromFormatV, PyUnicodeUCS2_FromFormatV, required);
|
219
219
|
}
|
220
|
+
|
221
|
+
INIT_API_TABLE_ENTRY(PyGILState_Check, required);
|
222
|
+
INIT_API_TABLE_ENTRY(PyGILState_Ensure, required);
|
223
|
+
INIT_API_TABLE_ENTRY(PyGILState_Release, required);
|
220
224
|
}
|
221
225
|
|
222
226
|
void
|
data/ext/pycall/pycall.c
CHANGED
@@ -139,7 +139,15 @@ pycall_pyptr_free(void *ptr)
|
|
139
139
|
fprintf(stderr, "zero refcnt object %p of type %s\n", pyobj, Py_TYPE(pyobj)->tp_name);
|
140
140
|
}
|
141
141
|
#endif /* PYCALL_DEBUG_DUMP_REFCNT */
|
142
|
-
|
142
|
+
|
143
|
+
if (Py_API(PyGILState_Check())) {
|
144
|
+
pycall_Py_DecRef(pyobj);
|
145
|
+
}
|
146
|
+
else {
|
147
|
+
PyGILState_STATE gstate = Py_API(PyGILState_Ensure)();
|
148
|
+
pycall_Py_DecRef(pyobj);
|
149
|
+
Py_API(PyGILState_Release)(gstate);
|
150
|
+
}
|
143
151
|
}
|
144
152
|
|
145
153
|
static size_t _PySys_GetSizeOf(PyObject *);
|
@@ -792,8 +800,9 @@ pycall_libpython_helpers_m_compare(VALUE mod, VALUE op, VALUE pyptr_a, VALUE pyp
|
|
792
800
|
if (!res) {
|
793
801
|
pycall_pyerror_fetch_and_raise("PyObject_RichCompare in pycall_libpython_helpers_m_compare");
|
794
802
|
}
|
795
|
-
|
796
|
-
|
803
|
+
VALUE obj = pycall_pyobject_to_ruby(res);
|
804
|
+
pycall_Py_DecRef(res);
|
805
|
+
return obj;
|
797
806
|
}
|
798
807
|
|
799
808
|
static int is_pyobject_wrapper(VALUE obj);
|
@@ -1269,7 +1278,9 @@ pycall_libpython_helpers_m_str(VALUE mod, VALUE pyptr)
|
|
1269
1278
|
pycall_pyerror_fetch_and_raise("PyObject_Str");
|
1270
1279
|
}
|
1271
1280
|
|
1272
|
-
|
1281
|
+
VALUE v = pycall_pyobject_to_ruby(pyobj_str);
|
1282
|
+
pycall_Py_DecRef(pyobj_str);
|
1283
|
+
return v;
|
1273
1284
|
}
|
1274
1285
|
|
1275
1286
|
static VALUE
|
@@ -1689,19 +1700,21 @@ pycall_pyunicode_to_ruby(PyObject *pyobj)
|
|
1689
1700
|
return Qnil;
|
1690
1701
|
}
|
1691
1702
|
|
1692
|
-
|
1693
|
-
if (!
|
1703
|
+
PyObject *pyobj_uni = Py_API(PyUnicode_AsUTF8String)(pyobj);
|
1704
|
+
if (!pyobj_uni) {
|
1694
1705
|
Py_API(PyErr_Clear)();
|
1695
1706
|
return Qnil;
|
1696
1707
|
}
|
1697
1708
|
|
1698
|
-
res = Py_API(PyString_AsStringAndSize)(
|
1709
|
+
res = Py_API(PyString_AsStringAndSize)(pyobj_uni, &str, &len);
|
1699
1710
|
if (res < 0) {
|
1700
|
-
pycall_Py_DecRef(
|
1711
|
+
pycall_Py_DecRef(pyobj_uni);
|
1701
1712
|
return Qnil;
|
1702
1713
|
}
|
1703
1714
|
|
1704
|
-
|
1715
|
+
VALUE v = rb_enc_str_new(str, len, rb_enc_from_index(rb_utf8_encindex()));
|
1716
|
+
pycall_Py_DecRef(pyobj_uni);
|
1717
|
+
return v;
|
1705
1718
|
}
|
1706
1719
|
|
1707
1720
|
static VALUE
|
@@ -519,6 +519,11 @@ PyObject * PyRuby_New(VALUE ruby_object);
|
|
519
519
|
|
520
520
|
/* ==== thread support ==== */
|
521
521
|
|
522
|
+
typedef enum {
|
523
|
+
PyGILState_LOCKED,
|
524
|
+
PyGILState_UNLOCKED
|
525
|
+
} PyGILState_STATE;
|
526
|
+
|
522
527
|
#if defined(PYCALL_THREAD_WIN32)
|
523
528
|
typedef DWORD pycall_tls_key;
|
524
529
|
#elif defined(PYCALL_THREAD_PTHREAD)
|
@@ -669,6 +674,10 @@ typedef struct {
|
|
669
674
|
PyObject * (* PyUnicode_AsUTF8String)(PyObject *);
|
670
675
|
PyObject * (* PyUnicode_DecodeUTF8)(char const*, Py_ssize_t, char const *);
|
671
676
|
PyObject * (* PyUnicode_FromFormatV)(char const*, ...);
|
677
|
+
|
678
|
+
int (* PyGILState_Check)(void);
|
679
|
+
PyGILState_STATE (* PyGILState_Ensure)(void);
|
680
|
+
void (* PyGILState_Release)(PyGILState_STATE);
|
672
681
|
} pycall_libpython_api_table_t;
|
673
682
|
|
674
683
|
pycall_libpython_api_table_t *pycall_libpython_api_table(void);
|
data/ext/pycall/range.c
CHANGED
@@ -6,6 +6,12 @@ struct enumerator_head {
|
|
6
6
|
VALUE args;
|
7
7
|
};
|
8
8
|
|
9
|
+
#ifdef HAVE_RTYPEDDATA_GET_DATA
|
10
|
+
# define GET_ENUMERATOR_DATA(obj) ((struct enumerator_head *)RTYPEDDATA_GET_DATA(obj))
|
11
|
+
#else
|
12
|
+
# define GET_ENUMERATOR_DATA(obj) ((struct enumerator_head *)DATA_PTR(obj))
|
13
|
+
#endif
|
14
|
+
|
9
15
|
int
|
10
16
|
pycall_obj_is_step_range(VALUE obj)
|
11
17
|
{
|
@@ -19,7 +25,7 @@ pycall_obj_is_step_range(VALUE obj)
|
|
19
25
|
return 0;
|
20
26
|
}
|
21
27
|
|
22
|
-
eh = (
|
28
|
+
eh = GET_ENUMERATOR_DATA(obj);
|
23
29
|
|
24
30
|
if (!rb_obj_is_kind_of(eh->obj, rb_cRange)) {
|
25
31
|
return 0;
|
@@ -50,7 +56,7 @@ pycall_extract_range(VALUE obj, VALUE *pbegin, VALUE *pend, int *pexclude_end, V
|
|
50
56
|
exclude_end = rb_funcallv(obj, id_exclude_end, 0, 0);
|
51
57
|
}
|
52
58
|
else if (pycall_obj_is_step_range(obj)) {
|
53
|
-
struct enumerator_head *eh = (
|
59
|
+
struct enumerator_head *eh = GET_ENUMERATOR_DATA(obj);
|
54
60
|
begin = rb_funcallv(eh->obj, id_begin, 0, 0);
|
55
61
|
end = rb_funcallv(eh->obj, id_end, 0, 0);
|
56
62
|
exclude_end = rb_funcallv(eh->obj, id_exclude_end, 0, 0);
|
data/ext/pycall/ruby_wrapper.c
CHANGED
@@ -59,10 +59,11 @@ PyObject *
|
|
59
59
|
PyRuby_New(VALUE ruby_object)
|
60
60
|
{
|
61
61
|
if (!ruby_thread_has_gvl_p()) {
|
62
|
-
CALL_WITH_GVL(PyRuby_New_impl, ruby_object);
|
62
|
+
return CALL_WITH_GVL(PyRuby_New_impl, ruby_object);
|
63
|
+
}
|
64
|
+
else {
|
65
|
+
return PyRuby_New_impl(ruby_object);
|
63
66
|
}
|
64
|
-
|
65
|
-
return PyRuby_New_impl(ruby_object);
|
66
67
|
}
|
67
68
|
|
68
69
|
static void *
|
@@ -90,7 +91,9 @@ PyRuby_dealloc_with_gvl(PyRubyObject *pyro)
|
|
90
91
|
if (!ruby_thread_has_gvl_p()) {
|
91
92
|
CALL_WITH_GVL(PyRuby_dealloc, pyro);
|
92
93
|
}
|
93
|
-
|
94
|
+
else {
|
95
|
+
PyRuby_dealloc(pyro);
|
96
|
+
}
|
94
97
|
}
|
95
98
|
|
96
99
|
static PyObject *
|
@@ -114,7 +117,9 @@ PyRuby_repr_with_gvl(PyRubyObject *pyro)
|
|
114
117
|
if (!ruby_thread_has_gvl_p()) {
|
115
118
|
return CALL_WITH_GVL(PyRuby_repr, pyro);
|
116
119
|
}
|
117
|
-
|
120
|
+
else {
|
121
|
+
return PyRuby_repr(pyro);
|
122
|
+
}
|
118
123
|
}
|
119
124
|
|
120
125
|
#if SIZEOF_SSIZE_T < 8
|
@@ -154,7 +159,9 @@ PyRuby_hash_long_with_gvl(PyRubyObject *pyro)
|
|
154
159
|
if (!ruby_thread_has_gvl_p()) {
|
155
160
|
return (long)(intptr_t)CALL_WITH_GVL(PyRuby_hash_long, pyro);
|
156
161
|
}
|
157
|
-
|
162
|
+
else {
|
163
|
+
return (long)(intptr_t)PyRuby_hash_long(pyro);
|
164
|
+
}
|
158
165
|
}
|
159
166
|
|
160
167
|
static void *
|
@@ -185,7 +192,9 @@ PyRuby_hash_hash_t_with_gvl(PyRubyObject *pyro)
|
|
185
192
|
if (!ruby_thread_has_gvl_p()) {
|
186
193
|
return (Py_hash_t)CALL_WITH_GVL(PyRuby_hash_hash_t, pyro);
|
187
194
|
}
|
188
|
-
|
195
|
+
else {
|
196
|
+
return (Py_hash_t)PyRuby_hash_hash_t(pyro);
|
197
|
+
}
|
189
198
|
}
|
190
199
|
|
191
200
|
struct call_rb_funcallv_params {
|
@@ -269,8 +278,9 @@ PyRuby_call_with_gvl(PyRubyObject *pyro, PyObject *pyobj_args, PyObject *pyobj_k
|
|
269
278
|
if (!ruby_thread_has_gvl_p()) {
|
270
279
|
return CALL_WITH_GVL(PyRuby_call, ¶ms);
|
271
280
|
}
|
272
|
-
|
273
|
-
|
281
|
+
else {
|
282
|
+
return PyRuby_call(¶ms);
|
283
|
+
}
|
274
284
|
}
|
275
285
|
|
276
286
|
struct PyRuby_getattro_params {
|
@@ -348,8 +358,9 @@ PyRuby_getattro_with_gvl(PyRubyObject *pyro, PyObject *pyobj_name)
|
|
348
358
|
if (!ruby_thread_has_gvl_p()) {
|
349
359
|
return CALL_WITH_GVL(PyRuby_getattro, ¶ms);
|
350
360
|
}
|
351
|
-
|
352
|
-
|
361
|
+
else {
|
362
|
+
return PyRuby_getattro(¶ms);
|
363
|
+
}
|
353
364
|
}
|
354
365
|
|
355
366
|
/* ==== PyCall::PyRubyPtr ==== */
|
data/lib/pycall/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pycall
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.5.
|
4
|
+
version: 1.5.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kenta Murata
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-05-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -144,6 +144,7 @@ extensions:
|
|
144
144
|
- ext/pycall/extconf.rb
|
145
145
|
extra_rdoc_files: []
|
146
146
|
files:
|
147
|
+
- ".github/dependabot.yml"
|
147
148
|
- ".github/workflows/ci.yml"
|
148
149
|
- ".github/workflows/windows.yml"
|
149
150
|
- ".gitignore"
|
@@ -221,7 +222,7 @@ homepage: https://github.com/mrkn/pycall
|
|
221
222
|
licenses:
|
222
223
|
- MIT
|
223
224
|
metadata: {}
|
224
|
-
post_install_message:
|
225
|
+
post_install_message:
|
225
226
|
rdoc_options: []
|
226
227
|
require_paths:
|
227
228
|
- lib
|
@@ -236,8 +237,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
236
237
|
- !ruby/object:Gem::Version
|
237
238
|
version: '0'
|
238
239
|
requirements: []
|
239
|
-
rubygems_version: 3.
|
240
|
-
signing_key:
|
240
|
+
rubygems_version: 3.5.10
|
241
|
+
signing_key:
|
241
242
|
specification_version: 4
|
242
243
|
summary: pycall
|
243
244
|
test_files: []
|