Changeset 483 for abuse/trunk/src/lisp/lisp.cpp
- Timestamp:
- Apr 17, 2011, 10:28:16 AM (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
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:
Note: See TracChangeset
for help on using the changeset viewer.