$Id$

UPGRADE NOTES - PHP X.Y

1. Internal API changes
  a. Executor changes
  b. Streams pooling API
  c. Lowercasing and locales
  d. zend_qsort_r
  e. get_current_key
  f. unserialization of manipulated object strings

2. Build system changes
  a. Unix build system changes
  b. Windows build system changes


========================
1. Internal API changes
========================

	a. Executor changes

 * extensions can't override zend_execute() any more, they should override
   zend_execute_ex() instead. The EG(current_execute_data) is already
   initialized in zend_execute_ex(), so for compatibility extensions
   may need to use EG(current_execute_data)->prev_execute_data instead.
 * removed EG(arg_types_stack), EX(fbc), EX(called_scope), EX(current_object)
 * added op_array->nested_calls. It's calculated at compile time.
 * added EX(call_slots). It is an array to store information about syntaticaly
   nested calls (e.g. foo(bar())). It's preallocated together with execute_data.
 * added EX(call) - pointer to a current calling function. Actually an
   element of EX(call_slots)
 * opcodes INIT_METHOD_CALL, ZEND_INIT_STATIC_METHOD_CALL,
   ZEND_INIT_FCALL_BY_NAME, ZEND_INIT_NS_FCALL_BY_NAME use result.num as
   an index in EX(call_slots)
 * opcode ZEND_NEW uses extended_vallue as an index in EX(call_slots)
 * opcoes ZEND_DO_FCALL and ZEND_DO_FCALL_BY_NAME use op2.num as
   an index in EX(call_slots)
 * added op_array->used_stack. It's calculated at compile time and the
   corresponding stack space is preallocated together with execute_data.
   ZEND_SEND* and ZEND_DO_FCALL* don't need to check for stack overflow
   anymore.
 * Removed execute_data->Ts field. The VM temporary variables always allocated
   immediately before execute_data structure. Now they are accessed by offset
   from the execute_data base pointer (instead of execute_data->Ts). Compiler
   stores new offsets in op_array->opcodes[*].op?.num. You can use macros
   EX_TMP_VAR() and EX_TMP_VAR_NUM() to access temp_variable by offset or
   number. You can convert number to offset using EX_TMP_VAR_NUM(0, num) or
   offset to number (EX_TMP_VAR_NUM(0,0)-EX_TMP_VAR(0,offset)).
 * Removed execute_data->CVs field. The VM compiled variables always allocated
   immediately after execute_data structure. Now they are accessed by offset
   from the execute_data base pointer (instead of execute_data->CVs). You can
   use macros EX_CV_NUM() to access compiled variables by number.

	b. Streams pooling API

The streams pooling API has been removed. The following functions no longer
exist:

PHPAPI int php_stream_context_get_link(php_stream_context *context,
		const char *hostent, php_stream **stream);
PHPAPI int php_stream_context_set_link(php_stream_context *context,
		const char *hostent, php_stream *stream);
PHPAPI int php_stream_context_del_link(php_stream_context *context,
		php_stream *stream);

	c. Lowercasing and locales

The lowercasing functions in zend_operators.c were split into those that do 
lowercasing according to locale rules and those that do ASCII lowercasing.
ASCII:

                zend_str_tolower_copy
                zend_str_tolower_dup
                zend_str_tolower
                zend_binary_strcasecmp
                zend_binary_strncasecmp

Locale-based:
                zend_binary_strncasecmp_l
                zend_binary_strcasecmp_l
                zend_binary_zval_strcasecmp
                zend_binary_zval_strncasecmp
                string_compare_function_ex
                string_case_compare_function

Internal engine lowercasing will be using ASCII-only rules. User-facing functions,
such as strcasecmp, will be using locale rules. 

Two new functions - zend_binary_strncasecmp_l and zend_binary_strcasecmp_l - added as 
locale-based counterparts to zend_binary_strcasecmp and zend_binary_strncasecmp.

	d. zend_qsort_r

Added the function zend_qsort_r():

typedef int  (*compare_r_func_t)(const void *, const void * TSRMLS_DC, void *);
void zend_qsort_r(void *base, size_t nmemb, size_t siz, compare_r_func_t compare, void *arg TSRMLS_DC);

The extra argument it has (relatively to zend_qsort()) is passed to the
comparison function.

	e. get_current_key

The signature of the get_current_key iteration handler has been changed to:

void (*get_current_key)(zend_object_iterator *iter, zval *key TSRMLS_DC);

The key should be written into the zval* using the ZVAL_* macros.

	f. unserialization of manipulated object strings

Strings requiring unserialization of objects are now explicitly checked
whether the object they contain implements the Serializable interface.
This solves the situation where manipulated strings could be passed for
objects using Serializable to disallow serialization. An object
implementing Serializable will always start with "C:" in the serialized
string, all other objects are represented with starting "O:". Objects
implementing Serializable to disable serialization using
zend_class_unserialize_deny and zend_class_serialize_deny, when
instantiated from the serializer with a manipulated "O:" string at the
start, will most likely be defectively initialized. This is now
fixed at the appropriate place by checking for the presence of the
serialize callback in the class entry.

========================
2. Build system changes
========================

  a. Unix build system changes
    - 

  b. Windows build system changes
    - Drop Windows XP and 2003 support.
  
