diff --git a/src/core/ast.ml b/src/core/ast.ml index 092f3eec2a3..7e53e522d7e 100644 --- a/src/core/ast.ml +++ b/src/core/ast.ml @@ -501,13 +501,15 @@ let unescape s = Buffer.add_char b c; inext := !inext + 2; | 'x' -> - let hex = String.sub s (i+1) 2 in - let u = (try (int_of_string ("0x" ^ hex)) with _ -> fail None) in + let fail_no_hex () = fail (Some "Must be followed by a hexadecimal sequence.") in + let hex = try String.sub s (i+1) 2 with _ -> fail_no_hex () in + let u = (try (int_of_string ("0x" ^ hex)) with _ -> fail_no_hex ()) in if u > 127 then fail (Some ("Values greater than \\x7f are not allowed. Use \\u00" ^ hex ^ " instead.")); UTF8.add_uchar b (UChar.uchar_of_int u); inext := !inext + 2; | 'u' -> + let fail_no_hex () = fail (Some "Must be followed by a hexadecimal sequence enclosed in curly brackets.") in let (u, a) = try (int_of_string ("0x" ^ String.sub s (i+1) 4), 4) @@ -515,10 +517,12 @@ let unescape s = assert (s.[i+1] = '{'); let l = String.index_from s (i+3) '}' - (i+2) in let u = int_of_string ("0x" ^ String.sub s (i+2) l) in - assert (u <= 0x10FFFF); + if u > 0x10FFFF then + fail (Some "Maximum allowed value for unicode escape sequence is \\u{10FFFF}"); (u, l+2) - with _ -> - fail None + with + | Invalid_escape_sequence (c,i,msg) as e -> raise e + | _ -> fail_no_hex () in UTF8.add_uchar b (UChar.uchar_of_int u); inext := !inext + a; diff --git a/tests/misc/projects/Issue8191/U1.hx b/tests/misc/projects/Issue8191/U1.hx new file mode 100644 index 00000000000..69e9ea31cc7 --- /dev/null +++ b/tests/misc/projects/Issue8191/U1.hx @@ -0,0 +1,3 @@ +class U1 { + var u = "\u"; +} \ No newline at end of file diff --git a/tests/misc/projects/Issue8191/U2.hx b/tests/misc/projects/Issue8191/U2.hx new file mode 100644 index 00000000000..87b959f1915 --- /dev/null +++ b/tests/misc/projects/Issue8191/U2.hx @@ -0,0 +1,3 @@ +class U2 { + var u = "\u{007f"; +} \ No newline at end of file diff --git a/tests/misc/projects/Issue8191/U3.hx b/tests/misc/projects/Issue8191/U3.hx new file mode 100644 index 00000000000..c6e9010792d --- /dev/null +++ b/tests/misc/projects/Issue8191/U3.hx @@ -0,0 +1,3 @@ +class U3 { + var u = "\u{}"; +} \ No newline at end of file diff --git a/tests/misc/projects/Issue8191/U4.hx b/tests/misc/projects/Issue8191/U4.hx new file mode 100644 index 00000000000..86b5c9d9b73 --- /dev/null +++ b/tests/misc/projects/Issue8191/U4.hx @@ -0,0 +1,3 @@ +class U4 { + var u = "\u{007g}"; +} \ No newline at end of file diff --git a/tests/misc/projects/Issue8191/U5.hx b/tests/misc/projects/Issue8191/U5.hx new file mode 100644 index 00000000000..735435c69cd --- /dev/null +++ b/tests/misc/projects/Issue8191/U5.hx @@ -0,0 +1,3 @@ +class U4 { + var u = "\u{110000}"; +} \ No newline at end of file diff --git a/tests/misc/projects/Issue8191/X1.hx b/tests/misc/projects/Issue8191/X1.hx new file mode 100644 index 00000000000..2cc600797b9 --- /dev/null +++ b/tests/misc/projects/Issue8191/X1.hx @@ -0,0 +1,3 @@ +class X1 { + var x = "\x"; +} \ No newline at end of file diff --git a/tests/misc/projects/Issue8191/X2.hx b/tests/misc/projects/Issue8191/X2.hx new file mode 100644 index 00000000000..c5f9792aaea --- /dev/null +++ b/tests/misc/projects/Issue8191/X2.hx @@ -0,0 +1,3 @@ +class X2 { + var x = "\xfg"; +} \ No newline at end of file diff --git a/tests/misc/projects/Issue8191/compile-fail.hxml b/tests/misc/projects/Issue8191/compile-fail.hxml new file mode 100644 index 00000000000..5572f8dd0a1 --- /dev/null +++ b/tests/misc/projects/Issue8191/compile-fail.hxml @@ -0,0 +1 @@ +X1 \ No newline at end of file diff --git a/tests/misc/projects/Issue8191/compile-fail.hxml.stderr b/tests/misc/projects/Issue8191/compile-fail.hxml.stderr new file mode 100644 index 00000000000..2eb298a959b --- /dev/null +++ b/tests/misc/projects/Issue8191/compile-fail.hxml.stderr @@ -0,0 +1 @@ +X1.hx:2: character 11 : Invalid escape sequence \x. Must be followed by a hexadecimal sequence. \ No newline at end of file diff --git a/tests/misc/projects/Issue8191/compile2-fail.hxml b/tests/misc/projects/Issue8191/compile2-fail.hxml new file mode 100644 index 00000000000..d74cfc7b3fd --- /dev/null +++ b/tests/misc/projects/Issue8191/compile2-fail.hxml @@ -0,0 +1 @@ +X2 \ No newline at end of file diff --git a/tests/misc/projects/Issue8191/compile2-fail.hxml.stderr b/tests/misc/projects/Issue8191/compile2-fail.hxml.stderr new file mode 100644 index 00000000000..0f1709efe7d --- /dev/null +++ b/tests/misc/projects/Issue8191/compile2-fail.hxml.stderr @@ -0,0 +1 @@ +X2.hx:2: character 11 : Invalid escape sequence \x. Must be followed by a hexadecimal sequence. \ No newline at end of file diff --git a/tests/misc/projects/Issue8191/compile3-fail.hxml b/tests/misc/projects/Issue8191/compile3-fail.hxml new file mode 100644 index 00000000000..5258a2283eb --- /dev/null +++ b/tests/misc/projects/Issue8191/compile3-fail.hxml @@ -0,0 +1 @@ +U1 \ No newline at end of file diff --git a/tests/misc/projects/Issue8191/compile3-fail.hxml.stderr b/tests/misc/projects/Issue8191/compile3-fail.hxml.stderr new file mode 100644 index 00000000000..698bd1abfd1 --- /dev/null +++ b/tests/misc/projects/Issue8191/compile3-fail.hxml.stderr @@ -0,0 +1 @@ +U1.hx:2: character 11 : Invalid escape sequence \u. Must be followed by a hexadecimal sequence enclosed in curly brackets. \ No newline at end of file diff --git a/tests/misc/projects/Issue8191/compile4-fail.hxml b/tests/misc/projects/Issue8191/compile4-fail.hxml new file mode 100644 index 00000000000..21b49ffcf8c --- /dev/null +++ b/tests/misc/projects/Issue8191/compile4-fail.hxml @@ -0,0 +1 @@ +U2 \ No newline at end of file diff --git a/tests/misc/projects/Issue8191/compile4-fail.hxml.stderr b/tests/misc/projects/Issue8191/compile4-fail.hxml.stderr new file mode 100644 index 00000000000..70f72edba39 --- /dev/null +++ b/tests/misc/projects/Issue8191/compile4-fail.hxml.stderr @@ -0,0 +1 @@ +U2.hx:2: character 11 : Invalid escape sequence \u. Must be followed by a hexadecimal sequence enclosed in curly brackets. \ No newline at end of file diff --git a/tests/misc/projects/Issue8191/compile5-fail.hxml b/tests/misc/projects/Issue8191/compile5-fail.hxml new file mode 100644 index 00000000000..427adcc878d --- /dev/null +++ b/tests/misc/projects/Issue8191/compile5-fail.hxml @@ -0,0 +1 @@ +U3 \ No newline at end of file diff --git a/tests/misc/projects/Issue8191/compile5-fail.hxml.stderr b/tests/misc/projects/Issue8191/compile5-fail.hxml.stderr new file mode 100644 index 00000000000..e25ba4eef18 --- /dev/null +++ b/tests/misc/projects/Issue8191/compile5-fail.hxml.stderr @@ -0,0 +1 @@ +U3.hx:2: character 11 : Invalid escape sequence \u. Must be followed by a hexadecimal sequence enclosed in curly brackets. \ No newline at end of file diff --git a/tests/misc/projects/Issue8191/compile6-fail.hxml b/tests/misc/projects/Issue8191/compile6-fail.hxml new file mode 100644 index 00000000000..9dc86511671 --- /dev/null +++ b/tests/misc/projects/Issue8191/compile6-fail.hxml @@ -0,0 +1 @@ +U4 \ No newline at end of file diff --git a/tests/misc/projects/Issue8191/compile6-fail.hxml.stderr b/tests/misc/projects/Issue8191/compile6-fail.hxml.stderr new file mode 100644 index 00000000000..29f139fecb1 --- /dev/null +++ b/tests/misc/projects/Issue8191/compile6-fail.hxml.stderr @@ -0,0 +1 @@ +U4.hx:2: character 11 : Invalid escape sequence \u. Must be followed by a hexadecimal sequence enclosed in curly brackets. \ No newline at end of file diff --git a/tests/misc/projects/Issue8191/compile7-fail.hxml b/tests/misc/projects/Issue8191/compile7-fail.hxml new file mode 100644 index 00000000000..4f748ab1e92 --- /dev/null +++ b/tests/misc/projects/Issue8191/compile7-fail.hxml @@ -0,0 +1 @@ +U5 \ No newline at end of file diff --git a/tests/misc/projects/Issue8191/compile7-fail.hxml.stderr b/tests/misc/projects/Issue8191/compile7-fail.hxml.stderr new file mode 100644 index 00000000000..2fad4f3ffb3 --- /dev/null +++ b/tests/misc/projects/Issue8191/compile7-fail.hxml.stderr @@ -0,0 +1 @@ +U5.hx:2: character 11 : Invalid escape sequence \u. Maximum allowed value for unicode escape sequence is \u{10FFFF} \ No newline at end of file