Skip to content

Commit 2c9ba90

Browse files
author
Andrew Zenin
committed
First steps to php7 support
1 parent 9814ac6 commit 2c9ba90

File tree

8 files changed

+171
-52
lines changed

8 files changed

+171
-52
lines changed

Source/DelphiFunctions.pas

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -692,7 +692,7 @@ procedure RegisterInternalClasses(p : pointer);
692692

693693
begin
694694
{$IFDEF PHP7}
695-
object_functions
695+
!
696696
{$ELSE}
697697
object_functions[0].fname := 'delphi_classname';
698698
object_functions[0].handler := @delphi_object_classname;

Source/PHP.INC

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,9 @@ backward compatibility between PHP versions.
6262
{$DEFINE ZEND_WIN32}
6363
{$DEFINE PHP_COMPILER_ID}
6464
{$ENDIF}
65-
{..$DEFINE soulengine_build}
66-
{..$DEFINE PHP7}
67-
{..$DEFINE P_CUT}
65+
{$DEFINE soulengine_build}
66+
{.$DEFINE PHP7}
67+
{.$DEFINE P_CUT}
6868
{$IFDEF PHP7}
6969
{$DEFINE COMPILER_VC14}
7070
{$DEFINE PHP560}

Source/PHPAPI.pas

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,7 @@ interface
2929
Windows
3030
{$ENDIF},
3131

32-
ZendTypes,
33-
{$IFDEF PHP7} hzend_types,{$ENDIF}
32+
{$IFDEF PHP7} hzend_types, {$ELSE} ZendTypes, {$ENDIF}
3433
PHPTypes, zendAPI,
3534

3635

Source/PHPFunctions.pas

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,7 @@ interface
2323
{$IFDEF PHP_UNICE}WideStrUtils, {$ENDIF}
2424
{$IFDEF VERSION6} Variants,
2525
{$ENDIF}
26-
{$IFDEF PHP7} hzend_types, {$ENDIF}
27-
ZendTypes, PHPTypes, ZendAPI, PHPAPI ;
26+
{$IFDEF PHP7} hzend_types, {$ELSE} ZendTypes, {$ENDIF} PHPTypes, ZendAPI, PHPAPI ;
2827

2928
type
3029
TParamType = (tpString, tpInteger, tpFloat, tpBoolean, tpArray, tpUnknown);

Source/PHPTypes.pas

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
interface
1717

1818
uses
19-
{$IFNDEF FPC} Windows{$ELSE} LCLType{$ENDIF}, {$IFDEF PHP7}hzend_types,{$ENDIF} ZENDTypes;
19+
{$IFNDEF FPC} Windows{$ELSE} LCLType{$ENDIF}, {$IFDEF PHP7} hzend_types {$ELSE} ZendTypes {$ENDIF};
2020

2121
{$IFDEF PHP4}
2222
const

Source/ZENDAPI.pas

Lines changed: 98 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,7 @@ interface
2121

2222
uses
2323
{$IFNDEF FPC} Windows{$ELSE} LCLType,LCLIntf,dynlibs,libc{$ENDIF}, SysUtils,
24-
{$IFDEF PHP7} hzend_types, {$ENDIF}
25-
ZendTypes, Variants,
24+
{$IFDEF PHP7} hzend_types, {$ElSE} ZendTypes, {$ENDIF} Variants,
2625
PHPTypes;
2726
type
2827
TArrayVariant = array of variant;
@@ -218,8 +217,9 @@ function zend_hash_add(ht : {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF}; a
218217

219218
var
220219
zend_hash_graceful_destroy : procedure(ht: PHashTable); cdecl;
220+
{$IFNDEF PHP7}
221221
zend_hash_graceful_reverse_destroy : zend_hash_graceful_reverse_destroy_t;
222-
222+
{$ENDIF}
223223
zend_hash_apply : procedure(ht: PHashTable; apply_func: pointer; TSRMLS_DC: Pointer); cdecl;
224224

225225
zend_hash_apply_with_argument : procedure(ht: PHashTable;
@@ -332,8 +332,17 @@ procedure zend_hash_internal_pointer_reset(ht: {$IFDEF PHP7} Pzend_array {$ELSE}
332332

333333
zend_register_constant : function(var c: zend_constant; TSRMLS_DC: Pointer): Integer; cdecl;
334334

335-
zend_register_auto_global : function(name: zend_pchar; name_len: uint; callback: Pointer; TSRMLS_DC: Pointer): Integer; cdecl;
336-
335+
zend_register_auto_global :
336+
{$IFDEF PHP700}
337+
function(name:Pzend_string; jit:zend_bool; auto_global_callback:Pointer):longint; cdecl;
338+
{$ELSE}
339+
{$IFDEF PHP5}
340+
function(name: zend_pchar; name_len: uint; jit:boolean; callback: Pointer; TSRMLS_DC: Pointer): Integer; cdecl;
341+
zend_activate_auto_globals: procedure(TSRMLS_C: Pointer); cdecl;
342+
{$ELSE}
343+
function(name: zend_pchar; name_len: uint; callback: Pointer; TSRMLS_DC: Pointer): Integer; cdecl;
344+
{$ENDIF}
345+
{$ENDIF}
337346
procedure REGISTER_MAIN_LONG_CONSTANT(name: zend_pchar; lval: longint; flags: integer; TSRMLS_DC: Pointer);
338347
procedure REGISTER_MAIN_DOUBLE_CONSTANT(name: zend_pchar; dval: double; flags: integer; TSRMLS_DC: Pointer);
339348
procedure REGISTER_MAIN_STRING_CONSTANT(name: zend_pchar; str: zend_pchar; flags: integer; TSRMLS_DC: Pointer);
@@ -551,17 +560,32 @@ procedure convert_to_string(op: pzval);
551560
{$ELSE}
552561
zend_indent : procedure; cdecl;
553562
{$ENDIF}
554-
ZendGetParameters : function: integer; cdecl;
555-
zend_get_params_ex : function(param_count : Integer; Args : {$IFNDEF PHP700} ppzval {$ELSE} pzval{$ENDIF}) :integer; cdecl varargs;
563+
ZendGetParameters :
564+
{$IFDEF PHP7}
565+
function(ht:longint; param_count:longint):longint; cdecl varargs;
566+
{$ELSE}
567+
function: integer; cdecl;
568+
{$ENDIF}
569+
zend_get_params_ex :
570+
{$IFDEF PHP7}
571+
function(param_count:longint):longint; cdecl varargs;
572+
{$ELSE}
573+
function(param_count : Integer; Args : ppzval) :integer; cdecl varargs;
574+
{$ENDIF}
575+
{$IFDEF PHP7}
576+
ZvalGetArgs: function(Count: Integer; Args: ppzval): Integer;cdecl varargs;
577+
_zend_get_parameters_array_ex:function(param_count:longint; argument_array:Pzval):longint; cdecl;
578+
{$ELSE}
579+
_zend_get_parameters_array_ex : function(param_count: integer; argument_array:
580+
pppzval; TSRMLS_CC: pointer): integer; cdecl;
581+
{$ENDIF}
556582
function zend_get_parameters_ex(number: integer; var Params: pzval_array): integer;
557583
function zend_get_parameters_my(number: integer; var Params: pzval_array; TSRMLS_DC: Pointer): integer;
558-
584+
{$IFNDEF PHP7}
559585
function zend_get_parameters(ht: integer; param_count: integer; Params: array of
560586
ppzval): integer;
587+
{$ENDIF}
561588

562-
var
563-
_zend_get_parameters_array_ex : function(param_count: integer; argument_array:
564-
pppzval; TSRMLS_CC: pointer): integer; cdecl;
565589

566590
procedure dispose_pzval_array(Params: pzval_array);
567591

@@ -869,10 +893,10 @@ function Z_STRVAL(z : Pzval) : zend_ustr;
869893
function Z_STRUVAL(z : PZval): UTF8String;
870894
function Z_STRWVAL(z : pzval) : String;
871895
function Z_STRLEN(z : Pzval) : longint;
872-
function Z_ARRVAL(z : Pzval ) : {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF};
873-
function Z_OBJ_HANDLE(z :Pzval) : zend_object_handle;
874-
function Z_OBJ_HT(z : Pzval) : {$IFDEF PHP7}hzend_types.P_zend_object_handlers{$ELSE}pzend_object_handlers{$ENDIF};
875-
function Z_OBJPROP(z : Pzval) : {$IFDEF PHP7}hzend_types.PHashTable{$ELSE}PHashTable{$ENDIF};
896+
function Z_ARRVAL(z : Pzval ) : PHashTable;
897+
function Z_OBJ_HANDLE(z :Pzval) : {$IFDEF PHP7} P_zend_object_handlers {$ELSE} zend_object_handle{$ENDIF};
898+
function Z_OBJ_HT(z : Pzval) : {$IFDEF PHP7}P_zend_object_handlers{$ELSE}pzend_object_handlers{$ENDIF};
899+
function Z_OBJPROP(z : Pzval) : PHashTable;
876900
function Z_VARREC(z: pzval): TVarRec;
877901

878902
procedure zend_addref_p(z: pzval); cdecl;
@@ -1306,7 +1330,7 @@ function ZValArrayKeyDel(v: pzval; key: zend_ustr): Boolean; overload;
13061330
{$IFDEF PHP7}
13071331
begin
13081332
pzs^.len := strlen(zend_pchar(key));
1309-
pzs^.val := zend_pchar(key);
1333+
pzs^.val := estrdup(zend_pchar(key));
13101334
Result := zend_hash_del_key_or_index(v.value.arr, pzs) = SUCCESS
13111335
end;
13121336
{$ELSE}
@@ -1326,7 +1350,7 @@ function ZValArrayKeyDel(v: pzval; idx: Integer): Boolean; overload;
13261350
{$IFDEF PHP7}
13271351
begin
13281352
pzs^.len := strlen(zend_pchar(inttostr(idx)));
1329-
pzs^.val := zend_pchar(inttostr(idx));
1353+
pzs^.val := estrdup(zend_pchar(inttostr(idx)));
13301354
Result := zend_hash_del_key_or_index(v.value.arr, pzs) = SUCCESS
13311355
end;
13321356
{$ELSE}
@@ -2458,6 +2482,9 @@ function LoadZEND(const DllFilename: zend_ustr = PHPWin) : boolean;
24582482
zend_register_constant := GetProcAddress(PHPLib, 'zend_register_constant');
24592483

24602484
zend_register_auto_global := GetProcAddress(PHPLib, 'zend_register_auto_global');
2485+
{$IFDEF PHP5}
2486+
zend_activate_auto_globals := GetProcAddress(PHPLib, 'zend_activate_auto_globals');
2487+
{$ENDIF}
24612488

24622489
// -- tsrm_shutdown
24632490
tsrm_shutdown := GetProcAddress(PHPLib, 'tsrm_shutdown');
@@ -2725,6 +2752,8 @@ function LoadZEND(const DllFilename: zend_ustr = PHPWin) : boolean;
27252752
{$IFDEF PHP7}
27262753
// -- zend_parse_parameters_throw
27272754
zend_parse_parameters_throw := GetProcAddress(PHPLib, 'zend_parse_parameters_throw');
2755+
ZvalGetArgs := GetProcAddress(PHPLib, 'zend_get_parameters_ex');
2756+
_zend_get_parameters_array_ex := GetProcAddress(PHPLib, '_zend_get_parameters_array_ex');
27282757
{$ELSE}
27292758
// -- zend_indent
27302759
zend_indent := GetProcAddress(PHPLib, 'zend_indent');
@@ -3026,34 +3055,64 @@ function zend_get_parameters_ex(number: integer; var Params: pzval_array): integ
30263055
var
30273056
i : integer;
30283057
begin
3029-
SetLength(Params, number);
3058+
30303059
if number = 0 then
30313060
begin
30323061
Result := SUCCESS;
30333062
Exit;
30343063
end;
3064+
{$IFDEF PHP7}
3065+
Params.value.arr.nNumOfElements := number;
3066+
for i := 0 to number - 1 do
3067+
zend_hash_index_add_empty_element(Params.value.arr, i);
3068+
Result := ZvalGetArgs(number, @Params);
3069+
{$ELSE}
3070+
SetLength(Params, number);
30353071
for i := 0 to number - 1 do
30363072
New(Params[i]);
3037-
30383073
Result := zend_get_parameters(number, number, Params);
3074+
{$ENDIF}
30393075
end;
30403076

30413077
function zend_get_parameters_my(number: integer; var Params: pzval_array; TSRMLS_DC: Pointer): integer;
30423078
var
30433079
i : integer;
3044-
p: pppzval;
3080+
3081+
p:
3082+
{$IFDEF PHP7}
3083+
pzval
3084+
{$ELSE}
3085+
pppzval
3086+
{$ENDIF};
30453087
begin
3046-
SetLength(Params, number);
30473088
if number = 0 then
30483089
begin
30493090
Result := SUCCESS;
30503091
Exit;
30513092
end;
3093+
{$IFDEF PHP7}
3094+
Params.value.arr.nNumOfElements := number;
3095+
for i := 0 to number - 1 do
3096+
zend_hash_index_add_empty_element(Params.value.arr, i);
3097+
3098+
p := emalloc(number * sizeOf(zval));
3099+
Result := _zend_get_parameters_array_ex(number, p);
3100+
3101+
for i := 0 to number - 1 do
3102+
begin
3103+
_zend_hash_update_ind(Params.value.arr, i, p, '', 0);
3104+
if i <> number then
3105+
inc(integer(p), sizeof(zval));
3106+
end;
3107+
3108+
efree(p);
3109+
_zend_get_parameters_array_ex(number, p);
3110+
{$ELSE}
3111+
SetLength(Params, number);
30523112
for i := 0 to number - 1 do
30533113
New(Params[i]);
3054-
{$IFNDEF PHP700}
3114+
30553115
p := emalloc(number * sizeOf(ppzval));
3056-
{$ENDIF}
30573116
Result := _zend_get_parameters_array_ex(number, p, TSRMLS_DC);
30583117

30593118
for i := 0 to number - 1 do
@@ -3064,8 +3123,9 @@ function zend_get_parameters_my(number: integer; var Params: pzval_array; TSRMLS
30643123
end;
30653124

30663125
efree(p);
3126+
{$ENDIF}
30673127
end;
3068-
3128+
{$IFNDEF PHP7}
30693129
function zend_get_parameters(ht: integer; param_count: integer; Params: array of ppzval): integer; assembler; register;
30703130
asm
30713131
push esi
@@ -3092,15 +3152,20 @@ function zend_get_parameters(ht: integer; param_count: integer; Params: array of
30923152
loop @toploop2
30933153
pop esi
30943154
end;
3095-
3155+
{$ENDIF}
30963156
procedure dispose_pzval_array(Params: pzval_array);
30973157
var
30983158
i : integer;
30993159
begin
3160+
{$IFDEF PHP7}
3161+
if Params.value.arr.nNumOfElements>0 then
3162+
for i := 0 to Params.value.arr.nNumOfElements-1 do
3163+
Freemem(zend_hash_index_findZval(Params,i));
3164+
{$ELSE}
31003165
if Length(Params)>0 then
3101-
31023166
for i := 0 to High(Params) do
31033167
FreeMem(Params[i]);
3168+
{$ENDIF}
31043169
Params := nil;
31053170
end;
31063171

@@ -3302,6 +3367,8 @@ procedure CheckZendErrors;
33023367
if @zend_html_puts = nil then raise EPHP4DelphiException.Create('zend_html_puts');
33033368
{$IFDEF PHP7}
33043369
if @zend_parse_parameters_throw = nil then EPHP4DelphiException.Create('zend_parse_parameters_throw');
3370+
if @ZvalGetArgs = nil then EPHP4DelphiException.Create('ZvalGetArgs');
3371+
if @_zend_get_parameters_array_ex = nil then EPHP4DelphiException.Create('_zend_get_parameters_array_ex');
33053372
{$ELSE}
33063373
if @zend_indent = nil then raise EPHP4DelphiException.Create('zend_indent');
33073374
{$ENDIF}
@@ -3418,7 +3485,7 @@ function zend_unregister_functions(functions : {$IFDEF PHP7}P_zend_function_entr
34183485
break;
34193486
{$IFDEF PHP7}
34203487
pzs^.len := strlen(ptr.fname);
3421-
pzs^.val := ptr.fname;
3488+
pzs^.val := estrdup(ptr.fname);
34223489
zend_hash_del_key_or_index(function_table, pzs);
34233490
{$ELSE}
34243491
zend_hash_del_key_or_index(function_table, ptr.fname, strlen(ptr.fname) +1, 0, HASH_DEL_KEY);
@@ -3614,7 +3681,7 @@ function Z_BVAL(z : pzval) : boolean;
36143681
end;
36153682

36163683
if {$IFDEF PHP7}z.u1.v._type{$ELSE}z._type{$ENDIF} = IS_BOOL then
3617-
Result := zend_bool(z.value.lval)
3684+
Result := boolean(zend_bool(z.value.lval))
36183685
else
36193686
case {$IFDEF PHP7}z.u1.v._type{$ELSE}z._type{$ENDIF} of
36203687
IS_DOUBLE: if Trunc(z.value.dval) = 0 then Result := false else Result := true;
@@ -3766,9 +3833,9 @@ function Z_ARRVAL(z : pzval ) : {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$ENDIF
37663833
Result := {$IFDEF PHP7} z.value.arr {$ELSE}z.value.ht{$ENDIF};
37673834
end;
37683835

3769-
function Z_OBJ_HANDLE(z :pzval) : zend_object_handle;
3836+
function Z_OBJ_HANDLE(z :pzval) : {$IFDEF PHP7} P_zend_object_handlers {$ELSE} zend_object_handle{$ENDIF};
37703837
begin
3771-
Result := z.value.obj.handle;
3838+
Result := {$IFDEF PHP7}z.value.obj.handlers{$ELSE}z.value.obj.handle{$ENDIF};
37723839
end;
37733840

37743841
function Z_OBJ_HT(z : pzval) : {$IFDEF PHP7}hzend_types.P_zend_object_handlers{$ELSE}pzend_object_handlers{$ENDIF};
@@ -3824,7 +3891,7 @@ function zend_hash_add_or_update(ht : {$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{
38243891
begin
38253892
{$IFDEF PHP7}
38263893
pz^.len := strlen(arKey);
3827-
pz^.val := arKey;
3894+
pz^.val := estrdup(arKey);
38283895
if Assigned(_zend_hash_add_or_update) then
38293896
Result := _zend_hash_add_or_update(ht, pz, pData, flag, '', 0).u2.fe_iter_idx
38303897
{$ELSE}

0 commit comments

Comments
 (0)