[svn:parrot] r35815 - in trunk/languages/pipp: src/pct t/php
[email protected] Tue, 20 Jan 2009 08:37:20 -0800 (PST)
| Newsgroups | perl.cvs.parrot |
|---|---|
| Message-ID | <[email protected]> |
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
+