annotate gcc/testsuite/g++.dg/ext/pr57735.C @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* { dg-do compile { target arm*-*-* } } */
kono
parents:
diff changeset
2 /* { dg-require-effective-target arm_arch_v5te_ok } */
kono
parents:
diff changeset
3 /* { dg-require-effective-target arm_arm_ok } */
kono
parents:
diff changeset
4 /* { dg-skip-if "do not override -mfloat-abi" { *-*-* } { "-mfloat-abi=*" } {"-mfloat-abi=soft" } } */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
5 /* { dg-options "-march=armv5te -marm -mtune=xscale -mfloat-abi=soft -O1 -Wno-return-type" } */
111
kono
parents:
diff changeset
6
kono
parents:
diff changeset
7 typedef unsigned int size_t;
kono
parents:
diff changeset
8 __extension__
kono
parents:
diff changeset
9 typedef long long int int64_t;
kono
parents:
diff changeset
10 namespace WTF {
kono
parents:
diff changeset
11 template<typename T> class RefPtr {
kono
parents:
diff changeset
12 public:
kono
parents:
diff changeset
13 inline T* operator->() const { return m_ptr; }
kono
parents:
diff changeset
14 T* m_ptr;
kono
parents:
diff changeset
15 };
kono
parents:
diff changeset
16 }
kono
parents:
diff changeset
17 using WTF::RefPtr;
kono
parents:
diff changeset
18 namespace JSC {
kono
parents:
diff changeset
19 class ExecState;
kono
parents:
diff changeset
20 class JSString;
kono
parents:
diff changeset
21 typedef int64_t EncodedJSValue;
kono
parents:
diff changeset
22 class JSValue {
kono
parents:
diff changeset
23 public:
kono
parents:
diff changeset
24 static EncodedJSValue encode(JSValue);
kono
parents:
diff changeset
25 JSString* toString(ExecState*) const;
kono
parents:
diff changeset
26 };
kono
parents:
diff changeset
27 }
kono
parents:
diff changeset
28 typedef unsigned char LChar;
kono
parents:
diff changeset
29 typedef short unsigned int UChar;
kono
parents:
diff changeset
30 namespace WTF {
kono
parents:
diff changeset
31 template<typename T, size_t inlineCapacity = 0>
kono
parents:
diff changeset
32 class Vector {
kono
parents:
diff changeset
33 public:
kono
parents:
diff changeset
34 template<typename U> bool tryAppend(const U*, size_t);
kono
parents:
diff changeset
35 };
kono
parents:
diff changeset
36 }
kono
parents:
diff changeset
37 using WTF::Vector;
kono
parents:
diff changeset
38 namespace WTF {
kono
parents:
diff changeset
39 template<typename CharType> inline bool isASCIIDigit(CharType c)
kono
parents:
diff changeset
40 {
kono
parents:
diff changeset
41 }
kono
parents:
diff changeset
42 template<typename CharType> inline bool isASCIIHexDigit(CharType c)
kono
parents:
diff changeset
43 {
kono
parents:
diff changeset
44 return isASCIIDigit(c) || ((c | 0x20) >= 'a' && (c | 0x20) <= 'f');
kono
parents:
diff changeset
45 }
kono
parents:
diff changeset
46 class StringImpl;
kono
parents:
diff changeset
47 }
kono
parents:
diff changeset
48 using WTF::StringImpl;
kono
parents:
diff changeset
49 namespace WTF {
kono
parents:
diff changeset
50 class StringImpl {
kono
parents:
diff changeset
51 public:
kono
parents:
diff changeset
52 unsigned length() const { return m_length; }
kono
parents:
diff changeset
53 unsigned m_length;
kono
parents:
diff changeset
54 };
kono
parents:
diff changeset
55 }
kono
parents:
diff changeset
56 namespace JSC {
kono
parents:
diff changeset
57 class Register {
kono
parents:
diff changeset
58 };
kono
parents:
diff changeset
59 class UString {
kono
parents:
diff changeset
60 public:
kono
parents:
diff changeset
61 unsigned length() const
kono
parents:
diff changeset
62 {
kono
parents:
diff changeset
63 return m_impl->length();
kono
parents:
diff changeset
64 }
kono
parents:
diff changeset
65 const LChar* characters8() const
kono
parents:
diff changeset
66 {
kono
parents:
diff changeset
67 }
kono
parents:
diff changeset
68 RefPtr<StringImpl> m_impl;
kono
parents:
diff changeset
69 };
kono
parents:
diff changeset
70 class ExecState : private Register {
kono
parents:
diff changeset
71 public:
kono
parents:
diff changeset
72 JSValue argument(size_t argument)
kono
parents:
diff changeset
73 {
kono
parents:
diff changeset
74 }
kono
parents:
diff changeset
75 };
kono
parents:
diff changeset
76 class JSCell {
kono
parents:
diff changeset
77 };
kono
parents:
diff changeset
78 class JSString : public JSCell {
kono
parents:
diff changeset
79 public:
kono
parents:
diff changeset
80 const UString& value(ExecState*) const;
kono
parents:
diff changeset
81 };
kono
parents:
diff changeset
82 class JSStringBuilder {
kono
parents:
diff changeset
83 public:
kono
parents:
diff changeset
84 void append(const UChar u)
kono
parents:
diff changeset
85 {
kono
parents:
diff changeset
86 m_okay &= buffer16.tryAppend(&u, 1);
kono
parents:
diff changeset
87 }
kono
parents:
diff changeset
88 Vector<UChar, 64> buffer16;
kono
parents:
diff changeset
89 bool m_okay;
kono
parents:
diff changeset
90 };
kono
parents:
diff changeset
91 template <typename T>
kono
parents:
diff changeset
92 class Lexer {
kono
parents:
diff changeset
93 public:
kono
parents:
diff changeset
94 static unsigned char convertHex(int c1, int c2);
kono
parents:
diff changeset
95 };
kono
parents:
diff changeset
96 }
kono
parents:
diff changeset
97 namespace WTF {
kono
parents:
diff changeset
98 namespace Unicode {
kono
parents:
diff changeset
99 int UTF8SequenceLength(char);
kono
parents:
diff changeset
100 int decodeUTF8Sequence(const char*);
kono
parents:
diff changeset
101 }
kono
parents:
diff changeset
102 }
kono
parents:
diff changeset
103 using namespace WTF;
kono
parents:
diff changeset
104 using namespace Unicode;
kono
parents:
diff changeset
105 namespace JSC {
kono
parents:
diff changeset
106 template <typename CharType>
kono
parents:
diff changeset
107 static JSValue decode(ExecState* exec, const CharType* characters, int length, const char* doNotUnescape, bool strict)
kono
parents:
diff changeset
108 {
kono
parents:
diff changeset
109 JSStringBuilder builder;
kono
parents:
diff changeset
110 int k = 0;
kono
parents:
diff changeset
111 UChar u = 0;
kono
parents:
diff changeset
112 while (k < length) {
kono
parents:
diff changeset
113 const CharType* p = characters + k;
kono
parents:
diff changeset
114 CharType c = *p;
kono
parents:
diff changeset
115 if (c == '%') {
kono
parents:
diff changeset
116 int charLen = 0;
kono
parents:
diff changeset
117 if (k <= length - 3 && isASCIIHexDigit(p[1]) && isASCIIHexDigit(p[2])) {
kono
parents:
diff changeset
118 const char b0 = Lexer<CharType>::convertHex(p[1], p[2]);
kono
parents:
diff changeset
119 const int sequenceLen = UTF8SequenceLength(b0);
kono
parents:
diff changeset
120 if (sequenceLen && k <= length - sequenceLen * 3) {
kono
parents:
diff changeset
121 charLen = sequenceLen * 3;
kono
parents:
diff changeset
122 char sequence[5];
kono
parents:
diff changeset
123 if (charLen != 0) {
kono
parents:
diff changeset
124 const int character = decodeUTF8Sequence(sequence);
kono
parents:
diff changeset
125 if (character < 0 || character >= 0x110000)
kono
parents:
diff changeset
126 charLen = 0;
kono
parents:
diff changeset
127 else if (character >= 0x10000) {
kono
parents:
diff changeset
128 builder.append(static_cast<UChar>(0xD800 | ((character - 0x10000) >> 10)));
kono
parents:
diff changeset
129 } else
kono
parents:
diff changeset
130 u = static_cast<UChar>(character);
kono
parents:
diff changeset
131 }
kono
parents:
diff changeset
132 }
kono
parents:
diff changeset
133 }
kono
parents:
diff changeset
134 }
kono
parents:
diff changeset
135 }
kono
parents:
diff changeset
136 }
kono
parents:
diff changeset
137 static JSValue decode(ExecState* exec, const char* doNotUnescape, bool strict)
kono
parents:
diff changeset
138 {
kono
parents:
diff changeset
139 UString str = exec->argument(0).toString(exec)->value(exec);
kono
parents:
diff changeset
140 return decode(exec, str.characters8(), str.length(), doNotUnescape, strict);
kono
parents:
diff changeset
141 }
kono
parents:
diff changeset
142 EncodedJSValue globalFuncDecodeURI(ExecState* exec)
kono
parents:
diff changeset
143 {
kono
parents:
diff changeset
144 static const char do_not_unescape_when_decoding_URI[] =
kono
parents:
diff changeset
145 "#$&+,/:;=?@";
kono
parents:
diff changeset
146 return JSValue::encode(decode(exec, do_not_unescape_when_decoding_URI, true));
kono
parents:
diff changeset
147 }
kono
parents:
diff changeset
148 }