Author: kjs Date: Tue Jan 20 15:28:09 2009 New Revision: 35843 Modified: trunk/compilers/pirc/src/bcgen.c trunk/compilers/pirc/src/pircompunit.c trunk/compilers/pirc/src/piremit.c trunk/compilers/pirc/t/stmts.t
Log: [pirc] fix something with debug segment creation, fix auto-declaration of "self" for :vtables and :methods, and add a test for :method calls. Modified: trunk/compilers/pirc/src/bcgen.c ============================================================================== --- trunk/compilers/pirc/src/bcgen.c (original) +++ trunk/compilers/pirc/src/bcgen.c Tue Jan 20 15:28:09 2009 @@ -438,9 +438,11 @@ */ void create_debugsegment(bytecode * const bc, size_t size, char const * const file) { + /* create a new debug segment; Parrot_new_debug_seg() automatically stores + * away any currently existing debug segment. + */ bc->debug_seg = Parrot_new_debug_seg(bc->interp, bc->interp->code, size); - Parrot_debug_add_mapping(bc->interp, bc->debug_seg, bc->instr_counter, file); } Modified: trunk/compilers/pirc/src/pircompunit.c ============================================================================== --- trunk/compilers/pirc/src/pircompunit.c (original) +++ trunk/compilers/pirc/src/pircompunit.c Tue Jan 20 15:28:09 2009 @@ -188,6 +188,9 @@ else { CURRENT_SUB(lexer)->info.vtable_index = vtable_index; SET_FLAG(lexer->subs->flags, PIRC_SUB_FLAG_VTABLE); + + /* :vtable methods have an automatic "self" parameter */ + add_param(lexer, PMC_TYPE, "self"); } } @@ -226,6 +229,9 @@ CURRENT_SUB(lexer)->methodname = CURRENT_SUB(lexer)->info.subname; SET_FLAG(lexer->subs->flags, PIRC_SUB_FLAG_METHOD); + + /* :methods have an automatic "self" parameter */ + add_param(lexer, PMC_TYPE, "self"); } /* @@ -266,8 +272,7 @@ set_sub_flag(lexer_state * const lexer, sub_flag flag)> Set a subroutine flag on the current sub. The C<flag> parameter may encode -multiple flags. If it encodes the C<:vtable> or C<:method> flag, an extra -parameter named C<self> is added to the current subroutine. +multiple flags. =cut @@ -277,9 +282,6 @@ /* set the specified flag in the current subroutine */ SET_FLAG(CURRENT_SUB(lexer)->flags, flag); - /* if the sub is a method or a :vtable method, then also add a "self" parameter */ - if (TEST_FLAG(flag, (PIRC_SUB_FLAG_VTABLE | PIRC_SUB_FLAG_METHOD))) - add_param(lexer, PMC_TYPE, "self"); } /* Modified: trunk/compilers/pirc/src/piremit.c ============================================================================== --- trunk/compilers/pirc/src/piremit.c (original) +++ trunk/compilers/pirc/src/piremit.c Tue Jan 20 15:28:09 2009 @@ -876,8 +876,7 @@ /* create debug segment */ /* XXX is this the right size? */ - create_debugsegment(lexer->bc, lexer->codesize, iter->sourceline, lexer->filename); - + create_debugsegment(lexer->bc, lexer->codesize, lexer->filename); do { emit_pbc_instr(lexer, iter); Modified: trunk/compilers/pirc/t/stmts.t ============================================================================== --- trunk/compilers/pirc/t/stmts.t (original) +++ trunk/compilers/pirc/t/stmts.t Tue Jan 20 15:28:09 2009 @@ -3,7 +3,7 @@ # $Id$ use lib "../../lib"; -use Parrot::Test tests => 4; +use Parrot::Test tests => 5; pirc_2_pasm_is(<<'CODE', <<'OUTPUT', "a simple sub call - no params"); .sub main @@ -73,6 +73,26 @@ OUTPUT + +pirc_2_pasm_is(<<'CODE', <<'OUTPUT', "method call"); +.sub main + .local pmc cl, obj, meth + cl = newclass "Foo" + obj = new "Foo" + obj.'hi'() +.end + +.namespace ["Foo"] +.sub hi :method + say "ok" +.end + + +CODE +ok +OUTPUT + + # Local Variables: # mode: cperl # cperl-indent-level: 4