this repo has no description
1// Copyright (c) Facebook, Inc. and its affiliates. (http://www.facebook.com)
2#include "cpython-data.h"
3#include "cpython-func.h"
4
5#include "api-handle.h"
6#include "builtins-module.h"
7#include "function-builtins.h"
8#include "function-utils.h"
9#include "runtime.h"
10#include "type-utils.h"
11
12namespace py {
13
14PY_EXPORT PyTypeObject* PyDictProxy_Type_Ptr() {
15 Runtime* runtime = Thread::current()->runtime();
16 return reinterpret_cast<PyTypeObject*>(ApiHandle::borrowedReference(
17 runtime, runtime->typeAt(LayoutId::kMappingProxy)));
18}
19
20PY_EXPORT PyObject* PyDescr_NAME_Func(PyObject* obj) {
21 Thread* thread = Thread::current();
22 HandleScope scope(thread);
23 Object descr_obj(&scope, ApiHandle::asObject(ApiHandle::fromPyObject(obj)));
24 Runtime* runtime = thread->runtime();
25 if (descr_obj.isFunction()) {
26 // Method
27 Function descr(&scope, *descr_obj);
28 return ApiHandle::borrowedReference(runtime, descr.name());
29 }
30 if (descr_obj.isProperty()) {
31 // GetSet
32 Property descr(&scope, *descr_obj);
33 Object getter(&scope, descr.getter());
34 if (getter.isFunction()) {
35 Function func(&scope, *getter);
36 return ApiHandle::borrowedReference(runtime, func.name());
37 }
38 Object setter(&scope, descr.setter());
39 if (setter.isFunction()) {
40 Function func(&scope, *setter);
41 return ApiHandle::borrowedReference(runtime, func.name());
42 }
43 Object deleter(&scope, descr.deleter());
44 if (deleter.isFunction()) {
45 Function func(&scope, *deleter);
46 return ApiHandle::borrowedReference(runtime, func.name());
47 }
48 UNIMPLEMENTED("property without getter or setter");
49 }
50 // ClassMethod
51 if (DCHECK_IS_ON()) {
52 Object descrclassmethod(&scope,
53 runtime->lookupNameInModule(thread, ID(builtins),
54 ID(_descrclassmethod)));
55 DCHECK(descrclassmethod.isType(), "missing _descrclassmethod");
56 DCHECK(runtime->typeOf(*descr_obj) == descrclassmethod,
57 "unexpected type in PyDescr_NAME");
58 }
59 Object fn(&scope, SmallStr::fromCStr("fn"));
60 Function func(&scope, getAttribute(thread, descr_obj, fn));
61 return ApiHandle::borrowedReference(runtime, func.name());
62}
63
64PY_EXPORT PyObject* PyDescr_NewClassMethod(PyTypeObject* type,
65 PyMethodDef* method) {
66 Thread* thread = Thread::current();
67 HandleScope scope(thread);
68 Object name(&scope, Runtime::internStrFromCStr(thread, method->ml_name));
69 Object type_obj(
70 &scope,
71 ApiHandle::asObject(ApiHandle::fromPyObject(reinterpret_cast<PyObject*>(type))));
72 return ApiHandle::newReferenceWithManaged(
73 thread->runtime(), newClassMethod(thread, method, name, type_obj));
74}
75
76PY_EXPORT PyObject* PyDictProxy_New(PyObject* mapping) {
77 Thread* thread = Thread::current();
78 HandleScope scope(thread);
79 Object mapping_obj(&scope, ApiHandle::asObject(ApiHandle::fromPyObject(mapping)));
80 Object result(&scope, thread->invokeFunction1(ID(builtins), ID(mappingproxy),
81 mapping_obj));
82 if (result.isError()) return nullptr;
83 return ApiHandle::newReferenceWithManaged(thread->runtime(), *result);
84}
85
86PY_EXPORT PyObject* PyDescr_NewGetSet(PyTypeObject*, PyGetSetDef* def) {
87 Thread* thread = Thread::current();
88 HandleScope scope(thread);
89 Object name(&scope, Runtime::internStrFromCStr(thread, def->name));
90 return ApiHandle::newReferenceWithManaged(thread->runtime(),
91 newGetSet(thread, name, def));
92}
93
94PY_EXPORT PyObject* PyDescr_NewMember(PyTypeObject* /* e */,
95 PyMemberDef* /* r */) {
96 UNIMPLEMENTED("PyDescr_NewMember");
97}
98
99PY_EXPORT PyObject* PyDescr_NewMethod(PyTypeObject* type, PyMethodDef* method) {
100 Thread* thread = Thread::current();
101 HandleScope scope(thread);
102 Object name(&scope, Runtime::internStrFromCStr(thread, method->ml_name));
103 Object type_obj(
104 &scope,
105 ApiHandle::asObject(ApiHandle::fromPyObject(reinterpret_cast<PyObject*>(type))));
106 return ApiHandle::newReferenceWithManaged(
107 thread->runtime(), newMethod(thread, method, name, type_obj));
108}
109
110PY_EXPORT PyTypeObject* PyProperty_Type_Ptr() {
111 Runtime* runtime = Thread::current()->runtime();
112 return reinterpret_cast<PyTypeObject*>(ApiHandle::borrowedReference(
113 runtime, runtime->typeAt(LayoutId::kProperty)));
114}
115
116PY_EXPORT PyObject* PyWrapper_New(PyObject* /* d */, PyObject* /* f */) {
117 UNIMPLEMENTED("PyWrapper_New");
118}
119
120} // namespace py