this repo has no description
at trunk 120 lines 4.5 kB view raw
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