Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 28 additions & 30 deletions piconumpy/_piconumpy_hpy.c
Original file line number Diff line number Diff line change
@@ -1,23 +1,24 @@
#include "hpy.h"

typedef struct {
HPyObject_HEAD
/* Type-specific fields go here. */
double *data;
int size;
} ArrayObject;

HPyType_HELPERS(ArrayObject)

HPyDef_SLOT(Array_destroy, Array_destroy_impl, HPy_tp_destroy)
static void Array_destroy_impl(void *obj) {
ArrayObject *self = (ArrayObject *)obj;
free(self->data);
}

HPyDef_SLOT(Array_init, Array_init_impl, HPy_tp_init)
static int Array_init_impl(HPyContext ctx, HPy h_self, HPy *args,
static int Array_init_impl(HPyContext *ctx, HPy h_self, HPy *args,
HPy_ssize_t nargs, HPy kw) {
static const char *kwlist[] = {"data", NULL};
ArrayObject *self = HPy_CAST(ctx, ArrayObject, h_self);
ArrayObject *self = ArrayObject_AsStruct(ctx, h_self);
int index;
HPy h_data = HPy_NULL;
HPyTracker ht;
Expand Down Expand Up @@ -58,8 +59,8 @@ HPyDef_MEMBER(Array_size, "size", HPyMember_INT, offsetof(ArrayObject, size),

HPyDef_METH(Array_tolist, "tolist", Array_tolist_impl, HPyFunc_NOARGS,
.doc = "Return the data as a list")
static HPy Array_tolist_impl(HPyContext ctx, HPy h_self) {
ArrayObject *self = HPy_CAST(ctx, ArrayObject, h_self);
static HPy Array_tolist_impl(HPyContext *ctx, HPy h_self) {
ArrayObject *self = ArrayObject_AsStruct(ctx, h_self);
int index;
HPyListBuilder builder = HPyListBuilder_New(ctx, self->size);
for (index = 0; index < self->size; index++) {
Expand All @@ -70,10 +71,10 @@ static HPy Array_tolist_impl(HPyContext ctx, HPy h_self) {
return HPyListBuilder_Build(ctx, builder);
};

static HPy Array_empty(HPyContext ctx, int size, ArrayObject **result);
static HPy Array_empty(HPyContext *ctx, int size, ArrayObject **result);

HPyDef_SLOT(Array_multiply, Array_multiply_impl, HPy_nb_multiply)
static HPy Array_multiply_impl(HPyContext ctx, HPy h1, HPy h2) {
static HPy Array_multiply_impl(HPyContext *ctx, HPy h1, HPy h2) {
int index;
double number;
HPy h_number = HPy_NULL;
Expand All @@ -82,10 +83,10 @@ static HPy Array_multiply_impl(HPyContext ctx, HPy h1, HPy h2) {

if (HPyNumber_Check(ctx, h2)) {
h_number = h2;
arr = HPy_CAST(ctx, ArrayObject, h1);
arr = ArrayObject_AsStruct(ctx, h1);
} else if (HPyNumber_Check(ctx, h1)) {
h_number = h1;
arr = HPy_CAST(ctx, ArrayObject, h2);
arr = ArrayObject_AsStruct(ctx, h2);
}

if (HPyNumber_Check(ctx, h1) || HPyNumber_Check(ctx, h2)) {
Expand All @@ -100,12 +101,12 @@ static HPy Array_multiply_impl(HPyContext ctx, HPy h1, HPy h2) {
};

HPyDef_SLOT(Array_add, Array_add_impl, HPy_nb_add)
static HPy Array_add_impl(HPyContext ctx, HPy h1, HPy h2) {
static HPy Array_add_impl(HPyContext *ctx, HPy h1, HPy h2) {
int index;
ArrayObject *result = NULL, *a1, *a2;
HPy h_result = HPy_NULL;
a1 = HPy_CAST(ctx, ArrayObject, h1);
a2 = HPy_CAST(ctx, ArrayObject, h2);
a1 = ArrayObject_AsStruct(ctx, h1);
a2 = ArrayObject_AsStruct(ctx, h2);

if (a1->size != a2->size)
return HPy_NULL; /* XXX should raise an exception */
Expand All @@ -118,7 +119,7 @@ static HPy Array_add_impl(HPyContext ctx, HPy h1, HPy h2) {
};

HPyDef_SLOT(Array_divide, Array_divide_impl, HPy_nb_true_divide)
static HPy Array_divide_impl(HPyContext ctx, HPy h1, HPy h2) {
static HPy Array_divide_impl(HPyContext *ctx, HPy h1, HPy h2) {
int index;
double number;
ArrayObject *result = NULL, *a1;
Expand All @@ -127,7 +128,7 @@ static HPy Array_divide_impl(HPyContext ctx, HPy h1, HPy h2) {
if (!HPyNumber_Check(ctx, h2)) {
return HPy_NULL;
}
a1 = HPy_CAST(ctx, ArrayObject, h1);
a1 = ArrayObject_AsStruct(ctx, h1);
number = HPyFloat_AsDouble(ctx, h2);
h_result = Array_empty(ctx, a1->size, &result);
for (index = 0; index < a1->size; index++) {
Expand All @@ -138,16 +139,16 @@ static HPy Array_divide_impl(HPyContext ctx, HPy h1, HPy h2) {


HPyDef_SLOT(Array_length, Array_length_impl, HPy_sq_length)
HPy_ssize_t Array_length_impl(HPyContext ctx, HPy h_arr) {
ArrayObject *arr = HPy_CAST(ctx, ArrayObject, h_arr);
HPy_ssize_t Array_length_impl(HPyContext *ctx, HPy h_arr) {
ArrayObject *arr = ArrayObject_AsStruct(ctx, h_arr);
HPy_ssize_t result = (HPy_ssize_t)arr->size;
return result;
};


HPyDef_SLOT(Array_item, Array_item_impl, HPy_sq_item)
HPy Array_item_impl(HPyContext ctx, HPy h_arr, HPy_ssize_t index) {
ArrayObject *arr = HPy_CAST(ctx, ArrayObject, h_arr);
HPy Array_item_impl(HPyContext *ctx, HPy h_arr, HPy_ssize_t index) {
ArrayObject *arr = ArrayObject_AsStruct(ctx, h_arr);
if (index < 0 || index >= arr->size) {
HPyErr_SetString(ctx, ctx->h_IndexError, "index out of range");
return HPy_NULL;
Expand All @@ -157,8 +158,8 @@ HPy Array_item_impl(HPyContext ctx, HPy h_arr, HPy_ssize_t index) {
};

HPyDef_SLOT(Array_setitem, Array_setitem_impl, HPy_sq_ass_item)
int Array_setitem_impl(HPyContext ctx, HPy h_arr, HPy_ssize_t index, HPy h_item) {
ArrayObject *arr = HPy_CAST(ctx, ArrayObject, h_arr);
int Array_setitem_impl(HPyContext *ctx, HPy h_arr, HPy_ssize_t index, HPy h_item) {
ArrayObject *arr = ArrayObject_AsStruct(ctx, h_arr);
if (index < 0 || index >= arr->size) {
HPyErr_SetString(ctx, ctx->h_IndexError, "index out of range");
return -1;
Expand Down Expand Up @@ -201,7 +202,7 @@ static HPyType_Spec Array_type_spec = {

HPy h_ArrayType;

static HPy Array_empty(HPyContext ctx, int size, ArrayObject **result) {
static HPy Array_empty(HPyContext *ctx, int size, ArrayObject **result) {
ArrayObject *new_array;
HPy h_new_array = HPy_New(ctx, h_ArrayType, &new_array);
new_array->size = size;
Expand All @@ -214,15 +215,15 @@ static HPy Array_empty(HPyContext ctx, int size, ArrayObject **result) {
};

HPyDef_METH(empty, "empty", empty_impl, HPyFunc_O, .doc = "Create an empty array")
static HPy empty_impl(HPyContext ctx, HPy module, HPy arg) {
static HPy empty_impl(HPyContext *ctx, HPy module, HPy arg) {
int size;
ArrayObject *result;
size = (int)HPyLong_AsLong(ctx, arg);
return Array_empty(ctx, size, &result);
};

HPyDef_METH(zeros, "zeros", zeros_impl, HPyFunc_O, .doc = "Create a zero-filled array")
static HPy zeros_impl(HPyContext ctx, HPy module, HPy arg) {
static HPy zeros_impl(HPyContext *ctx, HPy module, HPy arg) {
int size;
ArrayObject *result;
size = (int)HPyLong_AsLong(ctx, arg);
Expand Down Expand Up @@ -250,20 +251,17 @@ static HPyModuleDef piconumpymodule = {
};

HPy_MODINIT(_piconumpy_hpy)
static HPy init__piconumpy_hpy_impl(HPyContext ctx) {
static HPy init__piconumpy_hpy_impl(HPyContext *ctx) {
HPy hm = HPyModule_Create(ctx, &piconumpymodule);
if (HPy_IsNull(hm))
return HPy_NULL;

h_ArrayType = HPyType_FromSpec(ctx, &Array_type_spec, NULL);
if (HPy_IsNull(h_ArrayType))
return HPy_NULL;

if (HPy_SetAttr_s(ctx, hm, "array", h_ArrayType) < 0) {
HPy_Close(ctx, h_ArrayType);
if (!HPyHelpers_AddType(ctx, hm, "array", &Array_type_spec, NULL)) {
HPy_Close(ctx, hm);
return HPy_NULL;
}

h_ArrayType = HPy_GetAttr_s(ctx, hm, "array");

return hm;
}