@@ -725,6 +725,9 @@ procedure dispose_pzval_array(Params: pzval_array);
725725
726726procedure ZEND_PUTS (str: zend_pchar);
727727
728+ type
729+ TObjectAConvertMethod = procedure(v:variant;z:pzval);
730+ TObjectBConvertMethod = function(a: pzval):Variant;
728731
729732var
730733 zend_register_internal_class : function(class_entry: pzend_class_entry; TSRMLS_DC: pointer): Pzend_class_entry; cdecl;
@@ -799,13 +802,14 @@ procedure ArrayToHash(Keys,AR: Array of Variant; var HT: pzval); overload;
799802function ToStrA (V: Variant): zend_ustr;
800803function ToStr (V: Variant): String;
801804function toWChar (s: zend_pchar): PWideChar;
802- function ZendToVariant (const Value : pzval): Variant;
805+ function ZendToVariant (const Value : pzval;cobj: TObjectBConvertMethod= nil ): Variant;
803806{ $IFNDEF PHP7}
804807overload;
805- function ZendToVariant (const Value : ppzval): Variant; overload;
806- function ZendToVariant (const Value : pppzval): Variant; overload;
808+ function ZendToVariant (const Value : ppzval;cobj: TObjectBConvertMethod= nil ): Variant; overload;
809+ function ZendToVariant (const Value : pppzval;cobj: TObjectBConvertMethod= nil ): Variant; overload;
807810{ $ENDIF}
808- procedure VariantToZend (const Value : Variant; z: pzval);
811+ procedure VariantToZend (const Value : Variant; z: pzval;
812+ cobj: TObjectAConvertMethod=nil );
809813procedure ZVAL_STRING (z: pzval; s: zend_pchar; duplicate: boolean);
810814procedure ZVAL_STRINGU (z: pzval; s: PUtf8Char; duplicate: boolean);
811815procedure ZVAL_STRINGW (z: pzval; s: PWideChar; duplicate: boolean);
@@ -1601,7 +1605,8 @@ procedure VarArrayToHash(var HT: pzval;Value: Variant);
16011605 end ;
16021606end ;
16031607
1604- function ZendToVariant (const Value : pzval): Variant; overload;
1608+ function ZendToVariant (const Value : pzval;
1609+ cobj: TObjectBConvertMethod=nil ): Variant; overload;
16051610 Var
16061611 S: String;
16071612begin
@@ -1611,7 +1616,11 @@ function ZendToVariant(const Value: pzval): Variant; overload;
16111616 2 : Result := Value ^.value .dval;
16121617 3 : Result := boolean(Value ^.value .lval);
16131618 4 : Result := HashToVarArray(Value ^.value .ht);
1614- // 5: Result := object //HERE;
1619+ 5 :
1620+ if Assigned(cobj) then
1621+ Result := cobj(Value )
1622+ else
1623+ Result := Null;
16151624 7 : Result := Value ^.value .lval;
16161625 6 : begin S := Value ^.value .str.val; Result := S; end ;
16171626 8 : begin S := Value ^.value .str.val; Result := S; end ;
@@ -1620,7 +1629,8 @@ function ZendToVariant(const Value: pzval): Variant; overload;
16201629 end ;
16211630end ;
16221631
1623- procedure VariantToZend (const Value :Variant;z:pzval);
1632+ procedure VariantToZend (const Value :Variant;z:pzval;
1633+ cobj: TObjectAConvertMethod=nil );
16241634var
16251635 W : WideString;
16261636 S: String;
@@ -1673,14 +1683,41 @@ procedure VariantToZend(const Value:Variant;z:pzval);
16731683 // <==óêàçàòåëü íà âûçûâàþùóþ ôóíêöèþ... õç òî÷íî íå ïîéìó
16741684 // âîîáùåì íà ìåòîä ñ òèïîì Dispatch (âûçîâ, âûáðîñ)... çàáûë ÿ
16751685 // íó ìåòîä â êëàññå êîðî.÷å
1686+ varDispatch :
1687+ begin
1688+ if Assigned(cobj) then
1689+ cobj(Value , z)
1690+ else
1691+ ZVALVAL(z);
1692+ end ;
16761693 // varAny : integer(TVarData(Value).VAny
16771694 // <==óêàçàòåëü íà ìåòîä*(ëþáîé)
16781695 //
1679- 1696+ varAny :
1697+ begin
1698+ if Assigned(cobj) then
1699+ cobj(Value , z)
1700+ else
1701+ ZVALVAL(z);
1702+ end ;
16801703 // varRecord : integer(TVarData(Value).VRecord)
16811704 // <==çàïèñü... ÿ äî ñèõ ïîð íå ðàçîáðàëñÿ êàê ñ íèìè ÷åðåç RTTI ðàáîòàòü
1705+ varRecord :
1706+ begin
1707+ if Assigned(cobj) then
1708+ cobj(Value , z)
1709+ else
1710+ ZVALVAL(z);
1711+ end ;
16821712 // varObject : integer(TVarData(Value).VObject)
16831713 // <==îáúåêò...
1714+ varObject :
1715+ begin
1716+ if Assigned(cobj) then
1717+ cobj(Value , z)
1718+ else
1719+ ZVALVAL(z, integer(TObject(TVarData(Value ).VPointer^)));
1720+ end ;
16841721 varStrArg : // Peter Enz
16851722 begin
16861723 if Assigned ( TVarData(Value ).VString ) then
@@ -1719,12 +1756,12 @@ procedure VariantToZend(const Value:Variant;z:pzval);
17191756 end ;
17201757end ;
17211758
1722- function ZendToVariant (const Value : ppzval): Variant; overload;
1759+ function ZendToVariant (const Value : ppzval;cobj: TObjectBConvertMethod= nil ): Variant; overload;
17231760begin
17241761Result := ZendToVariant(Value ^);
17251762end ;
17261763
1727- function ZendToVariant (const Value : pppzval): Variant; overload;
1764+ function ZendToVariant (const Value : pppzval;cobj: TObjectBConvertMethod= nil ): Variant; overload;
17281765begin
17291766Result := ZendToVariant(Value ^^);
17301767end ;
0 commit comments