php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Return to Bug #54089
Patch tokenizer_patch_full.txt revision 2011-09-15 14:32 UTC by nikic@php.net
revision 2011-09-13 17:11 UTC by nikic@php.net
Patch tokenizer_patch.txt revision 2011-09-15 14:27 UTC by nikic@php.net
revision 2011-09-13 15:50 UTC by nikic@php.net
revision 2011-09-13 07:51 UTC by nicolas dot grekas+php at gmail dot com

Patch tokenizer_patch.txt for Unknown/Other Function Bug #54089

Patch version 2011-09-13 07:51 UTC

Return to Bug #54089 | Download this patch
This patch is obsolete

Obsoleted by patches:

Patch Revisions:

Developer: nicolas.grekas+php@gmail.com

From d6941fad8c0d91a2ffacb0c965b654d1711753b4 Mon Sep 17 00:00:00 2001
From: Nikita Popov <nikic@chicken.(none)>
Date: Tue, 13 Sep 2011 09:07:21 +0200
Subject: [PATCH] Make token_get_all return next three tokens after __halt_compiler

---
 ext/tokenizer/tests/bug54089.phpt                  |   10 ++++-
 ext/tokenizer/tests/token_get_all_variation16.phpt |   45 ++++++++++++++++++--
 ext/tokenizer/tokenizer.c                          |   10 ++++-
 3 files changed, 57 insertions(+), 8 deletions(-)

diff --git a/ext/tokenizer/tests/bug54089.phpt b/ext/tokenizer/tests/bug54089.phpt
index e1f6d79..2f40510 100644
--- a/ext/tokenizer/tests/bug54089.phpt
+++ b/ext/tokenizer/tests/bug54089.phpt
@@ -17,7 +17,7 @@ foreach ($tokens as $t)
 var_dump($code);
 ?>
 --EXPECTF--
-array(2) {
+array(5) {
   [0]=>
   array(3) {
     [0]=>
@@ -36,5 +36,11 @@ array(2) {
     [2]=>
     int(1)
   }
+  [2]=>
+  string(1) "("
+  [3]=>
+  string(1) ")"
+  [4]=>
+  string(1) ";"
 }
-string(21) "<?php __halt_compiler"
+string(24) "<?php __halt_compiler();"
diff --git a/ext/tokenizer/tests/token_get_all_variation16.phpt b/ext/tokenizer/tests/token_get_all_variation16.phpt
index 39550bd..db9bde1 100644
--- a/ext/tokenizer/tests/token_get_all_variation16.phpt
+++ b/ext/tokenizer/tests/token_get_all_variation16.phpt
@@ -47,17 +47,17 @@ else
 
 list($value1,$value2) = $c;
 if(empty($value1) && !isset($value1)) {
-  __halt_compiler();
+  myFunction();
 }
 ?>';
 $tokens =  token_get_all($source);
 var_dump($tokens);
 
-echo "Done"
+echo "Done";
 ?>
 --EXPECTF--
 *** Testing token_get_all() : with different function constructs ***
-array(135) {
+array(142) {
   [0]=>
   array(3) {
     [0]=>
@@ -958,9 +958,46 @@ array(135) {
     [0]=>
     int(%d)
     [1]=>
-    string(15) "__halt_compiler"
+    string(10) "myFunction"
+    [2]=>
+    int(26)
+  }
+  [135]=>
+  string(1) "("
+  [136]=>
+  string(1) ")"
+  [137]=>
+  string(1) ";"
+  [138]=>
+  array(3) {
+    [0]=>
+    int(%d)
+    [1]=>
+    string(1) "
+"
     [2]=>
     int(26)
   }
+  [139]=>
+  string(1) "}"
+  [140]=>
+  array(3) {
+    [0]=>
+    int(%d)
+    [1]=>
+    string(1) "
+"
+    [2]=>
+    int(27)
+  }
+  [141]=>
+  array(3) {
+    [0]=>
+    int(%d)
+    [1]=>
+    string(2) "?>"
+    [2]=>
+    int(28)
+  }
 }
 Done
diff --git a/ext/tokenizer/tokenizer.c b/ext/tokenizer/tokenizer.c
index c6c901f..d502f9a 100644
--- a/ext/tokenizer/tokenizer.c
+++ b/ext/tokenizer/tokenizer.c
@@ -106,6 +106,7 @@ static void tokenize(zval *return_value TSRMLS_DC)
 	int token_type;
 	zend_bool destroy;
 	int token_line = 1;
+	int need_tokens = -1; // for __halt_compiler lexing. -1 = disabled
 
 	array_init(return_value);
 
@@ -152,8 +153,13 @@ static void tokenize(zval *return_value TSRMLS_DC)
 
 		token_line = CG(zend_lineno);
 
-		if (token_type == T_HALT_COMPILER) {
-			break;
+		// after T_HALT_COMPILER collect the next three non-dropped tokens
+		if (need_tokens != -1) {
+			if (destroy && --need_tokens == 0) {
+				break;
+			}
+		} else if (token_type == T_HALT_COMPILER) {
+			need_tokens = 3;
 		}
 	}
 }
-- 
1.7.4.1

 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Thu Nov 21 15:01:30 2024 UTC