Ignore:
Timestamp:
Apr 17, 2011, 10:28:16 AM (11 years ago)
Author:
Sam Hocevar
Message:

lisp: move all array-related functions to the LispArray? struct.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • abuse/trunk/src/lisp/lisp.cpp

    r482 r483  
    220220}
    221221
    222 LispArray *new_lisp_1d_array(int size, void *rest)
     222LispArray *LispArray::Create(int size, void *rest)
    223223{
    224224  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 *));
    232232  p_ref r1(p);
    233233
     
    238238    {
    239239      x=eval(CAR(CDR(rest)));
    240       data=(void **)(((LispArray *)p)+1);
     240      data = p->GetData();
    241241      for (int i=0;i<size;i++, x=CDR(x))
    242242      {
    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      }
    252257    }
    253258    else if (x==colon_initial_element)
    254259    {
    255260      x=eval(CAR(CDR(rest)));
    256       data=(void **)(((LispArray *)p)+1);
     261      data = p->GetData();
    257262      for (int i=0;i<size;i++)
    258         data[i]=x;
     263        data[i] = (LispObject *)x;
    259264    }
    260265    else
     
    266271  }
    267272
    268   return ((LispArray *)p);
     273  return p;
    269274}
    270275
     
    623628}
    624629
    625 void *lget_array_element(void *a, long x)
     630LispObject *LispArray::Get(long x)
    626631{
    627632#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];
    641646}
    642647
     
    14311436      case L_1D_ARRAY :
    14321437      {
    1433                 LispArray *a=(LispArray *)i;
    1434                 void **data=(void **)(a+1);
    1435                 dprintf("#(");
    1436                 for (int j=0;j<a->size;j++)
    1437                 {
    1438                   lprint(data[j]);
    1439                   if (j!=a->size-1)
    1440                     dprintf(" ");
    1441                 }
    1442                 dprintf(")");
     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(")");
    14431448      } break;
    14441449      case L_COLLECTED_OBJECT :
     
    20262031          {
    20272032#endif
    2028             void *a=(LispArray *)eval(CAR(CDR(i)));
     2033            LispArray *a = (LispArray *)eval(CAR(CDR(i)));
    20292034            p_ref r1(a);
    20302035#ifdef TYPE_CHECKING
    2031             if (item_type(a)!=L_1D_ARRAY)
     2036            if (item_type(a) != L_1D_ARRAY)
    20322037            {
    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);
    20362041            }
    20372042#endif
    20382043            long num=lnumber_value(eval(CAR(CDR(CDR(i)))));
    20392044#ifdef TYPE_CHECKING
    2040             if (num>=((LispArray *)a)->size || num<0)
     2045            if (num >= a->size || num < 0)
    20412046            {
    20422047              lbreak("aref : value of bounds (%d)\n", num);
     
    20442049            }
    20452050#endif
    2046             void **data=(void **)(((LispArray *)a)+1);
    2047             data[num]=set_to;
     2051            a->GetData()[num] = (LispObject *)set_to;
    20482052#ifdef TYPE_CHECKING
    20492053          } else
     
    26462650                exit(0);
    26472651      }
    2648       ret=new_lisp_1d_array(l, CDR(arg_list));
     2652      ret = LispArray::Create(l, CDR(arg_list));
    26492653    } break;
    26502654    case SYS_FUNC_AREF:
    26512655    {
    26522656      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);
    26542658    } break;
    26552659    case SYS_FUNC_IF_1PROGN:
Note: See TracChangeset for help on using the changeset viewer.