Mailinglisten-Archive |
Holger Bahr wrote: > Handelt es sich bei den Funktionen um PHP4 oder um 'native' Zend Funktionen > (php wird > --with-zend compiliert (oder so)) Es sind Funktionen aus der Zend API, also Funktionen, die PHP intern benutzt werden. Bereits in PHP3 findet man Funktionen wie convert_to_long(), die zur Typwandlung von Daten dienen, die an PHP Funktionen übergeben werden. Ein Blick in den Source von PHP3 und PHP3 klärt Teile des Rätsels auf. convert_to_long() ist in der PHP3 und der Zend API eine Funktion. Diese Funktion versucht eine Typwandlung im zur Datenspeicherung genutzen struct. convert_to_long_ex hingegen ist keine Funktion. Es ist nur ein mit define definiertet Textersatz: #define convert_to_long_ex(ppzv) \ if ((*ppzv)->type!=IS_LONG) { \ if (!(*ppzv)->is_ref) { \ SEPARATE_ZVAL(ppzv); \ } \ convert_to_long(*ppzv); \ [zend_operators.h] Hierin findet eine weitere Definition Verwendung: #define SEPARATE_ZVAL(ppz) \ { \ zval *orig_ptr = *(ppzv); \ \ if (orig_ptr->refcount>1) { \ orig_ptr->refcount--; \ *(ppzv) = (zval *) emalloc(sizeof(zval)); \ **(ppzv) = *orig_ptr; \ zval_copy_ctor(*(ppzv)); \ (*(ppzv))->refcount=1; \ (*(ppzv))->is_ref = 0; \ } \ } Was sagt das CangeLog? 1999-09-24 Zeev Suraski <zeev_(at)_php.net> * ext/wddx/wddx.c ext/xml/xml.c ext/zlib/zlib.c: Compile fixes for WDDX, XML and Zlib (untested) * ext/sybase_ct/php_sybase_ct.c: This should make the Sybase CT module compile again (untested) * ext/msql/php_msql.c: This should make the mSQL module compile again (untested) * ext/mysql/php_mysql.c ChangeLog: Ok guys, the prototype for zend_fetch_resource*() has changed - it now accepts a zval ** instead of a zval *, to be suitable for use with the getParametersEx() API. You don't have to switch to the getParametersEx() API, but you will have to go over your code and add &'s where it's applicable (of course, if you have the mental strength to go over your code and convert it to use the Ex API, it's best). The MySQL module now uses the getParametersEx() API completely. Und was steht bei der Zend Funktion? /* Zend-optimized Extended functions */ /* this function doesn't check for too many parameters */ ZEND_API int getParametersEx(int param_count,...) Wenn Du mal den Source der beiden Funktionen in der zend_API.c vergleichst, wirst Du sehen, daß die neue *Ex Funktion um ein ganzes Stück kürzer geworden ist. Folgendes ist rausgeflogen: if (!PZVAL_IS_REF(param_ptr) && param_ptr->refcount>1) { zval *new_tmp; new_tmp = (zval *) emalloc(sizeof(zval)); *new_tmp = *param_ptr; zval_copy_ctor(new_tmp); INIT_PZVAL(new_tmp); param_ptr = new_tmp; ((zval *) *(p-param_count))->refcount--; *(p-param_count) = param_ptr; } *param = param_ptr; param_count--; } Frag mich nicht, was hier im Detail passiert... Wichtig scheint mir, daß bei nur einer Stufe tiefer geschalteten Pointern kürzerer (s. Extensions) und effektiverer Code möglich wird. Viele wichtige Extensions (MySQL, Oracle, Standard-Array, Standard-String, ODBC...) nutzen die neuen *Ex Funktionen, was die Vermutung stärkt, daß sie /* Zend-optimized Extended functions */ sind. Ulf
php::bar PHP Wiki - Listenarchive