Changeset 561
- Timestamp:
- Apr 30, 2011, 12:24:57 AM (12 years ago)
- Location:
- abuse/trunk/src
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
abuse/trunk/src/game.cpp
r560 r561 2636 2636 timer_uninit(); 2637 2637 2638 l_user_stack.clean_up();2639 // FIXME: this is now private in PtrRef::stack2640 //l_ptr_stack.clean_up();2641 2642 2638 sound_uninit(); 2643 2639 -
abuse/trunk/src/lisp/lisp.cpp
r560 r561 86 86 { 87 87 dprintf("Main program\n"); 88 if (max_lev==-1) max_lev=PtrRef::stack.son; 89 else if (max_lev>=PtrRef::stack.son) max_lev=PtrRef::stack.son-1; 90 91 for (int i=0; i<max_lev; i++) 88 if (max_lev == -1) 89 max_lev = PtrRef::stack.m_size; 90 else if (max_lev >= (int)PtrRef::stack.m_size) 91 max_lev = PtrRef::stack.m_size - 1; 92 93 for (int i = 0; i < max_lev; i++) 92 94 { 93 95 dprintf("%d> ", i); … … 1565 1567 void **arg_on=(void **)malloc(sizeof(void *)*num_args); 1566 1568 LList *list_on=(LList *)CDR(arg_list); 1567 long old_ptr_son=PtrRef::stack. son;1569 long old_ptr_son=PtrRef::stack.m_size; 1568 1570 1569 1571 for (i=0; i<num_args; i++) … … 1619 1621 } 1620 1622 while (!stop); 1621 PtrRef::stack. son=old_ptr_son;1623 PtrRef::stack.m_size=old_ptr_son; 1622 1624 1623 1625 free(arg_on); … … 1640 1642 { 1641 1643 void **str_eval=(void **)malloc(elements*sizeof(void *)); 1642 int i, old_ptr_stack_start=PtrRef::stack. son;1644 int i, old_ptr_stack_start=PtrRef::stack.m_size; 1643 1645 1644 1646 // evalaute all the strings and count their lengths … … 1702 1704 } 1703 1705 free(str_eval); 1704 PtrRef::stack. son=old_ptr_stack_start; // restore pointer GC stack1706 PtrRef::stack.m_size=old_ptr_stack_start; // restore pointer GC stack 1705 1707 *s=0; 1706 1708 ret=st; … … 2081 2083 LObject *block_list = CDR(arg_list); 2082 2084 PtrRef r1(block_list), r2(var_list); 2083 long stack_start = l_user_stack. son;2085 long stack_start = l_user_stack.m_size; 2084 2086 2085 2087 while (var_list) … … 2117 2119 var_list = CDR(var_list); 2118 2120 } 2119 l_user_stack. son= stack_start; // restore the stack2121 l_user_stack.m_size = stack_start; // restore the stack 2120 2122 break; 2121 2123 } … … 2768 2770 LObject *init_var = CAR(arg_list); 2769 2771 PtrRef r1(init_var); 2770 int ustack_start = l_user_stack. son; // restore stack at end2772 int ustack_start = l_user_stack.m_size; // restore stack at end 2771 2773 LSymbol *sym = NULL; 2772 2774 PtrRef r2(sym); … … 2784 2786 } 2785 2787 2786 void **do_evaled = l_user_stack.sdata + l_user_stack. son;2788 void **do_evaled = l_user_stack.sdata + l_user_stack.m_size; 2787 2789 // push all of the init forms, so we can set the symbol 2788 2790 for (init_var = CAR(arg_list); init_var; init_var = CDR(init_var)) … … 2819 2821 } 2820 2822 2821 l_user_stack. son= ustack_start;2823 l_user_stack.m_size = ustack_start; 2822 2824 break; 2823 2825 } … … 3010 3012 3011 3013 // mark the start start, so we can restore when done 3012 long stack_start = l_user_stack. son;3014 long stack_start = l_user_stack.m_size; 3013 3015 3014 3016 // first push all of the old symbol values … … 3025 3027 // open block so that local vars aren't saved on the stack 3026 3028 { 3027 int new_start = l_user_stack. son;3029 int new_start = l_user_stack.m_size; 3028 3030 int i = new_start; 3029 3031 // now push all the values we wish to gather … … 3044 3046 ((LSymbol *)CAR(f_arg))->SetValue((LObject *)l_user_stack.sdata[i++]); 3045 3047 3046 l_user_stack. son= new_start;3048 l_user_stack.m_size = new_start; 3047 3049 } 3048 3050 … … 3065 3067 ((LSymbol *)CAR(f_arg))->SetValue((LObject *)l_user_stack.sdata[cur_stack++]); 3066 3068 3067 l_user_stack. son= stack_start;3069 l_user_stack.m_size = stack_start; 3068 3070 3069 3071 #ifdef L_PROFILE … … 3088 3090 dprintf("%d (%d, %d, %d) TRACE : ", trace_level, 3089 3091 get_free_size(PERM_SPACE), get_free_size(TMP_SPACE), 3090 PtrRef::stack. son);3092 PtrRef::stack.m_size); 3091 3093 Print(); 3092 3094 dprintf("\n"); … … 3137 3139 dprintf("%d (%d, %d, %d) TRACE ==> ", trace_level, 3138 3140 get_free_size(PERM_SPACE), get_free_size(TMP_SPACE), 3139 PtrRef::stack. son);3141 PtrRef::stack.m_size); 3140 3142 ret->Print(); 3141 3143 dprintf("\n"); -
abuse/trunk/src/lisp/lisp_gc.cpp
r558 r561 31 31 32 32 // Stack where user programs can push data and have it GCed 33 grow_stack<void> l_user_stack(150);33 GrowStack<void> l_user_stack(150); 34 34 35 35 // Stack of user pointers 36 grow_stack<void *> PtrRef::stack(1500);36 GrowStack<void *> PtrRef::stack(1500); 37 37 38 38 static size_t reg_ptr_total = 0; … … 187 187 void LispGC::CollectStacks() 188 188 { 189 size_t t = l_user_stack.son;190 191 189 void **d = l_user_stack.sdata; 192 for (size_t i = 0; i < t; i++, d++)190 for (size_t i = 0; i < l_user_stack.m_size; i++, d++) 193 191 *d = CollectObject((LObject *)*d); 194 192 195 t = PtrRef::stack.son;196 193 void ***d2 = PtrRef::stack.sdata; 197 for (size_t i = 0; i < t; i++, d2++)194 for (size_t i = 0; i < PtrRef::stack.m_size; i++, d2++) 198 195 { 199 196 void **ptr = *d2; … … 201 198 } 202 199 203 d2= reg_ptr_list;204 for (size_t i = 0; i < reg_ptr_total; i++, d 2++)205 { 206 void **ptr = *d 2;200 void ***d3 = reg_ptr_list; 201 for (size_t i = 0; i < reg_ptr_total; i++, d3++) 202 { 203 void **ptr = *d3; 207 204 *ptr = CollectObject((LObject *)*ptr); 208 205 } -
abuse/trunk/src/lisp/lisp_gc.h
r558 r561 14 14 15 15 // Stack user progs can push data and have it GCed 16 extern grow_stack<void> l_user_stack;16 extern GrowStack<void> l_user_stack; 17 17 18 18 class LispGC … … 52 52 53 53 // Stack of user pointers, user pointers get remapped on GC 54 static grow_stack<void *> stack;54 static GrowStack<void *> stack; 55 55 }; 56 56 -
abuse/trunk/src/lisp/stack.h
r555 r561 16 16 17 17 // A fixed-size stack class 18 template<class T> class grow_stack18 template<class T> class GrowStack 19 19 { 20 20 public: 21 T **sdata; 22 long son; 21 GrowStack(int max_size) 22 { 23 m_max_size = max_size; 24 m_size = 0; 25 sdata = (T **)malloc(sizeof(T *) * m_max_size); 26 } 23 27 24 private: 25 long smax; 26 27 public: 28 grow_stack(int max_size) 28 ~GrowStack() 29 29 { 30 smax = max_size;31 son = 0;32 sdata = (T **)malloc(sizeof(T *) * smax);30 if (m_size != 0) 31 fprintf(stderr, "warning: cleaning up nonempty stack\n"); 32 free(sdata); 33 33 } 34 34 35 35 void push(T *data) 36 36 { 37 if (son >= smax)37 if (m_size >= m_max_size) 38 38 { 39 lbreak("error: stack overflow (%ld >= %ld)\n", son, smax); 39 lbreak("error: stack overflow (%d >= %d)\n", 40 (int)m_size, (int)m_max_size); 40 41 exit(1); 41 42 } 42 sdata[ son] = data;43 son++;43 sdata[m_size] = data; 44 m_size++; 44 45 } 45 46 46 T *pop( longtotal)47 T *pop(size_t total) 47 48 { 48 if (total > son)49 if (total > m_size) 49 50 { 50 51 lbreak("error: stack underflow\n"); 51 52 exit(1); 52 53 } 53 son-= total;54 return sdata[ son];54 m_size -= total; 55 return sdata[m_size]; 55 56 } 56 57 57 void clean_up() 58 { 59 if(son != 0) 60 fprintf(stderr, "warning: cleaning up stack and not empty\n"); 61 free(sdata); 62 sdata = NULL; 63 son = 0; 64 } 58 public: 59 T **sdata; 60 size_t m_size; 61 62 private: 63 size_t m_max_size; 65 64 }; 66 65 67 66 #endif 67
Note: See TracChangeset
for help on using the changeset viewer.