|
@@ -889,71 +889,22 @@ int rpnif_getbuffer(PyObject *self, Py_buffer *view, int flags)
|
889
|
889
|
PyRPNIterExpr_t *expr_self;
|
890
|
890
|
expr_self = (PyRPNIterExpr_t*)self;
|
891
|
891
|
|
892
|
|
- return PyObject_GetBuffer(expr_self->mmap, view, flags);
|
893
|
|
-
|
894
|
|
- rpn_if_default_data_t *data = (rpn_if_default_data_t*)expr_self->rif->params->data;
|
895
|
|
-
|
896
|
|
- view->buf = expr_self->rif->mem;
|
897
|
|
- view->obj = self;
|
898
|
|
- view->len = expr_self->rif->params->mem_sz * expr_self->rif->params->value_sz;
|
899
|
|
- view->readonly = 0;
|
900
|
|
- //view->itemsize = expr_self->rif->params->value_sz;
|
901
|
|
- view->itemsize = sizeof(rpn_value_t);
|
902
|
|
- if(flags & PyBUF_FORMAT)
|
903
|
|
- {
|
904
|
|
- view->format = "L";
|
905
|
|
- }
|
906
|
|
- else
|
|
892
|
+ if(expr_self->mmap)
|
907
|
893
|
{
|
908
|
|
- view->format = NULL;
|
|
894
|
+ return PyObject_GetBuffer(expr_self->mmap, view, flags);
|
909
|
895
|
}
|
910
|
|
- view->ndim = 1;
|
911
|
|
- view->shape = NULL;
|
912
|
|
- if(flags & PyBUF_ND)
|
913
|
|
- {
|
914
|
|
- view->ndim = expr_self->ndim;
|
915
|
|
-
|
916
|
|
- // !! Error if value_sz < sizeof(rpn_value_t) !!
|
917
|
|
- short nval = view->itemsize / sizeof(rpn_value_t);
|
918
|
|
- if(nval > 1)
|
919
|
|
- {
|
920
|
|
- view->ndim++;
|
921
|
|
- }
|
922
|
|
- view->shape = malloc(sizeof(Py_ssize_t) * view->ndim);
|
923
|
|
- if(!view->shape)
|
924
|
|
- {
|
925
|
|
- goto buff_error;
|
926
|
|
- }
|
927
|
|
- for(size_t i=0; i<expr_self->ndim; i++)
|
928
|
|
- {
|
929
|
|
- int idx = i;
|
930
|
|
- if(data->pos_flag == RPN_IF_POSITION_XDIM)
|
931
|
|
- {
|
932
|
|
- idx++;
|
933
|
|
- }
|
934
|
|
- view->shape[i] = data->size_lim[idx];
|
935
|
|
- }
|
936
|
|
- if(nval>1)
|
937
|
|
- {
|
938
|
|
- view->shape[expr_self->ndim] = nval;
|
939
|
|
- }
|
940
|
|
- }
|
941
|
|
- view->strides = NULL;
|
942
|
|
- view->suboffsets = NULL;
|
943
|
|
-
|
944
|
|
- Py_INCREF(self);
|
945
|
|
- return 0;
|
946
|
|
-
|
947
|
|
-buff_error:
|
948
|
|
- PyErr_Format(PyExc_BufferError,
|
949
|
|
- "Unable to provide buffer : %s", strerror(errno));
|
950
|
|
- view->obj = NULL;
|
951
|
|
- return -1;
|
|
896
|
+ return _rpnif_getbuffer_nopymap(self, expr_self->rif->params,
|
|
897
|
+ expr_self->_mmap, view, flags);
|
952
|
898
|
}
|
953
|
899
|
|
954
|
900
|
void rpnif_releasebuffer(PyObject *self, Py_buffer *view)
|
955
|
901
|
{
|
956
|
|
- free(view->shape);
|
|
902
|
+ PyRPNIterExpr_t *expr_self = (PyRPNIterExpr_t*)self;
|
|
903
|
+ if(expr_self->mmap)
|
|
904
|
+ {
|
|
905
|
+ return PyBuffer_Release(view);
|
|
906
|
+ }
|
|
907
|
+ return _rpnif_releasebuffer_nopymap(self, view);
|
957
|
908
|
}
|
958
|
909
|
|
959
|
910
|
PyObject* rpnif_str(PyObject *self)
|
|
@@ -1676,6 +1627,76 @@ err:
|
1676
|
1627
|
}
|
1677
|
1628
|
|
1678
|
1629
|
|
|
1630
|
+int _rpnif_getbuffer_nopymap(PyObject *self, const rpn_if_param_t *params,
|
|
1631
|
+ void *buf, Py_buffer *view, int flags)
|
|
1632
|
+{
|
|
1633
|
+ rpn_if_default_data_t *data = (rpn_if_default_data_t*)params->data;
|
|
1634
|
+
|
|
1635
|
+ view->buf = buf;
|
|
1636
|
+ view->obj = self;
|
|
1637
|
+ view->len = params->mem_sz * params->value_sz;
|
|
1638
|
+ view->readonly = 0;
|
|
1639
|
+ view->itemsize = sizeof(rpn_value_t);
|
|
1640
|
+ view->format = (flags & PyBUF_FORMAT)?"L":NULL;
|
|
1641
|
+ view->ndim = 1;
|
|
1642
|
+ view->shape = NULL;
|
|
1643
|
+ if(flags & PyBUF_ND)
|
|
1644
|
+ {
|
|
1645
|
+ short nval;
|
|
1646
|
+ switch(data->res_flag)
|
|
1647
|
+ {
|
|
1648
|
+ case RPN_IF_RES_BOOL:
|
|
1649
|
+ case RPN_IF_RES_CONST:
|
|
1650
|
+ case RPN_IF_RES_COUNT:
|
|
1651
|
+ nval = 1;
|
|
1652
|
+ break;
|
|
1653
|
+ case RPN_IF_RES_RGBA:
|
|
1654
|
+ case RPN_IF_RES_CONST_RGBA:
|
|
1655
|
+ nval = 4;
|
|
1656
|
+ break;
|
|
1657
|
+ case RPN_IF_RES_RGB:
|
|
1658
|
+ nval = 3;
|
|
1659
|
+ break;
|
|
1660
|
+ default:
|
|
1661
|
+ PyErr_SetString(PyExc_BufferError,
|
|
1662
|
+ "Unsupported result flag");
|
|
1663
|
+ return -1;
|
|
1664
|
+ }
|
|
1665
|
+ view->ndim += (nval>1)?1:0;
|
|
1666
|
+ if(!(view->shape = malloc(sizeof(Py_ssize_t) * view->ndim)))
|
|
1667
|
+ {
|
|
1668
|
+ PyErr_Format(PyExc_BufferError,
|
|
1669
|
+ "Buffer's shape allocation error : %s",
|
|
1670
|
+ strerror(errno));
|
|
1671
|
+ return -1;
|
|
1672
|
+ }
|
|
1673
|
+ for(size_t i=0; i<data->ndim; i++)
|
|
1674
|
+ {
|
|
1675
|
+ const int idx = i + \
|
|
1676
|
+ (data->pos_flag == RPN_IF_POSITION_XDIM)?1:0;
|
|
1677
|
+ view->shape[i] = data->size_lim[idx];
|
|
1678
|
+ }
|
|
1679
|
+ if(nval>1)
|
|
1680
|
+ {
|
|
1681
|
+ view->shape[data->ndim] = nval;
|
|
1682
|
+ }
|
|
1683
|
+
|
|
1684
|
+ }
|
|
1685
|
+ view->strides = NULL;
|
|
1686
|
+ view->suboffsets = NULL;
|
|
1687
|
+ Py_INCREF(self);
|
|
1688
|
+ return 0;
|
|
1689
|
+}
|
|
1690
|
+
|
|
1691
|
+
|
|
1692
|
+void _rpnif_releasebuffer_nopymap(PyObject *self, Py_buffer *view)
|
|
1693
|
+{
|
|
1694
|
+ if(view->shape) { free(view->shape); }
|
|
1695
|
+ view->buf = NULL;
|
|
1696
|
+ Py_DECREF(self);
|
|
1697
|
+}
|
|
1698
|
+
|
|
1699
|
+
|
1679
|
1700
|
int _rpnif_init_expr_tuple(PyRPNIterExpr_t *expr_self)
|
1680
|
1701
|
{
|
1681
|
1702
|
expr_self->expr = PyTuple_New(expr_self->rif->params->rpn_sz);
|