Changeset 483


Ignore:
Timestamp:
Apr 17, 2011, 10:28:16 AM (6 years ago)
Author:
sam
Message:

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

Location:
abuse/trunk/src
Files:
5 edited

Legend:

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

    r482 r483  
    727727    if (o->lvars[just_fired_var])
    728728    {
    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);
    730730      o->lvars[just_fired_var]=0;
    731731    } 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)));
    733733  }
    734734  return NULL;
     
    10211021    for (i=0;i<tp;i++)
    10221022    {
    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()));
    10241024      sprintf(msg,"%3ld %s",(long)sorted_players[i]->kills,sorted_players[i]->name);
    10251025      if (sorted_players[i]==local)
     
    10621062  {
    10631063    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()));
    10651065    char max_name[NAME_LEN];
    10661066    strncpy(max_name,v->name,NAME_LEN-1);
  • 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:
  • abuse/trunk/src/lisp/lisp.h

    r482 r483  
    9797struct LispArray : LispObject
    9898{
     99    static LispArray *Create(int size, void *rest);
     100
     101    inline LispObject **GetData() { return data; }
     102    LispObject *Get(long x);
     103
    99104    unsigned short size;
    100105    // size * sizeof (void *) follows1
     106
     107private:
     108    LispObject *data[1];
    101109};
    102110
     
    129137void use_user_space(void *addr, long size);
    130138#define item_type(c) ((c) ? *((ltype *)c) : (ltype)L_CONS_CELL)
    131 void *lget_array_element(void *a, long x);
    132139void *lpointer_value(void *lpointer);
    133140int32_t lnumber_value(void *lnumber);
     
    176183LispFixedPoint *new_lisp_fixed_point(int32_t x);
    177184LispObjectVar *new_lisp_object_var(int16_t number);
    178 LispArray   *new_lisp_1d_array(int size, void *rest);
    179185LispSysFunction *new_lisp_sys_function(int min_args, int max_args, int fun_number);
    180186LispSysFunction *new_lisp_c_function(int min_args, int max_args, int fun_number);
  • abuse/trunk/src/lisp/lisp_gc.cpp

    r482 r483  
    8686static void *collect_array(void *x)
    8787{
    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;
    9796}
    9897
  • abuse/trunk/src/lisp/lisp_gc.h

    r481 r483  
    2323  public :
    2424  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); }
    2527  ~p_ref() { l_ptr_stack.pop(1); }
    2628} ;
Note: See TracChangeset for help on using the changeset viewer.