Changeset 22923 for v6

Show
Ignore:
Timestamp:
11/08/08 10:26:25 (2 months ago)
Author:
pmurias
Message:

[smop] mold is used to call DESTROYALL, we still don't have a free this register RI

Location:
v6/smop
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • v6/smop/include/smop_s1p.h

    r22915 r22923  
    6565#define ___CONST_IDENTIFIER_ONLY___ \ 
    6666    if (SMOP_RI(identifier) != SMOP_RI(SMOP__ID__new)) {\ 
    67         fprintf("%s\n",SMOP_RI(SMOP__ID__new)->id);\ 
     67        fprintf(stderr,"%s\n",SMOP_RI(SMOP__ID__new)->id);\ 
    6868    }\ 
    6969    assert(SMOP_RI(identifier) == SMOP_RI(SMOP__ID__new)) 
     
    7373    assert(SMOP_RI(invocant) == (SMOP__ResponderInterface*)self) 
    7474#define ___VALUE_FETCH___\ 
    75     SMOP_REFERENCE(interpreter,invocant);\ 
     75    SMOP_REFERENCE(interpreter,(SMOP__Object*) invocant);\ 
    7676    ret = invocant; 
    7777#define ___VALUE_STORE___ \ 
  • v6/smop/sm0p.pl

    r21974 r22923  
    4444        $out_count++; 
    4545        quasi( 
    46             'sm0p' => \&preprocess_sm0p, 
    4746            'm0ld' => \&preprocess_m0ld, 
    48             'v6-sm0p' => \&preprocess_p6_sm0p, 
    4947            'v6-m0ld' => \&preprocess_p6_m0ld, 
    5048        ) and next; 
     
    9694    return $retbuf; 
    9795} 
    98 sub preprocess_p6_sm0p { 
    99     my $code = shift; 
    100     my ($writer, $reader, $error) = map { gensym } 1..3; 
    101     my $sm0p = preprocess('','perl',"$base/../../misc/elfish/elfX/elfX",'-C','sm0p','-s','-e',$code); 
    102     return preprocess_sm0p( 
    103         $sm0p 
    104         . "\$SMOP__SLIME__CurrentFrame.\$SMOP__ID__forget();\n" 
    105         . "\$interpreter.goto(|\$continuation);\n" 
    106         ); 
    107 } 
    10896sub preprocess_p6_m0ld { 
    10997    my $code = shift; 
     
    112100    return preprocess_m0ld($m0ld); 
    113101} 
    114 sub preprocess_sm0p { 
    115     my $code = shift; 
    116     #warn "got sm0p code <$code>\n"; 
    117     return preprocess($code,'perl',"-I$base/../../src/perl6", 
    118         '-I'.$base.'/sm0p', 
    119         $base.'/sm0p/sm0p_with_actions'); 
    120 } 
    121102sub preprocess_m0ld { 
    122103    my $code = shift; 
  • v6/smop/src/lowlevel.sm0p

    r22915 r22923  
    77 
    88#include <smop.h> 
     9#include <smop_mold.h> 
    910#include <smop_lowlevel.h> 
    1011#include <stdlib.h> 
     
    170171 
    171172      smop_lowlevel_free(value); 
     173    } else if ((SMOP__Object*)SMOP_RI(value) == SMOP__Mold || 
     174               (SMOP__Object*)SMOP_RI(value) == SMOP__Mold__Frame) { 
     175        SMOP_DISPATCH(interpreter, SMOP_RI(value), SMOP__ID__DESTROYALL, SMOP__NATIVE__capture_create(interpreter,value,NULL,NULL)); 
     176#ifdef SMOP_LOWLEVEL_MEM_TRACE 
     177      smop_mem_trace_del(value); 
     178#endif 
     179      smop_lowlevel_free(value); 
    172180    } else if ((SMOP__Object*)SMOP_RI(value) == SMOP__INTPTR__InterpreterInstance || 
    173181               (SMOP__Object*)SMOP_RI(value) == SMOP__NATIVE__capture || 
     
    183191 
    184192    } else { 
    185        SMOP_DISPATCH(interpreter, SMOP_RI(value), SMOP__ID__DESTROYALL, SMOP__NATIVE__capture_create(interpreter,value,NULL,NULL)); 
    186 #ifdef SMOP_LOWLEVEL_MEM_TRACE 
    187       smop_mem_trace_del(value); 
    188 #endif 
    189  
    190       smop_lowlevel_free(value); 
     193      SMOP__Object* current = SMOP_DISPATCH(interpreter, SMOP_RI(interpreter), SMOP__ID__continuation, 
     194                                             SMOP__NATIVE__capture_create(interpreter,SMOP_REFERENCE(interpreter,interpreter),NULL,NULL)); 
     195      SMOP__Object* free_obj = q:m0ld { 
     196        my $interpreter; 
     197        my $current; 
     198        my $value; 
     199        my $void = $value."DESTROYALL"($value); 
     200        $void = $interpreter."goto"($current); 
     201      }; 
     202      SMOP__Object* frame = SMOP__Mold__Frame_create(interpreter,SMOP_REFERENCE(interpreter,free_obj)); 
     203      mold_reg_set(interpreter,frame,0,SMOP_REFERENCE(interpreter,interpreter)); 
     204      mold_reg_set(interpreter,frame,1,current); 
     205      mold_reg_set(interpreter,frame,2,value); 
     206      SMOP_DISPATCH(interpreter, SMOP_RI(interpreter), SMOP__ID__goto,  frame); 
     207#ifdef SMOP_LOWLEVEL_MEM_TRACE 
     208      smop_mem_trace_del(value); 
     209#endif 
     210      //smop_lowlevel_free(value); 
     211      SMOP_RELEASE(interpreter,free_obj); 
    191212    } 
    192213    return NULL;