summaryrefslogtreecommitdiff
path: root/UPGRADING.INTERNALS
blob: d1aca29dc4533b6bfde8f0986695818df9883e1b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
$Id$

UPGRADE NOTES - PHP X.Y

1. Internal API changes
  a. Addition of do_operation and compare object handlers
  b. return_value_ptr now always available, RETVAL_ZVAL_FAST macros
  c. POST data handling
  d. Arginfo changes

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


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

  a. Addition of do_operation and compare object handlers

  Two new object handlers have been added:

    do_operation:
    typedef int (*zend_object_do_operation_t)(
        zend_uchar opcode, zval *result, zval *op1, zval *op2 TSRMLS_DC
    );

    compare:
    typedef int (*zend_object_compare_zvals_t)(
        zval *result, zval *op1, zval *op2 TSRMLS_DC
    );

  The first handler is used to overload arithmetic operations. The first
  argument specifies the opcode of the operator, result is the target zval,
  op1 the first operand and op2 the second operand. For unary operations
  op2 is NULL. If the handler returns FAILURE PHP falls back to the default
  behavior for the operation.

  The second handler is used to perform comparison operations with
  non-objects. The value written into result must be an IS_LONG with value
  -1 (smaller), 0 (equal) or 1 (greater). The return value is a SUCCESS/FAILURE
  return code. The difference between this handler and compare_objects is
  that it will be triggered for comparisons with non-objects and objects of
  different types. It takes precedence over compare_objects.

  Further docs in the RFC: https://wiki.php.net/rfc/operator_overloading_gmp

  b. return_value_ptr now always available, RETVAL_ZVAL_FAST macros

  The return_value_ptr argument to internal functions is now always set.
  Previously it was only available for functions returning by-reference.
  return_value_ptr can now be used to return zvals without copying them.
  For this purpose two new macros are provided:

      RETVAL_ZVAL_FAST(zv); /* analog to RETVAL_ZVAL(zv, 1, 0) */
      RETURN_ZVAL_FAST(zv); /* analog to RETURN_ZVAL(zv, 1, 0) */

  The macros behave similarly to the non-FAST variants with copy=1 and
  dtor=0, but will try to return the zval without making a copy by utilizing
  return_value_ptr.
  
  c. POST data handling
  
  The sapi_request_info's members post_data, post_data_len and raw_post_data as 
  well as raw_post_data_len have been replaced with a temp PHP stream 
  request_body.
  
  The recommended way to access raw POST data is to open and use a php://input 
  stream wrapper.  It is safe to be used concurrently and more than once. 

  d. Arginfo changes

  The pass_rest_by_reference argument of the ZEND_BEGIN_ARG_INFO and
  ZEND_BEGIN_ARG_INFO_EX() is no longer used. The value passed to it is ignored.

  Instead a variadic argument is created using ZEND_ARG_VARIADIC_INFO():

      ZEND_ARG_VARIADIC_INFO(0, name) /* pass rest by value */
      ZEND_ARG_VARIADIC_INFO(1, name) /* pass rest by reference */
      ZEND_ARG_VARIADIC_INFO(ZEND_SEND_PREFER_REF, name)
          /* pass rest by prefer-ref */

  ZEND_ARG_VARIADIC_INFO() should only be used for the last argument.

  The following changes were applied to the zend_arg_info struct:

       typedef struct _zend_arg_info {
           const char *class_name;
           zend_uint class_name_len;
           zend_uchar type_hint;
      +    zend_uchar pass_by_reference;
           zend_bool allow_null;
      -    zend_bool pass_by_reference;
      +    zend_bool is_variadic;
       } zend_arg_info;

  The following changes were applied to the zend_internal_function_info struct:

       typedef struct _zend_internal_function_info {
           zend_uint required_num_args;
           zend_uchar _type_hint;
           zend_bool return_reference;
      -    zend_bool pass_rest_by_reference;
      +    zend_bool _allow_null;
      +    zend_bool _is_variadic;
       } zend_internal_function_info;

  The CHECK_ARG_SEND_TYPE(), ARG_MUST_BE_SENT_BY_REF(),
  ARG_SHOULD_BE_SENT_BY_REF() and ARG_MAY_BE_SENT_BY_REF() macros now assume
  that the argument passed to them is a zend_function* and that it is non-NULL.

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

  a. Unix build system changes
    - The bison version check is now a blacklist instead of a whitelist.
    - The bison binary can be specified through the YACC environment/configure
      variable. Previously `bison` was assumed to be in $PATH. 

  b. Windows build system changes
    -