Changeset 21971

Show
Ignore:
Timestamp:
08/20/08 20:48:37 (3 months ago)
Author:
ruoso
Message:

[smop] YAY! We have code blocks working... with signature binding and all...

Location:
v6/smop
Files:
6 modified
1 moved

Legend:

Unmodified
Added
Removed
  • v6/smop/CMakeLists.txt

    r21965 r21971  
    6565    src/p6opaque.sm0p 
    6666    src/smop_s1p_attribute.sm0p 
     67    src/smop_s1p_code.sm0p 
    6768) 
    6869compile_sm0p (${sm0p_file}) 
  • v6/smop/include/smop_mold.h

    r21874 r21971  
    1010*/ 
    1111extern SMOP__Object* SMOP__Mold; 
     12extern SMOP__Object* SMOP__Mold__Frame; 
    1213SMOP__Object* SMOP__Mold_create(int registers,SMOP__Object** constants,int opcodes_len,int *opcodes);  
    1314SMOP__Object* SMOP__Mold__Frame_create(SMOP__Object* interpreter,SMOP__Object* mold); 
  • v6/smop/src/idconst.c

    r21739 r21971  
    99#include <pthread.h> 
    1010#include <stdio.h> 
     11#include <smop_s1p.h> 
    1112#include "smop_internal.h" 
    1213 
     
    5758                                     SMOP__Object* identifier, 
    5859                                     SMOP__Object* capture) { 
    59   // TODO 
    60   return NULL; 
     60  ___UNKNOWN_METHOD___; 
    6161} 
    6262 
  • v6/smop/src/smop_internal.h

    r21903 r21971  
    8080     smop_s1p_lexicalscope_mold_init();     \ 
    8181     smop_s1p_defaultblocksignature_mold_init(); \ 
     82     smop_s1p_code_mold_init();             \ 
    8283 
    8384#define SMOP_BOOTSTRAP_DESTR_SEQUENCE       \ 
     85     smop_s1p_code_mold_destr();            \ 
    8486     smop_s1p_defaultblocksignature_mold_destr();\ 
    8587     smop_s1p_lexicalscope_mold_destr();    \ 
  • v6/smop/src/smop_mold.c

    r21919 r21971  
    88SMOP__Object* SMOP__Mold; 
    99SMOP__Object* SMOP__Mold__Frame; 
     10 
     11static SMOP__Object* SMOP__ID__set_reg; 
     12static SMOP__Object* SMOP__ID__set_back; 
    1013 
    1114typedef struct smop_mold { 
     
    143146    SMOP__Object* mold = SMOP__NATIVE__capture_positional(interpreter, capture, 0); 
    144147    ret = SMOP__Mold__Frame_create(interpreter,mold); 
     148  } else if (SMOP__ID__set_reg == identifier) { 
     149 
     150    SMOP__Object* reg_pos = SMOP__NATIVE__capture_positional(interpreter, capture, 0); 
     151    SMOP__Object* value = SMOP__NATIVE__capture_positional(interpreter, capture, 1); 
     152    mold_reg_set(interpreter, invocant, SMOP__NATIVE__int_fetch(reg_pos), value); 
     153 
     154  } else if (SMOP__ID__back == identifier) { 
     155 
     156    SMOP__Object* value = SMOP__NATIVE__capture_positional(interpreter, capture, 0); 
     157    if (frame->back) { 
     158      ret = SMOP_REFERENCE(interpreter,frame->back); 
     159    } 
     160 
     161  } else if (SMOP__ID__set_back == identifier) { 
     162 
     163    SMOP__Object* value = SMOP__NATIVE__capture_positional(interpreter, capture, 0); 
     164    if (!frame->back) { 
     165      frame->back = value; 
     166    } else { 
     167      printf("trying to set a new back to the frame\n"); 
     168      abort(); 
     169    } 
     170 
    145171  } else if (SMOP__ID__has_next == identifier) { 
    146172    if (mold->opcodes[frame->position]) { 
     
    289315 
    290316void smop_mold_init() { 
     317  SMOP__ID__set_reg = SMOP__NATIVE__idconst_create("set_reg"); 
     318  SMOP__ID__set_back = SMOP__NATIVE__idconst_create("set_back"); 
     319 
    291320  SMOP__Mold = calloc(1,sizeof(SMOP__ResponderInterface)); 
    292321  ((SMOP__ResponderInterface*)SMOP__Mold)->MESSAGE = smop_mold_message; 
  • v6/smop/src/smop_s1p_code.sm0p

    r21970 r21971  
    22#include <smop_lowlevel.h> 
    33#include <smop_identifiers.h> 
     4#include <smop_mold.h> 
    45#include <smop_s1p.h> 
    56#include <stdlib.h> 
     
    89 
    910SMOP__Object* SMOP__S1P__Code; 
     11 
     12static SMOP__Object* smop_s1p_code_mold; 
    1013 
    1114/* 
     
    5255    SMOP__Object* outer = code->outer; 
    5356    SMOP__Object* mold = code->mold; 
     57    SMOP__Object* signature = code->signature; 
    5458    smop_lowlevel_unlock(invocant); 
    5559 
    56     SMOP__Object* frame = SMOP__Mold__Frame_create(interpreter,SMOP_REFERENCE(interpreter,mold)); 
     60    SMOP__Object* frame = SMOP__Mold__Frame_create(interpreter,SMOP_REFERENCE(interpreter,smop_s1p_code_mold)); 
    5761    SMOP__Object* back = SMOP_DISPATCH(interpreter, SMOP_RI(interpreter), 
    5862      SMOP__ID__continuation, 
     
    6266    mold_reg_set(interpreter,frame,0,SMOP_REFERENCE(interpreter,interpreter)); 
    6367    mold_reg_set(interpreter,frame,1,SMOP_REFERENCE(interpreter,capture)); 
    64     mold_reg_set(interpreter,frame,2,SMOP_REFERENCE(interpreter,outer)); 
    65     mold_reg_set(interpreter,frame,3,SMOP_REFERENCE(interpreter,back)); 
     68    mold_reg_set(interpreter,frame,2,SMOP_REFERENCE(interpreter,back)); 
     69    mold_reg_set(interpreter,frame,3,SMOP_REFERENCE(interpreter,code)); 
     70    mold_reg_set(interpreter,frame,4,SMOP_REFERENCE(interpreter,outer)); 
     71    mold_reg_set(interpreter,frame,5,SMOP_REFERENCE(interpreter,signature)); 
     72    mold_reg_set(interpreter,frame,6,SMOP_REFERENCE(interpreter,mold)); 
     73 
    6674    SMOP_DISPATCH(interpreter,SMOP_RI(interpreter),SMOP__ID__goto,frame); 
    6775 
     
    99107  free(SMOP__S1P__Code); 
    100108} 
     109 
     110void smop_s1p_code_mold_init() { 
     111  SMOP__Object* interpreter = SMOP__GlobalInterpreter; 
     112  smop_s1p_code_mold = q:m0ld { 
     113    my $interpreter; 
     114    my $capture; 
     115    my $back; 
     116    my $code; 
     117    my $outer; 
     118    my $signature; 
     119    my $mold; 
     120 
     121    my $void; 
     122 
     123    my $lexical_proto = ¢SMOP__S1P__LexicalScope; 
     124    my $lexical = $lexical_proto."new"(); 
     125    my $lexical_outer_container = $lexical."outer"(); 
     126    $void = $lexical_outer_container."STORE"($outer); 
     127 
     128    $void = $signature."BIND"($capture,$lexical); 
     129    my $frame_proto = ¢SMOP__Mold__Frame; 
     130    my $frame = $frame_proto."new"($mold); 
     131    $void = $frame."set_reg"(0, $interpreter); 
     132    $void = $frame."set_reg"(1, $lexical); 
     133    $void = $frame."set_back"($back); 
     134    $void = $interpreter."goto"($frame); 
     135  }; 
     136} 
     137 
     138void smop_s1p_code_mold_destr() { 
     139  SMOP__Object* interpreter = SMOP__GlobalInterpreter; 
     140  SMOP_RELEASE(interpreter, smop_s1p_code_mold); 
     141} 
  • v6/smop/test/21_code.m0ld

    r21970 r21971  
    22my $out_scalar = ¢SMOP__S1P__RootNamespace."postcircumfix:{ }"("$*OUT"); 
    33my $out = $out_scalar."FETCH"(); 
    4 $void = $out."print"("1..2\n"); 
     4$void = $out."print"("1..3\n"); 
    55 
    66my $Code_scalar = ¢SMOP__S1P__RootNamespace."postcircumfix:{ }"("::Code"); 
    77my $Code = $Code_scalar."FETCH"(); 
    8 my $code1 = $Code."new"(:"outer"("...outer..."),:"signature"("...signature..."),:"mold"(mold { 
     8my $lexicalscope = ¢SMOP__S1P__LexicalScope."new"(); 
     9 
     10my $it_var_slot = $lexicalscope."postcircumfix:{ }"("$_"); 
     11my $it_var_cont = ¢SMOP__S1P__Scalar."new"(); 
     12$void = $it_var_slot."STORE"($it_var_cont); 
     13$void = $it_var_cont."STORE"("ok 3\n"); 
     14 
     15my $code1 = $Code."new"(:"outer"($lexicalscope),:"signature"(¢SMOP__S1P__DefaultBlockSignature),:"mold"(mold { 
    916    my $interpreter; 
    10     my $capture; 
    11     my $outer; 
    12     my $back; 
     17    my $lexical; 
    1318 
     19 
     20    my $it_var_slot = $lexical."postcircumfix:{ }"("$_"); 
     21    my $it_var = $it_var_slot."FETCH"(); 
     22    my $it  = $it_var."FETCH"(); 
     23    
    1424    my $void; 
    1525    my $out_scalar = ¢SMOP__S1P__RootNamespace."postcircumfix:{ }"("$*OUT"); 
    1626    my $out = $out_scalar."FETCH"(); 
    17     $void = $out."print"("ok\n"); 
    18     my $void = $interpreter."goto"($back); 
     27    $void = $out."print"($it); 
     28 
     29    my $continuation = $interpreter."continuation"(); 
     30    my $back = $continuation."back"(); 
     31    $void = $interpreter."goto"($back); 
    1932})); 
     33$void = $code1."postcircumfix:( )"("ok 1\n"); 
     34$void = $code1."postcircumfix:( )"("ok 2\n"); 
    2035$void = $code1."postcircumfix:( )"(); 
    21 $void = $code1."postcircumfix:( )"();