- Timestamp:
- 09/08/08 22:15:26 (3 months ago)
- Location:
- v6/smop/src
- Files:
-
- 2 modified
-
smop_mold.c (modified) (5 diffs)
-
smop_s1p_code.sm0p (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
v6/smop/src/smop_mold.c
r22190 r22192 11 11 static SMOP__Object* SMOP__ID__set_reg; 12 12 static SMOP__Object* SMOP__ID__set_back; 13 14 static 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 22 static 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 13 30 14 31 typedef struct smop_mold { … … 87 104 } 88 105 106 107 //printf("Mold Frame! %p\n",ret); 89 108 return (SMOP__Object*) ret; 90 109 } … … 197 216 printf("got null as a result of a call (reg = %d, pos = %d) via setr\n",frame->target, frame->position); 198 217 abort(); 218 } 219 220 if (value == invocant) { 221 SMOP_RELEASE(interpreter, value); 199 222 } 200 223 … … 250 273 frame->target, frame->position, identifier_size, s); 251 274 abort(); 275 } else if (ret == invocant) { 276 // this circularity is saved by releasing once... 277 SMOP_RELEASE(interpreter, ret); 252 278 } 253 279 … … 332 358 SMOP__Mold__Frame = calloc(1,sizeof(SMOP__ResponderInterface)); 333 359 ((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; 336 362 ((SMOP__ResponderInterface*)SMOP__Mold__Frame)->id = "mold frame"; 337 363 } -
v6/smop/src/smop_s1p_code.sm0p
r22191 r22192 82 82 83 83 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; 85 90 smop_lowlevel_unlock(invocant); 86 91 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); 88 95 89 96 } else {
