# New Ticket Created by Sam Ruby
# Please include the string: [perl #32322]
# in the subject line of all future correspondence about this issue.
# <URL: http://rt.perl.org:80/rt3/Ticket/Display.html?id=32322 >
Parts of this should have been done in my previous patch, but at the
time wasn't needed. As the first to need it, I guess I get to implement
it. ;-)
- Sam Ruby
Index: lib/Parrot/Pmc2c.pm
===================================================================
RCS file: /cvs/public/parrot/lib/Parrot/Pmc2c.pm,v
retrieving revision 1.49
diff -u -r1.49 Pmc2c.pm
--- lib/Parrot/Pmc2c.pm 4 Nov 2004 09:07:20 -0000 1.49
+++ lib/Parrot/Pmc2c.pm 4 Nov 2004 16:23:44 -0000
@@ -126,17 +126,8 @@
* This load function will be called to do global (once) setup
* whatever is needed to get this extension running
*/
-#include "parrot/parrot.h"
-#include "parrot/extend.h"
-#include "parrot/dynext.h"
EOC
- for my $class (keys %classes) {
- my $lc_class = lc $class;
- $cout .= <<"EOC";
-#include "pmc_${lc_class}.h"
-EOC
- }
$cout .= <<"EOC";
extern Parrot_PMC Parrot_lib_${lc_libname}_load(Parrot_INTERP interpreter); /* don't
warn */
@@ -372,6 +363,11 @@
sub includes() {
my $self = shift;
my $cout = "";
+ $cout .= <<"EOC";
+#include "parrot/parrot.h"
+#include "parrot/extend.h"
+#include "parrot/dynext.h"
+EOC
foreach my $parents ($self->{class}, @{ $self->{parents} } ) {
my $name = lc $parents;
$cout .= <<"EOC";
@@ -740,6 +736,8 @@
/* Dynamic classes need the runtime type
which is passed in entry to class_init.
*/
+ MMD_init *mmd_clone = mem_sys_allocate(sizeof(_temp_mmd_init));
+ memcpy(mmd_clone, _temp_mmd_init, sizeof(_temp_mmd_init));
EOC
# declare auxiliary variables for dyncpmc IDs
foreach my $dynclass (keys %init_mmds) {
@@ -752,12 +750,12 @@
foreach my $entry (@init_mmds) {
if ($entry->[1] eq $classname) {
$cout .= <<"EOC";
- _temp_mmd_init[$entry->[0]].right = entry;
+ mmd_clone[$entry->[0]].right = entry;
EOC
}
else {
$cout .= <<"EOC";
- _temp_mmd_init[$entry->[0]].right = my_enum_class_$entry->[1];
+ mmd_clone[$entry->[0]].right = my_enum_class_$entry->[1];
EOC
}
}
@@ -812,14 +810,26 @@
# declare each nci method for this class
my $firstnci = 1;
+ my $my_enum_class;
+ if ($self->{flags}{dynpmc}) {
+ $my_enum_class = "my_enum_class_${classname}";
+ }
+ else {
+ $my_enum_class = "enum_class_${classname}";
+ }
foreach my $method (@{ $self->{methods} }) {
next unless $method->{loc} eq 'nci';
my $proto = proto($method->{type}, $method->{parameters});
- $cout .= <<"EOC" if $firstnci;
+ if ($firstnci) {
+ $cout .= <<"EOC";
if (pass) {
EOC
+ $cout .= <<"EOC" if $self->{flags}{dynpmc};
+ int my_enum_class_$classname = Parrot_PMC_typenum(interp, "$classname");
+EOC
+ }
$cout .= <<"EOC";
- enter_nci_method(interp, enum_class_${classname},
+ enter_nci_method(interp, $my_enum_class,
F2DPTR(Parrot_${classname}_$method->{meth}),
"$method->{meth}", "$proto");
EOC
@@ -846,12 +856,12 @@
foreach my $entry (@init_mmds) {
if ($entry->[1] eq $classname) {
$cout .= <<"EOC";
- _temp_mmd_init[$entry->[0]].right = entry;
+ mmd_clone[$entry->[0]].right = entry;
EOC
}
else {
$cout .= <<"EOC";
- _temp_mmd_init[$entry->[0]].right = my_enum_class_$entry->[1];
+ mmd_clone[$entry->[0]].right = my_enum_class_$entry->[1];
EOC
}
}
@@ -865,7 +875,7 @@
$cout .= <<"EOC";
#define N_MMD_INIT (sizeof(_temp_mmd_init)/sizeof(_temp_mmd_init[0]))
Parrot_mmd_register_parents(interp, entry,
- _temp_mmd_init, N_MMD_INIT);
+ mmd_clone, N_MMD_INIT);
}
} /* Parrot_${classname}_class_init */
EOC
@@ -1647,6 +1657,7 @@
my ($self, $file) = @_;
my $cout = Parrot::Pmc2c->dont_edit('various files');
+ $cout .= $self->includes;
$cout .= Parrot::Pmc2c::dynext_load_code($self->{opt}{library},
map { $_->{class} => $_ }
values %{$self->{pmcs}} );
@@ -1654,6 +1665,29 @@
return $cout;
}
+=item C<includes()>
+
+Returns the set of C C<#include>s for the library.
+
+=cut
+
+sub includes() {
+ my $self = shift;
+ my $cout = "";
+ $cout .= <<"EOC";
+#include "parrot/parrot.h"
+#include "parrot/extend.h"
+#include "parrot/dynext.h"
+EOC
+ foreach my $pmc (values %{$self->{pmcs}}) {
+ my $name = lc $pmc->{class};
+ $cout .= <<"EOC";
+#include "pmc_$name.h"
+EOC
+ }
+ "$cout\n";
+}
+
=back
=head1 SEE ALSO