@@ -136,6 +136,34 @@ static inline zval *_get_zval_ptr(znode *node, temp_variable *Ts, int *should_fr
136
136
return NULL ;
137
137
}
138
138
139
+ static inline zval * _get_object_zval_ptr (znode * node , temp_variable * Ts , int * should_free ELS_DC )
140
+ {
141
+ switch (node -> op_type ) {
142
+ case IS_TMP_VAR :
143
+ * should_free = 1 ;
144
+ return & Ts [node -> u .var ].tmp_var ;
145
+ break ;
146
+ case IS_VAR :
147
+ if (Ts [node -> u .var ].var ) {
148
+ PZVAL_UNLOCK (* Ts [node -> u .var ].var );
149
+ * should_free = 0 ;
150
+ return * Ts [node -> u .var ].var ;
151
+ } else {
152
+ * should_free = 1 ;
153
+ return NULL ;
154
+ }
155
+ break ;
156
+ case IS_UNUSED :
157
+ return NULL ;
158
+ break ;
159
+ #if DEBUG_ZEND
160
+ default :
161
+ zend_error (E_ERROR , "Unknown temporary variable type" );
162
+ break ;
163
+ #endif
164
+ }
165
+ return NULL ;
166
+ }
139
167
140
168
static inline zval * * _get_zval_ptr_ptr (znode * node , temp_variable * Ts ELS_DC )
141
169
{
@@ -720,7 +748,7 @@ static inline void zend_fetch_property_address(znode *result, znode *op1, znode
720
748
zend_property_reference property_reference ;
721
749
zend_overloaded_element overloaded_element ;
722
750
723
- property_reference .object = container_ptr ;
751
+ property_reference .object = container ;
724
752
property_reference .type = type ;
725
753
zend_llist_init (& property_reference .elements_list , sizeof (zend_overloaded_element ), NULL , 0 );
726
754
overloaded_element .element = * get_zval_ptr (op2 , Ts , & free_op2 , type );
@@ -791,7 +819,7 @@ static zval get_overloaded_property(ELS_D)
791
819
zval result ;
792
820
793
821
zend_stack_top (& EG (overloaded_objects_stack ), (void * * ) & property_reference );
794
- result = (* ( property_reference -> object ) )-> value .obj .ce -> handle_property_get (property_reference );
822
+ result = (property_reference -> object )-> value .obj .ce -> handle_property_get (property_reference );
795
823
796
824
zend_llist_destroy (& property_reference -> elements_list );
797
825
@@ -805,7 +833,7 @@ static void set_overloaded_property(zval *value ELS_DC)
805
833
zend_property_reference * property_reference ;
806
834
807
835
zend_stack_top (& EG (overloaded_objects_stack ), (void * * ) & property_reference );
808
- (* ( property_reference -> object ) )-> value .obj .ce -> handle_property_set (property_reference , value );
836
+ (property_reference -> object )-> value .obj .ce -> handle_property_set (property_reference , value );
809
837
810
838
zend_llist_destroy (& property_reference -> elements_list );
811
839
@@ -818,7 +846,7 @@ static void call_overloaded_function(int arg_count, zval *return_value, HashTabl
818
846
zend_property_reference * property_reference ;
819
847
820
848
zend_stack_top (& EG (overloaded_objects_stack ), (void * * ) & property_reference );
821
- (* ( property_reference -> object )) -> value .obj .ce -> handle_function_call (arg_count , return_value , list , plist , * property_reference -> object , property_reference );
849
+ (property_reference -> object )-> value .obj .ce -> handle_function_call (arg_count , return_value , list , plist , property_reference -> object , property_reference );
822
850
zend_llist_destroy (& property_reference -> elements_list );
823
851
824
852
zend_stack_del_top (& EG (overloaded_objects_stack ));
@@ -1297,7 +1325,7 @@ binary_assign_op_addr: {
1297
1325
object_ptr = NULL ;
1298
1326
}
1299
1327
} else { /* used for member function calls */
1300
- object_ptr = get_zval_ptr (& opline -> op1 , Ts , & free_op1 , BP_VAR_R );
1328
+ object_ptr = _get_object_zval_ptr (& opline -> op1 , Ts , & free_op1 , BP_VAR_R );
1301
1329
1302
1330
1303
1331
if (!object_ptr
@@ -1376,13 +1404,23 @@ binary_assign_op_addr: {
1376
1404
if (opline -> opcode == ZEND_DO_FCALL_BY_NAME
1377
1405
&& object_ptr
1378
1406
&& function_being_called -> type != ZEND_OVERLOADED_FUNCTION ) {
1379
- /*zval *dummy = (zval *) emalloc(sizeof(zval)), **this_ptr;
1407
+ /*
1408
+ zval *dummy = (zval *) emalloc(sizeof(zval)), **this_ptr;
1380
1409
1381
1410
var_uninit(dummy);
1382
1411
INIT_PZVAL(dummy);
1383
1412
zend_hash_update_ptr(function_state.function_symbol_table, "this", sizeof("this"), dummy, sizeof(zval *), (void **) &this_ptr);
1384
1413
zend_assign_to_variable_reference(NULL, this_ptr, object_ptr, NULL ELS_CC);
1385
1414
*/
1415
+ //zval *dummy = (zval *) emalloc(sizeof(zval));
1416
+ zval * * this_ptr ;
1417
+
1418
+ //var_uninit(dummy);
1419
+ //INIT_PZVAL(dummy);
1420
+ zend_hash_update_ptr (function_state .function_symbol_table , "this" , sizeof ("this" ), NULL , sizeof (zval * ), (void * * ) & this_ptr );
1421
+ * this_ptr = object_ptr ;
1422
+ object_ptr -> refcount ++ ;
1423
+ //zend_assign_to_variable_reference(NULL, this_ptr, object_ptr, NULL ELS_CC);
1386
1424
object_ptr = NULL ;
1387
1425
}
1388
1426
original_return_value = EG (return_value );
0 commit comments