@@ -782,7 +782,11 @@ function ZValArrayKeyFind(v: pzval; idx: Integer; out pData: ppzval)
782782 Make: Boolean = false): pzval;
783783procedure ZVAL_RESOURCE (value : pzval; l: longint);
784784procedure ZVAL_EMPTY_STRING (z: pzval);
785+ 785786function add_next_index_variant (arg: pzval; value : variant): integer;
787+ function add_index_variant (arg: pzval; index:integer; value : variant): integer;
788+ function add_assoc_variant (arg: pzval; key: zend_pchar; key_len: uint; value : variant): integer;
789+ 786790procedure ZVAL_ARRAY (z: pzval; arr: TWSDate); overload;
787791procedure ZVAL_ARRAY (z: pzval; arr: TASDate); overload;
788792procedure ZVAL_ARRAY (z: pzval; arr: array of string); overload;
@@ -1593,18 +1597,14 @@ function HashToVarArray(const Value:{$IFDEF PHP7}Pzend_array{$ELSE}PHashTable{$E
15931597procedure VarArrayToHash (var HT: pzval;Value : Variant);
15941598 Var
15951599 I,Len: Integer;
1596- z: pzval;
15971600begin
15981601 _array_init(ht,nil ,1 );
15991602 len := TVarData(Value ).VArray^.Bounds[0 ].ElementCount;
16001603 for i:= 0 to len - 1 do
16011604 begin
1602- z := MAKE_STD_ZVAL;
1603- VariantToZend(VarArrayGet(Value , [i]),z);
1604- add_index_zval(HT, i, z);
1605+ add_index_variant(HT, i, VarArrayGet(Value , [i]));
16051606 end ;
16061607end ;
1607- 16081608function ZendToVariant (const Value : pzval;
16091609cobj: TObjectBConvertMethod=nil ): Variant; overload;
16101610 Var
@@ -1793,45 +1793,24 @@ procedure ArrayToHash(AR: Array of Variant; var HT: pzval); overload;
17931793 len := Length(AR);
17941794 for i:=0 to len-1 do
17951795 begin
1796- case VarType(AR[i]) of
1797- varInteger, varSmallint, varLongWord, 17 : add_index_long(ht,i,AR[i]);
1798- varDouble,varSingle: add_index_double(ht,i,AR[i]);
1799- varBoolean: add_index_bool(ht,i,AR[I]);
1800- varEmpty: add_index_null(ht,i);
1801- varString: add_index_string(ht,i,zend_pchar(ToStr(AR[I])),1 );
1802- 258 : add_index_string(ht,i,zend_pchar(zend_ustr(ToStr(AR[I]))),1 );
1803- end ;
1796+ add_index_variant(ht,i,AR[i]);
18041797 end ;
18051798end ;
18061799
18071800procedure ArrayToHash (Keys,AR: Array of Variant; var HT: pzval); overload;
18081801 Var
18091802 I,Len: Integer;
1810- v: Variant;
1811- key: zend_pchar;
1812- s: zend_pchar;
18131803begin
18141804 _array_init(ht,nil ,1 );
18151805 len := Length(AR);
18161806 for i:=0 to len-1 do
18171807 begin
1818- v := AR[I];
1819- key := zend_pchar(ToStrA(keys[i]));
1820- s := zend_pchar(ToStrA(v));
1821- case VarType(AR[i]) of
1822- varInteger, varSmallint, varLongWord, 17 : add_assoc_long_ex(ht,ToPChar(Keys[i]),strlen(ToPChar(Keys[i]))+1 ,AR[i]);
1823- varDouble,varSingle: add_assoc_double_ex(ht,ToPChar(Keys[i]),strlen(ToPChar(Keys[i]))+1 ,AR[i]);
1824- varBoolean: add_assoc_bool_ex(ht,ToPChar(Keys[i]),strlen(ToPChar(Keys[i]))+1 ,AR[I]);
1825- varEmpty: add_assoc_null_ex(ht,ToPChar(Keys[i]),strlen(ToPChar(Keys[i]))+1 );
1826- varString,258 : add_assoc_string_ex(ht,key,strlen(key)+1 ,s,1 );
1827- end ;
1808+ add_assoc_variant(ht, ToPChar(Keys[i]),strlen(ToPChar(Keys[i]))+1 ,AR[i]);
18281809 end ;
18291810end ;
18301811
18311812function add_next_index_variant (arg: pzval; value : variant): integer;
18321813var iz: pzval;
1833- W: WideString;
1834- S: String;
18351814begin
18361815 iz := MAKE_STD_ZVAL;
18371816 if VarIsEmpty(value ) then
@@ -1840,54 +1819,37 @@ function add_next_index_variant(arg: pzval; value: variant): integer;
18401819 Result := add_next_index_zval(arg, iz);
18411820 Exit;
18421821 end ;
1843- // MessageBoxA(0, zend_pchar(AnsiString( TVarData(Value).VType.ToString)), '', 0 ) ;
1844- case TVarData(Value ).VType of
1845- varString : // Peter Enz
1846- begin
1847- if Assigned ( TVarData(Value ).VString ) then
1848- begin
1849- ZVAL_STRING(iz, TVarData(Value ).VString , true);
1850- end
1851- else
1852- begin
1853- ZVAL_STRING(iz, ' ' , true);
1854- end ;
1855- end ;
1856- 1857- varUString : // Peter Enz
1858- begin
1859- S := string(TVarData(Value ).VUString);
1860- 1861- ZVAL_STRING(iz, zend_pchar(zend_ustr(S)), true);
1862- end ;
1822+ VariantToZend(Value ,iz);
1823+ Result := add_next_index_zval(arg, iz);
1824+ end ;
18631825
1864- varOleStr : // Peter Enz
1865- begin
1866- if Assigned ( TVarData(Value ).VOleStr ) then
1867- begin
1868- W := WideString(Pointer(TVarData(Value ).VOleStr));
1869- ZVAL_STRINGW(iz, PWideChar(W), true);
1870- end
1871- else
1872- begin
1873- ZVAL_STRING(iz, ' ' , true);
1874- end ;
1875- end ;
1876- varSmallInt : ZVALVAL(iz, TVarData(Value ).VSmallint);
1877- varInteger : ZVALVAL(iz, TVarData(Value ).VInteger);
1878- varBoolean : ZVALVAL(iz, TVarData(Value ).VBoolean);
1879- varSingle : ZVALVAL(iz, TVarData(Value ).VSingle);
1880- varDouble : ZVALVAL(iz, TVarData(Value ).VDouble);
1881- varError : ZVALVAL(iz, TVarData(Value ).VError);
1882- varByte : ZVALVAL(iz, TVarData(Value ).VByte);
1883- varDate : ZVALVAL(iz, TVarData(Value ).VDate);
1884- else
1885- ZVAL_NULL(iz);
1826+ function add_index_variant (arg: pzval; index:integer; value : variant): integer;
1827+ var iz: pzval;
1828+ begin
1829+ iz := MAKE_STD_ZVAL;
1830+ if VarIsEmpty(value ) then
1831+ begin
1832+ ZVAL_NULL(iz);
1833+ Result := add_index_zval(arg, index, iz);
1834+ Exit;
18861835 end ;
1887- 1888- Result := add_next_index_zval (arg, iz);
1836+ VariantToZend( Value ,iz);
1837+ Result := add_index_zval (arg, index , iz);
18891838end ;
18901839
1840+ function add_assoc_variant (arg: pzval; key: zend_pchar; key_len: uint; value : variant): integer;
1841+ var iz: pzval;
1842+ begin
1843+ iz := MAKE_STD_ZVAL;
1844+ if VarIsEmpty(value ) then
1845+ begin
1846+ ZVAL_NULL(iz);
1847+ Result := add_assoc_zval_ex(arg, key, key_len, iz);
1848+ Exit;
1849+ end ;
1850+ VariantToZend(Value ,iz);
1851+ Result := add_assoc_zval_ex(arg, key, key_len, iz);
1852+ end ;
18911853
18921854procedure ZVAL_ARRAY (z: pzval; arr: TWSDate); overload;
18931855var
@@ -2069,51 +2031,6 @@ procedure ZVAL_ARRAY(z: pzval; arr: Variant); overload;
20692031
20702032 for i := 0 to arr.DimCount-1 do
20712033 begin
2072- { V := TVarData( arr[i] );
2073- case V.VType of
2074- varEmpty, varNull:
2075- add_next_index_null(z);
2076- varSmallInt:
2077- add_next_index_string(z, zend_pchar(zend_ustr(IntToStr(V.VSmallInt))), 1);
2078- varInteger:
2079- add_next_index_string(z, zend_pchar(zend_ustr(IntToStr(V.VInteger))), 1);
2080- varSingle:
2081- add_next_index_string(z, zend_pchar(zend_ustr(V.VSingle.ToString())), 1);
2082- varDouble:
2083- add_next_index_double(z, V.VDouble);
2084- varCurrency:
2085- add_next_index_string(z, zend_pchar(zend_ustr(CurrToStr(V.VCurrency))), 1);
2086- varDate:
2087- add_next_index_string(z, zend_pchar(zend_ustr(DateTimeToStr(V.VDate))), 1);
2088- varOleStr:
2089- add_next_index_string(z, zend_pchar(zend_ustr(V.VOleStr)), 1);
2090- varBoolean:
2091- add_next_index_bool(z, V.VBoolean.ToInteger());
2092- varByte:
2093- add_next_index_string(z, zend_pchar(zend_ustr(IntToStr(V.VByte))), 1);
2094- varWord:
2095- add_next_index_string(z, zend_pchar(zend_ustr(IntToStr(V.VWord))), 1);
2096- varShortInt:
2097- add_next_index_string(z, zend_pchar(zend_ustr(IntToStr(V.VShortInt))), 1);
2098- varLongWord:
2099- add_next_index_long(z, V.VLongWord);
2100- varInt64:
2101- add_next_index_string(z, zend_pchar(zend_ustr(IntToStr(V.VInt64))), 1);
2102- varString:
2103- add_next_index_string(z, zend_pchar(zend_ustr(V.VString)), 1);
2104- {$IFDEF SUPPORTS_UNICODE_STRING}{
2105- varUString:
2106- add_next_index_string(z, zend_pchar(zend_ustr(V.VUString)), 1);
2107- {$ENDIF SUPPORTS_UNICODE_STRING}
2108- { varArray,
2109- varDispatch,
2110- varError,
2111- varUnknown,
2112- varAny,
2113- varByRef:}{
2114- varObject:
2115- add_next_index_long(z, Integer(
2116- end; }
21172034 add_next_index_variant(z, arr[i]);
21182035 end ;
21192036 Exit;
0 commit comments