Changeset 529


Ignore:
Timestamp:
02/04/09 22:01:44 (3 years ago)
Author:
mooneer
Message:

Applied patch to System.list to fix operators (credit: Michael Edgar)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • interpreter/trunk/modules/System/list.c

    r523 r529  
    105105        return; \ 
    106106    } 
    107  
    108 KITE_CLASS_METHOD(List_add) { 
     107KITE_CLASS_METHOD(List_lshift) { 
    109108    kite_object_t *cur = this, *rhs; 
    110109    kite_object_t *secondhalf; 
    111      
     110 
    112111    rhs = kite_list_object(thd, args); 
    113112    secondhalf = rhs->builtin_data.listvalue.car; 
    114      
     113 
    115114    if (cur->builtin_data.listvalue.car == NULL) { 
    116115        cur->builtin_data.listvalue.car = kite_reference_object(secondhalf); 
     
    118117        kite_vm_return(thd, this); 
    119118    } 
    120      
     119 
    121120    while(cur->builtin_data.listvalue.cdr != NULL) { 
    122121        cur = cur->builtin_data.listvalue.cdr; 
    123122    } 
    124      
     123 
    125124    if (secondhalf->type == OBJ_LIST) { 
    126125        secondhalf = kite_reference_object(secondhalf); 
     
    130129            kite_reference_object(rhs->builtin_data.listvalue.car); 
    131130    } 
    132      
     131 
    133132    cur->builtin_data.listvalue.cdr = secondhalf; 
    134133    kite_dereference_object(rhs); 
    135134    kite_vm_return(thd, this); 
     135} 
     136 
     137KITE_CLASS_METHOD(List_add) { 
     138    kite_object_t *cur = this, *rhs; 
     139    kite_object_t *secondhalf, *new; 
     140     
     141    new = kite_new_list(thd); 
     142     
     143    rhs = kite_list_object(thd, args); 
     144    secondhalf = rhs->builtin_data.listvalue.car; 
     145     
     146    if (secondhalf->type == OBJ_LIST) { 
     147        secondhalf = kite_reference_object(secondhalf); 
     148    } else { 
     149        secondhalf = kite_new_list(thd); 
     150        secondhalf->builtin_data.listvalue.car =  
     151            kite_reference_object(rhs->builtin_data.listvalue.car); 
     152    } 
     153     
     154    if (cur->builtin_data.listvalue.car == NULL) { 
     155        if (secondhalf->type == OBJ_LIST) 
     156          new = kite_reference_object(secondhalf); 
     157        else 
     158          new->builtin_data.listvalue.car = kite_reference_object(secondhalf); 
     159        kite_dereference_object(rhs); 
     160        kite_vm_return(thd, new); 
     161        return; 
     162    } 
     163     
     164    while (cur && cur->builtin_data.listvalue.car) { 
     165          kite_append_list(thd,new,cur->builtin_data.listvalue.car); 
     166          cur = cur->builtin_data.listvalue.cdr; 
     167    } 
     168    cur = new; 
     169    while(cur->builtin_data.listvalue.cdr != NULL) { 
     170        cur = cur->builtin_data.listvalue.cdr; 
     171    } 
     172     
     173    cur->builtin_data.listvalue.cdr = secondhalf; 
     174     
     175    kite_dereference_object(rhs); 
     176    kite_vm_return(thd, new); 
    136177} 
    137178 
     
    578619    kite_add_operator(thread, newclass, OP_ADD,  
    579620        kite_new_method_compiled_with_docs(thread, List_add,  
    580                                   "Adds item to the end of the list.", 1, 
     621   kite_add_operator(thread, newclass, OP_LEFT_SHIFT,  
     622       kite_new_method_compiled_with_docs(thread, List_lshift,  
     623                                 "Adds item to the end of the list.", 1, 
     624                                 "item", "Item to add.")); 
     625                                  
     626                                  "Creates a new list that is the combination of the two operands.", 1, 
    581627                                  "item", "Item to add.")); 
    582628    kite_add_operator(thread, newclass, OP_LESS_THAN,  
Note: See TracChangeset for help on using the changeset viewer.