annotate runtime/context.c @ 75:0083b2f7b3c7

Partially working implementation of List. Modified build scripts to allow use of other compilers. Fixed some bugs involving method implementations on different types returning different numbers of outputs. Added Fold to the 'builtins' in the comipler.
author Mike Pavone <pavone@retrodev.com>
date Tue, 06 Jul 2010 07:52:59 -0400
parents d1569087348f
children a68e6828d896
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1 #include "context.h"
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
2 #include "object.h"
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
3 #include <stdlib.h>
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
4 #include <stddef.h>
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
5 #include <stdio.h>
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
6
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
7 stackchunk * new_stack()
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
8 {
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
9 stackchunk * st = malloc(sizeof(stackchunk));
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
10 st->prev = NULL;
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
11 st->next = NULL;
67
d1569087348f Some small optimizations
Mike Pavone <pavone@retrodev.com>
parents: 66
diff changeset
12 st->free_space = st->data;
8
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
13 return st;
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
14 }
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
15
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
16 context * new_context()
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
17 {
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
18 context * c = malloc(sizeof(context));
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
19 c->stack_begin = new_stack();
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
20 c->current_stack = c->stack_begin;
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
21 return c;
66
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 63
diff changeset
22 }
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 63
diff changeset
23
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 63
diff changeset
24 void free_context(context * c)
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 63
diff changeset
25 {
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 63
diff changeset
26 stackchunk *next,*current = c->stack_begin;
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 63
diff changeset
27 while(current)
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 63
diff changeset
28 {
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 63
diff changeset
29 next = current->next;
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 63
diff changeset
30 free(current);
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 63
diff changeset
31 current = next;
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 63
diff changeset
32 }
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 63
diff changeset
33 free(c);
8
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
34 }
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
35
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
36 void * alloc_stack(context * ct, uint32_t size)
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
37 {
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
38 void * ret;
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
39 stackchunk * current = ct->current_stack;
67
d1569087348f Some small optimizations
Mike Pavone <pavone@retrodev.com>
parents: 66
diff changeset
40 char * next_free = current->free_space + size;
d1569087348f Some small optimizations
Mike Pavone <pavone@retrodev.com>
parents: 66
diff changeset
41 if (next_free <= (current->data + STACK_CHUNK_SIZE))
8
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
42 {
67
d1569087348f Some small optimizations
Mike Pavone <pavone@retrodev.com>
parents: 66
diff changeset
43 ret = current->free_space;
d1569087348f Some small optimizations
Mike Pavone <pavone@retrodev.com>
parents: 66
diff changeset
44 current->free_space = next_free;
d1569087348f Some small optimizations
Mike Pavone <pavone@retrodev.com>
parents: 66
diff changeset
45 return ret;
8
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
46 }
67
d1569087348f Some small optimizations
Mike Pavone <pavone@retrodev.com>
parents: 66
diff changeset
47 if (!current->next)
37
640f541e9116 Added support for type declarations on user defined workers and added a few more methods to Int32 in the runtime for the C backend
Mike Pavone <pavone@retrodev.com>
parents: 12
diff changeset
48 {
67
d1569087348f Some small optimizations
Mike Pavone <pavone@retrodev.com>
parents: 66
diff changeset
49 current->next = new_stack();
d1569087348f Some small optimizations
Mike Pavone <pavone@retrodev.com>
parents: 66
diff changeset
50 current->next->prev = current;
37
640f541e9116 Added support for type declarations on user defined workers and added a few more methods to Int32 in the runtime for the C backend
Mike Pavone <pavone@retrodev.com>
parents: 12
diff changeset
51 }
67
d1569087348f Some small optimizations
Mike Pavone <pavone@retrodev.com>
parents: 66
diff changeset
52 current = current->next;
8
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
53 ct->current_stack = current;
67
d1569087348f Some small optimizations
Mike Pavone <pavone@retrodev.com>
parents: 66
diff changeset
54 current->free_space = current->data + size;
d1569087348f Some small optimizations
Mike Pavone <pavone@retrodev.com>
parents: 66
diff changeset
55 return current->data;
8
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
56 }
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
57
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 37
diff changeset
58 calldata * alloc_cdata(context * ct, calldata * lastframe, uint32_t num_params)
8
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
59 {
66
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 63
diff changeset
60 //Make sure we have enough space for at least 32 return values
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 63
diff changeset
61 calldata * retval = alloc_stack(ct, sizeof(calldata)+(31)*sizeof(object *));
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 63
diff changeset
62 //But only actually reserve space for the number requested
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 63
diff changeset
63 free_stack(ct, retval->params + num_params);
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 37
diff changeset
64 retval->lastframe = lastframe;
66
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 63
diff changeset
65 retval->callspace = num_params;
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 37
diff changeset
66 return retval;
8
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
67 }
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
68
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
69 void free_stack(context * ct, void * data)
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
70 {
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
71 char * cdata = data;
67
d1569087348f Some small optimizations
Mike Pavone <pavone@retrodev.com>
parents: 66
diff changeset
72 while(cdata < ct->current_stack->data || cdata >= ct->current_stack->free_space)
d1569087348f Some small optimizations
Mike Pavone <pavone@retrodev.com>
parents: 66
diff changeset
73 {
12
31f8182f3433 Finished fib test and did some small work on the c backend
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
74 if(ct->current_stack == ct->stack_begin)
31f8182f3433 Finished fib test and did some small work on the c backend
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
75 {
31f8182f3433 Finished fib test and did some small work on the c backend
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
76 fprintf(stderr, "Attempt to free memory at %X using free_stack, but %X doesn't appear to be stack allocated\n", data, data);
31f8182f3433 Finished fib test and did some small work on the c backend
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
77 exit(-1);
31f8182f3433 Finished fib test and did some small work on the c backend
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
78 }
31f8182f3433 Finished fib test and did some small work on the c backend
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
79 ct->current_stack = ct->current_stack->prev;
8
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
80 }
67
d1569087348f Some small optimizations
Mike Pavone <pavone@retrodev.com>
parents: 66
diff changeset
81 ct->current_stack->free_space = data;
d1569087348f Some small optimizations
Mike Pavone <pavone@retrodev.com>
parents: 66
diff changeset
82 if(ct->current_stack->free_space == ct->current_stack->data && ct->current_stack->prev)
8
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
83 ct->current_stack = ct->current_stack->prev;
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
84 }
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
85