Devel-PtrTable

 view release on metacpan or  search on metacpan

PtrTable.xs  view on Meta::CPAN

        mg;
        mg = mg->mg_moremagic
    ) {
        if(mg->mg_virtual == &vtbl) {
            break;
        }
    }
    
    if(!mg) {
        sv_dump(self);
        die("Couldn't find our magic!");
    }
    return (PTR_TBL_t*)mg->mg_ptr;
}

void _PtrTable_make_our_table(SV *self)
{    
    PTR_TBL_t *our_table = get_our_table(self);
    assert(PL_ptr_table);
    UV max = PL_ptr_table->tbl_max;
    UV i = 0;
    PTR_TBL_ENT_t *head_ent;
    for(i = 0; i <= max; i++) {
        for(head_ent = PL_ptr_table->tbl_ary[i];
            head_ent;
            head_ent = head_ent->next)
        {
            ptr_table_store(our_table, head_ent->oldval, head_ent->newval);
        }
    }
}

SV *_PtrTable_get(SV *self, UV addr)
{
    PTR_TBL_t *our_table = get_our_table(self);
    SV *ret = ptr_table_fetch(our_table, (void*)addr);
    if(!ret) {
        ret = &PL_sv_undef;
    } else {
        ret = newRV_inc(ret);
    }
    /*else*/
    return ret;
}

void _PtrTable_freecopied(SV *self)
{
    PTR_TBL_t *our_table = get_our_table(self);
    ptr_table_free(our_table);
}
MODULE = Devel::PtrTable	PACKAGE = Devel::PtrTable	

PROTOTYPES: DISABLE


void
_PtrTable_init (self)
	SV *	self
	PREINIT:
	I32* temp;
	PPCODE:
	temp = PL_markstack_ptr++;
	_PtrTable_init(self);
	if (PL_markstack_ptr != temp) {
          /* truly void, because dXSARGS not invoked */
	  PL_markstack_ptr = temp;
	  XSRETURN_EMPTY; /* return empty stack */
        }
        /* must have used dXSARGS; list context implied */
	return; /* assume stack size is correct */

void
_PtrTable_make_our_table (self)
	SV *	self
	PREINIT:
	I32* temp;
	PPCODE:
	temp = PL_markstack_ptr++;
	_PtrTable_make_our_table(self);
	if (PL_markstack_ptr != temp) {
          /* truly void, because dXSARGS not invoked */
	  PL_markstack_ptr = temp;
	  XSRETURN_EMPTY; /* return empty stack */
        }
        /* must have used dXSARGS; list context implied */
	return; /* assume stack size is correct */

SV *
_PtrTable_get (self, addr)
	SV *	self
	UV	addr

void
_PtrTable_freecopied (self)
	SV *	self
	PREINIT:
	I32* temp;
	PPCODE:
	temp = PL_markstack_ptr++;
	_PtrTable_freecopied(self);
	if (PL_markstack_ptr != temp) {
          /* truly void, because dXSARGS not invoked */
	  PL_markstack_ptr = temp;
	  XSRETURN_EMPTY; /* return empty stack */
        }
        /* must have used dXSARGS; list context implied */
	return; /* assume stack size is correct */



( run in 0.768 second using v1.01-cache-2.11-cpan-5511b514fd6 )