cvs commit: ponie/src/pmc perl5cargo_cult.pmc

[email protected] (Nicholas Clark) 30 Aug 2004 14:37:45 -0000
Newsgroups perl.ponie.changes
Message-ID <[email protected]>
cvsuser     04/08/30 07:37:45

  Modified:    .        Configure.pl Makefile
               perl     Makefile.SH perl.c
               src/pmc  perl5cargo_cult.pmc
  Log:
  [PATCH] Dynamically load Perl5 PMCs
  Courtesy of Mattia Barbon
  
  Revision  Changes    Path
  1.35      +5 -5      ponie/Configure.pl
  
  Index: Configure.pl
  ===================================================================
  RCS file: /cvs/public/ponie/Configure.pl,v
  retrieving revision 1.34
  retrieving revision 1.35
  diff -u -w -r1.34 -r1.35
  --- Configure.pl	18 Aug 2004 16:51:00 -0000	1.34
  +++ Configure.pl	30 Aug 2004 14:37:45 -0000	1.35
  @@ -1,5 +1,5 @@
   #!/usr/bin/perl -w
  -# $Id: Configure.pl,v 1.34 2004/08/18 16:51:00 nicholas Exp $
  +# $Id: Configure.pl,v 1.35 2004/08/30 14:37:45 nicholas Exp $
   
   use strict;
   use Config;
  @@ -46,11 +46,10 @@
   open F, "src/pmc/perl5cargo_cult.pmc" or die $!;
   my $template = do {local $/; <F>};
   close F or die $!;
  -chdir('parrot')  || die "You need to checkout parrot inside ponie";
   foreach (qw(null iv nv rv pv pviv pvnv pvmg pvbm pvgv pvlv pvav pvhv pvcv pvfm
   	    pvio)) {
     my $leaf = "perl5$_.pmc";
  -  my $file = File::Spec->catfile('classes', $leaf);
  +  my $file = File::Spec->catfile('src', 'pmc', $leaf);
     my $real = File::Spec->catfile ($dir, 'src', 'pmc', $leaf);
     if (-e $file) {
       # So the target exists.
  @@ -78,8 +77,8 @@
     }
   }
   
  +chdir('parrot')  || die "You need to checkout parrot inside ponie";
   system($^X,'Configure.pl',
  -       "--ccflags= :add{ -I$dir/perl}",
          @ARGV)
     && die "error";
   chdir($dir) || die "chdir $dir: $!";
  @@ -109,6 +108,7 @@
       system('sh','Configure',@config_args)  && die "error";;
   
       my $inc_path = "$dir/parrot/include";
  +    my $inc_path_pmc = "$dir/parrot/classes";
       my $lib_path = "$dir/parrot/blib/lib";
   
       open (FH, "config.sh") or die $!;
  @@ -124,7 +124,7 @@
       if (" $Parrot::Config::PConfig{libs} " =~ / -lgmp /) {
   	$bonus_libs .= "-lgmp ";
       }
  -    $munge{cppflags} = $munge{ccflags} = " -I${inc_path}";
  +    $munge{cppflags} = $munge{ccflags} = " -I${inc_path} -I${inc_path_pmc}";
       $munge{ldflags} = $munge{lddlflags} = " -L${lib_path}";
       $munge{libs} = $munge{perllibs} = "$bonus_libs ";
       $munge{libpth} = $lib_path;
  
  
  
  1.4       +10 -1     ponie/Makefile
  
  Index: Makefile
  ===================================================================
  RCS file: /cvs/public/ponie/Makefile,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -w -r1.3 -r1.4
  --- Makefile	8 May 2004 12:56:16 -0000	1.3
  +++ Makefile	30 Aug 2004 14:37:45 -0000	1.4
  @@ -1,4 +1,11 @@
  -# $Id: Makefile,v 1.3 2004/05/08 12:56:16 nicholas Exp $
  +# $Id: Makefile,v 1.4 2004/08/30 14:37:45 nicholas Exp $
  +
  +GEN_PMC = src/pmc/perl5null.pmc src/pmc/perl5nv.pmc src/pmc/perl5pv.pmc \
  +          src/pmc/perl5pvbm.pmc src/pmc/perl5pvcv.pmc src/pmc/perl5pvav.pmc \
  +          src/pmc/perl5pvfm.pmc src/pmc/perl5pvgv.pmc src/pmc/perl5pvhv.pmc \
  +          src/pmc/perl5pvio.pmc src/pmc/perl5pviv.pmc src/pmc/perl5pvlv.pmc \
  +          src/pmc/perl5pvmg.pmc src/pmc/perl5pvnv.pmc src/pmc/perl5rv.pmc \
  +          src/pmc/perl5iv.pmc
   
   all:	final
   
  @@ -22,6 +29,8 @@
   	rm -f *~
   	rm -f lib
   	rm -f ponie
  +	rm -f $(GEN_PMC)
  +	rm -f src/pmc/*.dump
   
   distclean:
   	error: will kill subversion
  
  
  
  1.3       +38 -2     ponie/perl/Makefile.SH
  
  Index: Makefile.SH
  ===================================================================
  RCS file: /cvs/public/ponie/perl/Makefile.SH,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -w -r1.2 -r1.3
  --- Makefile.SH	28 Apr 2004 11:44:12 -0000	1.2
  +++ Makefile.SH	30 Aug 2004 14:37:45 -0000	1.3
  @@ -326,20 +326,23 @@
   h3 = pad.h patchlevel.h perl.h perlapi.h perly.h pp.h proto.h regcomp.h
   h4 = regexp.h scope.h sv.h unixish.h util.h iperlsys.h thread.h
   h5 = utf8.h warnings.h
  +hpmc = pmc_perl5null.h pmc_perl5iv.h pmc_perl5nv.h pmc_perl5rv.h pmc_perl5pv.h pmc_perl5pviv.h pmc_perl5pvnv.h pmc_perl5pvmg.h pmc_perl5pvbm.h pmc_perl5pvgv.h pmc_perl5pvlv.h pmc_perl5pvav.h pmc_perl5pvhv.h pmc_perl5pvcv.h pmc_perl5pvfm.h pmc_perl5pvio.h pmc_perl5pvio.h perl5pmcs.h
   h = $(h1) $(h2) $(h3) $(h4) $(h5)
   
   c1 = $(mallocsrc) av.c scope.c op.c doop.c doio.c dump.c hv.c mg.c reentr.c
   c2 = perl.c perly.c pp.c pp_hot.c pp_ctl.c pp_sys.c regcomp.c regexec.c utf8.c
   c3 = gv.c sv.c taint.c toke.c util.c deb.c run.c universal.c xsutils.c pad.c
   c4 = globals.c perlio.c perlapi.c numeric.c locale.c pp_pack.c pp_sort.c
  +cpmc = perl5null.c perl5iv.c perl5nv.c perl5rv.c perl5pv.c perl5pviv.c perl5pvnv.c perl5pvmg.c perl5pvbm.c perl5pvgv.c perl5pvlv.c perl5pvav.c perl5pvhv.c perl5pvcv.c perl5pvfm.c perl5pvio.c perl5pmcs.c
   
   c = $(c1) $(c2) $(c3) $(c4) miniperlmain.c perlmain.c
   
   obj1 = $(mallocobj) gv$(OBJ_EXT) toke$(OBJ_EXT) perly$(OBJ_EXT) op$(OBJ_EXT) pad$(OBJ_EXT) regcomp$(OBJ_EXT) dump$(OBJ_EXT) util$(OBJ_EXT) mg$(OBJ_EXT) reentr$(OBJ_EXT)
   obj2 = hv$(OBJ_EXT) av$(OBJ_EXT) run$(OBJ_EXT) pp_hot$(OBJ_EXT) sv$(OBJ_EXT) pp$(OBJ_EXT) scope$(OBJ_EXT) pp_ctl$(OBJ_EXT) pp_sys$(OBJ_EXT)
   obj3 = doop$(OBJ_EXT) doio$(OBJ_EXT) regexec$(OBJ_EXT) utf8$(OBJ_EXT) taint$(OBJ_EXT) deb$(OBJ_EXT) universal$(OBJ_EXT) xsutils$(OBJ_EXT) globals$(OBJ_EXT) perlio$(OBJ_EXT) perlapi$(OBJ_EXT) numeric$(OBJ_EXT) locale$(OBJ_EXT) pp_pack$(OBJ_EXT) pp_sort$(OBJ_EXT)
  +obj4 = perl5null$(OBJ_EXT) perl5iv$(OBJ_EXT) perl5nv$(OBJ_EXT) perl5rv$(OBJ_EXT) perl5pv$(OBJ_EXT) perl5pviv$(OBJ_EXT) perl5pvnv$(OBJ_EXT) perl5pvmg$(OBJ_EXT) perl5pvbm$(OBJ_EXT) perl5pvgv$(OBJ_EXT) perl5pvlv$(OBJ_EXT) perl5pvav$(OBJ_EXT) perl5pvhv$(OBJ_EXT) perl5pvcv$(OBJ_EXT) perl5pvfm$(OBJ_EXT) perl5pvio$(OBJ_EXT) perl5pmcs$(OBJ_EXT)
   
  -obj = $(obj1) $(obj2) $(obj3) $(ARCHOBJS)
  +obj = $(obj1) $(obj2) $(obj3) $(obj4) $(ARCHOBJS)
   
   lintflags = -hbvxac
   
  @@ -706,6 +709,39 @@
   
   fi
   
  +for p in null iv nv rv pv pviv pvnv pvmg pvbm pvgv pvlv pvav pvhv pvcv pvfm pvio ; do
  +  pmcdumps="$pmcdumps ../src/pmc/perl5$p.dump"
  +  pmcs="$pmcs ../src/pmc/perl5$p.pmc"
  +done
  +
  +for p in null iv nv rv pv pviv pvnv pvmg pvbm pvgv pvlv pvav pvhv pvcv pvfm pvio ; do
  +  $spitshell >>Makefile <<!GROK!THIS!
  +
  +../src/pmc/perl5$p.dump : ../src/pmc/perl5$p.pmc
  +	perl ../parrot/classes/pmc2c2.pl --no-lines --include=../src/pmc --dump ../src/pmc/perl5$p.pmc
  +
  +perl5$p.c : $pmcdumps
  +	perl ../parrot/classes/pmc2c2.pl --no-lines --include=../src/pmc --c ../src/pmc/perl5$p.pmc
  +	sh mv-if-diff ../src/pmc/perl5$p.c perl5$p.c
  +	sh mv-if-diff ../src/pmc/pmc_perl5$p.h pmc_perl5$p.h
  +
  +perl5$p\$(OBJ_EXT) : perl5$p.c
  +
  +!GROK!THIS!
  +done
  +
  +$spitshell >>Makefile <<!GROK!THIS!
  +perl5pmcs\$(OBJ_EXT) : perl5pmcs.c
  +
  +perl5pmcs.c : $pmcdumps
  +	perl ../parrot/classes/pmc2c2.pl --no-lines --include=../src/pmc --library perl5pmcs --c $pmcs
  +
  +perl\$(OBJ_EXT) :  perl5pmcs.h
  +
  +perl5pmcs.h : perl5pmcs.c
  +
  +!GROK!THIS!
  +
   $spitshell >>Makefile <<'!NO!SUBS!'
   
   sperl$(OBJ_EXT): perl.c $(h)
  @@ -948,7 +984,7 @@
   
   # Do not 'make _mopup' directly.
   _mopup:
  -	rm -f *$(OBJ_EXT) *$(LIB_EXT) all perlmain.c
  +	rm -f *$(OBJ_EXT) *$(LIB_EXT) all perlmain.c $(cpmc) $(hpmc)
   	-rmdir .depending
   	-@test -f extra.pods && rm -f `cat extra.pods`
   	-@test -f vms/README_vms.pod && rm -f vms/README_vms.pod
  
  
  
  1.12      +7 -0      ponie/perl/perl.c
  
  Index: perl.c
  ===================================================================
  RCS file: /cvs/public/ponie/perl/perl.c,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -w -r1.11 -r1.12
  --- perl.c	21 Jun 2004 16:34:16 -0000	1.11
  +++ perl.c	30 Aug 2004 14:37:45 -0000	1.12
  @@ -17,6 +17,7 @@
   #include "perl.h"
   #include "parrot/extend.h"
   #include "patchlevel.h"			/* for local_patches */
  +#include "perl5pmcs.h"
   
   #ifdef NETWARE
   #include "nwutil.h"	
  @@ -145,6 +146,10 @@
   =cut
   */
   
  +extern Parrot_PMC Parrot_init_lib(Parrot_INTERP,
  +                                  Parrot_PMC (*)(Parrot_INTERP),
  +                                  void (*)(Parrot_INTERP, Parrot_PMC));
  +
   void
   perl_construct(pTHXx)
   {
  @@ -155,6 +160,8 @@
       PL_Parrot = Parrot_new(0);
       Parrot_init(PL_Parrot);
   
  +    Parrot_init_lib(PL_Parrot, &Parrot_lib_perl5pmcs_load, NULL);
  +
       PL_sv_arenatable = Perl_ptr_table_new(aTHX);
   
   #ifdef MULTIPLICITY
  
  
  
  1.13      +5 -16     ponie/src/pmc/perl5cargo_cult.pmc
  
  Index: perl5cargo_cult.pmc
  ===================================================================
  RCS file: /cvs/public/ponie/src/pmc/perl5cargo_cult.pmc,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -w -r1.12 -r1.13
  --- perl5cargo_cult.pmc	24 Jun 2004 14:33:05 -0000	1.12
  +++ perl5cargo_cult.pmc	30 Aug 2004 14:37:45 -0000	1.13
  @@ -1,7 +1,7 @@
   /* Perl5QQQ.pmc -*- c -*-
    *  Copyright: 2001-2004 The Perl Foundation.  All Rights Reserved.
    *  CVS Info
  - *     $Id: perl5cargo_cult.pmc,v 1.12 2004/06/24 14:33:05 nicholas Exp $
  + *     $Id: perl5cargo_cult.pmc,v 1.13 2004/08/30 14:37:45 nicholas Exp $
    *  Overview:
    *     These are the vtable functions for the Perl5QQQ base class
    *  Data Structure and Algorithms:
  @@ -17,7 +17,7 @@
   #undef HAS_OFF64_T
   #include "perl.h"
   
  -pmclass Perl5QQQ {
  +pmclass Perl5QQQ dynpmc {
   
       void init () {	
           PObj_active_destroy_SET(SELF);
  @@ -53,10 +53,7 @@
   	case Ponie_P_HVPLACEHOLDERS:
   	    return &(((struct STRUCT_SV *)PMC_struct_val(SELF))->xnv_nv);
   	    default:
  -	      /*  Can't easily croak.  */
  -	    /*croak ("Out of range key %d (max is %d)", key, Ponie_P_MAX - 1);*/
  -	    fprintf (stderr, "Out of range P key %d (max is %d)\n", (int)key,
  -		     (int)Ponie_P_MAX - 1);
  +	    croak ("Out of range key %d (max is %d)", key, Ponie_P_MAX - 1);
   	}
   	return 0;
       }
  @@ -73,11 +70,7 @@
   	    return ((struct STRUCT_SV *)PMC_struct_val(SELF))->sv_flags
   			 & (SVf_NOK|SVf_NOK);
   	default:
  -	    /*  Can't easily croak.  */
  -	    /*croak ("Out of range key %d (max is %d)", key, Ponie_P_MAX - 1);*/
  -	    fprintf (stderr, "Out of range get I key %d (max is %d)\n",
  -		     (int)key, (int)Ponie_I_MAX - 1);
  -	    abort();
  +	    croak ("Out of range key %d (max is %d)", key, Ponie_P_MAX - 1);
   	}
   	return 0;
       }
  @@ -104,11 +97,7 @@
   		    |= (SVp_NOK|SVf_NOK);
   	    return;
   	default:
  -	    /*  Can't easily croak.  */
  -	    /*croak ("Out of range key %d (max is %d)", key, Ponie_P_MAX - 1);*/
  -	    fprintf (stderr, "Out of range set I key %d (max is %d)\n",
  -		     (int)key, (int)Ponie_I_MAX - 1);
  -	    abort();
  +	    croak ("Out of range key %d (max is %d)", key, Ponie_P_MAX - 1);
   	}
   	return;
       }