this repo has no description
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