[PATCH] Dynamically load Perl5 PMCs
[email protected] (Mattia Barbon) Sat, 28 Aug 2004 18:16:36 +0200 (ora legale Europa occidentale)
| Newsgroups | perl.ponie.dev |
|---|---|
| Message-ID | <[email protected]> |
Hello, the only thing I am not satisfied about in this patch is that it calls directly the Parrot_init_lib, that at the moment is not a function in Parrot embed.h or extend.h. I think something like it will be available for extender consumption. You can apply it now or wait for the official blessing of Parrot maintainers on the dynamic loading interface. What it does: it generates the perl5*.pmc files in src/pmc instead of parrot/classes, it modified Makefile.SH to build the .o files and link them inside libperl.a, it initialized the PMCs in perl_construct, it changes the fprintf/abort pairs in perl5cargo_cult back to croak(). Regards Mattia
ponie.diff
(application/octet-stream, 7.9 KB)
Index: Configure.pl
===================================================================
RCS file: /cvs/public/ponie/Configure.pl,v
retrieving revision 1.34
diff -u -2 -r1.34 Configure.pl
--- Configure.pl 18 Aug 2004 16:51:00 -0000 1.34
+++ Configure.pl 28 Aug 2004 14:37:56 -0000
@@ -47,9 +47,8 @@
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) {
@@ -79,6 +78,6 @@
}
+chdir('parrot') || die "You need to checkout parrot inside ponie";
system($^X,'Configure.pl',
- "--ccflags= :add{ -I$dir/perl}",
@ARGV)
&& die "error";
@@ -110,4 +109,5 @@
my $inc_path = "$dir/parrot/include";
+ my $inc_path_pmc = "$dir/parrot/classes";
my $lib_path = "$dir/parrot/blib/lib";
@@ -125,5 +125,5 @@
$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 ";
Index: Makefile
===================================================================
RCS file: /cvs/public/ponie/Makefile,v
retrieving revision 1.3
diff -u -2 -r1.3 Makefile
--- Makefile 8 May 2004 12:56:16 -0000 1.3
+++ Makefile 28 Aug 2004 14:37:56 -0000
@@ -1,4 +1,11 @@
# $Id: Makefile,v 1.3 2004/05/08 12:56:16 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
@@ -23,4 +30,6 @@
rm -f lib
rm -f ponie
+ rm -f $(GEN_PMC)
+ rm -f src/pmc/*.dump
distclean:
Index: perl/Makefile.SH
===================================================================
RCS file: /cvs/public/ponie/perl/Makefile.SH,v
retrieving revision 1.2
diff -u -2 -r1.2 Makefile.SH
--- perl/Makefile.SH 28 Apr 2004 11:44:12 -0000 1.2
+++ perl/Makefile.SH 28 Aug 2004 14:38:00 -0000
@@ -327,4 +327,5 @@
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)
@@ -333,4 +334,5 @@
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
@@ -339,6 +341,7 @@
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
@@ -707,4 +710,37 @@
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!'
@@ -949,5 +985,5 @@
# 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`
Index: perl/perl.c
===================================================================
RCS file: /cvs/public/ponie/perl/perl.c,v
retrieving revision 1.11
diff -u -2 -r1.11 perl.c
--- perl/perl.c 21 Jun 2004 16:34:16 -0000 1.11
+++ perl/perl.c 28 Aug 2004 14:38:13 -0000
@@ -18,4 +18,5 @@
#include "parrot/extend.h"
#include "patchlevel.h" /* for local_patches */
+#include "perl5pmcs.h"
#ifdef NETWARE
@@ -146,4 +147,8 @@
*/
+extern Parrot_PMC Parrot_init_lib(Parrot_INTERP,
+ Parrot_PMC (*)(Parrot_INTERP),
+ void (*)(Parrot_INTERP, Parrot_PMC));
+
void
perl_construct(pTHXx)
@@ -156,4 +161,6 @@
Parrot_init(PL_Parrot);
+ Parrot_init_lib(PL_Parrot, &Parrot_lib_perl5pmcs_load, NULL);
+
PL_sv_arenatable = Perl_ptr_table_new(aTHX);
Index: src/pmc/perl5cargo_cult.pmc
===================================================================
RCS file: /cvs/public/ponie/src/pmc/perl5cargo_cult.pmc,v
retrieving revision 1.12
diff -u -2 -r1.12 perl5cargo_cult.pmc
--- src/pmc/perl5cargo_cult.pmc 24 Jun 2004 14:33:05 -0000 1.12
+++ src/pmc/perl5cargo_cult.pmc 28 Aug 2004 14:38:26 -0000
@@ -18,5 +18,5 @@
#include "perl.h"
-pmclass Perl5QQQ {
+pmclass Perl5QQQ dynpmc {
void init () {
@@ -54,8 +54,5 @@
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;
@@ -74,9 +71,5 @@
& (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;
@@ -105,9 +98,5 @@
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;