1- # Copyright (c) 2022, 2024 , Oracle and/or its affiliates. All rights reserved.
1+ # Copyright (c) 2022, 2026 , Oracle and/or its affiliates. All rights reserved.
22# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
33#
44# The Universal Permissive License (UPL), Version 1.0
@@ -101,6 +101,22 @@ def test_member(self):
101101 return Py_None;
102102 }
103103
104+ PyObject* set_string_inplace(PyObject *self, PyObject *arg) {
105+ TestMemberObject *tmo = (TestMemberObject *)self;
106+ Py_ssize_t len;
107+ const char *utf8 = PyUnicode_AsUTF8AndSize(arg, &len);
108+ if (utf8 == NULL)
109+ return NULL;
110+ if (len >= (Py_ssize_t)sizeof(tmo->member_string_inplace)) {
111+ PyErr_SetString(PyExc_ValueError, "string too long");
112+ return NULL;
113+ }
114+ memcpy(tmo->member_string_inplace, utf8, len);
115+ tmo->member_string_inplace[len] = 0;
116+ Py_INCREF(Py_None);
117+ return Py_None;
118+ }
119+
104120 PyObject* get_min_values(PyObject *self) {
105121 PyObject *result = PyTuple_New(9);
106122 PyTuple_SetItem(result, 0, PyLong_FromSsize_t(CHAR_MIN));
@@ -138,6 +154,7 @@ def test_member(self):
138154 float member_float;
139155 double member_double;
140156 char *member_string;
157+ char member_string_inplace[8];
141158 char member_char;
142159 char member_byte;
143160 unsigned char member_ubyte;
@@ -159,6 +176,7 @@ def test_member(self):
159176 {"member_float", T_FLOAT, offsetof(TestMemberObject, member_float), 0, "float member"},
160177 {"member_double", T_DOUBLE, offsetof(TestMemberObject, member_double), 0, "double member"},
161178 {"member_string", T_STRING, offsetof(TestMemberObject, member_string), 0, "string member"},
179+ {"member_string_inplace", T_STRING_INPLACE, offsetof(TestMemberObject, member_string_inplace), 0, "string inplace member"},
162180 {"member_char", T_CHAR, offsetof(TestMemberObject, member_char), 0, "char member"},
163181 {"member_byte", T_BYTE, offsetof(TestMemberObject, member_byte), 0, "byte member"},
164182 {"member_ubyte", T_UBYTE, offsetof(TestMemberObject, member_ubyte), 0, "ubyte member"},
@@ -172,6 +190,7 @@ def test_member(self):
172190 """ ,
173191 tp_methods = '''
174192 {"set_string", (PyCFunction)set_string, METH_O, ""},
193+ {"set_string_inplace", (PyCFunction)set_string_inplace, METH_O, ""},
175194 {"get_min_values", (PyCFunction)get_min_values, METH_NOARGS, ""},
176195 {"get_max_values", (PyCFunction)get_max_values, METH_NOARGS, ""}
177196 ''' ,
@@ -277,6 +296,19 @@ def test_member(self):
277296 assert type (obj .member_string ) is str
278297 assert obj .member_string == "hello"
279298
299+ # T_STRING_INPLACE
300+ assert type (obj .member_string_inplace ) is str
301+ assert obj .member_string_inplace == ""
302+ assert_raises (TypeError , delattr , obj , "member_string_inplace" )
303+ assert_raises (TypeError , setattr , obj , "member_string_inplace" , "hello" )
304+ obj .set_string_inplace ("hello" )
305+ assert type (obj .member_string_inplace ) is str
306+ assert obj .member_string_inplace == "hello"
307+ obj .set_string_inplace ("hi" )
308+ assert obj .member_string_inplace == "hi"
309+ assert_raises (ValueError , obj .set_string_inplace , "too long" )
310+ assert obj .member_string_inplace == "hi"
311+
280312 # T_CHAR
281313 assert type (obj .member_char ) is str
282314 assert obj .member_char == "\x00 " , "was: %r" % obj .member_char
0 commit comments