Changeset 22523
- Timestamp:
- 10/07/08 09:51:39 (6 weeks ago)
- Location:
- v6/smop
- Files:
-
- 2 added
- 7 modified
-
CMakeLists.txt (modified) (4 diffs)
-
include/smop_lowlevel.h (modified) (1 diff)
-
src/internal.h (modified) (6 diffs)
-
src/proto.ri (added)
-
src/ri.c (modified) (3 diffs)
-
src/s1p_io.ri (modified) (1 diff)
-
src/s1p_lexicalscope.ri (added)
-
tools/dsl (modified) (1 diff)
-
tools/ri (modified) (10 diffs)
Legend:
- Unmodified
- Added
- Removed
-
v6/smop/CMakeLists.txt
r22512 r22523 55 55 COMMAND perl ARGS ${smop_SOURCE_DIR}/tools/dsl ri ${smop_SOURCE_DIR}/ ${CMAKE_CURRENT_BINARY_DIR}/m0ld_exe ${smop_SOURCE_DIR}/${dsl_file} ${CMAKE_CURRENT_BINARY_DIR}/${c_file} 56 56 DEPENDS ${smop_SOURCE_DIR}/${dsl_file} 57 DEPENDS ${smop_SOURCE_DIR}/tools/ri 57 58 ) 58 59 endmacro(compile_ri) … … 88 89 foreach (sm0p_file 89 90 src/lowlevel.sm0p 90 src/s1p_lexicalscope.sm0p91 91 src/s1p_defaultblocksignature.sm0p 92 92 src/s1p_bindcapturesignature.sm0p … … 104 104 foreach (ri_file 105 105 src/s1p_io.ri 106 src/s1p_lexicalscope.ri 107 src/proto.ri 106 108 ) 107 109 compile_ri (${ri_file}) … … 147 149 src/slime_node.c 148 150 src/ri.c 151 src/proto.c 149 152 # src_s1p_itemcontext.c 150 153 # src_s1p_itemrwcontext.c -
v6/smop/include/smop_lowlevel.h
r22230 r22523 56 56 char *id 57 57 ); 58 SMOP__Object* SMOP__Proto__create(SMOP__Object*,SMOP__Object*); 58 59 59 60 /* This functions decrements the reference count of a value, it should -
v6/smop/src/internal.h
r22512 r22523 34 34 smop_native_bool_destr(); \ 35 35 smop_native_capture_destr(); \ 36 smop_ri_destr(); \ 37 smop_proto_destr(); \ 36 38 smop_interpreter_destr(); \ 37 39 smop_lowlevel_destr(); \ 38 smop_ri_destr(); \ 39 smop_idconst_destr(); 40 smop_idconst_destr(); 40 41 41 42 /* … … 58 59 smop_s1p_io_init(); \ 59 60 smop_s1p_attribute_init(); \ 60 smop_s1p_lexicalscope_init(); \61 61 smop_s1p_capturize_init(); \ 62 62 smop_s1p_defaultblocksignature_init(); \ … … 78 78 smop_s1p_defaultblocksignature_destr();\ 79 79 smop_s1p_capturize_destr(); \ 80 smop_s1p_lexicalscope_destr(); \81 80 smop_s1p_attribute_destr(); \ 82 81 smop_s1p_io_destr(); \ … … 93 92 94 93 #define SMOP_BOOTSTRAP_INIT_SEQUENCE \ 94 smop_proto_init(); \ 95 95 smop_s1p_root_namespace_init(); \ 96 smop_s1p_lexicalscope_ mold_init(); \96 smop_s1p_lexicalscope_init(); \ 97 97 smop_s1p_defaultblocksignature_mold_init(); \ 98 98 smop_s1p_bindcapturesignature_mold_init(); \ … … 111 111 smop_s1p_bindcapturesignature_mold_destr(); \ 112 112 smop_s1p_defaultblocksignature_mold_destr();\ 113 smop_s1p_lexicalscope_ mold_destr(); \113 smop_s1p_lexicalscope_destr(); \ 114 114 smop_s1p_root_namespace_destr(); \ 115 115 … … 148 148 void smop_s1p_lexicalscope_init(); 149 149 void smop_s1p_lexicalscope_destr(); 150 void smop_s1p_lexicalscope_mold_init();151 void smop_s1p_lexicalscope_mold_destr();152 150 void smop_s1p_defaultblocksignature_init(); 153 151 void smop_s1p_defaultblocksignature_destr(); -
v6/smop/src/ri.c
r22512 r22523 54 54 55 55 void smop_ri_init() { 56 SMOP__RI = calloc(1,sizeof(SMOP__ResponderInterface));56 SMOP__RI = malloc(sizeof(SMOP__ResponderInterface)); 57 57 ((SMOP__ResponderInterface*)SMOP__RI)->MESSAGE = message; 58 58 ((SMOP__ResponderInterface*)SMOP__RI)->REFERENCE = ri_reference;//smop_lowlevel_generic_reference; … … 63 63 64 64 void smop_ri_destr() { 65 free(SMOP__RI);65 //free(SMOP__RI); 66 66 } 67 67 … … 88 88 return ret; 89 89 } 90 -
v6/smop/src/s1p_io.ri
r22512 r22523 1 %prototype IO1 //%prototype IO 2 2 %RI.id lowlevel io 3 3 %prefix smop_s1p_io 4 4 5 5 %{ 6 typedef struct smop_s1p_io_struct {7 SMOP__Object__BASE8 } smop_s1p_io_struct;9 10 6 SMOP__Object* SMOP__S1P__IO_create(SMOP__Object* interpreter) { 11 7 SMOP_REFERENCE(interpreter,RI); -
v6/smop/tools/dsl
r22263 r22523 12 12 system("perl $elfX -C m0ld -s $in > $out"); 13 13 } elsif ($dsl eq 'ri') { 14 system("perl $base/tools/ri$in > $out");14 system("perl -I$base/../../src/perl6 $base/tools/ri $base $m0ld $in > $out"); 15 15 } elsif ($dsl eq 'p6-pugs') { 16 16 system("$base/../../pugs -Cm0ld $in > $out"); -
v6/smop/tools/ri
r22303 r22523 1 1 #!/usr/bin/perl 2 package SMOP::RI; 2 3 use warnings; 3 4 use strict; 4 5 use IO::Select; 6 use IO::Handle; 7 use IPC::Open3; 8 use Symbol; 9 require 'mangle.pl'; 10 11 12 my ($base,$m0ld) = (shift @ARGV,shift @ARGV); 13 sub preprocess_m0ld { 14 my $code = shift; 15 #warn "got m0ld code <$code>\n"; 16 return preprocess($code,"$m0ld"); 17 } 18 sub preprocess { 19 my $code = shift; 20 my ($writer, $reader, $error) = map { gensym } 1..3; 21 my $pid = open3($writer, $reader, $error,@_) || die "$@"; 22 print {$writer} $code; 23 close $writer; 24 25 my ($errbuf, $retbuf) = ('',''); 26 27 $reader->blocking(0); 28 $error->blocking(0); 29 30 my $select = IO::Select->new(); 31 $select->add($reader); 32 $select->add($error); 33 34 while ($select->can_read(10000) && (!eof($reader) || !eof($error))) { 35 36 my $buf = ''; 37 my $returncode = read $reader, $buf, 1024; 38 $retbuf .= $buf; 39 40 $buf = ''; 41 my $returncode2 = read $error, $buf, 1024; 42 $errbuf .= $buf; 43 44 } 45 46 print $errbuf; 47 close $reader; 48 close $error; 49 waitpid($pid,0); 50 die join(' ',@_).' returned failure '.$? if ($? || !$retbuf || $retbuf eq "\n") ; 51 return $retbuf; 52 } 5 53 sub mangle { 6 54 my $id = shift; 7 return 'ID__'. $id;55 return 'ID__'.::mangle($id); 8 56 } 9 57 … … 14 62 my $method; 15 63 16 my $raw = ''; 64 my %mold; 65 my $mold; 66 67 my %attrs; 68 my @getters; 69 70 my %raw; 17 71 18 72 sub debug { 19 73 } 20 74 while (my $line = <>) { 21 if ($line =~ /^\%\{\s*/) { 22 debug "raw start\n"; 75 if ($line =~ /^\%\s*(\w*)\s*\{\s*$/) { 76 debug "raw.$1 start\n"; 77 $raw{$1} = ''; 23 78 until((my $raw_line = <>) =~ /^\%}\s*$/) { 24 79 debug "raw $raw_line"; 25 $raw .= $raw_line;80 $raw{$1} .= $raw_line; 26 81 } 27 debug "raw stop\n";82 debug "raw.R1 stop\n"; 28 83 } elsif ($method) { 29 84 if ($line =~ /^%/) { … … 35 90 next; 36 91 } 92 } elsif ($mold) { 93 if ($line =~ /^%/) { 94 undef $mold; 95 redo; 96 } else { 97 debug "in mold $line"; 98 $mold{$mold} .= $line; 99 next; 100 } 37 101 } elsif ($line =~ /^%method\s*(.*)$/) { 38 102 $method = $1; 39 103 debug "method start:$method\n"; 104 } elsif ($line =~ /^%mold\s*(.*)$/) { 105 $mold = $1; 106 debug "mold start:$mold\n"; 107 } elsif ($line =~ /^%attr\s*(.*?)\s*(\S+)$/) { 108 $attrs{$2} = $1; 109 } elsif ($line =~ /^%getter\s*(\S+)$/) { 110 push(@getters,$1); 40 111 } elsif ($line =~ / ^\s*$ | ^\# | ^\/\/ /x) { 41 112 debug "ws/comment:$line"; … … 53 124 } 54 125 126 die "a %prefix is required\n" unless $properties{prefix}; 55 127 56 128 print qq[/* generated by tools/ri - do not edit*/ … … 60 132 #include <stdlib.h> 61 133 #include <stdio.h> 134 #include <smop_mold.h> 62 135 ]; 63 136 for (split (/,/,$properties{include} || '')) { … … 67 140 my $id = defined $properties{"RI.id"} ? $properties{"RI.id"} : "unknown RI"; 68 141 142 if ($properties{prototype}) { 143 print "SMOP__Object* $properties{prototype};\n"; 144 } 69 145 if ($properties{RI}) { 70 146 print "SMOP__Object* $properties{RI};\n"; … … 76 152 print 'static SMOP__Object* ',mangle($_),";\n"; 77 153 } 78 79 print $raw; 80 154 for (keys %mold) { 155 print 'static SMOP__Object* ',$_,";\n"; 156 } 157 print qq[ 158 typedef struct $properties{prefix}_struct { 159 SMOP__Object__BASE 160 ]; 161 while (my ($name,$type) = each %attrs) { 162 print " $type $name;\n"; 163 } 164 print "} $properties{prefix}_struct;\n"; 165 166 print $raw{''} || ''; 167 168 169 for my $getter (@getters) { 170 $methods{$getter} = qq[ smop_lowlevel_rdlock(invocant); 171 ret = (($properties{prefix}_struct*)invocant)->$getter; 172 smop_lowlevel_unlock(invocant); 173 SMOP_REFERENCE(interpreter, ret); 174 ]; 175 } 81 176 print q[ 82 177 static SMOP__Object* message(SMOP__Object* interpreter, … … 84 179 SMOP__Object* identifier, 85 180 SMOP__Object* capture) { 181 ]; 182 183 print ' '; 184 if ($raw{message}) { 185 print $raw{message}; 186 } else { 187 print q[ 86 188 ___NATIVE_CAPTURE_ONLY___; 87 189 ___CONST_IDENTIFIER_ONLY___; 88 ___INVOCANT_RI_SHOULD_MATCH___;190 SMOP__Object* invocant = (SMOP__Object*) SMOP__NATIVE__capture_invocant(interpreter, capture); 89 191 SMOP__Object* ret = SMOP__NATIVE__bool_false; 90 91 ]; 92 print ' '; 93 while (my ($method,$body) = each %methods) { 94 print "if (",mangle($method)," == identifier) {\n$body } else "; 95 } 96 print qq[{ 192 ]; 193 while (my ($method,$body) = each %methods) { 194 print "if (",mangle($method)," == identifier) {\n$body } else "; 195 } 196 print qq[{ 97 197 ___UNKNOWN_METHOD___; 98 198 } … … 101 201 SMOP_RELEASE(interpreter,capture); 102 202 return ret; 203 ]; 204 } 205 print q[ 103 206 } 104 207 ]; … … 112 215 "$id"); 113 216 ]; 217 print " SMOP__Object* interpreter = SMOP__GlobalInterpreter;\n"; 114 218 for (keys %methods) { 115 219 print " ",mangle($_)," = ","SMOP__NATIVE__idconst_create(\"$_\");\n"; 116 220 } 221 while (my ($name,$mold) = each %mold) { 222 print " $name = ",preprocess_m0ld($mold),";\n"; 223 } 224 225 if ($properties{prototype}) { 226 print qq[ 227 $properties{prototype} = SMOP__Proto__create(interpreter,SMOP_REFERENCE(interpreter,$RI)); 228 ]; 229 } 117 230 print qq[ 118 231 } 119 232 120 233 void $properties{prefix}_destr() { 234 ]; 235 #printf("$properties{prefix}_destr()\\n"); 236 if ($properties{prototype}) { 237 print qq[ 238 SMOP_RELEASE(SMOP__GlobalInterpreter,$properties{prototype}); 239 ]; 240 } 241 while (my ($name,$mold) = each %mold) { 242 print "SMOP_RELEASE(SMOP__GlobalInterpreter,$name);\n"; 243 } 244 print qq[ 121 245 SMOP_RELEASE(SMOP__GlobalInterpreter,$RI); 122 246 } 123 ] 247 ]; 248 print $raw{'bottom'} || '';
