| 321 | } |
| 322 | |
| 323 | static PyObject* |
| 324 | NumExpr_setstate(NumExprObject *self, PyObject *args) { |
| 325 | // printf( "In __setstate__, ob_base: %p\n", &self->ob_base ); |
| 326 | npy_intp statePoint = 0, mem_offset = 0; |
| 327 | |
| 328 | PyObject *state_obj = NULL; |
| 329 | // Get 'state' from args |
| 330 | if( ! PyArg_ParseTuple(args, "S", &state_obj ) ) { |
| 331 | PyErr_Format(PyExc_RuntimeError, |
| 332 | "numexpr_object.cpp: Pickled state expected as bytes." ); |
| 333 | return NULL; |
| 334 | } |
| 335 | char* state = PyBytes_AsString( state_obj ); |
| 336 | |
| 337 | //memcpy( self+SIZEOF_PYOBJECT_HEAD, state+SIZEOF_PYOBJECT_HEAD, sizeof(NumExprObject)-SIZEOF_PYOBJECT_HEAD ); |
| 338 | memcpy( self, state, sizeof(NumExprObject) ); |
| 339 | statePoint += sizeof(NumExprObject); |
| 340 | |
| 341 | // Do some simple limit checks on program_len and n_reg |
| 342 | // printf( "TODO: checks, program_len: %d, n_reg: %d\n", self->program_len, self->n_reg ); |
| 343 | |
| 344 | // Load program |
| 345 | self->program = (NumExprOperation*)malloc( self->program_len*sizeof(NumExprOperation) ); |
| 346 | memcpy( self->program, state+statePoint, self->program_len*sizeof(NumExprOperation) ); |
| 347 | statePoint += self->program_len*sizeof(NumExprOperation); |
| 348 | |
| 349 | // Load registers |
| 350 | self->registers = (NumExprReg*)malloc( self->n_reg*sizeof(NumExprReg) ); |
| 351 | memcpy( self->registers, state+statePoint, self->n_reg*sizeof(NumExprReg) ); |
| 352 | statePoint += self->n_reg*sizeof(NumExprReg); |
| 353 | |
| 354 | // Load scalar_mem |
| 355 | self->scalar_mem = (char *)malloc( self->scalar_mem_size ); |
| 356 | memcpy( self->scalar_mem, state+statePoint, self->scalar_mem_size ); |
| 357 | // Restore scalar memory pointers in registers |
| 358 | |
| 359 | for ( NE_REGISTER R = 0; R < self->n_reg; R++) { |
| 360 | if( self->registers[R].kind != KIND_SCALAR ) continue; |
| 361 | // Set pointer in the register to the block in scalar_mem |
| 362 | self->registers[R].mem = self->scalar_mem + mem_offset; |
| 363 | // Advance memory pointer |
| 364 | mem_offset += self->registers[R].itemsize; |
| 365 | } |
| 366 | |
| 367 | return Py_BuildValue(""); |
| 368 | } |
| 369 | |
| 370 | static PyObject* |
| 371 | NumExpr_print_state(NumExprObject *self, PyObject *args) { |
nothing calls this directly
no outgoing calls
no test coverage detected
searching dependent graphs…