Index: lib/Parrot/Pmc2c/PMCEmitter.pm =================================================================== --- lib/Parrot/Pmc2c/PMCEmitter.pm (revision 40547) +++ lib/Parrot/Pmc2c/PMCEmitter.pm (working copy) @@ -96,6 +96,7 @@ $c->emit( $self->get_vtable_func ); $c->emit( $self->get_mro_func ); $c->emit( $self->get_isa_func ); + $c->emit( $self->pmc_class_init_func ); $c->emit( $self->init_func ); $c->emit( $self->postamble ); @@ -479,6 +480,34 @@ return $cache->{$name} = "mfl_$count"; } +=item C + +Returns the C code for the PMC's class_init function as a static +function to be called from the exported class_init. + +=cut + +sub pmc_class_init_func { + my ($self) = @_; + my $class_init_code = ""; + + if ($self->has_method('class_init')) { + $class_init_code .= $self->get_method('class_init')->body; + + $class_init_code =~ s/INTERP/interp/g; + + # fix indenting + $class_init_code =~ s/^/ /mg; + $class_init_code = < Returns the C code for the PMC's initialization method, or an empty @@ -533,12 +562,7 @@ my $class_init_code = ""; if ($self->has_method('class_init')) { - $class_init_code = $self->get_method('class_init')->body; - - $class_init_code =~ s/INTERP/interp/g; - - # fix indenting - $class_init_code =~ s/^/ /mg; + $class_init_code .= " thispmc_class_init(interp, entry);\n"; } my %extra_vt; @@ -715,10 +739,10 @@ # include any class specific init code from the .pmc file if ($class_init_code) { $cout .= <<"EOC"; + /* class_init */ - { $class_init_code - } + EOC }