/
helper.h
72 lines (57 loc) · 1.78 KB
/
helper.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#ifndef SDL_PERL_HELPER_H
#define SDL_PERL_HELPER_H
PerlInterpreter * perl = NULL;
void *bag2obj( SV *bag )
{
void *obj = NULL;
if( sv_isobject(bag) && (SvTYPE(SvRV(bag)) == SVt_PVMG) ) {
void **pointers = (void **)(SvIV((SV *)SvRV( bag )));
obj = (void *)(pointers[0]);
}
return obj;
}
SV *obj2bag( int size_ptr, void *obj, char *CLASS )
{
SV * objref = newSV( size_ptr );
void** pointers = malloc(2 * sizeof(void*));
pointers[0] = (void*)obj;
pointers[1] = (void*)PERL_GET_CONTEXT;
sv_setref_pv( objref, CLASS, (void *)pointers);
return objref;
}
SV *cpy2bag( void *object, int p_size, int s_size, char *package )
{
SV *ref = newSV( p_size );
void *copy = safemalloc( s_size );
memcpy( copy, object, s_size );
void** pointers = malloc(2 * sizeof(void*));
pointers[0] = (void*)copy;
pointers[1] = (void*)PERL_GET_CONTEXT;
return newSVsv(sv_setref_pv(ref, package, (void *)pointers));
}
void objDESTROY(SV *bag, void (* callback)(void *object))
{
if( sv_isobject(bag) && (SvTYPE(SvRV(bag)) == SVt_PVMG) )
{
void** pointers = (void**)(SvIV((SV*)SvRV( bag )));
void* object = pointers[0];
if (PERL_GET_CONTEXT == pointers[1])
{
pointers[0] = NULL;
if(object)
callback(object);
safefree(pointers);
}
}
}
SV *_sv_ref( void *object, int p_size, int s_size, char *package )
{
SV *ref = newSV( p_size );
void *copy = safemalloc( s_size );
memcpy( copy, object, s_size );
void** pointers = malloc(2 * sizeof(void*));
pointers[0] = (void*)copy;
pointers[1] = (void*)perl;
return newSVsv(sv_setref_pv(ref, package, (void *)pointers));
}
#endif