cvs: ZendEngine2 / zend_builtin_functions.c /tests bug47593.phpt

[email protected] ("Felipe Pena") Sun, 08 Mar 2009 17:23:44 -0000
Newsgroups php.zend-engine.cvs
Message-ID <cvsfelipe1236533024@cvsserver>
felipe		Sun Mar  8 17:23:44 2009 UTC

  Added files:                 
    /ZendEngine2/tests	bug47593.phpt 

  Modified files:              
    /ZendEngine2	zend_builtin_functions.c 
  Log:
  - Fixed bug #47593 (interface_exists() returns false when using absolute namespace path)
    Patch by Kalle.
  
  
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_builtin_functions.c?r1=1.399&r2=1.400&diff_format=u
Index: ZendEngine2/zend_builtin_functions.c
diff -u ZendEngine2/zend_builtin_functions.c:1.399 ZendEngine2/zend_builtin_functions.c:1.400
--- ZendEngine2/zend_builtin_functions.c:1.399	Thu Mar  5 13:45:32 2009
+++ ZendEngine2/zend_builtin_functions.c	Sun Mar  8 17:23:43 2009
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_builtin_functions.c,v 1.399 2009/03/05 13:45:32 iliaa Exp $ */
+/* $Id: zend_builtin_functions.c,v 1.400 2009/03/08 17:23:43 felipe Exp $ */
 
 #include "zend.h"
 #include "zend_API.h"
@@ -1230,8 +1230,24 @@
 	}
 
 	if (!autoload) {
+		zstr name;
+		int len;
+		
 		lc_name = zend_u_str_case_fold(type, iface_name, iface_name_len, 1, &lc_name_len);
-		found = zend_u_hash_find(EG(class_table), type, lc_name, lc_name_len+1, (void **) &ce);
+		
+		/* Ignore leading "\" */
+		name = lc_name;
+		len = iface_name_len;
+		if (lc_name.s[0] == '\\') {
+			if (type == IS_UNICODE) {
+				name.u = &lc_name.u[1];
+			} else {
+				name.s = &lc_name.s[1];
+			}
+			len--;
+		}
+		
+		found = zend_u_hash_find(EG(class_table), type, name, len+1, (void **) &ce);
 		efree(lc_name.v);
 		RETURN_BOOL(found == SUCCESS && (*ce)->ce_flags & ZEND_ACC_INTERFACE);
 	}
@@ -1260,8 +1276,19 @@
 	}
 
 	lcname = zend_u_str_case_fold(function_name_type, function_name, function_name_len, 1, &lcname_len);
+	
+	function_name = lcname;
+	if (function_name.s[0] == '\\') {
+		if (function_name_type == IS_UNICODE) {
+			function_name.u = &lcname.u[1];
+		} else {
+			function_name.s = &lcname.s[1];
+		}
+		function_name_len--;
+	}
+
 
-	retval = (zend_u_hash_find(EG(function_table), function_name_type, lcname, lcname_len+1, (void **)&func) == SUCCESS);
+	retval = (zend_u_hash_find(EG(function_table), function_name_type, function_name, function_name_len+1, (void **)&func) == SUCCESS);
 
 	efree(lcname.v);
 

http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/bug47593.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/bug47593.phpt
+++ ZendEngine2/tests/bug47593.phpt
--TEST--
Bug #47593 (interface_exists() returns false when using absolute namespace path)
--FILE--
<?php

namespace test;
const TEST = 11;

class foo {
	public function xyz() {
	}
}

interface baz {
}	

function bar() {
}


var_dump(interface_exists('\test\baz'));
var_dump(function_exists('\test\bar'));
var_dump(constant('\test\TEST'));
var_dump(defined('\test\TEST'));
var_dump(defined('TEST'));


?>
--EXPECT--
bool(true)
bool(true)
int(11)
bool(true)
bool(false)