X-Git-Url: http://uxul.de/gitweb/?p=lazyeval.git;a=blobdiff_plain;f=withMulklib.c;h=1da0e37f5aa396a669b7cde2c2298750f6753ade;hp=cf4bf4fc743db90d34cd3e62036ea0de11aed716;hb=9f57f92b36f36e6dfac6dd702432cbb4c8515f2b;hpb=402fadd089a83ccad4290012f38ed6dbc7b35317 diff --git a/withMulklib.c b/withMulklib.c index cf4bf4f..1da0e37 100644 --- a/withMulklib.c +++ b/withMulklib.c @@ -10,8 +10,26 @@ #define __USE_GNU #include +#include "lists.h" + /* This code is only for x86_64 gcc linux. It is NOT threadsafe. */ +void* slice_alloc (size_t length) { + static intptr_t *nextslice = NULL + 1; + static intptr_t *lastslice = NULL; + + int num = length / sizeof(intptr_t) + 1; + + if (lastslice < nextslice + num) { + nextslice = (intptr_t *)malloc(1024*sizeof(intptr_t)); + lastslice = nextslice + 1023; + } + + void* ret = (void*) nextslice; + nextslice += num; + return ret; +} + /* w00t, I am a three-star-programmer! */ void ***dereferencedPointer; void ***lastDereferencedPointer; @@ -78,8 +96,7 @@ void*** lazy_alloc (void* (*calculate) (void*), void* opt) { lockedPointer++; dereferencedPointer++; - /* we should use a slice allocator here */ - tree_entry *en = (tree_entry*) malloc (sizeof(tree_entry)); + tree_entry *en = (tree_entry*) slice_alloc (sizeof(tree_entry)); en->function = calculate; en->argument = opt; en->dereferencedPointer = ret; @@ -90,6 +107,8 @@ void*** lazy_alloc (void* (*calculate) (void*), void* opt) { return ret; } +void initializeSignalHandler(); + void handle_segv(int segv, siginfo_t* siginfo, void* ucontext) { ucontext_t* uc = (ucontext_t*) ucontext; @@ -198,7 +217,7 @@ void handle_segv(int segv, siginfo_t* siginfo, void* ucontext) { intptr_t address = uc->uc_mcontext.gregs[setreg]; if (!bpt_has_key(pointer_tree, address)) { - printf("Address not found in Patricia tree.\n"); + printf("Address not found in Patricia tree: %d.\n", address); exit(-1); } @@ -214,20 +233,46 @@ inline void initializeSignalHandler () { struct sigaction q; bzero(&q, sizeof(q)); q.sa_sigaction = handle_segv; - q.sa_flags = SA_SIGINFO; + q.sa_flags = SA_SIGINFO | SA_NODEFER; sigaction(11, &q, NULL); } -void *calculateLazy24 (void* bla) { - int* ret = (int*) malloc(sizeof(int)); - *ret = 42; +typedef struct { + int i; + int (*fun) (int, list); + list initial; +} listComprehensionRecursorR; + +void * listComprehensionRecursor (void* x) { + listComprehensionRecursorR* lcr = (listComprehensionRecursorR*) x; + int value = (lcr->fun)(lcr->i, lcr->initial); + lcr->i++; + + list cdr = (list) lazy_alloc(listComprehensionRecursor, (void*)lcr); + cons * ret = (cons*) slice_alloc(sizeof(cons)); + doCons(value, cdr, ret); return (void*) ret; } +list listComprehension (int (*fun) (int, list)) { + listComprehensionRecursorR* lcr = + (listComprehensionRecursorR*) slice_alloc + (sizeof(listComprehensionRecursorR)); + lcr->i = 0; + lcr->fun=fun; + lcr->initial = (list) lazy_alloc(listComprehensionRecursor, (void*)lcr); + return lcr->initial; +} + +int fib (int x, list l) { + return x == 0 ? 0 : (x == 1 ? 1 : elt(l, x-1) + elt(l, x-2)); +} + int main (void) { initializePointerTree (); initializeSignalHandler (); - void *** lazy42 = lazy_alloc(calculateLazy24, NULL); - printf("%d\n", **((int**)lazy42)); - + list lst = listComprehension(fib); + int i; + for (i = 0; i < 10; i++) + printf("%d\n", elt(lst, i)); }