Closures/Value capture: Difference between revisions

Content added Content deleted
No edit summary
Line 26: Line 26:


<lang c>#include <stdio.h>
<lang c>#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <string.h>
#include <stdlib.h>
#include <sys/mman.h>


typedef int (*f_int)();
typedef int (*f_int)();

#define TAG 0xdeadbeef
#define TAG 0xdeadbeef
int _tmpl() {
int _tmpl() {
Line 37: Line 38:
}
}


#define PROT (PROT_EXEC | PROT_WRITE)
#define FLAGS (MAP_PRIVATE | MAP_ANONYMOUS)
f_int dupf(int v)
f_int dupf(int v)
{
{
size_t len = (void*)dupf - (void*)_tmpl;
size_t len = (void*)dupf - (void*)_tmpl;
f_int ret = malloc(len);
f_int ret = mmap(NULL, len, PROT, FLAGS, 0, 0);
char *p;
char *p;
if(ret == MAP_FAILED) {
perror("mmap");
exit(-1);
}
memcpy(ret, _tmpl, len);
memcpy(ret, _tmpl, len);
for (p = (char*)ret; p < (char*)ret + len - sizeof(int); p++)
for (p = (char*)ret; p < (char*)ret + len - sizeof(int); p++)
Line 47: Line 54:
return ret;
return ret;
}
}

int main()
int main()
{
{
Line 53: Line 60:
int i;
int i;
for (i = 0; i < 10; i++) funcs[i] = dupf(i);
for (i = 0; i < 10; i++) funcs[i] = dupf(i);

for (i = 0; i < 9; i++)
for (i = 0; i < 9; i++)
printf("func[%d]: %d\n", i, funcs[i]());
printf("func[%d]: %d\n", i, funcs[i]());

return 0;
return 0;
}</lang>output<lang>func[0]: 0
}</lang>output<lang>func[0]: 0