Переглянути джерело

+ utf-8 <-> variant type casts, resolves #11371
* ucs-4 -> variant type cast (variant -> ucs-4 is not possible due to overloading contraints of fpc and how ucs-4 is implemented)
* some newlines fixed

git-svn-id: trunk@13451 -

florian 16 роки тому
батько
коміт
d38340c753
4 змінених файлів з 62 додано та 11 видалено
  1. 1 0
      .gitattributes
  2. 31 11
      rtl/inc/variant.inc
  3. 4 0
      rtl/inc/varianth.inc
  4. 26 0
      tests/webtbs/tw11371.pp

+ 1 - 0
.gitattributes

@@ -9060,6 +9060,7 @@ tests/webtbs/tw1133.pp svneol=native#text/plain
 tests/webtbs/tw11349.pp svneol=native#text/plain
 tests/webtbs/tw11354.pp svneol=native#text/plain
 tests/webtbs/tw11369.pp svneol=native#text/plain
+tests/webtbs/tw11371.pp svneol=native#text/plain
 tests/webtbs/tw11372.pp svneol=native#text/plain
 tests/webtbs/tw11392.pp svneol=native#text/plain
 tests/webtbs/tw11431.pp svneol=native#text/plain

+ 31 - 11
rtl/inc/variant.inc

@@ -194,14 +194,12 @@ end;
 
 
 operator :=(const source : wordbool) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
-
 begin
   Variantmanager.varfromBool(Dest,Boolean(Source));
 end;
 
 
 operator :=(const source : longbool) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
-
 begin
   Variantmanager.varfromBool(Dest,Boolean(Source));
 end;
@@ -210,14 +208,12 @@ end;
 { Chars }
 
 operator :=(const source : char) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
-
 begin
   VariantManager.VarFromPStr(Dest,Source);
 end;
 
 
 operator :=(const source : widechar) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
-
 begin
   Variantmanager.varfromInt(Dest,word(Source),2);
 end;
@@ -242,6 +238,18 @@ begin
 end;
 
 
+operator :=(const source : UTF8String) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
+begin
+  VariantManager.VarFromWStr(Dest,UTF8Encode(Source));
+end;
+
+
+operator :=(const source : UCS4String) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
+begin
+  VariantManager.VarFromWStr(Dest,UCS4StringToWideString(Source));
+end;
+
+
 {$ifndef FPC_WIDESTRING_EQUAL_UNICODESTRING}
 operator :=(const source : UnicodeString) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
 begin
@@ -357,14 +365,12 @@ operator :=(const source : variant) dest : longint;{$ifdef SYSTEMINLINE}inline;{
 
 
 operator :=(const source : variant) dest : qword;{$ifdef SYSTEMINLINE}inline;{$endif}
-
 begin
   dest:=variantmanager.vartoword64(source);
 end;
 
 
 operator :=(const source : variant) dest : int64;{$ifdef SYSTEMINLINE}inline;{$endif}
-
 begin
   dest:=variantmanager.vartoint64(source);
 end;
@@ -380,14 +386,12 @@ end;
 
 
 operator :=(const source : variant) dest : wordbool;{$ifdef SYSTEMINLINE}inline;{$endif}
-
 begin
   dest:=variantmanager.vartobool(source);
 end;
 
 
 operator :=(const source : variant) dest : longbool;{$ifdef SYSTEMINLINE}inline;{$endif}
-
 begin
    dest:=variantmanager.vartobool(source);
 end;
@@ -396,10 +400,8 @@ end;
 { Chars }
 
 operator :=(const source : variant) dest : char;{$ifdef SYSTEMINLINE}inline;{$endif}
-
 Var
   S : String;
-
 begin
   VariantManager.VarToPStr(S,Source);
   If Length(S)>0 then
@@ -408,7 +410,6 @@ end;
 
 
 operator :=(const source : variant) dest : widechar;{$ifdef SYSTEMINLINE}inline;{$endif}
-
 begin
   dest:=widechar(variantmanager.vartoint(source));
 end;
@@ -434,6 +435,25 @@ begin
 end;
 
 
+operator :=(const source : variant) dest : UTF8String;{$ifdef SYSTEMINLINE}inline;{$endif}
+var
+  temp : Widestring;
+begin
+  VariantManager.VarToWStr(temp,Source);
+  dest:=UTF8Encode(temp);
+end;
+
+
+{$ifdef dummy}
+operator :=(const source : variant) dest : UCS4String;{$ifdef SYSTEMINLINE}inline;{$endif}
+var
+  temp : Widestring;
+begin
+  VariantManager.VarToWStr(temp,Source);
+  dest:=WideStringToUCS4String(temp);
+end;
+{$endif dummy}
+
 {$ifndef FPC_WIDESTRING_EQUAL_UNICODESTRING}
 operator :=(const source : variant) dest : UnicodeString;{$ifdef SYSTEMINLINE}inline;{$endif}
 var

+ 4 - 0
rtl/inc/varianth.inc

@@ -243,6 +243,8 @@ operator :=(const source : widechar) dest : variant;{$ifdef SYSTEMINLINE}inline;
 operator :=(const source : shortstring) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
 operator :=(const source : ansistring) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
 operator :=(const source : widestring) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
+operator :=(const source : UTF8String) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
+operator :=(const source : UCS4String) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
 {$ifndef FPC_WIDESTRING_EQUAL_UNICODESTRING}
 operator :=(const source : UnicodeString) dest : variant;{$ifdef SYSTEMINLINE}inline;{$endif}
 {$endif FPC_WIDESTRING_EQUAL_UNICODESTRING}
@@ -300,6 +302,8 @@ operator :=(const source : variant) dest : widechar;{$ifdef SYSTEMINLINE}inline;
 operator :=(const source : variant) dest : shortstring;{$ifdef SYSTEMINLINE}inline;{$endif}
 operator :=(const source : variant) dest : ansistring;{$ifdef SYSTEMINLINE}inline;{$endif}
 operator :=(const source : variant) dest : widestring;{$ifdef SYSTEMINLINE}inline;{$endif}
+operator :=(const source : variant) dest : UTF8String;{$ifdef SYSTEMINLINE}inline;{$endif}
+// operator :=(const source : variant) dest : UCS4String;{$ifdef SYSTEMINLINE}inline;{$endif}
 {$ifndef FPC_WIDESTRING_EQUAL_UNICODESTRING}
 operator :=(const source : variant) dest : unicodestring;{$ifdef SYSTEMINLINE}inline;{$endif}
 {$endif FPC_WIDESTRING_EQUAL_UNICODESTRING}

+ 26 - 0
tests/webtbs/tw11371.pp

@@ -0,0 +1,26 @@
+program tw11371;
+
+{$mode delphi}{$H+}
+
+uses
+  Variants;
+
+procedure Test1(const s: string);
+begin
+  // nothing
+end;
+
+procedure Test2(const s: UTF8String);
+begin
+  // nothing
+end;
+
+var
+  V: Variant;
+
+begin
+  V := 'Test';
+  Test1(V);
+  Test2(V);
+end.
+