- Timestamp:
- 06/01/05 01:23:56 (4 years ago)
- svk:copy_cache_prev:
- 5801
- Location:
- src/perl5
- Files:
-
- 2 modified
-
perl5.c (modified) (4 diffs)
-
pugsembed.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
src/perl5/perl5.c
r4227 r4231 16 16 const char pugs_guts_code[] = 17 17 "use strict;" 18 18 19 "package pugs;" 19 20 … … 21 22 "sub AUTOLOAD { pugs::guts::invoke($AUTOLOAD, @_) } " 22 23 "sub DESTROY {}" 24 23 25 "package pugs::guts;" 24 26 "our @ISA=('pugs');" 25 "sub code { my ($class, $val) = @_;" 26 " sub { pugs::guts::invoke($val, undef, @_) } }" 27 "sub Block { my ($class, $val) = @_;" 28 " sub { pugs::guts::invoke($val, undef, @_) } }" 29 30 "sub Array { my ($class, $val) = @_;" 31 " my $array; tie @$array, 'pugs::array', $val;" 32 " warn 'returning '.$array;" 33 " return $array; }" 34 35 "our $AUTOLOAD;" 36 "sub AUTOLOAD { my $type = $AUTOLOAD; $type =~ s/.*:://;" 37 " return if $type =~ m/^[A-Z]*$/; die 'unhandled supported type: '.$type } " 38 "warn 'compiled .'.__PACKAGE__;" 39 40 "package pugs::array;" 41 "sub TIEARRAY {" 42 " my ($class, $val) = @_;" 43 " bless \\$val, $class; }" 44 45 "sub STORE {" 46 " my ($self, $index, $elem) = @_;" 47 " warn 'store! '.$elem;" 48 " pugs::guts::eval_apply('{ $^x[$^y] = $^z }', $$self, $index, $elem) }" 49 50 "sub FETCHSIZE {" 51 " my ($self) = @_;" 52 " my $ret = pugs::guts::invoke('elems', $$self); " 53 " warn 'FETCHSIZE: '.$ret; $ret; }" 54 55 "sub FETCH {" 56 " my ($self, $index) = @_;" 57 " pugs::guts::eval_apply('{ $^x[$^y] }', $$self, $index) }" 58 "warn 'compiled';" 27 59 "1;"; 28 29 XS(_pugs_guts_eval) {30 Val *val;31 32 dXSARGS;33 if (items < 1)34 Perl_croak(aTHX_ "hate software");35 val = pugs_Eval ( SvPV_nolen(ST(0)) );36 ST(0) = pugs_ValToSv ( val );37 38 XSRETURN(1);39 }40 60 41 61 XS(_pugs_guts_invoke) { … … 68 88 ST(0) = pugs_Apply(val, inv, stack, GIMME_V); 69 89 /* sv_dump (ret); */ 90 free (stack); 91 92 XSRETURN(1); 93 } 94 95 96 XS(_pugs_guts_eval_apply) { 97 Val *val, *inv, **stack; 98 int i; 99 dXSARGS; 100 if (items < 1) 101 Perl_croak(aTHX_ "hate software"); 102 103 val = pugs_Eval(SvPV_nolen(ST(0))); 104 105 stack = (Val **)malloc(sizeof(Val*)*items-1); 106 for (i = 1; i < items; ++i) { 107 fprintf(stderr, "put into stack: %s\n", SvPV_nolen(ST(i))); 108 stack[i-1] = pugs_SvToVal(ST(i)); 109 } 110 stack[i-1] = NULL; 111 112 ST(0) = pugs_Apply(val, NULL, stack, GIMME_V); 70 113 free (stack); 71 114 … … 164 207 165 208 newXS((char*) "pugs::guts::invoke", _pugs_guts_invoke, (char*)__FILE__); 166 newXS((char*) "pugs::guts::eval", _pugs_guts_eval, (char*)__FILE__); 167 209 newXS((char*) "pugs::guts::eval_apply", _pugs_guts_eval_apply, (char*)__FILE__); 210 211 fprintf(stderr, "(%s)", pugs_guts_code); 168 212 eval_pv(pugs_guts_code, TRUE); 169 213 170 214 if (SvTRUE(ERRSV)) { 215 fprintf(stderr, "Hate!\n"); 171 216 STRLEN n_a; 172 217 printf("Error init perl: %s\n", SvPV(ERRSV,n_a)); -
src/perl5/pugsembed.c
r4199 r4231 17 17 SV *sv = newSV(0); 18 18 Val *isa[2]; 19 SV *stack[8] ;19 SV *stack[8], *type; 20 20 21 21 sv_setref_pv(sv, "pugs", val); 22 22 23 isa[0] = pugs_PvToVal("Code"); 24 isa[1] = NULL; 25 if (SvTRUE(pugs_Apply(pugs_PvToVal("&isa"), val, isa, G_SCALAR))) { 26 if (__init) { 27 SV **rv; 23 if (!__init) { 24 fprintf(stderr, "MkValRef called before perl_init.\n"); 25 } 26 27 isa[0] = NULL; 28 29 type = pugs_Apply(pugs_PvToVal("&ref"), val, isa, G_SCALAR); 30 fprintf(stderr, "query the type: got %s\n", SvPV_nolen(type)); 31 if (SvTRUE( type )) { 32 SV **rv; 33 stack[0] = type; 34 stack[1] = NULL; 35 rv = perl5_apply(newSVpv("can", 0), newSVpv("pugs::guts", 0), stack, NULL, G_SCALAR); 36 if (SvTRUE( rv[0] )) { 28 37 stack[0] = sv; 29 stack[1] = NULL; 30 rv = perl5_apply(newSVpv("code", 0), newSVpv("pugs::guts", 0), stack, NULL, G_SCALAR); 38 rv = perl5_apply(type, newSVpv("pugs::guts", 0), stack, NULL, G_SCALAR); 31 39 sv = rv[0]; 32 40 } 33 41 else { 34 fprintf(stderr, " MkValRef called before perl_init.\n");42 fprintf(stderr, "unknown type\n"); 35 43 } 36 44 } 45 37 46 return (sv); 38 47 }
