Changeset 22192 for v6

Show
Ignore:
Timestamp:
09/08/08 22:15:26 (3 months ago)
Author:
ruoso
Message:

[smop] more plumbing... there was circularity in some code... mold frames now dont add a refcount when it stores itself on its registers..

Location:
v6/smop/src
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • v6/smop/src/smop_mold.c

    r22190 r22192  
    1111static SMOP__Object* SMOP__ID__set_reg; 
    1212static SMOP__Object* SMOP__ID__set_back; 
     13 
     14static SMOP__Object* mold_reference(SMOP__Object* interpreter, SMOP__ResponderInterface* responder, SMOP__Object* obj) { 
     15  //printf("+ %p\n", obj); 
     16  if ((SMOP__Object*)responder != obj) { 
     17    smop_lowlevel_refcnt_inc(interpreter, responder, obj); 
     18  } 
     19  return obj; 
     20} 
     21 
     22static SMOP__Object* mold_release(SMOP__Object* interpreter, SMOP__ResponderInterface* responder, SMOP__Object* obj) { 
     23  //printf("- %p\n", obj); 
     24  if ((SMOP__Object*)responder != obj) { 
     25    smop_lowlevel_refcnt_dec(interpreter, responder, obj); 
     26  } 
     27  return obj; 
     28} 
     29 
    1330 
    1431typedef struct smop_mold { 
     
    87104    } 
    88105 
     106 
     107    //printf("Mold Frame! %p\n",ret); 
    89108    return (SMOP__Object*) ret; 
    90109} 
     
    197216      printf("got null as a result of a call (reg = %d, pos = %d) via setr\n",frame->target, frame->position); 
    198217      abort(); 
     218    } 
     219 
     220    if (value == invocant) { 
     221      SMOP_RELEASE(interpreter, value); 
    199222    } 
    200223 
     
    250273                 frame->target, frame->position, identifier_size, s); 
    251274          abort(); 
     275        } else if (ret == invocant) { 
     276          // this circularity is saved by releasing once... 
     277          SMOP_RELEASE(interpreter, ret); 
    252278        } 
    253279 
     
    332358  SMOP__Mold__Frame = calloc(1,sizeof(SMOP__ResponderInterface)); 
    333359  ((SMOP__ResponderInterface*)SMOP__Mold__Frame)->MESSAGE = smop_mold_frame_message; 
    334   ((SMOP__ResponderInterface*)SMOP__Mold__Frame)->REFERENCE = smop_lowlevel_generic_reference; 
    335   ((SMOP__ResponderInterface*)SMOP__Mold__Frame)->RELEASE = smop_lowlevel_generic_release; 
     360  ((SMOP__ResponderInterface*)SMOP__Mold__Frame)->REFERENCE = mold_reference; 
     361  ((SMOP__ResponderInterface*)SMOP__Mold__Frame)->RELEASE = mold_release; 
    336362  ((SMOP__ResponderInterface*)SMOP__Mold__Frame)->id = "mold frame"; 
    337363} 
  • v6/smop/src/smop_s1p_code.sm0p

    r22191 r22192  
    8282 
    8383    smop_lowlevel_rdlock(invocant); 
    84     SMOP__Object* mold = code->mold; 
     84    SMOP__Object* mold = code->mold;     
     85    code->mold = NULL; 
     86    SMOP__Object* signature = code->signature; 
     87    code->signature = NULL; 
     88    SMOP__Object* outer = code->outer; 
     89    code->outer = NULL; 
    8590    smop_lowlevel_unlock(invocant); 
    8691 
    87     //SMOP_RELEASE(interpreter,mold); 
     92    if (mold) SMOP_RELEASE(interpreter,mold); 
     93    if (signature) SMOP_RELEASE(interpreter,signature); 
     94    if (outer) SMOP_RELEASE(interpreter,outer); 
    8895 
    8996  } else {