]> granicus.if.org Git - php/commitdiff
extract() should convert keys using runtime encoding.
authorAndrei Zmievski <andrei@php.net>
Tue, 5 Dec 2006 23:17:06 +0000 (23:17 +0000)
committerAndrei Zmievski <andrei@php.net>
Tue, 5 Dec 2006 23:17:06 +0000 (23:17 +0000)
ext/standard/array.c

index d01bdc0437e3431e7dce710b6e9b8c82f14a0c45..95ecc332f8ffc5c1c9b5ec779416fe17caccaeed 100644 (file)
@@ -1427,7 +1427,7 @@ PHP_FUNCTION(extract)
                                        break;
                                }
                        
-                               ZVAL_TEXTL(&final_name, var_name, var_name_len, 1);
+                               ZVAL_ZSTRL(&final_name, var_name, var_name_len, key_type, 1);
                                break;
 
                        case EXTR_PREFIX_IF_EXISTS:
@@ -1438,7 +1438,7 @@ PHP_FUNCTION(extract)
 
                        case EXTR_PREFIX_SAME:
                                if (!var_exists && var_name_len != 0) {
-                                       ZVAL_TEXTL(&final_name, var_name, var_name_len, 1);
+                                       ZVAL_ZSTRL(&final_name, var_name, var_name_len, key_type, 1);
                                }
                                /* break omitted intentionally */
 
@@ -1453,18 +1453,24 @@ PHP_FUNCTION(extract)
                                        if (!php_valid_var_name(var_name, var_name_len, key_type)) {
                                                php_prefix_varname(&final_name, prefix, var_name, var_name_len, key_type TSRMLS_CC);
                                        } else {
-                                               ZVAL_TEXTL(&final_name, var_name, var_name_len, 1);
+                                               ZVAL_ZSTRL(&final_name, var_name, var_name_len, key_type, 1);
                                        }
                                }
                                break;
 
                        default:
                                if (!var_exists) {
-                                       ZVAL_TEXTL(&final_name, var_name, var_name_len, 1);
+                                       ZVAL_ZSTRL(&final_name, var_name, var_name_len, key_type, 1);
                                }
                                break;
                }
 
+               if (UG(unicode) && Z_TYPE(final_name) == IS_STRING) {
+                       convert_to_unicode(&final_name);
+               } else if (!UG(unicode) && Z_TYPE(final_name) == IS_UNICODE) {
+                       convert_to_string(&final_name);
+               }
+
                if (Z_TYPE(final_name) != IS_NULL) {
                        if (extract_refs) {
                                zval **orig_var;