this repo has no description
at trunk 88 lines 3.5 kB view raw
1// Copyright (c) Facebook, Inc. and its affiliates. (http://www.facebook.com) 2#include "cpython-func.h" 3 4#include "api-handle.h" 5#include "builtins-module.h" 6#include "dict-builtins.h" 7#include "module-builtins.h" 8#include "object-builtins.h" 9#include "objects.h" 10#include "runtime.h" 11#include "structseq-builtins.h" 12#include "type-builtins.h" 13 14char* PyStructSequence_UnnamedField = const_cast<char*>("unnamed field"); 15 16namespace py { 17 18PY_EXPORT PyObject* PyStructSequence_GET_ITEM_Func(PyObject* structseq, 19 Py_ssize_t pos) { 20 Thread* thread = Thread::current(); 21 HandleScope scope(thread); 22 Object structseq_obj(&scope, ApiHandle::asObject(ApiHandle::fromPyObject(structseq))); 23 Object result(&scope, structseqGetItem(thread, structseq_obj, pos)); 24 return result.isUnbound() 25 ? nullptr 26 : ApiHandle::newReference(thread->runtime(), *result); 27} 28 29PY_EXPORT PyObject* PyStructSequence_GetItem(PyObject* structseq, 30 Py_ssize_t pos) { 31 return PyStructSequence_GET_ITEM_Func(structseq, pos); 32} 33 34PY_EXPORT PyObject* PyStructSequence_SET_ITEM_Func(PyObject* structseq, 35 Py_ssize_t pos, 36 PyObject* value) { 37 PyStructSequence_SetItem(structseq, pos, value); 38 return value; 39} 40 41PY_EXPORT void PyStructSequence_SetItem(PyObject* structseq, Py_ssize_t pos, 42 PyObject* value) { 43 Thread* thread = Thread::current(); 44 HandleScope scope(thread); 45 Object structseq_obj(&scope, ApiHandle::asObject(ApiHandle::fromPyObject(structseq))); 46 Object value_obj(&scope, value == nullptr 47 ? Unbound::object() 48 : ApiHandle::asObject(ApiHandle::fromPyObject(value))); 49 structseqSetItem(thread, structseq_obj, pos, value_obj); 50} 51 52PY_EXPORT PyObject* PyStructSequence_New(PyTypeObject* pytype) { 53 Thread* thread = Thread::current(); 54 HandleScope scope(thread); 55 Type type(&scope, ApiHandle::asObject(ApiHandle::fromPyTypeObject(pytype))); 56 Object result(&scope, structseqNew(thread, type)); 57 if (result.isErrorException()) return nullptr; 58 return ApiHandle::newReferenceWithManaged(thread->runtime(), *result); 59} 60 61PY_EXPORT PyTypeObject* PyStructSequence_NewType(PyStructSequence_Desc* desc) { 62 Thread* thread = Thread::current(); 63 HandleScope scope(thread); 64 Runtime* runtime = thread->runtime(); 65 66 word num_fields = 0; 67 for (PyStructSequence_Field* field = desc->fields; field->name != nullptr; 68 field++) { 69 num_fields++; 70 } 71 MutableTuple field_names(&scope, runtime->newMutableTuple(num_fields)); 72 for (word i = 0; i < num_fields; i++) { 73 const char* field_name = desc->fields[i].name; 74 field_names.atPut(i, field_name == PyStructSequence_UnnamedField 75 ? NoneType::object() 76 : Runtime::internStrFromCStr(thread, field_name)); 77 } 78 Tuple field_names_tuple(&scope, field_names.becomeImmutable()); 79 Str name(&scope, runtime->newStrFromCStr(desc->name)); 80 word flags = Type::Flag::kIsCPythonHeaptype | Type::Flag::kIsStructseq; 81 Object result(&scope, structseqNewType(thread, name, field_names_tuple, 82 desc->n_in_sequence, flags)); 83 if (result.isErrorException()) return nullptr; 84 return reinterpret_cast<PyTypeObject*>( 85 ApiHandle::newReferenceWithManaged(runtime, *result)); 86} 87 88} // namespace py