Skip to content

Commit 557f3af

Browse files
committed
[GR-26688] Report compatible basic size for PyType_Type.
PullRequest: graalpython/1325
2 parents ee0c5a5 + 3fca90c commit 557f3af

File tree

73 files changed

+953
-751
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

73 files changed

+953
-751
lines changed

graalpython/com.oracle.graal.python.cext/include/Python.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@
4848
#define HAVE_SYS_WAIT_H
4949

5050
#define PYPY_VERSION 0
51-
#define PYPY_VERSION_NUM 0
51+
#define PYPY_VERSION_NUM 0x07030000
5252

5353
#include <stdio.h>
5454
#include <string.h>

graalpython/com.oracle.graal.python.cext/src/descrobject.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,3 +61,14 @@ PyObject* PyDictProxy_New(PyObject *mapping) {
6161
return (PyObject*) UPCALL_CEXT_O(_jls_PyDictProxy_New, native_to_java(mapping));
6262
}
6363

64+
UPCALL_ID(PyMethodDescr_Check);
65+
int PyMethodDescr_Check(PyObject* method) {
66+
return UPCALL_CEXT_I(_jls_PyMethodDescr_Check, native_to_java(method));
67+
}
68+
69+
typedef PyObject* (*new_classmethod_fun_t)(PyTypeObject*, void*, void*);
70+
71+
UPCALL_TYPED_ID(PyDescr_NewClassMethod, new_classmethod_fun_t);
72+
PyObject* PyDescr_NewClassMethod(PyTypeObject *type, PyMethodDef *method) {
73+
return _jls_PyDescr_NewClassMethod(native_type_to_java(type), native_pointer_to_java(method->ml_name), native_pointer_to_java(method->ml_meth));
74+
}
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
# Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
2+
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
3+
#
4+
# The Universal Permissive License (UPL), Version 1.0
5+
#
6+
# Subject to the condition set forth below, permission is hereby granted to any
7+
# person obtaining a copy of this software, associated documentation and/or
8+
# data (collectively the "Software"), free of charge and under any and all
9+
# copyright rights in the Software, and any and all patent rights owned or
10+
# freely licensable by each licensor hereunder covering either (i) the
11+
# unmodified Software as contributed to or provided by such licensor, or (ii)
12+
# the Larger Works (as defined below), to deal in both
13+
#
14+
# (a) the Software, and
15+
#
16+
# (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
17+
# one is included with the Software each a "Larger Work" to which the Software
18+
# is contributed by such licensors),
19+
#
20+
# without restriction, including without limitation the rights to copy, create
21+
# derivative works of, display, perform, and distribute the Software and make,
22+
# use, sell, offer for sale, import, export, have made, and have sold the
23+
# Software and the Larger Work(s), and to sublicense the foregoing rights on
24+
# either these or other terms.
25+
#
26+
# This license is subject to the following condition:
27+
#
28+
# The above copyright notice and either this complete permission notice or at a
29+
# minimum a reference to the UPL must be included in all copies or substantial
30+
# portions of the Software.
31+
#
32+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
33+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
34+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
35+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
36+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
37+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
38+
# SOFTWARE.
39+
40+
from . import CPyExtTestCase, CPyExtFunction, unhandled_error_compare
41+
__dir__ = __file__.rpartition("/")[0]
42+
43+
44+
def _reference_classmethod(args):
45+
if isinstance(args[0], type(list.append)):
46+
return classmethod(args[0])()
47+
raise TypeError
48+
49+
class TestDescr(CPyExtTestCase):
50+
51+
def compile_module(self, name):
52+
type(self).mro()[1].__dict__["test_%s" % name].create_module(name)
53+
super(TestDescr, self).compile_module(name)
54+
55+
test_PyDescr_NewClassMethod = CPyExtFunction(
56+
_reference_classmethod,
57+
lambda: (
58+
(type.__repr__,),
59+
(lambda x: x,),
60+
),
61+
code="""
62+
static PyObject* wrap_PyDescr_NewClassMethod(PyObject* method) {
63+
PyTypeObject *methoddescr_type = NULL;
64+
PyObject *meth = PyObject_GetAttrString((PyObject*)&PyList_Type, "append");
65+
if (!meth) return NULL;
66+
methoddescr_type = Py_TYPE(meth);
67+
Py_DECREF(meth);
68+
if (PyObject_TypeCheck(method, (PyTypeObject *)methoddescr_type)) {
69+
PyMethodDescrObject *descr = (PyMethodDescrObject *)method;
70+
PyTypeObject *d_type = descr->d_common.d_type;
71+
PyObject *class_method = PyDescr_NewClassMethod(d_type, descr->d_method);
72+
PyObject *args = PyTuple_New(0);
73+
Py_INCREF(args);
74+
PyObject *result = PyObject_CallObject(class_method, args);
75+
Py_DECREF(args); Py_DECREF(args);
76+
Py_DECREF(class_method);
77+
return result;
78+
}
79+
PyErr_SetString(PyExc_TypeError, "Class-level classmethod() can only be called on a method_descriptor or instance method.");
80+
return NULL;
81+
}
82+
""",
83+
resultspec="O",
84+
argspec="O",
85+
arguments=["PyObject* method"],
86+
callfunction="wrap_PyDescr_NewClassMethod",
87+
cmpfunc=unhandled_error_compare
88+
)

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/BuiltinConstructors.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,11 @@
2525
*/
2626
package com.oracle.graal.python.builtins.modules;
2727

28-
import static com.oracle.graal.python.builtins.objects.cext.NativeCAPISymbols.FUN_ADD_NATIVE_SLOTS;
29-
import static com.oracle.graal.python.builtins.objects.cext.NativeCAPISymbols.FUN_PY_OBJECT_NEW;
28+
import static com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbols.FUN_ADD_NATIVE_SLOTS;
29+
import static com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbols.FUN_PY_OBJECT_NEW;
3030
import static com.oracle.graal.python.builtins.objects.range.RangeUtils.canBeInt;
3131
import static com.oracle.graal.python.builtins.objects.range.RangeUtils.canBePint;
32+
import static com.oracle.graal.python.builtins.objects.type.TypeBuiltins.TYPE_ITEMSIZE;
3233
import static com.oracle.graal.python.nodes.BuiltinNames.BOOL;
3334
import static com.oracle.graal.python.nodes.BuiltinNames.BYTEARRAY;
3435
import static com.oracle.graal.python.nodes.BuiltinNames.BYTES;
@@ -71,6 +72,7 @@
7172
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__MODULE__;
7273
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__MRO_ENTRIES__;
7374
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__NAME__;
75+
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__QUALNAME__;
7476
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__SLOTS__;
7577
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__WEAKREF__;
7678
import static com.oracle.graal.python.nodes.SpecialMethodNames.DECODE;
@@ -112,9 +114,9 @@
112114
import com.oracle.graal.python.builtins.objects.bytes.PBytes;
113115
import com.oracle.graal.python.builtins.objects.bytes.PBytesLike;
114116
import com.oracle.graal.python.builtins.objects.cell.PCell;
115-
import com.oracle.graal.python.builtins.objects.cext.CExtNodes;
116-
import com.oracle.graal.python.builtins.objects.cext.CExtNodes.PCallCapiFunction;
117-
import com.oracle.graal.python.builtins.objects.cext.CExtNodesFactory;
117+
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes;
118+
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.PCallCapiFunction;
119+
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodesFactory;
118120
import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject;
119121
import com.oracle.graal.python.builtins.objects.cext.PythonNativeClass;
120122
import com.oracle.graal.python.builtins.objects.cext.PythonNativeVoidPtr;
@@ -170,7 +172,6 @@
170172
import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass;
171173
import com.oracle.graal.python.builtins.objects.type.PythonClass;
172174
import com.oracle.graal.python.builtins.objects.type.PythonManagedClass;
173-
import static com.oracle.graal.python.builtins.objects.type.TypeBuiltins.TYPE_ITEMSIZE;
174175
import com.oracle.graal.python.builtins.objects.type.TypeNodes;
175176
import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetBestBaseClassNode;
176177
import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetItemsizeNode;
@@ -182,7 +183,6 @@
182183
import com.oracle.graal.python.nodes.ErrorMessages;
183184
import com.oracle.graal.python.nodes.PGuards;
184185
import com.oracle.graal.python.nodes.SpecialAttributeNames;
185-
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__QUALNAME__;
186186
import com.oracle.graal.python.nodes.SpecialMethodNames;
187187
import static com.oracle.graal.python.nodes.SpecialMethodNames.__BYTES__;
188188
import com.oracle.graal.python.nodes.attributes.GetAttributeNode;

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/CtypesModuleBuiltins.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* The Universal Permissive License (UPL), Version 1.0
@@ -46,9 +46,9 @@
4646
import com.oracle.graal.python.builtins.CoreFunctions;
4747
import com.oracle.graal.python.builtins.PythonBuiltins;
4848
import com.oracle.graal.python.builtins.objects.PNone;
49-
import com.oracle.graal.python.builtins.objects.cext.CExtNodes.AsCharPointerNode;
50-
import com.oracle.graal.python.builtins.objects.cext.CExtNodes.GetNativeNullNode;
51-
import com.oracle.graal.python.builtins.objects.cext.CExtNodes.ToSulongNode;
49+
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.AsCharPointerNode;
50+
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.GetNativeNullNode;
51+
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.ToSulongNode;
5252
import com.oracle.graal.python.builtins.objects.str.PString;
5353
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
5454
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ExternalFunctionNodes.java

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -49,16 +49,16 @@
4949
import com.oracle.graal.python.builtins.modules.PythonCextBuiltins.PExternalFunctionWrapper;
5050
import com.oracle.graal.python.builtins.modules.PythonCextBuiltinsFactory.DefaultCheckFunctionResultNodeGen;
5151
import com.oracle.graal.python.builtins.objects.PNone;
52-
import com.oracle.graal.python.builtins.objects.cext.CApiGuards;
53-
import com.oracle.graal.python.builtins.objects.cext.CExtNodes;
54-
import com.oracle.graal.python.builtins.objects.cext.CExtNodes.ConvertArgsToSulongNode;
55-
import com.oracle.graal.python.builtins.objects.cext.CExtNodes.SubRefCntNode;
56-
import com.oracle.graal.python.builtins.objects.cext.CExtNodes.ToBorrowedRefNode;
57-
import com.oracle.graal.python.builtins.objects.cext.CExtNodes.ToJavaStealingNode;
58-
import com.oracle.graal.python.builtins.objects.cext.CExtNodesFactory.ToBorrowedRefNodeGen;
59-
import com.oracle.graal.python.builtins.objects.cext.CExtNodesFactory.ToJavaStealingNodeGen;
60-
import com.oracle.graal.python.builtins.objects.cext.DynamicObjectNativeWrapper;
61-
import com.oracle.graal.python.builtins.objects.cext.PythonNativeWrapper;
52+
import com.oracle.graal.python.builtins.objects.cext.capi.CApiGuards;
53+
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes;
54+
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.ConvertArgsToSulongNode;
55+
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.SubRefCntNode;
56+
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.ToBorrowedRefNode;
57+
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.ToJavaStealingNode;
58+
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodesFactory.ToBorrowedRefNodeGen;
59+
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodesFactory.ToJavaStealingNodeGen;
60+
import com.oracle.graal.python.builtins.objects.cext.capi.DynamicObjectNativeWrapper;
61+
import com.oracle.graal.python.builtins.objects.cext.capi.PythonNativeWrapper;
6262
import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.ConvertPIntToPrimitiveNode;
6363
import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodesFactory.ConvertPIntToPrimitiveNodeGen;
6464
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.ToArrayNode;
@@ -297,16 +297,14 @@ public static ExternalFunctionInvokeNode create(PExternalFunctionWrapper provide
297297
}
298298

299299
/**
300-
* Decrements the ref count by one of any
301-
* {@link com.oracle.graal.python.builtins.objects.cext.PythonNativeWrapper} object.
300+
* Decrements the ref count by one of any {@link PythonNativeWrapper} object.
302301
* <p>
303302
* This node avoids memory leaks for arguments given to native.<br>
304303
* Problem description:<br>
305-
* {@link com.oracle.graal.python.builtins.objects.cext.PythonNativeWrapper} objects given to C
306-
* code may go to native, i.e., a handle will be allocated. In this case, no ref count
307-
* manipulation is done since the C code considers the reference to be borrowed and the Python
308-
* code just doesn't do it because we have a GC. This means that the handle will stay allocated
309-
* and we are leaking the wrapper object.
304+
* {@link PythonNativeWrapper} objects given to C code may go to native, i.e., a handle will be
305+
* allocated. In this case, no ref count manipulation is done since the C code considers the
306+
* reference to be borrowed and the Python code just doesn't do it because we have a GC. This
307+
* means that the handle will stay allocated and we are leaking the wrapper object.
310308
* </p>
311309
*/
312310
abstract static class ReleaseNativeWrapperNode extends Node {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ImpModuleBuiltins.java

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@
6161
import com.oracle.graal.python.builtins.objects.PythonAbstractObjectFactory.PInteropGetAttributeNodeGen;
6262
import com.oracle.graal.python.builtins.objects.bytes.PBytes;
6363
import com.oracle.graal.python.builtins.objects.bytes.PBytesLike;
64-
import com.oracle.graal.python.builtins.objects.cext.CExtNodesFactory.AsPythonObjectNodeGen;
64+
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodesFactory.AsPythonObjectNodeGen;
6565
import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContext;
6666
import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyInitObject;
6767
import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodesFactory.HPyAsPythonObjectNodeGen;
@@ -93,7 +93,6 @@
9393
import com.oracle.graal.python.runtime.PythonOptions;
9494
import com.oracle.graal.python.runtime.exception.PException;
9595
import com.oracle.graal.python.util.PythonUtils;
96-
import com.oracle.truffle.api.Assumption;
9796
import com.oracle.truffle.api.CallTarget;
9897
import com.oracle.truffle.api.CompilerDirectives;
9998
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
@@ -178,12 +177,8 @@ public boolean run() {
178177
public abstract static class GetMagic extends PythonBuiltinNode {
179178
static final int MAGIC_NUMBER = 3413;
180179

181-
@Child IntBuiltins.ToBytesNode toBytesNode = IntBuiltins.ToBytesNode.create();
182-
@Child PythonObjectLibrary pol = PythonObjectLibrary.getFactory().createDispatched(1);
183-
184-
public static final Assumption singleContextAssumption() {
185-
return PythonLanguage.getCurrent().singleContextAssumption;
186-
}
180+
@Child private IntBuiltins.ToBytesNode toBytesNode = IntBuiltins.ToBytesNode.create();
181+
@Child private PythonObjectLibrary pol = PythonObjectLibrary.getFactory().createDispatched(1);
187182

188183
@Specialization(assumptions = "singleContextAssumption()")
189184
public PBytes runCachedSingleContext(@SuppressWarnings("unused") VirtualFrame frame,

0 commit comments

Comments
 (0)