Author: bernhard Date: Tue Jan 20 08:37:20 2009 New Revision: 35815 Modified: trunk/languages/pipp/src/pct/actions.pm trunk/languages/pipp/t/php/oo.t
Log: [Pipp] Assign __CLASS__ with parsed classname Modified: trunk/languages/pipp/src/pct/actions.pm ============================================================================== --- trunk/languages/pipp/src/pct/actions.pm (original) +++ trunk/languages/pipp/src/pct/actions.pm Tue Jan 20 08:37:20 2009 @@ -264,6 +264,9 @@ method constant($/) { our $?NS; + our $?CLASS; + my $ns := $?CLASS eq '' ?? $?NS + !! $?NS ~ '\\' ~ $?CLASS ~ '::'; if $<name><leading_backslash> { # fully qualified name make PAST::Var.new( @@ -277,7 +280,7 @@ make PAST::Var.new( :name(~$<name><ident>), :scope('package'), - :namespace($?NS ~ $<name><ns_path>) + :namespace($ns ~ $<name><ns_path>) ); } } @@ -741,15 +744,19 @@ method class_definition($/, $key) { our @?BLOCK; # A stack of PAST::Block our $?CLASS; # for namespacing of constants - if $key eq 'open' { - # Start of class definition; make PAST to create class object $?CLASS := ~$<class_name>; + our $?NS; + my $block := PAST::Block.new( :node($/), :blocktype('declaration'), :pirflags( ':init :load' ), - :namespace($?CLASS), + :namespace($?CLASS) + ); + + # Start of class definition; make PAST to create class object + $block.push( PAST::Op.new( :pasttype('bind'), PAST::Var.new( @@ -765,6 +772,25 @@ ) ); + # assign predeclared constant __CLASS__ + my $ns := $?NS ~ '\\' ~ $?CLASS ~ '::'; + $block.push( + PAST::Op.new( + :pasttype('bind'), + PAST::Var.new( + :name('__CLASS__'), + :isdecl(1), + :scope('package'), + :viviself('PhpNull'), + :namespace($ns) + ), + PAST::Val.new( + :value($?CLASS), + :returns('PhpString'), + ) + ) + ); + # set up scope 'package' for the superglobals our @?SUPER_GLOBALS; for ( @?SUPER_GLOBALS ) { $block.symbol( :scope('package'), $_ ); } Modified: trunk/languages/pipp/t/php/oo.t ============================================================================== --- trunk/languages/pipp/t/php/oo.t (original) +++ trunk/languages/pipp/t/php/oo.t Tue Jan 20 08:37:20 2009 @@ -20,7 +20,7 @@ use FindBin; use lib "$FindBin::Bin/../../../../lib", "$FindBin::Bin/../../lib"; -use Parrot::Test tests => 15; +use Parrot::Test tests => 16; language_output_is( 'Pipp', <<'CODE', <<'OUT', 'definition of a class' ); <?php @@ -339,3 +339,22 @@ static member $a OUT + +language_output_is( 'Pipp', <<'CODE', <<'OUT', '__CLASS__' ); +<?php + +class A { + function echo_class () { + echo __CLASS__; + echo "\n"; + } +} + +$a = new A; +$a->echo_class(); + +?> +CODE +A +OUT +