Browse Source

pastojs: Unicode character constants outside of BMP

git-svn-id: trunk@39126 -
Mattias Gaertner 7 years ago
parent
commit
a452e2dd5f

+ 10 - 2
packages/fcl-passrc/src/pasresolveeval.pas

@@ -3944,13 +3944,21 @@ begin
           'A'..'F': u:=u*16+ord(c)-ord('A')+10;
           else break;
           end;
-          if u>$ffff then
+          if u>$10FFFF then
             RangeError(20170523115712);
           inc(p);
         until false;
         if p=StartP then
           RaiseInternalError(20170207164956);
-        AddHash(u);
+        if u>$ffff then
+          begin
+          // split into two
+          dec(u,$10000);
+          AddHash($D800+(u shr 10));
+          AddHash($DC00+(u and $3ff));
+          end
+        else
+          AddHash(u);
         end
       else
         begin

+ 21 - 19
packages/fcl-passrc/tests/tcresolver.pas

@@ -4083,25 +4083,27 @@ end;
 procedure TTestResolver.TestStringOperators;
 begin
   StartProgram(false);
-  Add('var');
-  Add('  i,j:string;');
-  Add('  k:char;');
-  Add('  w:widechar;');
-  Add('begin');
-  Add('  i:='''';');
-  Add('  i:=''''+'''';');
-  Add('  i:=k+'''';');
-  Add('  i:=''''+k;');
-  Add('  i:=''a''+j;');
-  Add('  i:=''abc''+j;');
-  Add('  k:=#65;');
-  Add('  k:=#$42;');
-  Add('  k:=''a'';');
-  Add('  k:='''''''';');
-  Add('  k:=j[1];');
-  Add('  w:=k;');
-  Add('  w:=#66;');
-  Add('  w:=#6666;');
+  Add([
+  'var',
+  '  i,j:string;',
+  '  k:char;',
+  '  w:widechar;',
+  'begin',
+  '  i:='''';',
+  '  i:=''''+'''';',
+  '  i:=k+'''';',
+  '  i:=''''+k;',
+  '  i:=''a''+j;',
+  '  i:=''abc''+j;',
+  '  k:=#65;',
+  '  k:=#$42;',
+  '  k:=''a'';',
+  '  k:='''''''';',
+  '  k:=j[1];',
+  '  w:=k;',
+  '  w:=#66;',
+  '  w:=#6666;',
+  '']);
   ParseProgram;
 end;
 

+ 4 - 0
packages/pastojs/tests/tcmodules.pas

@@ -5597,6 +5597,8 @@ begin
   '  s:=''foo''#13''bar'';',
   '  s:=''"'';',
   '  s:=''"''''"'';',
+  '  s:=#$20AC;', // euro
+  '  s:=#$10437;', //
   '  s:=default(string);',
   '']);
   ConvertProgram;
@@ -5612,6 +5614,8 @@ begin
     '$mod.s="foo\rbar";',
     '$mod.s=''"'';',
     '$mod.s=''"\''"'';',
+    '$mod.s="€";',
+    '$mod.s="'#$F0#$90#$90#$B7'";',
     '$mod.s="";'
     ]));
 end;