|
53 | 53 | import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObjectTransfer;
|
54 | 54 | import static com.oracle.graal.python.nodes.ErrorMessages.S_NEEDS_S_AS_FIRST_ARG;
|
55 | 55 | import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___DOC__;
|
| 56 | +import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___FILE__; |
56 | 57 | import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___NAME__;
|
57 | 58 | import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___PACKAGE__;
|
58 | 59 | import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING;
|
|
65 | 66 | import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiTernaryBuiltinNode;
|
66 | 67 | import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiUnaryBuiltinNode;
|
67 | 68 | import com.oracle.graal.python.builtins.modules.cext.PythonCextMethodBuiltins.CFunctionNewExMethodNode;
|
| 69 | +import com.oracle.graal.python.builtins.objects.PNone; |
68 | 70 | import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.CheckPrimitiveFunctionResultNode;
|
69 | 71 | import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.ExternalFunctionInvokeNode;
|
70 | 72 | import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.PExternalFunctionWrapper;
|
|
94 | 96 | import com.oracle.truffle.api.dsl.Bind;
|
95 | 97 | import com.oracle.truffle.api.dsl.Cached;
|
96 | 98 | import com.oracle.truffle.api.dsl.Cached.Shared;
|
| 99 | +import com.oracle.truffle.api.dsl.Fallback; |
97 | 100 | import com.oracle.truffle.api.dsl.ImportStatic;
|
98 | 101 | import com.oracle.truffle.api.dsl.Specialization;
|
99 | 102 | import com.oracle.truffle.api.interop.InteropLibrary;
|
@@ -297,4 +300,26 @@ static int doGeneric(PythonModule self, Object visitFun, Object arg,
|
297 | 300 | return 0;
|
298 | 301 | }
|
299 | 302 | }
|
| 303 | + |
| 304 | + @CApiBuiltin(ret = PyObjectTransfer, args = {PyObject}, call = Direct) |
| 305 | + abstract static class PyModule_GetFilenameObject extends CApiUnaryBuiltinNode { |
| 306 | + @Specialization |
| 307 | + static Object getFilename(PythonModule module, |
| 308 | + @Bind Node inliningTarget, |
| 309 | + @Cached ReadAttributeFromObjectNode read, |
| 310 | + @Cached PyUnicodeCheckNode check, |
| 311 | + @Cached PRaiseNode raiseNode) { |
| 312 | + Object file = read.execute(module, T___FILE__); |
| 313 | + if (file != PNone.NO_VALUE && check.execute(inliningTarget, file)) { |
| 314 | + return file; |
| 315 | + } |
| 316 | + throw raiseNode.raise(inliningTarget, SystemError, ErrorMessages.MODULE_FILENAME_MISSING); |
| 317 | + } |
| 318 | + |
| 319 | + @Fallback |
| 320 | + static Object error(@SuppressWarnings("unused") Object module, |
| 321 | + @Bind Node inliningTarget) { |
| 322 | + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.BAD_ARG_TO_INTERNAL_FUNC); |
| 323 | + } |
| 324 | + } |
300 | 325 | }
|
0 commit comments