cvsuser     04/07/14 02:42:28

  Modified:    classes  parrotobject.pmc
               languages/python pie-thon.pl
               src      objects.c
  Log:
  Pie-thon 64 - pie-thon.pl bit better name handling; start w. classes
  
  Revision  Changes    Path
  1.31      +10 -1     parrot/classes/parrotobject.pmc
  
  Index: parrotobject.pmc
  ===================================================================
  RCS file: /cvs/public/parrot/classes/parrotobject.pmc,v
  retrieving revision 1.30
  retrieving revision 1.31
  diff -u -w -r1.30 -r1.31
  --- parrotobject.pmc  23 Jun 2004 07:14:30 -0000      1.30
  +++ parrotobject.pmc  14 Jul 2004 09:42:21 -0000      1.31
  @@ -1,6 +1,6 @@
   /*
   Copyright: 2001-2003 The Perl Foundation.  All Rights Reserved.
  -$Id: parrotobject.pmc,v 1.30 2004/06/23 07:14:30 leo Exp $
  +$Id: parrotobject.pmc,v 1.31 2004/07/14 09:42:21 leo Exp $
   
   =head1 NAME
   
  @@ -66,6 +66,15 @@
               "use the registered class instead");
       }
   
  +    void init_pmc() {
  +        SELF.init();
  +    }
  +
  +    void* invoke(void* next) {
  +        SELF.init();
  +        return next;
  +    }
  +
       void mark() {
           SLOTTYPE *attrib_array = PMC_data(SELF);
           UINTVAL i;
  
  
  
  1.42      +74 -62    parrot/languages/python/pie-thon.pl
  
  Index: pie-thon.pl
  ===================================================================
  RCS file: /cvs/public/parrot/languages/python/pie-thon.pl,v
  retrieving revision 1.41
  retrieving revision 1.42
  diff -u -w -r1.41 -r1.42
  --- pie-thon.pl       13 Jul 2004 16:28:21 -0000      1.41
  +++ pie-thon.pl       14 Jul 2004 09:42:25 -0000      1.42
  @@ -8,7 +8,8 @@
   use strict;
   use Getopt::Std;
   
  -my ($DIS, @dis, @source, $file, %opt, $DEFVAR, $cur_func, $lambda_count);
  +my ($DIS, @dis, @source, $file, %opt, $DEFVAR, $cur_func, $lambda_count,
  +   %main_names);
   $DIS = 'python mydis.py';
   $DEFVAR = 'PerlInt';
   
  @@ -215,12 +216,13 @@
        $params
   EOC
       print <<EOC;
  -     new_pad 0
  +     new_pad -1
        .local pmc None
        None = new .None
   EOC
  -    $names{None} = 1;
  -    $globals{None} = 1;
  +    %globals = ();
  +    $names{None} = 'None';
  +    $globals{None} = 'None';
       if ($def_args{$arg}) {
        my ($i, $n, $defs);
        $n = $arg_count{$arg};
  @@ -261,13 +263,14 @@
       print <<EOC;
   .sub $cur_func [EMAIL PROTECTED]
       .param pmc sys::argv
  +    new_pad 0
       .local pmc __name__
       __name__ = new $DEFVAR
       __name__ = '__main__'
       .local pmc None
       None = new .None
   EOC
  -    $globals{'__name__'} = 1;
  +    $globals{'__name__'} = '__name__';
       $code_l = 0;
       for (@dis) {
        next if /^\s*$/;
  @@ -433,65 +436,46 @@
       my ($n, $c, $cmt) = @_;
       if ($make_f) {
        $make_f = 0;
  -     print "\t\t$cmt\n";
  +     print "# make_f t$cmt\n";
        return;
       }
       my $tos = pop @stack;
  -    my $pmc;
  -    print "\t\t$cmt\n";
  -    unless ($names{$c}) {
  -     print <<"EOC";
  -     .local pmc $c \t# case 0
  -EOC
  -     if ($tos->[2] eq 'P' && $tos->[1] =~ /^\$/) {
  -         $pmc = $tos->[1];
  -     }
  -     elsif ($builtins{$tos->[1]}) {
  -         $pmc = $tos->[1];
  -     }
  -     else {
  -         print <<"EOC";
  -     $c = new $DEFVAR \t# case 1
  +    my $p = $tos->[1];
  +    if ($names{$c}) {
  +     my $pmc = $names{$c};
  +     print <<EOC;
  +     assign $pmc, $p $cmt
   EOC
  -         $pmc = $c
  -     }
  -    }
  -    if ($tos->[2] eq 'P') {
  -     $pmc = $tos->[1];
  +     $p = $pmc;
       }
       else {
  -     $pmc = promote($tos);
  +     $p = promote($tos);
  +     if ($cur_func eq 'test::main') {
  +         $main_names{$c} = $p;
       }
  -    $globals{$c} = 1;
  -    $names{$c} = 1;
  -    if ($builtins{$pmc}) {
  -     print <<"EOC";
  -     global "$c" = $pmc \t# case 2b
  -     $c = $pmc
  -EOC
  -     return;
  -    }
  -    # a temp - store it - XXX or a global dunno
  -    if (1||$pmc =~ /^\$/) {
  -     print <<"EOC";
  -     global "$c" = $pmc \t# case 2
  -     $c = $pmc
  -EOC
  -    }
  -    else {
  -     print <<"EOC";
  -     assign $c, $pmc \t# case 3
  +     print <<EOC;
  +     store_lex -1, $n, $p $cmt
   EOC
       }
  +    $names{$c} = $p;
   }
   
   sub STORE_GLOBAL {
       my ($n, $c, $cmt) = @_;
       my $tos = pop @stack;
  +    my $p = $tos->[1];
  +    if ($globals{$c}) {
       print <<EOC;
  -     global "$c" = $tos->[1] $cmt
  +     assign $c, $p;
   EOC
   }
  +    else {
  +     print <<EOC;
  +     global "$c" = $p $cmt
  +EOC
  +    }
  +    $globals{$c} = $p;
  +}
   
   
   sub is_opcode {
  @@ -504,10 +488,25 @@
       if (is_opcode($c) || $builtins{$c}) {
        return LOAD_NAME(@_);
       }
  -    my $p = temp('P');
  +    my $p;
  +    if (($p = $globals{$c})) {
  +     print <<EOC;
  +     # $p = global "$c" $cmt
  +EOC
  +    }
  +    elsif ($main_names{$c}) {
  +     $p = temp('P');
  +     print <<EOC;
  +     $p = find_lex -1, $n $cmt
  +EOC
  +    }
  +    else {
  +     $p = temp('P');
  +     $globals{$c} = $p;
       print <<"EOC";
        $p = global "$c" $cmt
   EOC
  +    }
       push @stack, [$c, $p, 'P'];
       # print_stack();
   }
  @@ -516,6 +515,7 @@
   sub LOAD_NAME() {
       my ($n, $c, $cmt) = @_;
       my ($o);
  +    my $p;
       if (($o = is_opcode($c))) {
        print <<EOC;
        # builtin $c $cmt $o
  @@ -523,22 +523,33 @@
        push @stack, [$c, $c, $o];
        return;
       }
  -    if ($globals{$c}) {
  +    # params TODO
  +    if ($names{$c}) {
  +     $p = $names{$c};
  +     print <<"EOC";
  +     # lexical $n '$c' := $p $cmt
  +EOC
  +    }
  +    elsif ($globals{$c}) {
  +     $p = $globals{$c};
        print <<"EOC";
        # $c = global "$c" $cmt
   EOC
       }
       else {
  -     $c = type_map($c);
  -     $globals{$c} = 1;
        my $type = 'pmc';
  -     $type = 'NCI' if ($builtins{$c});
  +     $p = $c;
  +     if ($type_map{$c}) {
  +         $c = $p = $type_map{$c};
  +         $type = 'NCI';
  +     }
  +     $globals{$c} = $c;
        print <<"EOC";
        .local $type $c $cmt
        $c = global "$c"
   EOC
       }
  -    push @stack, [$c, $c, 'P'];
  +    push @stack, [$c, $p, 'P'];
   }
   
   sub PRINT_ITEM
  @@ -929,9 +940,9 @@
       if ($make_f) {
        $make_f = 0;
        print <<EOC;
  -     \t$cmt
  +     # make_f \t$cmt
   EOC
  -     pop @stack;
  +     # pop @stack;
        return;
       }
       my $func;
  @@ -1051,9 +1062,9 @@
       }
       else {
        my $p = 5 + keys %params;
  -     $params{$c} = 1;
  -     $lexicals{$c} = 1;
  -     $names{$c} = 1;
  +     $params{$c} = $c;
  +     $lexicals{$c} = $c;
  +     $names{$c} = $c;
        print <<EOC;
        # .param pmc $c $cmt
        #.local pmc $c
  @@ -1320,11 +1331,12 @@
   sub BUILD_CLASS
   {
       my ($n, $c, $cmt) = @_;
  +    my $parent_tuple = pop @stack;
       my $tos = pop @stack;
       my $cl = temp('P');
       $classes{$tos->[1]} = 1;
       print <<EOC;
  -     $cl = newclass $tos->[1] $cmt
  +     $cl = subclass $parent_tuple->[1], $tos->[1] $cmt
   EOC
       push @stack, ["class $tos->[1]", $cl, 'P'];
   }
  
  
  
  1.102     +36 -2     parrot/src/objects.c
  
  Index: objects.c
  ===================================================================
  RCS file: /cvs/public/parrot/src/objects.c,v
  retrieving revision 1.101
  retrieving revision 1.102
  diff -u -w -r1.101 -r1.102
  --- objects.c 10 Jul 2004 09:02:35 -0000      1.101
  +++ objects.c 14 Jul 2004 09:42:28 -0000      1.102
  @@ -1,6 +1,6 @@
   /*
   Copyright: 2001-2003 The Perl Foundation.  All Rights Reserved.
  -$Id: objects.c,v 1.101 2004/07/10 09:02:35 leo Exp $
  +$Id: objects.c,v 1.102 2004/07/14 09:42:28 leo Exp $
   
   =head1 NAME
   
  @@ -24,6 +24,8 @@
   
   #include "objects.str"
   
  +static void* instantiate_py_object(Interp*, PMC*, void*);
  +
   static PMC *
   clone_array(Parrot_Interp interpreter, PMC *source_array)
   {
  @@ -179,6 +181,10 @@
       int i;
       const char *meth;
       STRING meth_str;
  +    union {
  +        const void * __c_ptr;
  +        void * __ptr;
  +    } __ptr_u;
   
       vtable_pmc = get_attrib_num((SLOTTYPE *)PMC_data(class), PCD_OBJECT_VTABLE);
       vtable = PMC_struct_val(vtable_pmc);
  @@ -191,7 +197,7 @@
       for (i = 0; (meth = Parrot_vtable_slot_names[i]); ++i) {
           if (!*meth)
               continue;
  -        meth_str.strstart = meth;
  +        meth_str.strstart = const_cast(meth);
           meth_str.strlen = strlen(meth);
           meth_str.hashval = 0;
           if (Parrot_find_global(interpreter, class_name, &meth_str)) {
  @@ -248,6 +254,23 @@
       PMC *parents, *temp_pmc;
       int parent_is_class;
   
  +    if (base_class->vtable->base_type == enum_class_FixedPMCArray) {
  +        PMC *tuple = base_class;
  +        /* got a tuple holding parents - Python!
  +         */
  +        INTVAL n = VTABLE_elements(interpreter, tuple);
  +        if (!n) {
  +            PMC* class = pmc_new(interpreter, enum_class_ParrotClass);
  +            Parrot_new_class(interpreter, class, child_class_name);
  +            return class;
  +        }
  +        if (n > 1)
  +            internal_exception(1, "subclass: unimp multiple parents");
  +        base_class = VTABLE_get_pmc_keyed_int(interpreter, tuple, 0);
  +        if (0&&PMC_struct_val(base_class) == (void*)0xdeadbeef)
  +            base_class = pmc_new(interpreter, base_class->vtable->base_type);
  +    }
  +
       parent_is_class = PObj_is_class_TEST(base_class);
   
       child_class = pmc_new(interpreter, enum_class_ParrotClass);
  @@ -446,6 +469,7 @@
       /* Reset the init method to our instantiation method */
       new_vtable->init = Parrot_instantiate_object;
       new_vtable->init_pmc = Parrot_instantiate_object_init;
  +    new_vtable->invoke  = instantiate_py_object;
       new_class->vtable = new_vtable;
   
       /* Put our new vtable in the global table */
  @@ -626,6 +650,16 @@
       instantiate_object(interpreter, object, NULL);
   }
   
  +static void*
  +instantiate_py_object(Interp* interpreter, PMC* class, void* next)
  +{
  +    INTVAL type = class->vtable->base_type;
  +    PMC *object = pmc_new_noinit(interpreter, type);
  +    VTABLE_init(interpreter, object);
  +    REG_PMC(5) = object;
  +    return next;
  +}
  +
   static void
   instantiate_object(Parrot_Interp interpreter, PMC *object, PMC *init)
   {
  
  
  

Reply via email to