Changeset 523


Ignore:
Timestamp:
01/31/09 20:31:16 (3 years ago)
Author:
mooneer
Message:

Now return reference to list element during list dereference, allowing constructs like list[x] = y; to work properly. (ticket #83)

Location:
interpreter/trunk
Files:
2 added
7 edited

Legend:

Unmodified
Added
Removed
  • interpreter/trunk/ChangeLog

    r522 r523  
    33    * Integrated interface.pop3 and interface.smtp modules (credit: Michael J. Edgar) 
    44    * Integrated new System.date.hires object. (credit: Michael J. Edgar) 
     5    * Now return reference to list element during list dereference, allowing constructs  
     6      like list[x] = y; to work properly. (ticket #83) 
    57 
    681/30/2009: 
  • interpreter/trunk/modules/System/list.c

    r513 r523  
    203203    /* Special-case: return list if range object is given */ 
    204204    kite_object_t *exc, *rhs; 
     205    kite_symtab_t *ret; 
    205206    int badType = FALSE, index; 
    206207    if (args->type == OBJ_LIST) {  
     
    243244        this = this->builtin_data.listvalue.cdr; 
    244245    } 
    245      
    246     kite_vm_push(thd, this->builtin_data.listvalue.car); 
     246 
     247    ret = kite_new_symtab(); 
     248    ret->value = (kite_object_t*)&this->builtin_data.listvalue.car; 
     249    ret->global = -1; 
     250    kite_reference_object(KITE_LIST_CAR(this)); 
     251    kite_push_stack(&(thd)->running_stack, TRUE, ret); 
    247252} 
    248253 
  • interpreter/trunk/objs/kite_object.h

    r505 r523  
    611611 * Symbol table manipulation 
    612612 */  
    613   
     613 
     614/** 
     615 * Create a new symbol table object. 
     616 * @return Symbol table object. 
     617 */ 
     618kite_symtab_t *kite_new_symtab(); 
     619 
    614620/** 
    615621 * Insert entry into symbol table. 
  • interpreter/trunk/objs/kite_symtab.c

    r476 r523  
    4242 
    4343/***************************************************************************** 
     44 * Create a new symbol table object. 
     45 ****************************************************************************/ 
     46kite_symtab_t *kite_new_symtab() 
     47{ 
     48    kite_symtab_t *newVal; 
     49     
     50    #ifndef HAVE_GC_H 
     51        newVal = (kite_symtab_t*)calloc(1, sizeof(kite_symtab_t)); 
     52    #else 
     53        newVal = (kite_symtab_t*)GC_malloc(sizeof(kite_symtab_t)); 
     54    #endif 
     55     
     56    return newVal; 
     57} 
     58 
     59/***************************************************************************** 
    4460 * Copy a symbol table's elements. 
    4561 ****************************************************************************/ 
  • interpreter/trunk/tests/Makefile.am

    r522 r523  
    224224./objs/list/sort_list.kt \ 
    225225./objs/list/sort_list.kt.out \ 
     226./objs/list/set_deref.kt \ 
     227./objs/list/set_deref.kt.out \ 
    226228./objs/integer/float.kt \ 
    227229./objs/integer/str.kt \ 
  • interpreter/trunk/vm/kite_execute.c

    r506 r523  
    834834        kite_symtab_t *symt =  
    835835            (kite_symtab_t*)thd->running_stack->stack[thd->running_stack->length - 1].obj; 
    836         kite_object_t *oldobj = symt->value; 
    837         symt->value = kite_reference_object(rhs); 
     836        kite_object_t *oldobj; 
     837        if (symt->global == -1) 
     838        { 
     839            oldobj = *(kite_object_t**)symt->value; 
     840            *(kite_object_t**)symt->value = kite_reference_object(rhs); 
     841        } 
     842        else 
     843        { 
     844            oldobj = symt->value; 
     845            symt->value = kite_reference_object(rhs); 
     846        } 
    838847        kite_dereference_object(oldobj); 
    839848        kite_dereference_object(oldobj->parent); 
  • interpreter/trunk/vm/kite_stack.c

    r477 r523  
    107107    entry = &st->stack[st->length - 1]; 
    108108    if (entry->reference) { 
     109        if (((kite_symtab_t*)entry->obj)->global == -1)  
     110            return *(kite_object_t**)((kite_symtab_t*)entry->obj)->value; 
    109111        return ((kite_symtab_t*)entry->obj)->value; 
    110112    } 
Note: See TracChangeset for help on using the changeset viewer.