MCPcopy Create free account
hub / github.com/pydata/numexpr / NumExpr_setstate

Function NumExpr_setstate

numexpr3/numexpr_object.cpp:323–368  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

321}
322
323static PyObject*
324NumExpr_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
370static PyObject*
371NumExpr_print_state(NumExprObject *self, PyObject *args) {

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…