|
63 | 63 | import com.oracle.graal.python.PythonLanguage;
|
64 | 64 | import com.oracle.graal.python.builtins.PythonBuiltinClassType;
|
65 | 65 | import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins;
|
| 66 | +import com.oracle.graal.python.builtins.modules.cext.PythonCextListBuiltins; |
66 | 67 | import com.oracle.graal.python.builtins.objects.PNone;
|
67 | 68 | import com.oracle.graal.python.builtins.objects.PythonAbstractObject.PInteropSubscriptNode;
|
| 69 | +import com.oracle.graal.python.builtins.objects.cext.PythonNativeClass; |
68 | 70 | import com.oracle.graal.python.builtins.objects.cext.PythonNativeObject;
|
69 | 71 | import com.oracle.graal.python.builtins.objects.cext.capi.CApiContext;
|
70 | 72 | import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.CreateMethodNode;
|
71 | 73 | import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.FromCharPointerNode;
|
| 74 | +import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.GetTypeMemberNode; |
72 | 75 | import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.SubRefCntNode;
|
73 | 76 | import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.PExternalFunctionWrapper;
|
| 77 | +import com.oracle.graal.python.builtins.objects.cext.capi.NativeMember; |
74 | 78 | import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.AsNativePrimitiveNode;
|
75 | 79 | import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.ConvertPIntToPrimitiveNode;
|
76 | 80 | import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.ImportCExtSymbolNode;
|
|
138 | 142 | import com.oracle.graal.python.nodes.util.CannotCastException;
|
139 | 143 | import com.oracle.graal.python.nodes.util.CastToJavaIntExactNode;
|
140 | 144 | import com.oracle.graal.python.nodes.util.CastToJavaIntLossyNode;
|
| 145 | +import com.oracle.graal.python.nodes.util.CastToJavaLongExactNode; |
141 | 146 | import com.oracle.graal.python.nodes.util.CastToJavaStringNode;
|
142 | 147 | import com.oracle.graal.python.runtime.PythonContext;
|
143 | 148 | import com.oracle.graal.python.runtime.PythonContext.GetThreadStateNode;
|
@@ -1976,6 +1981,7 @@ Object doGeneric(GraalHPyContext context, Object typeSpec, Object typeSpecParamA
|
1976 | 1981 | @Cached PythonObjectFactory factory,
|
1977 | 1982 | @Cached PCallHPyFunction callHelperFunctionNode,
|
1978 | 1983 | @Cached PCallHPyFunction callMallocNode,
|
| 1984 | + @Cached GetTypeMemberNode getMetaSizeNode, |
1979 | 1985 | @Cached ReadAttributeFromObjectNode readAttributeFromObjectNode,
|
1980 | 1986 | @Cached WriteAttributeToObjectNode writeAttributeToObjectNode,
|
1981 | 1987 | @Cached PyObjectCallMethodObjArgs callCreateTypeNode,
|
@@ -2020,18 +2026,29 @@ Object doGeneric(GraalHPyContext context, Object typeSpec, Object typeSpecParamA
|
2020 | 2026 | }
|
2021 | 2027 |
|
2022 | 2028 | // create the type object
|
2023 |
| - PythonClass metatype = (PythonClass) getMetatype(context, typeSpecParamArray, ptrLib, castToJavaIntNode, callHelperFunctionNode, hPyAsPythonObjectNode); |
| 2029 | + Object metatype = getMetatype(context, typeSpecParamArray, ptrLib, castToJavaIntNode, callHelperFunctionNode, hPyAsPythonObjectNode); |
2024 | 2030 | PythonModule pythonCextModule = PythonContext.get(this).lookupBuiltinModule(PythonCextBuiltins.PYTHON_CEXT);
|
2025 | 2031 | PythonClass newType = (PythonClass) callCreateTypeNode.execute(null, pythonCextModule, "PyTruffle_CreateType",
|
2026 | 2032 | names[1], bases, namespace, metatype != null ? metatype : PythonBuiltinClassType.PythonClass);
|
2027 | 2033 | // allocate additional memory for the metatype and set it
|
2028 |
| - if (metatype != null) { |
| 2034 | + long metaBasicSize = 0; |
| 2035 | + Object destroyFunc = null; |
| 2036 | + if (metatype instanceof PythonClass) { |
2029 | 2037 | // get basicsize of metatype and allocate it into
|
2030 | 2038 | // GraalHPyDef.OBJECT_HPY_NATIVE_SPACE
|
2031 |
| - long basicSize = metatype.basicSize; |
2032 |
| - Object dataPtr = callMallocNode.call(context, GraalHPyNativeSymbol.GRAAL_HPY_CALLOC, basicSize, 1L); |
2033 |
| - writeAttributeToObjectNode.execute(newType, GraalHPyDef.OBJECT_HPY_NATIVE_SPACE, dataPtr); |
2034 |
| - Object destroyFunc = metatype.hpyDestroyFunc; |
| 2039 | + PythonClass metaclass = (PythonClass) metatype; |
| 2040 | + metaBasicSize = metaclass.basicSize; |
| 2041 | + destroyFunc = metaclass.hpyDestroyFunc; |
| 2042 | + } else if (metatype instanceof PythonNativeClass) { |
| 2043 | + // This path is implemented only for completeness, |
| 2044 | + // but is not expected to happen often, hence the |
| 2045 | + // uncached nodes, no profiling and potential leak |
| 2046 | + Object sizeObj = getMetaSizeNode.execute(metatype, NativeMember.TP_BASICSIZE); |
| 2047 | + metaBasicSize = CastToJavaLongExactNode.getUncached().execute(sizeObj); |
| 2048 | + } |
| 2049 | + Object dataPtr = callMallocNode.call(context, GraalHPyNativeSymbol.GRAAL_HPY_CALLOC, metaBasicSize, 1L); |
| 2050 | + writeAttributeToObjectNode.execute(newType, GraalHPyDef.OBJECT_HPY_NATIVE_SPACE, dataPtr); |
| 2051 | + if (destroyFunc != null) { |
2035 | 2052 | context.createHandleReference(newType, dataPtr, destroyFunc != PNone.NO_VALUE ? destroyFunc : null);
|
2036 | 2053 | }
|
2037 | 2054 |
|
|
0 commit comments