Changeset 21971
- Timestamp:
- 08/20/08 20:48:37 (3 months ago)
- Location:
- v6/smop
- Files:
-
- 6 modified
- 1 moved
-
CMakeLists.txt (modified) (1 diff)
-
include/smop_mold.h (modified) (1 diff)
-
src/idconst.c (modified) (2 diffs)
-
src/smop_internal.h (modified) (1 diff)
-
src/smop_mold.c (modified) (3 diffs)
-
src/smop_s1p_code.sm0p (moved) (moved from v6/smop/src/smop_s1p_code.c) (5 diffs, 1 prop)
-
test/21_code.m0ld (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
v6/smop/CMakeLists.txt
r21965 r21971 65 65 src/p6opaque.sm0p 66 66 src/smop_s1p_attribute.sm0p 67 src/smop_s1p_code.sm0p 67 68 ) 68 69 compile_sm0p (${sm0p_file}) -
v6/smop/include/smop_mold.h
r21874 r21971 10 10 */ 11 11 extern SMOP__Object* SMOP__Mold; 12 extern SMOP__Object* SMOP__Mold__Frame; 12 13 SMOP__Object* SMOP__Mold_create(int registers,SMOP__Object** constants,int opcodes_len,int *opcodes); 13 14 SMOP__Object* SMOP__Mold__Frame_create(SMOP__Object* interpreter,SMOP__Object* mold); -
v6/smop/src/idconst.c
r21739 r21971 9 9 #include <pthread.h> 10 10 #include <stdio.h> 11 #include <smop_s1p.h> 11 12 #include "smop_internal.h" 12 13 … … 57 58 SMOP__Object* identifier, 58 59 SMOP__Object* capture) { 59 // TODO 60 return NULL; 60 ___UNKNOWN_METHOD___; 61 61 } 62 62 -
v6/smop/src/smop_internal.h
r21903 r21971 80 80 smop_s1p_lexicalscope_mold_init(); \ 81 81 smop_s1p_defaultblocksignature_mold_init(); \ 82 smop_s1p_code_mold_init(); \ 82 83 83 84 #define SMOP_BOOTSTRAP_DESTR_SEQUENCE \ 85 smop_s1p_code_mold_destr(); \ 84 86 smop_s1p_defaultblocksignature_mold_destr();\ 85 87 smop_s1p_lexicalscope_mold_destr(); \ -
v6/smop/src/smop_mold.c
r21919 r21971 8 8 SMOP__Object* SMOP__Mold; 9 9 SMOP__Object* SMOP__Mold__Frame; 10 11 static SMOP__Object* SMOP__ID__set_reg; 12 static SMOP__Object* SMOP__ID__set_back; 10 13 11 14 typedef struct smop_mold { … … 143 146 SMOP__Object* mold = SMOP__NATIVE__capture_positional(interpreter, capture, 0); 144 147 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 145 171 } else if (SMOP__ID__has_next == identifier) { 146 172 if (mold->opcodes[frame->position]) { … … 289 315 290 316 void 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 291 320 SMOP__Mold = calloc(1,sizeof(SMOP__ResponderInterface)); 292 321 ((SMOP__ResponderInterface*)SMOP__Mold)->MESSAGE = smop_mold_message; -
v6/smop/src/smop_s1p_code.sm0p
r21970 r21971 2 2 #include <smop_lowlevel.h> 3 3 #include <smop_identifiers.h> 4 #include <smop_mold.h> 4 5 #include <smop_s1p.h> 5 6 #include <stdlib.h> … … 8 9 9 10 SMOP__Object* SMOP__S1P__Code; 11 12 static SMOP__Object* smop_s1p_code_mold; 10 13 11 14 /* … … 52 55 SMOP__Object* outer = code->outer; 53 56 SMOP__Object* mold = code->mold; 57 SMOP__Object* signature = code->signature; 54 58 smop_lowlevel_unlock(invocant); 55 59 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)); 57 61 SMOP__Object* back = SMOP_DISPATCH(interpreter, SMOP_RI(interpreter), 58 62 SMOP__ID__continuation, … … 62 66 mold_reg_set(interpreter,frame,0,SMOP_REFERENCE(interpreter,interpreter)); 63 67 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 66 74 SMOP_DISPATCH(interpreter,SMOP_RI(interpreter),SMOP__ID__goto,frame); 67 75 … … 99 107 free(SMOP__S1P__Code); 100 108 } 109 110 void 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 138 void 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 2 2 my $out_scalar = ¢SMOP__S1P__RootNamespace."postcircumfix:{ }"("$*OUT"); 3 3 my $out = $out_scalar."FETCH"(); 4 $void = $out."print"("1.. 2\n");4 $void = $out."print"("1..3\n"); 5 5 6 6 my $Code_scalar = ¢SMOP__S1P__RootNamespace."postcircumfix:{ }"("::Code"); 7 7 my $Code = $Code_scalar."FETCH"(); 8 my $code1 = $Code."new"(:"outer"("...outer..."),:"signature"("...signature..."),:"mold"(mold { 8 my $lexicalscope = ¢SMOP__S1P__LexicalScope."new"(); 9 10 my $it_var_slot = $lexicalscope."postcircumfix:{ }"("$_"); 11 my $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 15 my $code1 = $Code."new"(:"outer"($lexicalscope),:"signature"(¢SMOP__S1P__DefaultBlockSignature),:"mold"(mold { 9 16 my $interpreter; 10 my $capture; 11 my $outer; 12 my $back; 17 my $lexical; 13 18 19 20 my $it_var_slot = $lexical."postcircumfix:{ }"("$_"); 21 my $it_var = $it_var_slot."FETCH"(); 22 my $it = $it_var."FETCH"(); 23 14 24 my $void; 15 25 my $out_scalar = ¢SMOP__S1P__RootNamespace."postcircumfix:{ }"("$*OUT"); 16 26 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); 19 32 })); 33 $void = $code1."postcircumfix:( )"("ok 1\n"); 34 $void = $code1."postcircumfix:( )"("ok 2\n"); 20 35 $void = $code1."postcircumfix:( )"(); 21 $void = $code1."postcircumfix:( )"();
