# New Ticket Created by "Daniel Keane"
# Please include the string: [perl #61696]
# in the subject line of all future correspondence about this issue.
# <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=61696 >
First stab at implementing array() function and '=>' within pipp.
Changes made:
* src/pct/actions.pm: added following methods: instantiate_array(),
array_arguments(), key_value_pair()
* src/pct/grammer.pg: added following rules: instantiate_array,
array_arguments, key_value_pair. Amend term rule by adding
instantiate_array rule.
* src/common/builtins: added sub 'infix:=>'
* src/common/php_array.pir: added sub 'array'
* t/in_php/array.t: added 3 tests for array()
TODO: Add type checking of key values
Thanks
Index: t/in_php/array.t
===================================================================
--- t/in_php/array.t (revision 34350)
+++ t/in_php/array.t (working copy)
@@ -27,7 +27,7 @@
require_once 'Test.php';
-plan(8);
+plan(11);
$count = 1;
$hello['world'] = 'hi';
@@ -61,5 +61,18 @@
is( count($thrice), 2, 'count of $thrice', $count );
$count++;
+#test array() function
+
+$arrayfunc = array(0, "key" => "key", 1);
+
+is( $arrayfunc[0], 0, 'arrayfunc[0]', $count );
+$count++;
+is( $arrayfunc[1], 1, 'arrayfunc[1]', $count );
+$count++;
+is( $arrayfunc["key"], 'key', 'arrayfunc[key]', $count );
+$count++;
+
+
+
# vim: expandtab shiftwidth=4 ft=php:
?>
Index: src/pct/actions.pm
===================================================================
--- src/pct/actions.pm (revision 34350)
+++ src/pct/actions.pm (working copy)
@@ -182,6 +182,43 @@
make $past;
}
+method instantiate_array($/) {
+ my $past := PAST::Op.new(
+ :pasttype( 'call' ),
+ :name( 'array' ),
+ :node( $/ )
+ );
+
+ #for $<expression> {
+ #$past.push( $($_) );
+ #}
+
+ #for $<key_value_pair> {
+ #$past.push( $($_) );
+ #}
+ for $<array_arguments> {
+ $past.push( $($_) );
+ }
+
+ make $past;
+}
+
+method array_arguments($/, $key) {
+ make $( $/{$key} );
+}
+
+method key_value_pair($/) {
+ my $past := PAST::Op.new(
+ :node( $/ ),
+ :pasttype( 'call' ),
+ :name( 'infix:=>' ),
+ :returns( 'Array' ),
+ $( $<key> ),
+ $( $<value> )
+ );
+ make $past;
+}
+
method method_call($/) {
my $past := PAST::Op.new(
:name( ~$<METHOD_NAME> ),
Index: src/pct/grammar.pg
===================================================================
--- src/pct/grammar.pg (revision 34350)
+++ src/pct/grammar.pg (working copy)
@@ -278,6 +278,21 @@
{*}
}
+rule instantiate_array {
+ 'array' '(' [ <array_arguments> [ [',' <array_arguments> ]* [',' <array_arguments> ]? ]? ','? ]? ')'
+ {*}
+}
+
+rule array_arguments {
+ | <key_value_pair> {*} #= key_value_pair
+ | <expression> {*} #= expression
+}
+
+rule key_value_pair {
+ <key=expression> '=>' <value=expression>
+ {*}
+}
+
rule constructor_call {
'new' <CLASS_NAME>
{*}
@@ -358,6 +373,7 @@
rule term {
<method_call> {*} #= method_call
| <function_call> {*} #= function_call
+ | <instantiate_array> {*} #= instantiate_array
| <constructor_call> {*} #= constructor_call
| '(' <expression> {*} ')' #= expression
| <literal> {*} #= literal
Index: src/common/php_array.pir
===================================================================
--- src/common/php_array.pir (revision 34350)
+++ src/common/php_array.pir (working copy)
@@ -61,6 +61,32 @@
.REGISTER_LONG_CONSTANT(cst, 'COUNT_RECURSIVE', COUNT_RECURSIVE)
.end
+.sub 'array'
+ .param pmc args :slurpy
+ .local pmc array, iter
+ array = new 'PhpArray'
+ iter = new 'Iterator', args
+ $I1 = 0
+ args_loop:
+ unless iter goto args_end
+ $P0 = shift iter
+ $I0 = isa $P0, 'ResizablePMCArray'
+ unless $I0 goto add_var
+ $P1 = $P0[0]
+ $P2 = $P0[1]
+ array[$P1] = $P2
+ goto args_loop
+ add_var:
+ array[$I1] = $P0
+ $I1 = $I1 + 1
+ goto end
+ end:
+ goto args_loop
+ args_end:
+ .return(array)
+.end
+
+
=item C<array array_change_key_case(array input [, int case=CASE_LOWER])>
Retuns an array with all string keys lowercased [or uppercased]
Index: src/common/builtins.pir
===================================================================
--- src/common/builtins.pir (revision 34350)
+++ src/common/builtins.pir (working copy)
@@ -310,6 +310,14 @@
.RETURN_BOOL($I0)
.end
+.sub 'infix:=>'
+ .param pmc key
+ .param pmc value
+ $P0 = new 'ResizablePMCArray'
+ $P0[0] = key
+ $P0[1] = value
+ .return($P0)
+.end
.include 'languages/pipp/src/common/php_standard.pir'