@@ -204,19 +204,17 @@ typedef struct _zend_ffi_ctype {
204
204
static zend_class_entry * zend_ffi_exception_ce ;
205
205
static zend_class_entry * zend_ffi_parser_exception_ce ;
206
206
static zend_class_entry * zend_ffi_ce ;
207
+ static zend_class_entry * zend_ffi_scope_ce ;
207
208
static zend_class_entry * zend_ffi_cdata_ce ;
208
209
static zend_class_entry * zend_ffi_ctype_ce ;
209
210
210
211
static zend_object_handlers zend_ffi_handlers ;
212
+ static zend_object_handlers zend_ffi_scope_handlers ;
211
213
static zend_object_handlers zend_ffi_cdata_handlers ;
212
214
static zend_object_handlers zend_ffi_cdata_value_handlers ;
213
215
static zend_object_handlers zend_ffi_cdata_free_handlers ;
214
216
static zend_object_handlers zend_ffi_ctype_handlers ;
215
217
216
- static zend_internal_function zend_ffi_new_fn ;
217
- static zend_internal_function zend_ffi_cast_fn ;
218
- static zend_internal_function zend_ffi_type_fn ;
219
-
220
218
/* forward declarations */
221
219
static void _zend_ffi_type_dtor (zend_ffi_type * type );
222
220
static void zend_ffi_finalize_type (zend_ffi_dcl * dcl );
@@ -2279,7 +2277,7 @@ static HashTable *zend_ffi_ctype_get_debug_info(zend_object *obj, int *is_temp)
2279
2277
}
2280
2278
/* }}} */
2281
2279
2282
- static zend_object * zend_ffi_new (zend_class_entry * class_type ) /* {{{ */
2280
+ static zend_object * zend_ffi_scope_new (zend_class_entry * class_type ) /* {{{ */
2283
2281
{
2284
2282
zend_ffi * ffi ;
2285
2283
@@ -2415,7 +2413,7 @@ static void zend_ffi_scope_hash_dtor(zval *zv) /* {{{ */
2415
2413
}
2416
2414
/* }}} */
2417
2415
2418
- static void zend_ffi_free_obj (zend_object * object ) /* {{{ */
2416
+ static void zend_ffi_scope_free_obj (zend_object * object ) /* {{{ */
2419
2417
{
2420
2418
zend_ffi * ffi = (zend_ffi * )object ;
2421
2419
@@ -2475,7 +2473,7 @@ static zend_object *zend_ffi_cdata_clone_obj(zend_object *obj) /* {{{ */
2475
2473
}
2476
2474
/* }}} */
2477
2475
2478
- static zval * zend_ffi_read_var (zend_object * obj , zend_string * var_name , int read_type , void * * cache_slot , zval * rv ) /* {{{ */
2476
+ static zval * zend_ffi_scope_read_var (zend_object * obj , zend_string * var_name , int read_type , void * * cache_slot , zval * rv ) /* {{{ */
2479
2477
{
2480
2478
zend_ffi * ffi = (zend_ffi * )obj ;
2481
2479
zend_ffi_symbol * sym = NULL ;
@@ -2518,7 +2516,7 @@ static zval *zend_ffi_read_var(zend_object *obj, zend_string *var_name, int read
2518
2516
}
2519
2517
/* }}} */
2520
2518
2521
- static zval * zend_ffi_write_var (zend_object * obj , zend_string * var_name , zval * value , void * * cache_slot ) /* {{{ */
2519
+ static zval * zend_ffi_scope_write_var (zend_object * obj , zend_string * var_name , zval * value , void * * cache_slot ) /* {{{ */
2522
2520
{
2523
2521
zend_ffi * ffi = (zend_ffi * )obj ;
2524
2522
zend_ffi_symbol * sym = NULL ;
@@ -2870,30 +2868,17 @@ static ZEND_FUNCTION(ffi_trampoline) /* {{{ */
2870
2868
}
2871
2869
/* }}} */
2872
2870
2873
- static zend_function * zend_ffi_get_func (zend_object * * obj , zend_string * name , const zval * key ) /* {{{ */
2871
+ static zend_function * zend_ffi_scope_get_func (zend_object * * obj , zend_string * name , const zval * key ) /* {{{ */
2874
2872
{
2875
2873
zend_ffi * ffi = (zend_ffi * )* obj ;
2876
2874
zend_ffi_symbol * sym = NULL ;
2877
2875
zend_function * func ;
2878
2876
zend_ffi_type * type ;
2877
+ zval * zv ;
2879
2878
2880
- if (ZSTR_LEN (name ) == sizeof ("new" ) - 1
2881
- && (ZSTR_VAL (name )[0 ] == 'n' || ZSTR_VAL (name )[0 ] == 'N' )
2882
- && (ZSTR_VAL (name )[1 ] == 'e' || ZSTR_VAL (name )[1 ] == 'E' )
2883
- && (ZSTR_VAL (name )[2 ] == 'w' || ZSTR_VAL (name )[2 ] == 'W' )) {
2884
- return (zend_function * )& zend_ffi_new_fn ;
2885
- } else if (ZSTR_LEN (name ) == sizeof ("cast" ) - 1
2886
- && (ZSTR_VAL (name )[0 ] == 'c' || ZSTR_VAL (name )[0 ] == 'C' )
2887
- && (ZSTR_VAL (name )[1 ] == 'a' || ZSTR_VAL (name )[1 ] == 'A' )
2888
- && (ZSTR_VAL (name )[2 ] == 's' || ZSTR_VAL (name )[2 ] == 'S' )
2889
- && (ZSTR_VAL (name )[3 ] == 't' || ZSTR_VAL (name )[3 ] == 'T' )) {
2890
- return (zend_function * )& zend_ffi_cast_fn ;
2891
- } else if (ZSTR_LEN (name ) == sizeof ("type" ) - 1
2892
- && (ZSTR_VAL (name )[0 ] == 't' || ZSTR_VAL (name )[0 ] == 'T' )
2893
- && (ZSTR_VAL (name )[1 ] == 'y' || ZSTR_VAL (name )[1 ] == 'Y' )
2894
- && (ZSTR_VAL (name )[2 ] == 'p' || ZSTR_VAL (name )[2 ] == 'P' )
2895
- && (ZSTR_VAL (name )[3 ] == 'e' || ZSTR_VAL (name )[3 ] == 'E' )) {
2896
- return (zend_function * )& zend_ffi_type_fn ;
2879
+ zv = zend_hash_find (& zend_ffi_scope_ce -> function_table , name );
2880
+ if (zv ) {
2881
+ return (zend_function * )Z_PTR_P (zv );
2897
2882
}
2898
2883
2899
2884
if (ffi -> symbols ) {
@@ -3057,7 +3042,7 @@ ZEND_METHOD(FFI, cdef) /* {{{ */
3057
3042
}
3058
3043
}
3059
3044
3060
- ffi = (zend_ffi * )zend_ffi_new ( zend_ffi_ce );
3045
+ ffi = (zend_ffi * )zend_ffi_scope_new ( zend_ffi_scope_ce );
3061
3046
ffi -> lib = handle ;
3062
3047
ffi -> symbols = FFI_G (symbols );
3063
3048
ffi -> tags = FFI_G (tags );
@@ -3493,15 +3478,15 @@ static zend_ffi *zend_ffi_load(const char *filename, bool preload) /* {{{ */
3493
3478
}
3494
3479
3495
3480
if (EG (objects_store ).object_buckets ) {
3496
- ffi = (zend_ffi * )zend_ffi_new ( zend_ffi_ce );
3481
+ ffi = (zend_ffi * )zend_ffi_scope_new ( zend_ffi_scope_ce );
3497
3482
} else {
3498
3483
ffi = ecalloc (1 , sizeof (zend_ffi ));
3499
3484
}
3500
3485
ffi -> symbols = scope -> symbols ;
3501
3486
ffi -> tags = scope -> tags ;
3502
3487
ffi -> persistent = 1 ;
3503
3488
} else {
3504
- ffi = (zend_ffi * )zend_ffi_new ( zend_ffi_ce );
3489
+ ffi = (zend_ffi * )zend_ffi_scope_new ( zend_ffi_scope_ce );
3505
3490
ffi -> lib = handle ;
3506
3491
ffi -> symbols = FFI_G (symbols );
3507
3492
ffi -> tags = FFI_G (tags );
@@ -3574,7 +3559,7 @@ ZEND_METHOD(FFI, scope) /* {{{ */
3574
3559
RETURN_THROWS ();
3575
3560
}
3576
3561
3577
- ffi = (zend_ffi * )zend_ffi_new ( zend_ffi_ce );
3562
+ ffi = (zend_ffi * )zend_ffi_scope_new ( zend_ffi_scope_ce );
3578
3563
3579
3564
ffi -> symbols = scope -> symbols ;
3580
3565
ffi -> tags = scope -> tags ;
@@ -3753,7 +3738,7 @@ static void zend_ffi_tags_cleanup(zend_ffi_dcl *dcl) /* {{{ */
3753
3738
}
3754
3739
/* }}} */
3755
3740
3756
- ZEND_METHOD ( FFI , new ) /* {{{ */
3741
+ static void _zend_ffi_new ( INTERNAL_FUNCTION_PARAMETERS , bool is_static_call ) /* {{{ */
3757
3742
{
3758
3743
zend_string * type_def = NULL ;
3759
3744
zend_object * type_obj = NULL ;
@@ -3763,7 +3748,6 @@ ZEND_METHOD(FFI, new) /* {{{ */
3763
3748
bool owned = 1 ;
3764
3749
bool persistent = 0 ;
3765
3750
bool is_const = 0 ;
3766
- bool is_static_call = Z_TYPE (EX (This )) != IS_OBJECT ;
3767
3751
zend_ffi_flags flags = ZEND_FFI_FLAG_OWNED ;
3768
3752
3769
3753
ZEND_FFI_VALIDATE_API_RESTRICTION ();
@@ -3774,13 +3758,6 @@ ZEND_METHOD(FFI, new) /* {{{ */
3774
3758
Z_PARAM_BOOL (persistent )
3775
3759
ZEND_PARSE_PARAMETERS_END ();
3776
3760
3777
- if (is_static_call ) {
3778
- zend_error (E_DEPRECATED , "Calling FFI::new() statically is deprecated" );
3779
- if (EG (exception )) {
3780
- RETURN_THROWS ();
3781
- }
3782
- }
3783
-
3784
3761
if (!owned ) {
3785
3762
flags &= ~ZEND_FFI_FLAG_OWNED ;
3786
3763
}
@@ -3878,6 +3855,18 @@ ZEND_METHOD(FFI, new) /* {{{ */
3878
3855
}
3879
3856
/* }}} */
3880
3857
3858
+ ZEND_METHOD (FFI , new ) /* {{{ */
3859
+ {
3860
+ _zend_ffi_new (INTERNAL_FUNCTION_PARAM_PASSTHRU , 1 );
3861
+ }
3862
+ /* }}} */
3863
+
3864
+ ZEND_METHOD (FFI_Scope , new ) /* {{{ */
3865
+ {
3866
+ _zend_ffi_new (INTERNAL_FUNCTION_PARAM_PASSTHRU , 0 );
3867
+ }
3868
+ /* }}} */
3869
+
3881
3870
ZEND_METHOD (FFI , free ) /* {{{ */
3882
3871
{
3883
3872
zval * zv ;
@@ -3912,14 +3901,13 @@ ZEND_METHOD(FFI, free) /* {{{ */
3912
3901
}
3913
3902
/* }}} */
3914
3903
3915
- ZEND_METHOD ( FFI , cast ) /* {{{ */
3904
+ static void _zend_ffi_cast ( INTERNAL_FUNCTION_PARAMETERS , bool is_static_call ) /* {{{ */
3916
3905
{
3917
3906
zend_string * type_def = NULL ;
3918
3907
zend_object * ztype = NULL ;
3919
3908
zend_ffi_type * old_type , * type , * type_ptr ;
3920
3909
zend_ffi_cdata * old_cdata , * cdata ;
3921
3910
bool is_const = 0 ;
3922
- bool is_static_call = Z_TYPE (EX (This )) != IS_OBJECT ;
3923
3911
zval * zv , * arg ;
3924
3912
void * ptr ;
3925
3913
@@ -3929,13 +3917,6 @@ ZEND_METHOD(FFI, cast) /* {{{ */
3929
3917
Z_PARAM_ZVAL (zv )
3930
3918
ZEND_PARSE_PARAMETERS_END ();
3931
3919
3932
- if (is_static_call ) {
3933
- zend_error (E_DEPRECATED , "Calling FFI::cast() statically is deprecated" );
3934
- if (EG (exception )) {
3935
- RETURN_THROWS ();
3936
- }
3937
- }
3938
-
3939
3920
arg = zv ;
3940
3921
ZVAL_DEREF (zv );
3941
3922
@@ -4095,25 +4076,29 @@ ZEND_METHOD(FFI, cast) /* {{{ */
4095
4076
}
4096
4077
/* }}} */
4097
4078
4098
- ZEND_METHOD (FFI , type ) /* {{{ */
4079
+ ZEND_METHOD (FFI , cast ) /* {{{ */
4080
+ {
4081
+ _zend_ffi_cast (INTERNAL_FUNCTION_PARAM_PASSTHRU , 1 );
4082
+ }
4083
+ /* }}} */
4084
+
4085
+ ZEND_METHOD (FFI_Scope , cast ) /* {{{ */
4086
+ {
4087
+ _zend_ffi_cast (INTERNAL_FUNCTION_PARAM_PASSTHRU , 0 );
4088
+ }
4089
+ /* }}} */
4090
+
4091
+ static void _zend_ffi_type (INTERNAL_FUNCTION_PARAMETERS , bool is_static_call ) /* {{{ */
4099
4092
{
4100
4093
zend_ffi_ctype * ctype ;
4101
4094
zend_ffi_dcl dcl = ZEND_FFI_ATTR_INIT ;
4102
4095
zend_string * type_def ;
4103
- bool is_static_call = Z_TYPE (EX (This )) != IS_OBJECT ;
4104
4096
4105
4097
ZEND_FFI_VALIDATE_API_RESTRICTION ();
4106
4098
ZEND_PARSE_PARAMETERS_START (1 , 1 )
4107
4099
Z_PARAM_STR (type_def );
4108
4100
ZEND_PARSE_PARAMETERS_END ();
4109
4101
4110
- if (is_static_call ) {
4111
- zend_error (E_DEPRECATED , "Calling FFI::type() statically is deprecated" );
4112
- if (EG (exception )) {
4113
- RETURN_THROWS ();
4114
- }
4115
- }
4116
-
4117
4102
if (!is_static_call ) {
4118
4103
zend_ffi * ffi = (zend_ffi * )Z_OBJ (EX (This ));
4119
4104
FFI_G (symbols ) = ffi -> symbols ;
@@ -4160,6 +4145,18 @@ ZEND_METHOD(FFI, type) /* {{{ */
4160
4145
}
4161
4146
/* }}} */
4162
4147
4148
+ ZEND_METHOD (FFI , type ) /* {{{ */
4149
+ {
4150
+ _zend_ffi_type (INTERNAL_FUNCTION_PARAM_PASSTHRU , 1 );
4151
+ }
4152
+ /* }}} */
4153
+
4154
+ ZEND_METHOD (FFI_Scope , type ) /* {{{ */
4155
+ {
4156
+ _zend_ffi_type (INTERNAL_FUNCTION_PARAM_PASSTHRU , 0 );
4157
+ }
4158
+ /* }}} */
4159
+
4163
4160
ZEND_METHOD (FFI , typeof ) /* {{{ */
4164
4161
{
4165
4162
zval * zv , * arg ;
@@ -5380,30 +5377,6 @@ static zend_result zend_ffi_preload(char *preload) /* {{{ */
5380
5377
}
5381
5378
/* }}} */
5382
5379
5383
- /* The startup code for observers adds a temporary to each function for internal use.
5384
- * The "new", "cast", and "type" functions in FFI are both static and non-static.
5385
- * Only the static versions are in the function table and the non-static versions are not.
5386
- * This means the non-static versions will be skipped by the observers startup code.
5387
- * This function fixes that by incrementing the temporary count for the non-static versions.
5388
- */
5389
- static zend_result (* prev_zend_post_startup_cb )(void );
5390
- static zend_result ffi_fixup_temporaries (void ) {
5391
- if (ZEND_OBSERVER_ENABLED ) {
5392
- ++ zend_ffi_new_fn .T ;
5393
- ++ zend_ffi_cast_fn .T ;
5394
- ++ zend_ffi_type_fn .T ;
5395
- }
5396
- #ifndef ZTS
5397
- ZEND_MAP_PTR (zend_ffi_new_fn .run_time_cache ) = ZEND_MAP_PTR (((zend_internal_function * )zend_hash_str_find_ptr (& zend_ffi_ce -> function_table , "new" , sizeof ("new" )- 1 ))-> run_time_cache );
5398
- ZEND_MAP_PTR (zend_ffi_cast_fn .run_time_cache ) = ZEND_MAP_PTR (((zend_internal_function * )zend_hash_str_find_ptr (& zend_ffi_ce -> function_table , "cast" , sizeof ("cast" )- 1 ))-> run_time_cache );
5399
- ZEND_MAP_PTR (zend_ffi_type_fn .run_time_cache ) = ZEND_MAP_PTR (((zend_internal_function * )zend_hash_str_find_ptr (& zend_ffi_ce -> function_table , "type" , sizeof ("type" )- 1 ))-> run_time_cache );
5400
- #endif
5401
- if (prev_zend_post_startup_cb ) {
5402
- return prev_zend_post_startup_cb ();
5403
- }
5404
- return SUCCESS ;
5405
- }
5406
-
5407
5380
/* {{{ ZEND_MINIT_FUNCTION */
5408
5381
ZEND_MINIT_FUNCTION (ffi )
5409
5382
{
@@ -5416,39 +5389,35 @@ ZEND_MINIT_FUNCTION(ffi)
5416
5389
zend_ffi_parser_exception_ce = register_class_FFI_ParserException (zend_ffi_exception_ce );
5417
5390
5418
5391
zend_ffi_ce = register_class_FFI ();
5419
- zend_ffi_ce -> create_object = zend_ffi_new ;
5420
5392
zend_ffi_ce -> default_object_handlers = & zend_ffi_handlers ;
5421
5393
5422
- memcpy (& zend_ffi_new_fn , zend_hash_str_find_ptr (& zend_ffi_ce -> function_table , "new" , sizeof ("new" )- 1 ), sizeof (zend_internal_function ));
5423
- zend_ffi_new_fn .fn_flags &= ~ZEND_ACC_STATIC ;
5424
- memcpy (& zend_ffi_cast_fn , zend_hash_str_find_ptr (& zend_ffi_ce -> function_table , "cast" , sizeof ("cast" )- 1 ), sizeof (zend_internal_function ));
5425
- zend_ffi_cast_fn .fn_flags &= ~ZEND_ACC_STATIC ;
5426
- memcpy (& zend_ffi_type_fn , zend_hash_str_find_ptr (& zend_ffi_ce -> function_table , "type" , sizeof ("type" )- 1 ), sizeof (zend_internal_function ));
5427
- zend_ffi_type_fn .fn_flags &= ~ZEND_ACC_STATIC ;
5428
-
5429
- prev_zend_post_startup_cb = zend_post_startup_cb ;
5430
- zend_post_startup_cb = ffi_fixup_temporaries ;
5394
+ zend_ffi_scope_ce = register_class_FFI_Scope ();
5395
+ zend_ffi_scope_ce -> create_object = zend_ffi_scope_new ;
5396
+ zend_ffi_scope_ce -> default_object_handlers = & zend_ffi_scope_handlers ;
5431
5397
5432
5398
memcpy (& zend_ffi_handlers , zend_get_std_object_handlers (), sizeof (zend_object_handlers ));
5433
5399
zend_ffi_handlers .get_constructor = zend_fake_get_constructor ;
5434
- zend_ffi_handlers .free_obj = zend_ffi_free_obj ;
5435
- zend_ffi_handlers .clone_obj = NULL ;
5436
- zend_ffi_handlers .read_property = zend_ffi_read_var ;
5437
- zend_ffi_handlers .write_property = zend_ffi_write_var ;
5438
- zend_ffi_handlers .read_dimension = zend_fake_read_dimension ;
5439
- zend_ffi_handlers .write_dimension = zend_fake_write_dimension ;
5440
- zend_ffi_handlers .get_property_ptr_ptr = zend_fake_get_property_ptr_ptr ;
5441
- zend_ffi_handlers .has_property = zend_fake_has_property ;
5442
- zend_ffi_handlers .unset_property = zend_fake_unset_property ;
5443
- zend_ffi_handlers .has_dimension = zend_fake_has_dimension ;
5444
- zend_ffi_handlers .unset_dimension = zend_fake_unset_dimension ;
5445
- zend_ffi_handlers .get_method = zend_ffi_get_func ;
5446
- zend_ffi_handlers .compare = NULL ;
5447
- zend_ffi_handlers .cast_object = zend_fake_cast_object ;
5448
- zend_ffi_handlers .get_debug_info = NULL ;
5449
- zend_ffi_handlers .get_closure = NULL ;
5450
- zend_ffi_handlers .get_properties = zend_fake_get_properties ;
5451
- zend_ffi_handlers .get_gc = zend_fake_get_gc ;
5400
+
5401
+ memcpy (& zend_ffi_scope_handlers , zend_get_std_object_handlers (), sizeof (zend_object_handlers ));
5402
+ zend_ffi_scope_handlers .get_constructor = zend_fake_get_constructor ;
5403
+ zend_ffi_scope_handlers .free_obj = zend_ffi_scope_free_obj ;
5404
+ zend_ffi_scope_handlers .clone_obj = NULL ;
5405
+ zend_ffi_scope_handlers .read_property = zend_ffi_scope_read_var ;
5406
+ zend_ffi_scope_handlers .write_property = zend_ffi_scope_write_var ;
5407
+ zend_ffi_scope_handlers .read_dimension = zend_fake_read_dimension ;
5408
+ zend_ffi_scope_handlers .write_dimension = zend_fake_write_dimension ;
5409
+ zend_ffi_scope_handlers .get_property_ptr_ptr = zend_fake_get_property_ptr_ptr ;
5410
+ zend_ffi_scope_handlers .has_property = zend_fake_has_property ;
5411
+ zend_ffi_scope_handlers .unset_property = zend_fake_unset_property ;
5412
+ zend_ffi_scope_handlers .has_dimension = zend_fake_has_dimension ;
5413
+ zend_ffi_scope_handlers .unset_dimension = zend_fake_unset_dimension ;
5414
+ zend_ffi_scope_handlers .get_method = zend_ffi_scope_get_func ;
5415
+ zend_ffi_scope_handlers .compare = NULL ;
5416
+ zend_ffi_scope_handlers .cast_object = zend_fake_cast_object ;
5417
+ zend_ffi_scope_handlers .get_debug_info = NULL ;
5418
+ zend_ffi_scope_handlers .get_closure = NULL ;
5419
+ zend_ffi_scope_handlers .get_properties = zend_fake_get_properties ;
5420
+ zend_ffi_scope_handlers .get_gc = zend_fake_get_gc ;
5452
5421
5453
5422
zend_ffi_cdata_ce = register_class_FFI_CData ();
5454
5423
zend_ffi_cdata_ce -> create_object = zend_ffi_cdata_new ;
0 commit comments