Changeset 4231 for src/perl5

Show
Ignore:
Timestamp:
06/01/05 01:23:56 (4 years ago)
Author:
clkao
svk:copy_cache_prev:
5801
Message:

Accessing p6 array(ref) in perl5, almost.

Location:
src/perl5
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • src/perl5/perl5.c

    r4227 r4231  
    1616const char pugs_guts_code[] = 
    1717"use strict;" 
     18 
    1819"package pugs;" 
    1920 
     
    2122"sub AUTOLOAD { pugs::guts::invoke($AUTOLOAD, @_) } " 
    2223"sub DESTROY {}" 
     24 
    2325"package pugs::guts;" 
    2426"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';" 
    2759"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 } 
    4060 
    4161XS(_pugs_guts_invoke) { 
     
    6888    ST(0) = pugs_Apply(val, inv, stack, GIMME_V); 
    6989    /* sv_dump (ret); */ 
     90    free (stack); 
     91     
     92    XSRETURN(1); 
     93} 
     94 
     95 
     96XS(_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); 
    70113    free (stack); 
    71114     
     
    164207 
    165208    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); 
    168212    eval_pv(pugs_guts_code, TRUE); 
    169213 
    170214    if (SvTRUE(ERRSV)) { 
     215        fprintf(stderr, "Hate!\n"); 
    171216        STRLEN n_a; 
    172217        printf("Error init perl: %s\n", SvPV(ERRSV,n_a)); 
  • src/perl5/pugsembed.c

    r4199 r4231  
    1717    SV *sv = newSV(0); 
    1818    Val *isa[2]; 
    19     SV *stack[8]; 
     19    SV *stack[8], *type; 
    2020 
    2121    sv_setref_pv(sv, "pugs", val); 
    2222 
    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] )) { 
    2837            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); 
    3139            sv = rv[0]; 
    3240        } 
    3341        else { 
    34             fprintf(stderr, "MkValRef called before perl_init.\n"); 
     42            fprintf(stderr, "unknown type\n"); 
    3543        } 
    3644    } 
     45 
    3746    return (sv); 
    3847}