summaryrefslogtreecommitdiffstats
path: root/php-ast-upstream.patch
blob: 264e630b24fc5e85e4964e06be31e53d8f85b84d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
From 81e2938b02ffb734bb85ef2a0fbc74f87b4ba377 Mon Sep 17 00:00:00 2001
From: Nikita Popov <nikic@php.net>
Date: Thu, 24 Nov 2016 21:49:21 +0100
Subject: [PATCH] Fix issue #36

The emulation of PHP 7.0 list() structure did not account for
skipped elements.
---
 ast.c                              |  4 ++--
 tests/array_destructuring_old.phpt | 19 +++++++++++++++++++
 2 files changed, 21 insertions(+), 2 deletions(-)

diff --git a/ast.c b/ast.c
index ad24ce8..755af14 100644
--- a/ast.c
+++ b/ast.c
@@ -241,7 +241,7 @@ static inline zend_bool ast_array_is_list(zend_ast *ast) {
 	}
 
 	for (i = 0; i < list->children; i++) {
-		if (list->child[i]->child[1] != NULL || list->child[i]->attr) {
+		if (list->child[i] && (list->child[i]->child[1] != NULL || list->child[i]->attr)) {
 			return 0;
 		}
 	}
@@ -400,7 +400,7 @@ static void ast_fill_children_ht(HashTable *ht, zend_ast *ast, zend_long version
 			/* Skip docComment child -- It's handled separately */
 			continue;
 #if PHP_VERSION_ID >= 70100
-		} else if (ast->kind == ZEND_AST_LIST) {
+		} else if (ast->kind == ZEND_AST_LIST && child != NULL) {
 			/* Emulate simple variable list */
 			ast_to_zval(&child_zv, child->child[0], version);
 #else
diff --git a/tests/array_destructuring_old.phpt b/tests/array_destructuring_old.phpt
index 6699a80..0aa378d 100644
--- a/tests/array_destructuring_old.phpt
+++ b/tests/array_destructuring_old.phpt
@@ -8,6 +8,7 @@ require __DIR__ . '/../util.php';
 $code = <<<'PHP'
 <?php
 list($a, $b) = $x;
+list(, $b) = $x;
 PHP;
 
 echo ast_dump(ast\parse_code($code, $version=30)), "\n";
@@ -24,6 +25,13 @@ AST_STMT_LIST
                 name: "b"
         expr: AST_VAR
             name: "x"
+    1: AST_ASSIGN
+        var: AST_LIST
+            0: null
+            1: AST_VAR
+                name: "b"
+        expr: AST_VAR
+            name: "x"
 AST_STMT_LIST
     0: AST_ASSIGN
         var: AST_ARRAY
@@ -40,3 +48,14 @@ AST_STMT_LIST
                 key: null
         expr: AST_VAR
             name: "x"
+    1: AST_ASSIGN
+        var: AST_ARRAY
+            flags: ARRAY_SYNTAX_LIST (1)
+            0: null
+            1: AST_ARRAY_ELEM
+                flags: 0
+                value: AST_VAR
+                    name: "b"
+                key: null
+        expr: AST_VAR
+            name: "x"
From fbab0c35d4c7851f32384073798a0031ecb4499e Mon Sep 17 00:00:00 2001
From: Nikita Popov <nikic@php.net>
Date: Thu, 24 Nov 2016 22:13:38 +0100
Subject: [PATCH] Fix PHP 7 build

---
 ast.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/ast.c b/ast.c
index 4c4095d..62a9f48 100644
--- a/ast.c
+++ b/ast.c
@@ -405,7 +405,7 @@ static void ast_fill_children_ht(HashTable *ht, zend_ast *ast, zend_long version
 			ast_to_zval(&child_zv, child->child[0], version);
 #else
 		} else if (version >= 35 && ast->kind == ZEND_AST_ARRAY
-				&& ast->attr == ZEND_ARRAY_SYNTAX_LIST) {
+				&& ast->attr == ZEND_ARRAY_SYNTAX_LIST && child != NULL) {
 			/* Emulate ARRAY_ELEM list */
 			zval ch0, ch1;
 			ast_to_zval(&ch0, child, version);