Changeset 483
- Timestamp:
- Apr 17, 2011, 10:28:16 AM (12 years ago)
- Location:
- abuse/trunk/src
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
abuse/trunk/src/cop.cpp
r482 r483 727 727 if (o->lvars[just_fired_var]) 728 728 { 729 o->draw_double_tint(lnumber_value( lget_array_element(symbol_value(l_player_tints),num)),S_bright_tint);729 o->draw_double_tint(lnumber_value(((LispArray *)symbol_value(l_player_tints))->Get(num)),S_bright_tint); 730 730 o->lvars[just_fired_var]=0; 731 731 } else 732 o->draw_tint(lnumber_value( lget_array_element(symbol_value(l_player_tints),num)));732 o->draw_tint(lnumber_value(((LispArray *)symbol_value(l_player_tints))->Get(num))); 733 733 } 734 734 return NULL; … … 1021 1021 for (i=0;i<tp;i++) 1022 1022 { 1023 int color=lnumber_value( lget_array_element(symbol_value(l_player_text_color),sorted_players[i]->get_tint()));1023 int color=lnumber_value(((LispArray *)symbol_value(l_player_text_color))->Get(sorted_players[i]->get_tint())); 1024 1024 sprintf(msg,"%3ld %s",(long)sorted_players[i]->kills,sorted_players[i]->name); 1025 1025 if (sorted_players[i]==local) … … 1062 1062 { 1063 1063 enum { NAME_LEN=18 } ; 1064 int color=lnumber_value( lget_array_element(symbol_value(l_player_text_color),v->get_tint()));1064 int color=lnumber_value(((LispArray *)symbol_value(l_player_text_color))->Get(v->get_tint())); 1065 1065 char max_name[NAME_LEN]; 1066 1066 strncpy(max_name,v->name,NAME_LEN-1); -
abuse/trunk/src/lisp/lisp.cpp
r482 r483 220 220 } 221 221 222 LispArray * new_lisp_1d_array(int size, void *rest)222 LispArray *LispArray::Create(int size, void *rest) 223 223 { 224 224 p_ref r11(rest); 225 size_t s =sizeof(LispArray)+size*sizeof(void *);226 if (s<8 + sizeof(intptr_t)) s=8 + sizeof(intptr_t);227 void *p=(LispArray *)lmalloc(s, current_space);228 ((LispArray *)p)->type=L_1D_ARRAY;229 ((LispArray *)p)->size=size;230 void **data=(void **)(((LispArray *)p)+1);231 memset(data, 0, size *sizeof(void*));225 size_t s = sizeof(LispArray) 226 + ((size < 1 ? 1 : size) - 1) * sizeof(LispObject *); 227 LispArray *p = (LispArray *)lmalloc(s, current_space); 228 p->type = L_1D_ARRAY; 229 p->size = size; 230 LispObject **data = p->GetData(); 231 memset(data, 0, size * sizeof(LispObject *)); 232 232 p_ref r1(p); 233 233 … … 238 238 { 239 239 x=eval(CAR(CDR(rest))); 240 data =(void **)(((LispArray *)p)+1);240 data = p->GetData(); 241 241 for (int i=0;i<size;i++, x=CDR(x)) 242 242 { 243 if (!x) 244 { 245 lprint(rest); 246 lbreak("(make-array) incorrect list length\n"); 247 exit(0); 248 } 249 data[i]=CAR(x); 250 } 251 if (x) { lprint(rest); lbreak("(make-array) incorrect list length\n"); exit(0); } 243 if (!x) 244 { 245 lprint(rest); 246 lbreak("(make-array) incorrect list length\n"); 247 exit(0); 248 } 249 data[i] = (LispObject *)CAR(x); 250 } 251 if (x) 252 { 253 lprint(rest); 254 lbreak("(make-array) incorrect list length\n"); 255 exit(0); 256 } 252 257 } 253 258 else if (x==colon_initial_element) 254 259 { 255 260 x=eval(CAR(CDR(rest))); 256 data =(void **)(((LispArray *)p)+1);261 data = p->GetData(); 257 262 for (int i=0;i<size;i++) 258 data[i] =x;263 data[i] = (LispObject *)x; 259 264 } 260 265 else … … 266 271 } 267 272 268 return ((LispArray *)p);273 return p; 269 274 } 270 275 … … 623 628 } 624 629 625 void *lget_array_element(void *a,long x)630 LispObject *LispArray::Get(long x) 626 631 { 627 632 #ifdef TYPE_CHECKING 628 if (item_type(a)!=L_1D_ARRAY)629 {630 lprint(a);631 lbreak("is not an array\n");632 exit(0);633 }634 #endif 635 if (x>=((LispArray *)a)->size || x<0)636 {637 lbreak("array refrence out of bounds (%d)\n", x);638 exit(0);639 }640 return ((void **)(((LispArray *)a)+1))[x];633 if (type != L_1D_ARRAY) 634 { 635 lprint(this); 636 lbreak("is not an array\n"); 637 exit(0); 638 } 639 #endif 640 if (x >= size || x < 0) 641 { 642 lbreak("array reference out of bounds (%d)\n", x); 643 exit(0); 644 } 645 return GetData()[x]; 641 646 } 642 647 … … 1431 1436 case L_1D_ARRAY : 1432 1437 { 1433 LispArray *a=(LispArray *)i;1434 void **data=(void **)(a+1);1435 1436 for (int j=0;j<a->size;j++)1437 1438 1439 if (j!=a->size-1)1440 1441 1442 1438 LispArray *a = (LispArray *)i; 1439 LispObject **data = a->GetData(); 1440 dprintf("#("); 1441 for (int j = 0; j < a->size; j++) 1442 { 1443 lprint(data[j]); 1444 if (j != a->size - 1) 1445 dprintf(" "); 1446 } 1447 dprintf(")"); 1443 1448 } break; 1444 1449 case L_COLLECTED_OBJECT : … … 2026 2031 { 2027 2032 #endif 2028 void *a=(LispArray *)eval(CAR(CDR(i)));2033 LispArray *a = (LispArray *)eval(CAR(CDR(i))); 2029 2034 p_ref r1(a); 2030 2035 #ifdef TYPE_CHECKING 2031 if (item_type(a) !=L_1D_ARRAY)2036 if (item_type(a) != L_1D_ARRAY) 2032 2037 { 2033 lprint(a);2034 lbreak("is not an array (aref)\n");2035 exit(0);2038 lprint(a); 2039 lbreak("is not an array (aref)\n"); 2040 exit(0); 2036 2041 } 2037 2042 #endif 2038 2043 long num=lnumber_value(eval(CAR(CDR(CDR(i))))); 2039 2044 #ifdef TYPE_CHECKING 2040 if (num >=((LispArray *)a)->size || num<0)2045 if (num >= a->size || num < 0) 2041 2046 { 2042 2047 lbreak("aref : value of bounds (%d)\n", num); … … 2044 2049 } 2045 2050 #endif 2046 void **data=(void **)(((LispArray *)a)+1); 2047 data[num]=set_to; 2051 a->GetData()[num] = (LispObject *)set_to; 2048 2052 #ifdef TYPE_CHECKING 2049 2053 } else … … 2646 2650 exit(0); 2647 2651 } 2648 ret =new_lisp_1d_array(l, CDR(arg_list));2652 ret = LispArray::Create(l, CDR(arg_list)); 2649 2653 } break; 2650 2654 case SYS_FUNC_AREF: 2651 2655 { 2652 2656 long x=lnumber_value(eval(CAR(CDR(arg_list)))); 2653 ret =lget_array_element(eval(CAR(arg_list)),x);2657 ret = ((LispArray *)eval(CAR(arg_list)))->Get(x); 2654 2658 } break; 2655 2659 case SYS_FUNC_IF_1PROGN: -
abuse/trunk/src/lisp/lisp.h
r482 r483 97 97 struct LispArray : LispObject 98 98 { 99 static LispArray *Create(int size, void *rest); 100 101 inline LispObject **GetData() { return data; } 102 LispObject *Get(long x); 103 99 104 unsigned short size; 100 105 // size * sizeof (void *) follows1 106 107 private: 108 LispObject *data[1]; 101 109 }; 102 110 … … 129 137 void use_user_space(void *addr, long size); 130 138 #define item_type(c) ((c) ? *((ltype *)c) : (ltype)L_CONS_CELL) 131 void *lget_array_element(void *a, long x);132 139 void *lpointer_value(void *lpointer); 133 140 int32_t lnumber_value(void *lnumber); … … 176 183 LispFixedPoint *new_lisp_fixed_point(int32_t x); 177 184 LispObjectVar *new_lisp_object_var(int16_t number); 178 LispArray *new_lisp_1d_array(int size, void *rest);179 185 LispSysFunction *new_lisp_sys_function(int min_args, int max_args, int fun_number); 180 186 LispSysFunction *new_lisp_c_function(int min_args, int max_args, int fun_number); -
abuse/trunk/src/lisp/lisp_gc.cpp
r482 r483 86 86 static void *collect_array(void *x) 87 87 { 88 long s = ((LispArray *)x)->size; 89 LispArray *a = new_lisp_1d_array(s, NULL); 90 void **src, **dst; 91 src = (void **)(((LispArray *)x)+1); 92 dst = (void **)(a+1); 93 for (int i = 0; i<s; i++) 94 dst[i] = collect_object(src[i]); 95 96 return a; 88 long s = ((LispArray *)x)->size; 89 LispArray *a = LispArray::Create(s, NULL); 90 LispObject **src = ((LispArray *)x)->GetData(); 91 LispObject **dst = a->GetData(); 92 for (int i = 0; i < s; i++) 93 dst[i] = (LispObject *)collect_object(src[i]); 94 95 return a; 97 96 } 98 97 -
abuse/trunk/src/lisp/lisp_gc.h
r481 r483 23 23 public : 24 24 p_ref(void *&ref) { l_ptr_stack.push(&ref); } 25 p_ref(LispObject *&ref) { l_ptr_stack.push((void **)&ref); } 26 p_ref(LispArray *&ref) { l_ptr_stack.push((void **)&ref); } 25 27 ~p_ref() { l_ptr_stack.pop(1); } 26 28 } ;
Note: See TracChangeset
for help on using the changeset viewer.