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

lisp: miscellaneous work on type safety.

File:
1 edited

Legend:

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

    r490 r491  
    8282{
    8383    dprintf("Main program\n");
    84     if (max_lev==-1) max_lev=l_ptr_stack.son;
    85     else if (max_lev>=l_ptr_stack.son) max_lev=l_ptr_stack.son-1;
     84    if (max_lev==-1) max_lev=PtrRef::stack.son;
     85    else if (max_lev>=PtrRef::stack.son) max_lev=PtrRef::stack.son-1;
    8686
    8787    for (int i=0;i<max_lev;i++)
    8888    {
    8989        dprintf("%d> ", i);
    90         lprint(*l_ptr_stack.sdata[i]);
     90        lprint(*PtrRef::stack.sdata[i]);
    9191    }
    9292}
     
    140140      {
    141141                void *prog=compile(s);
    142                 p_ref r1(prog);
     142                PtrRef r1(prog);
    143143                while (*s==' ' || *s=='\t' || *s=='\r' || *s=='\n') s++;
    144144                lprint(eval(prog));
     
    210210void *eval_block(void *list)
    211211{
    212   p_ref r1(list);
     212  PtrRef r1(list);
    213213  void *ret=NULL;
    214214  while (list)
     
    222222LispArray *LispArray::Create(int size, void *rest)
    223223{
    224   p_ref r11(rest);
     224  PtrRef r11(rest);
    225225  size_t s = sizeof(LispArray)
    226226           + ((size < 1 ? 1 : size) - 1) * sizeof(LispObject *);
     
    230230  LispObject **data = p->GetData();
    231231  memset(data, 0, size * sizeof(LispObject *));
    232   p_ref r1(p);
     232  PtrRef r1(p);
    233233
    234234  if (rest)
     
    349349LispUserFunction *new_lisp_user_function(void *arg_list, void *block_list)
    350350{
    351   p_ref r1(arg_list), r2(block_list);
     351  PtrRef r1(arg_list), r2(block_list);
    352352  LispUserFunction *lu=(LispUserFunction *)lmalloc(sizeof(LispUserFunction), current_space);
    353353  lu->type=L_USER_FUNCTION;
     
    452452}
    453453
    454 
    455 LispList *new_cons_cell()
    456 {
    457   LispList *c=(LispList *)lmalloc(sizeof(LispList), current_space);
    458   c->type=L_CONS_CELL;
    459   c->car=NULL;
    460   c->cdr=NULL;
    461   return c;
    462 }
    463 
     454LispList *LispList::Create()
     455{
     456    LispList *c = (LispList *)lmalloc(sizeof(LispList), current_space);
     457    c->type = L_CONS_CELL;
     458    c->car = NULL;
     459    c->cdr = NULL;
     460    return c;
     461}
    464462
    465463char *lerror(char const *loc, char const *cause)
     
    808806      current_space=PERM_SPACE;       // make sure all symbols get defined in permanant space
    809807    LispList *cs;
    810     cs=new_cons_cell();
     808    cs=LispList::Create();
    811809    s=new_lisp_symbol(name);
    812810    cs->car=s;
     
    931929  if (l1!=0)
    932930  {
    933     void *first=NULL, *last=NULL, *cur=NULL, *tmp;
    934     p_ref r1(first), r2(last), r3(cur);
     931    LispList *first = NULL, *last = NULL, *cur = NULL;
     932    LispObject *tmp;
     933    PtrRef r1(first), r2(last), r3(cur);
    935934    while (list1)
    936935    {
    937       cur=new_cons_cell();
    938       if (!first) first=cur;
     936      cur = LispList::Create();
     937      if (!first)
     938        first = cur;
    939939      if (last)
    940         ((LispList *)last)->cdr=(LispObject *)cur;
    941       last=cur;
    942 
    943       LispList *cell=new_cons_cell();
    944       tmp=lcar(list1);
    945       ((LispList *)cell)->car = (LispObject *)tmp;
    946       tmp=lcar(list2);
    947       ((LispList *)cell)->cdr = (LispObject *)tmp;
    948       ((LispList *)cur)->car = (LispObject *)cell;
    949 
    950       list1=((LispList *)list1)->cdr;
    951       list2=((LispList *)list2)->cdr;
    952     }
    953     ((LispList *)cur)->cdr = (LispObject *)list3;
     940        last->cdr = cur;
     941      last = cur;
     942
     943      LispList *cell = LispList::Create();
     944      tmp = (LispObject *)lcar(list1);
     945      cell->car = tmp;
     946      tmp = (LispObject *)lcar(list2);
     947      cell->cdr = tmp;
     948      cur->car = cell;
     949
     950      list1 = ((LispList *)list1)->cdr;
     951      list2 = ((LispList *)list2)->cdr;
     952    }
     953    cur->cdr = (LispObject *)list3;
    954954    ret=first;
    955955  } else ret=NULL;
     
    11051105void push_onto_list(void *object, void *&list)
    11061106{
    1107   p_ref r1(object), r2(list);
    1108   LispList *c=new_cons_cell();
     1107  PtrRef r1(object), r2(list);
     1108  LispList *c = LispList::Create();
    11091109  c->car = (LispObject *)object;
    11101110  c->cdr = (LispObject *)list;
     
    11251125  else if (n[0]=='\'')                    // short hand for quote function
    11261126  {
    1127     void *cs=new_cons_cell(), *c2=NULL, *tmp;
    1128     p_ref r1(cs), r2(c2);
     1127    void *cs = LispList::Create(), *c2=NULL, *tmp;
     1128    PtrRef r1(cs), r2(c2);
    11291129
    11301130    ((LispList *)cs)->car=quote_symbol;
    1131     c2=new_cons_cell();
     1131    c2 = LispList::Create();
    11321132    tmp=compile(s);
    11331133    ((LispList *)c2)->car = (LispObject *)tmp;
     
    11381138  else if (n[0]=='`')                    // short hand for backquote function
    11391139  {
    1140     void *cs=new_cons_cell(), *c2=NULL, *tmp;
    1141     p_ref r1(cs), r2(c2);
     1140    void *cs = LispList::Create(), *c2=NULL, *tmp;
     1141    PtrRef r1(cs), r2(c2);
    11421142
    11431143    ((LispList *)cs)->car=backquote_symbol;
    1144     c2=new_cons_cell();
     1144    c2 = LispList::Create();
    11451145    tmp=compile(s);
    11461146    ((LispList *)c2)->car = (LispObject *)tmp;
     
    11501150  }  else if (n[0]==',')              // short hand for comma function
    11511151  {
    1152     void *cs=new_cons_cell(), *c2=NULL, *tmp;
    1153     p_ref r1(cs), r2(c2);
     1152    void *cs = LispList::Create(), *c2=NULL, *tmp;
     1153    PtrRef r1(cs), r2(c2);
    11541154
    11551155    ((LispList *)cs)->car=comma_symbol;
    1156     c2=new_cons_cell();
     1156    c2 = LispList::Create();
    11571157    tmp=compile(s);
    11581158    ((LispList *)c2)->car = (LispObject *)tmp;
     
    11641164  {
    11651165    void *first=NULL, *cur=NULL, *last=NULL;
    1166     p_ref r1(first), r2(cur), r3(last);
     1166    PtrRef r1(first), r2(cur), r3(last);
    11671167    int done=0;
    11681168    do
     
    11951195                {       
    11961196                  void *tmp;
    1197                   cur=new_cons_cell();
    1198                   p_ref r1(cur);
     1197                  cur = LispList::Create();
     1198                  PtrRef r1(cur);
    11991199                  if (!first) first=cur;
    12001200                  tmp=compile(s);   
     
    12471247    else if (n[1]==0)                           // short hand for function
    12481248    {
    1249       void *cs=new_cons_cell(), *c2=NULL, *tmp;
    1250       p_ref r4(cs), r5(c2);
     1249      void *cs = LispList::Create(), *c2=NULL, *tmp;
     1250      PtrRef r4(cs), r5(c2);
    12511251      tmp = LispSymbol::FindOrCreate("function");
    12521252      ((LispList *)cs)->car = (LispObject *)tmp;
    1253       c2=new_cons_cell();
     1253      c2 = LispList::Create();
    12541254      tmp=compile(s);
    12551255      ((LispList *)c2)->car = (LispObject *)tmp;
     
    14391439
    14401440  void *fun=(LispSysFunction *)(((LispSymbol *)sym)->function);
    1441   p_ref ref2( fun  );
     1441  PtrRef ref2( fun  );
    14421442
    14431443  // make sure the arguments given to the function are the correct number
     
    14931493
    14941494
    1495   p_ref ref1(arg_list);
     1495  PtrRef ref1(arg_list);
    14961496  void *ret=NULL;
    14971497
     
    15101510    {
    15111511      void *first=NULL, *cur=NULL, *tmp;
    1512       p_ref r1(first), r2(cur);
     1512      PtrRef r1(first), r2(cur);
    15131513      while (arg_list)
    15141514      {
    15151515        if (first) {
    1516           tmp=new_cons_cell();
     1516          tmp = LispList::Create();
    15171517          ((LispList *)cur)->cdr = (LispObject *)tmp;
    15181518          cur=tmp;
    15191519        } else
    1520           cur=first=new_cons_cell();
     1520          cur=first = LispList::Create();
    15211521   
    15221522        void *val=eval(CAR(arg_list));
     
    15671567void *mapcar(void *arg_list)
    15681568{
    1569   p_ref ref1(arg_list);
     1569  PtrRef ref1(arg_list);
    15701570  void *sym=eval(CAR(arg_list));
    15711571  switch ((short)item_type(sym))
     
    15871587  void **arg_on=(void **)malloc(sizeof(void *)*num_args);
    15881588  LispList *list_on=(LispList *)CDR(arg_list);
    1589   long old_ptr_son=l_ptr_stack.son;
     1589  long old_ptr_son=PtrRef::stack.son;
    15901590
    15911591  for (i=0;i<num_args;i++)
    15921592  {
    15931593    arg_on[i]=(LispList *)eval(CAR(list_on));
    1594     l_ptr_stack.push(&arg_on[i]);
     1594    PtrRef::stack.push(&arg_on[i]);
    15951595
    15961596    list_on=(LispList *)CDR(list_on);
     
    16141614    {
    16151615      if (!na_list)
    1616         first=na_list=new_cons_cell();
     1616        first=na_list = LispList::Create();
    16171617      else
    16181618      {
    1619         na_list->cdr = (LispObject *)new_cons_cell();
     1619        na_list->cdr = (LispObject *)LispList::Create();
    16201620                na_list=(LispList *)CDR(na_list);
    16211621      }
     
    16311631    if (!stop)
    16321632    {
    1633       LispList *c=new_cons_cell();
     1633      LispList *c = LispList::Create();
    16341634      c->car = (LispObject *)eval_function((LispSymbol *)sym, first);
    16351635      if (return_list)
     
    16411641  }
    16421642  while (!stop);
    1643   l_ptr_stack.son=old_ptr_son;
     1643  PtrRef::stack.son=old_ptr_son;
    16441644
    16451645  free(arg_on);
     
    16501650{
    16511651  void *el_list=CDR(prog_list);
    1652   p_ref ref1(prog_list), ref2(el_list);
     1652  PtrRef ref1(prog_list), ref2(el_list);
    16531653  void *ret=NULL;
    16541654  void *rtype=eval(CAR(prog_list));
     
    16621662    {
    16631663      void **str_eval=(void **)malloc(elements*sizeof(void *));
    1664       int i, old_ptr_stack_start=l_ptr_stack.son;
     1664      int i, old_ptr_stack_start=PtrRef::stack.son;
    16651665
    16661666      // evalaute all the strings and count their lengths
     
    16681668      {
    16691669        str_eval[i]=eval(CAR(el_list));
    1670     l_ptr_stack.push(&str_eval[i]);
     1670    PtrRef::stack.push(&str_eval[i]);
    16711671
    16721672    switch ((short)item_type(str_eval[i]))
     
    17241724      }
    17251725      free(str_eval);
    1726       l_ptr_stack.son=old_ptr_stack_start;   // restore pointer GC stack
     1726      PtrRef::stack.son=old_ptr_stack_start;   // restore pointer GC stack
    17271727      *s=0;
    17281728      ret=st;
     
    17501750  {
    17511751    void *first=NULL, *last=NULL, *cur=NULL, *tmp;
    1752     p_ref ref1(first), ref2(last), ref3(cur), ref4(args);
     1752    PtrRef ref1(first), ref2(last), ref3(cur), ref4(args);
    17531753    while (args)
    17541754    {
     
    17631763    else
    17641764    {
    1765       cur=new_cons_cell();
     1765      cur = LispList::Create();
    17661766      if (first)
    17671767        ((LispList *)last)->cdr = (LispObject *)cur;
     
    17891789void *eval_sys_function(LispSysFunction *fun, void *arg_list)
    17901790{
    1791   p_ref ref1(arg_list);
     1791  PtrRef ref1(arg_list);
    17921792  void *ret=NULL;
    17931793  switch (fun->fun_number)
     
    18231823    {
    18241824      void *cur=NULL, *last=NULL, *first=NULL;
    1825       p_ref r1(cur), r2(first), r3(last);
     1825      PtrRef r1(cur), r2(first), r3(last);
    18261826      while (arg_list)
    18271827      {
    1828     cur=new_cons_cell();
     1828    cur = LispList::Create();
    18291829    void *val=eval(CAR(arg_list));
    18301830    ((LispList *) cur)->car = (LispObject *)val;
     
    18381838    } break;
    18391839    case SYS_FUNC_CONS:
    1840     { void *c=new_cons_cell();
    1841       p_ref r1(c);
     1840    { void *c = LispList::Create();
     1841      PtrRef r1(c);
    18421842      void *val=eval(CAR(arg_list));
    18431843      ((LispList *)c)->car = (LispObject *)val;
     
    18761876      long sum;
    18771877      void *first=eval(CAR(arg_list));
    1878       p_ref r1(first);
     1878      PtrRef r1(first);
    18791879      if (arg_list && item_type(first)==L_FIXED_POINT)
    18801880      {
     
    19061906      {
    19071907    void *i=eval(CAR(arg_list));
    1908     p_ref r1(i);
     1908    PtrRef r1(i);
    19091909    if (item_type(i)!=L_NUMBER)
    19101910    {
     
    19491949    {
    19501950      void *set_to=eval(CAR(CDR(arg_list))), *i=NULL;
    1951       p_ref r1(set_to), r2(i);
     1951      PtrRef r1(set_to), r2(i);
    19521952      i=CAR(arg_list);
    19531953
     
    19951995#endif
    19961996            LispArray *a = (LispArray *)eval(CAR(CDR(i)));
    1997             p_ref r1(a);
     1997            PtrRef r1(a);
    19981998#ifdef TYPE_CHECKING
    19991999            if (item_type(a) != L_1D_ARRAY)
     
    20372037    {
    20382038      void *item=eval(CAR(arg_list));
    2039       p_ref r1(item);
     2039      PtrRef r1(item);
    20402040      void *list=(LispList *)eval(CAR(CDR(arg_list)));
    2041       p_ref r2(list);
     2041      PtrRef r2(list);
    20422042      ret=assoc(item, (LispList *)list);
    20432043    } break;
     
    20492049    {
    20502050      void *i1=eval(CAR(arg_list)), *i2=eval(CAR(CDR(arg_list)));
    2051       p_ref r1(i1);
    2052       LispList *cs=new_cons_cell();
     2051      PtrRef r1(i1);
     2052      LispList *cs = LispList::Create();
    20532053      cs->car = (LispObject *)i1;
    20542054      cs->cdr = (LispObject *)i2;
     
    20572057
    20582058    case SYS_FUNC_PAIRLIS:
    2059     {   
     2059    {
    20602060      l_user_stack.push(eval(CAR(arg_list))); arg_list=CDR(arg_list);
    20612061      l_user_stack.push(eval(CAR(arg_list))); arg_list=CDR(arg_list);
     
    20702070      void *var_list=CAR(arg_list),
    20712071           *block_list=CDR(arg_list);
    2072       p_ref r1(block_list), r2(var_list);
     2072      PtrRef r1(block_list), r2(var_list);
    20732073      long stack_start=l_user_stack.son;
    20742074
     
    21452145    {
    21462146      void *l=arg_list;
    2147       p_ref r1(l);
     2147      PtrRef r1(l);
    21482148      ret=true_symbol;
    21492149      while (l)
     
    21592159    {
    21602160      void *l=arg_list;
    2161       p_ref r1(l);
     2161      PtrRef r1(l);
    21622162      ret=NULL;
    21632163      while (l)
     
    21782178    {
    21792179      void *i=eval(CAR(arg_list));
    2180       p_ref r1(i);
     2180      PtrRef r1(i);
    21812181      ret=NULL;
    21822182      switch (item_type(i))
     
    21972197    {
    21982198      void *i=eval(CAR(arg_list));
    2199       p_ref r1(i);
     2199      PtrRef r1(i);
    22002200      if (item_type(i)!=L_NUMBER)
    22012201      {
     
    22092209    {
    22102210      void *block_list=CAR(arg_list);
    2211       p_ref r1(block_list);
     2211      PtrRef r1(block_list);
    22122212      if (!block_list) ret=NULL;
    22132213      else
     
    22262226      void *selector=eval(CAR(arg_list));
    22272227      void *sel=CDR(arg_list);
    2228       p_ref r1(selector), r2(sel);
     2228      PtrRef r1(selector), r2(sel);
    22292229      while (sel)
    22302230      {
     
    23392339            void *fn = eval( CAR( arg_list ) );
    23402340            char *st = lstring_value( fn );
    2341             p_ref r1( fn );
     2341            PtrRef r1( fn );
    23422342            bFILE *fp;
    23432343            if( fun->fun_number == SYS_FUNC_LOCAL_LOAD )
     
    23912391            #endif
    23922392                void *compiled_form=NULL;
    2393                 p_ref r11(compiled_form);
     2393                PtrRef r11(compiled_form);
    23942394                while (!end_of_program(cs))  // see if there is anything left to compile and run
    23952395                {
     
    24612461      {
    24622462    void *sym=eval(CAR(arg_list));
    2463     p_ref r1(sym);
     2463    PtrRef r1(sym);
    24642464    switch (item_type(sym))
    24652465    {
     
    24692469      {
    24702470        void *s=eval(CAR(sym));
    2471         p_ref r1(s);
     2471        PtrRef r1(s);
    24722472#ifdef TYPE_CHECKING
    24732473        if (item_type(s)!=L_SYMBOL)
     
    25262526      LispSymbol *bind_var = (LispSymbol *)CAR(arg_list);
    25272527      arg_list = CDR(arg_list);
    2528       p_ref r1(bind_var);
     2528      PtrRef r1(bind_var);
    25292529      if (item_type(bind_var)!=L_SYMBOL)
    25302530      { lbreak("expecting for iterator to be a symbol\n"); exit(1); }
     
    25352535
    25362536      void *ilist=eval(CAR(arg_list)); arg_list=CDR(arg_list);
    2537       p_ref r2(ilist);
     2537      PtrRef r2(ilist);
    25382538
    25392539      if (CAR(arg_list)!=do_symbol)
     
    25422542
    25432543      void *block=NULL, *ret=NULL;
    2544       p_ref r3(block);
     2544      PtrRef r3(block);
    25452545      l_user_stack.push(bind_var->GetValue());  // save old symbol value
    25462546      while (ilist)
     
    25582558      bFILE *old_file=current_print_file;
    25592559      void *str1=eval(CAR(arg_list));
    2560       p_ref r1(str1);
     2560      PtrRef r1(str1);
    25612561      void *str2=eval(CAR(CDR(arg_list)));
    25622562
     
    26602660    {
    26612661      void *arg1=eval(CAR(arg_list)); arg_list=CDR(arg_list);
    2662       p_ref r1(arg1);       // protect this refrence
     2662      PtrRef r1(arg1);       // protect this refrence
    26632663      char *haystack=lstring_value(eval(CAR(arg_list)));
    26642664      char *needle=lstring_value(arg1);
     
    26722672    {
    26732673      void *arg1=eval(CAR(arg_list)); arg_list=CDR(arg_list);
    2674       p_ref r1(arg1);       // protect this refrence
     2674      PtrRef r1(arg1);       // protect this refrence
    26752675      long x=lnumber_value(eval(CAR(arg_list)));
    26762676      char *st=lstring_value(arg1);
     
    26922692    {
    26932693      void *init_var=CAR(arg_list);
    2694       p_ref r1(init_var);
     2694      PtrRef r1(init_var);
    26952695      int i, ustack_start=l_user_stack.son;      // restore stack at end
    26962696      LispSymbol *sym = NULL;
    2697       p_ref r2(sym);
     2697      PtrRef r2(sym);
    26982698
    26992699      // check to make sure iter vars are symbol and push old values
     
    27702770    {
    27712771      void *l1=eval(CAR(arg_list)); arg_list=CDR(arg_list);
    2772       p_ref r1(l1);
     2772      PtrRef r1(l1);
    27732773      void *first=l1, *next;
    2774       p_ref r2(first);
     2774      PtrRef r2(first);
    27752775
    27762776      if (!l1)
     
    28162816      long x2=lnumber_value(eval(CAR(arg_list))); arg_list=CDR(arg_list);
    28172817      void *st=eval(CAR(arg_list));
    2818       p_ref r1(st);
     2818      PtrRef r1(st);
    28192819
    28202820      if (x1 < 0 || x1 > x2 || (unsigned)x2 >= strlen(lstring_value(st)))
     
    28312831    {
    28322832      void *r=NULL, *rstart=NULL;
    2833       p_ref r1(r), r2(rstart);
     2833      PtrRef r1(r), r2(rstart);
    28342834      while (arg_list)
    28352835      {
     
    28702870{
    28712871  void *ret=NULL;
    2872   p_ref ref1(ret);
     2872  PtrRef ref1(ret);
    28732873
    28742874#ifdef TYPE_CHECKING
     
    28982898  void *fun_arg_list=cache.lblock(fun->alist);
    28992899  void *block_list=cache.lblock(fun->blist);
    2900   p_ref r9(block_list), r10(fun_arg_list);
     2900  PtrRef r9(block_list), r10(fun_arg_list);
    29012901#else
    29022902  void *fun_arg_list=fun->arg_list;
    29032903  void *block_list=fun->block_list;
    2904   p_ref r9(block_list), r10(fun_arg_list);
     2904  PtrRef r9(block_list), r10(fun_arg_list);
    29052905#endif
    29062906
     
    29122912  // first push all of the old symbol values
    29132913  void *f_arg=fun_arg_list;
    2914   p_ref r18(f_arg);
    2915   p_ref r19(arg_list);
     2914  PtrRef r18(f_arg);
     2915  PtrRef r19(arg_list);
    29162916  for (;f_arg;f_arg=CDR(f_arg))
    29172917  {
     
    29792979
    29802980  void *ret=NULL;
    2981   p_ref ref1(prog);
     2981  PtrRef ref1(prog);
    29822982
    29832983
     
    29912991          space_size[PERM_SPACE]-((char *)free_space[PERM_SPACE]-(char *)space[PERM_SPACE]),
    29922992          space_size[TMP_SPACE]-((char *)free_space[TMP_SPACE]-(char *)space[TMP_SPACE]),
    2993           l_ptr_stack.son);
     2993          PtrRef::stack.son);
    29942994      lprint(prog);
    29952995
     
    30363036          space_size[PERM_SPACE]-((char *)free_space[PERM_SPACE]-(char *)space[PERM_SPACE]),
    30373037          space_size[TMP_SPACE]-((char *)free_space[TMP_SPACE]-(char *)space[TMP_SPACE]),
    3038           l_ptr_stack.son);
     3038          PtrRef::stack.son);
    30393039    lprint(ret);
    30403040    dprintf("\n");
Note: See TracChangeset for help on using the changeset viewer.