• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * Copyright (c) 2023-2025 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16//! CHECKER       AOT IR Builder, check StringBuilder::toString replacement
17//! SKIP_IF       @architecture == "arm32"
18//! RUN_PAOC      options: "--compiler-regex='.*toString[0-9]+.*' --compiler-inlining=false"
19//!
20//! METHOD        "ets_stringbuilder.ETSGLOBAL::toString0"
21//! PASS_BEFORE   "BranchElimination"
22//! INST          /StringBuilder::<ctor>/
23//! INST_NEXT     /SaveState/
24//! INST_NEXT     /NullCheck/
25//! INST_NEXT     /Intrinsic.StdCoreSbToString/
26//! PASS_AFTER    "SimplifyStringBuilder"
27//! INST_NOT      /StringBuilder::<ctor>/
28//! INST_NOT      /StringBuilder::toString/
29//!
30//! METHOD        "ets_stringbuilder.ETSGLOBAL::toString1"
31//! PASS_BEFORE   "BranchElimination"
32//! INST          /StringBuilder::<ctor>/
33//! INST_NEXT     /SaveState/
34//! INST_NEXT     /NullCheck/
35//! INST_NEXT     /Intrinsic.StdCoreSbToString/
36//! PASS_AFTER    "SimplifyStringBuilder"
37//! INST_NOT      /StringBuilder::<ctor>/
38//! INST_NOT      /StringBuilder::toString/
39//!
40//! METHOD        "ets_stringbuilder.ETSGLOBAL::toString2"
41//! PASS_BEFORE   "BranchElimination"
42//! INST          /StringBuilder::<ctor>/
43//! INST_NEXT     /SaveState/
44//! INST_NEXT     /NullCheck/
45//! INST_NEXT     /Intrinsic.StdCoreSbToString/
46//! INST_NEXT     /SaveState/
47//! INST_NEXT     /NullCheck/
48//! INST_NEXT     /Intrinsic.StdCoreSbToString/
49//! INST_NEXT     /SaveState/
50//! INST_NEXT     /NullCheck/
51//! INST_NEXT     /Intrinsic.StdCoreSbToString/
52//! PASS_AFTER    "SimplifyStringBuilder"
53//! INST          /StringBuilder::<ctor>/
54//! INST_NEXT     /SaveState/
55//! INST_NEXT     /NullCheck/
56//! INST_NEXT     /Intrinsic.StdCoreSbToString/
57//! INST_NEXT_NOT /SaveState/
58//! INST_NEXT_NOT /NullCheck/
59//! INST_NEXT_NOT /Intrinsic.StdCoreSbToString/
60//!
61//! METHOD        "ets_stringbuilder.ETSGLOBAL::toString3"
62//! PASS_BEFORE   "BranchElimination"
63//! INST          /StringBuilder::<ctor>/
64//! INST_NEXT     /SaveState/
65//! INST_NEXT     /NullCheck/
66//! INST_NEXT     /Intrinsic.StdCoreSbToString/
67//! INST_NEXT     /SaveState/
68//! INST_NEXT     /NullCheck/
69//! INST_NEXT     /Intrinsic.StdCoreSbToString/
70//! PASS_AFTER    "SimplifyStringBuilder"
71//! INST          /StringBuilder::<ctor>/
72//! INST_NEXT     /SaveState/
73//! INST_NEXT_NOT /Intrinsic.StdCoreSbToString/
74//!
75//! METHOD        "ets_stringbuilder.ETSGLOBAL::toString4"
76//! PASS_BEFORE   "BranchElimination"
77//! INST          /StringBuilder::<ctor>/
78//! INST_NEXT     /SaveState/
79//! INST_NEXT     /NullCheck/
80//! INST_NEXT     /Intrinsic.StdCoreSbToString/
81//! INST_NEXT     /SaveState/
82//! INST_NEXT     /NullCheck/
83//! INST_NEXT     /Intrinsic.StdCoreSbToString/
84//! PASS_AFTER    "SimplifyStringBuilder"
85//! INST          /StringBuilder::<ctor>/
86//! INST_NEXT     /SaveState/
87//! INST_NEXT     /Intrinsic.StdCoreSbToString/
88//! INST_NEXT_NOT /SaveState/
89//! INST_NEXT_NOT /NullCheck/
90//! INST_NEXT_NOT /Intrinsic.StdCoreSbToString/
91//!
92//! METHOD        "ets_stringbuilder.ETSGLOBAL::toString5"
93//! PASS_BEFORE   "BranchElimination"
94//! INST          /StringBuilder::<ctor>/
95//! INST_NEXT     /SaveState/
96//! INST_NEXT     /NullCheck/
97//! INST_NEXT     /Intrinsic.StdCoreSbToString/
98//! INST_NEXT     /SaveState/
99//! INST_NEXT     /NullCheck/
100//! INST_NEXT     /Intrinsic.StdCoreSbToString/
101//! PASS_AFTER    "SimplifyStringBuilder"
102//! INST          /StringBuilder::<ctor>/
103//! INST_NEXT     /SaveState/
104//! INST_NEXT     /Intrinsic.StdCoreSbToString/
105//! INST_NEXT_NOT /SaveState/
106//! INST_NEXT_NOT /Intrinsic.StdCoreSbToString/
107//!
108//! METHOD        "ets_stringbuilder.ETSGLOBAL::toString6"
109//! PASS_BEFORE   "BranchElimination"
110//! INST          /StringBuilder::<ctor>/
111//! INST_NEXT     /SaveState/
112//! INST_NEXT     /NullCheck/
113//! INST_NEXT     /Intrinsic.StdCoreSbToString/
114//! INST_NEXT     /SaveState/
115//! INST_NEXT     /NullCheck/
116//! INST_NEXT     /Intrinsic.StdCoreSbToString/
117//! PASS_AFTER    "SimplifyStringBuilder"
118//! INST          /StringBuilder::<ctor>/
119//! INST_NEXT     /SaveState/
120//! INST_NEXT     /Intrinsic.StdCoreSbToString/
121//! INST_NEXT_NOT /SaveState/
122//! INST_NEXT_NOT /Intrinsic.StdCoreSbToString/
123//!
124//! METHOD        "ets_stringbuilder.ETSGLOBAL::toString7"
125//! PASS_BEFORE   "BranchElimination"
126//! INST          /StringBuilder::<ctor>/
127//! INST_NEXT     /SaveState/
128//! INST_NEXT     /NullCheck/
129//! INST_NEXT     /Intrinsic.StdCoreSbToString/
130//! INST_NEXT     /SaveState/
131//! INST_NEXT     /NullCheck/
132//! INST_NEXT     /Intrinsic.StdCoreSbToString/
133//! PASS_AFTER    "SimplifyStringBuilder"
134//! INST          /StringBuilder::<ctor>/
135//! INST_NEXT     /SaveState/
136//! INST_NEXT     /Intrinsic.StdCoreSbToString/
137//! INST_NEXT     /SaveState/
138//! INST_NEXT     /NullCheck/
139//! INST_NEXT     /Intrinsic.StdCoreSbToString/
140//!
141//! METHOD        "ets_stringbuilder.ETSGLOBAL::toString8"
142//! PASS_BEFORE   "BranchElimination"
143//! INST          /StringBuilder::<ctor>/
144//! INST_NEXT     /SaveState/
145//! INST_NEXT     /NullCheck/
146//! INST_NEXT     /Intrinsic.StdCoreSbToString/
147//! PASS_AFTER    "SimplifyStringBuilder"
148//! INST          /StringBuilder::<ctor>/
149//! INST_NEXT     /SaveState/
150//! INST_NEXT     /Intrinsic.StdCoreSbAppendInt/
151//! INST_NEXT     /SaveState/
152//! INST_NEXT     /Intrinsic.StdCoreSbToString/
153//!
154//! METHOD        "ets_stringbuilder.ETSGLOBAL::toString10"
155//! PASS_BEFORE   "BranchElimination"
156//! INST          /StringBuilder::<ctor>/
157//! INST_COUNT    /Intrinsic.StdCoreSbToString/,3
158//! PASS_AFTER    "SimplifyStringBuilder"
159//! INST          /StringBuilder::<ctor>/
160//! INST_COUNT    /Intrinsic.StdCoreSbToString/,1
161//!
162//! RUN           entry: "ets_stringbuilder.ETSGLOBAL::main"
163
164//! CHECKER       JIT IR Builder, check StringBuilder::toString replacement
165//! RUN           force_jit: true, options: "--compiler-regex='.*toString[0-9]+.*' --compiler-inlining=false", entry: "ets_stringbuilder.ETSGLOBAL::main"
166//!
167//! METHOD        "ets_stringbuilder.ETSGLOBAL::toString0"
168//! PASS_BEFORE   "BranchElimination"
169//! INST          /StringBuilder::<ctor>/
170//! INST_NEXT     /SaveState/
171//! INST_NEXT     /NullCheck/
172//! INST_NEXT     /Intrinsic.StdCoreSbToString/
173//! PASS_AFTER    "SimplifyStringBuilder"
174//! INST_NOT      /StringBuilder::<ctor>/
175//! INST_NOT      /StringBuilder::toString/
176//!
177//! METHOD        "ets_stringbuilder.ETSGLOBAL::toString1"
178//! PASS_BEFORE   "BranchElimination"
179//! INST          /StringBuilder::<ctor>/
180//! INST_NEXT     /SaveState/
181//! INST_NEXT     /NullCheck/
182//! INST_NEXT     /Intrinsic.StdCoreSbToString/
183//! PASS_AFTER    "SimplifyStringBuilder"
184//! INST_NOT      /StringBuilder::<ctor>/
185//! INST_NOT      /StringBuilder::toString/
186//!
187//! METHOD        "ets_stringbuilder.ETSGLOBAL::toString2"
188//! PASS_BEFORE   "BranchElimination"
189//! INST          /StringBuilder::<ctor>/
190//! INST_NEXT     /SaveState/
191//! INST_NEXT     /NullCheck/
192//! INST_NEXT     /Intrinsic.StdCoreSbToString/
193//! INST_NEXT     /SaveState/
194//! INST_NEXT     /NullCheck/
195//! INST_NEXT     /Intrinsic.StdCoreSbToString/
196//! INST_NEXT     /SaveState/
197//! INST_NEXT     /NullCheck/
198//! INST_NEXT     /Intrinsic.StdCoreSbToString/
199//! PASS_AFTER    "SimplifyStringBuilder"
200//! INST          /StringBuilder::<ctor>/
201//! INST_NEXT     /SaveState/
202//! INST_NEXT     /NullCheck/
203//! INST_NEXT     /Intrinsic.StdCoreSbToString/
204//! INST_NEXT_NOT /SaveState/
205//! INST_NEXT_NOT /NullCheck/
206//! INST_NEXT_NOT /Intrinsic.StdCoreSbToString/
207//!
208//! METHOD        "ets_stringbuilder.ETSGLOBAL::toString3"
209//! PASS_BEFORE   "BranchElimination"
210//! INST          /StringBuilder::<ctor>/
211//! INST_NEXT     /SaveState/
212//! INST_NEXT     /NullCheck/
213//! INST_NEXT     /Intrinsic.StdCoreSbToString/
214//! INST_NEXT     /SaveState/
215//! INST_NEXT     /NullCheck/
216//! INST_NEXT     /Intrinsic.StdCoreSbToString/
217//! PASS_AFTER    "SimplifyStringBuilder"
218//! INST          /StringBuilder::<ctor>/
219//! INST_NEXT     /SaveState/
220//! INST_NEXT_NOT /Intrinsic.StdCoreSbToString/
221//!
222//! METHOD        "ets_stringbuilder.ETSGLOBAL::toString4"
223//! PASS_BEFORE   "BranchElimination"
224//! INST          /StringBuilder::<ctor>/
225//! INST_NEXT     /SaveState/
226//! INST_NEXT     /NullCheck/
227//! INST_NEXT     /Intrinsic.StdCoreSbToString/
228//! INST_NEXT     /SaveState/
229//! INST_NEXT     /NullCheck/
230//! INST_NEXT     /Intrinsic.StdCoreSbToString/
231//! PASS_AFTER    "SimplifyStringBuilder"
232//! INST          /StringBuilder::<ctor>/
233//! INST_NEXT     /SaveState/
234//! INST_NEXT     /Intrinsic.StdCoreSbToString/
235//! INST_NEXT_NOT /SaveState/
236//! INST_NEXT_NOT /NullCheck/
237//! INST_NEXT_NOT /Intrinsic.StdCoreSbToString/
238//!
239//! METHOD        "ets_stringbuilder.ETSGLOBAL::toString5"
240//! PASS_BEFORE   "BranchElimination"
241//! INST          /StringBuilder::<ctor>/
242//! INST_NEXT     /SaveState/
243//! INST_NEXT     /NullCheck/
244//! INST_NEXT     /Intrinsic.StdCoreSbToString/
245//! INST_NEXT     /SaveState/
246//! INST_NEXT     /NullCheck/
247//! INST_NEXT     /Intrinsic.StdCoreSbToString/
248//! PASS_AFTER    "SimplifyStringBuilder"
249//! INST          /StringBuilder::<ctor>/
250//! INST_NEXT     /SaveState/
251//! INST_NEXT     /Intrinsic.StdCoreSbToString/
252//! INST_NEXT_NOT /SaveState/
253//! INST_NEXT_NOT /Intrinsic.StdCoreSbToString/
254//!
255//! METHOD        "ets_stringbuilder.ETSGLOBAL::toString6"
256//! PASS_BEFORE   "BranchElimination"
257//! INST          /StringBuilder::<ctor>/
258//! INST_NEXT     /SaveState/
259//! INST_NEXT     /NullCheck/
260//! INST_NEXT     /Intrinsic.StdCoreSbToString/
261//! INST_NEXT     /SaveState/
262//! INST_NEXT     /NullCheck/
263//! INST_NEXT     /Intrinsic.StdCoreSbToString/
264//! PASS_AFTER    "SimplifyStringBuilder"
265//! INST          /StringBuilder::<ctor>/
266//! INST_NEXT     /SaveState/
267//! INST_NEXT     /Intrinsic.StdCoreSbToString/
268//! INST_NEXT_NOT /SaveState/
269//! INST_NEXT_NOT /Intrinsic.StdCoreSbToString/
270//!
271//! METHOD        "ets_stringbuilder.ETSGLOBAL::toString7"
272//! PASS_BEFORE   "BranchElimination"
273//! INST          /StringBuilder::<ctor>/
274//! INST_NEXT     /SaveState/
275//! INST_NEXT     /NullCheck/
276//! INST_NEXT     /Intrinsic.StdCoreSbToString/
277//! INST_NEXT     /SaveState/
278//! INST_NEXT     /NullCheck/
279//! INST_NEXT     /Intrinsic.StdCoreSbToString/
280//! PASS_AFTER    "SimplifyStringBuilder"
281//! INST          /StringBuilder::<ctor>/
282//! INST_NEXT     /SaveState/
283//! INST_NEXT     /Intrinsic.StdCoreSbToString/
284//! INST_NEXT     /SaveState/
285//! INST_NEXT     /NullCheck/
286//! INST_NEXT     /Intrinsic.StdCoreSbToString/
287//!
288//! METHOD        "ets_stringbuilder.ETSGLOBAL::toString8"
289//! PASS_BEFORE   "BranchElimination"
290//! INST          /StringBuilder::<ctor>/
291//! INST_NEXT     /SaveState/
292//! INST_NEXT     /NullCheck/
293//! INST_NEXT     /Intrinsic.StdCoreSbToString/
294//! PASS_AFTER    "SimplifyStringBuilder"
295//! INST          /StringBuilder::<ctor>/
296//! INST_NEXT     /SaveState/
297//! INST_NEXT     /Intrinsic.StdCoreSbAppendInt/
298//! INST_NEXT     /SaveState/
299//! INST_NEXT     /Intrinsic.StdCoreSbToString/
300//!
301//! METHOD        "ets_stringbuilder.ETSGLOBAL::toString9"
302//! PASS_BEFORE   "BranchElimination"
303//! INST_COUNT    /StringBuilder::<ctor>/,2
304//! INST_COUNT    /Intrinsic.StdCoreSbToString/,6
305//! PASS_AFTER    "SimplifyStringBuilder"
306//! INST_COUNT    /StringBuilder::<ctor>/,2
307//! INST_COUNT    /Intrinsic.StdCoreSbToString/,2
308//!
309//! METHOD        "ets_stringbuilder.ETSGLOBAL::toString10"
310//! PASS_BEFORE   "BranchElimination"
311//! INST          /StringBuilder::<ctor>/
312//! INST_COUNT    /Intrinsic.StdCoreSbToString/,3
313//! PASS_AFTER    "SimplifyStringBuilder"
314//! INST          /StringBuilder::<ctor>/
315//! INST_COUNT    /Intrinsic.StdCoreSbToString/,1
316//!
317//! METHOD        "ets_stringbuilder.ETSGLOBAL::toString11"
318//! PASS_BEFORE   "BranchElimination"
319//! INST          /StringBuilder::<ctor>/
320//! INST_COUNT    /Intrinsic.StdCoreSbToString/,2
321//! PASS_AFTER    "SimplifyStringBuilder"
322//! INST          /StringBuilder::<ctor>/
323//! INST_COUNT    /Intrinsic.StdCoreSbToString/,1
324
325
326function toString0(str: String): String {
327    return new StringBuilder(str).toString();   // applied
328}
329
330function toString1(str: String): String {
331    let sb = new StringBuilder(str);
332    return sb.toString();                       // applied
333}
334
335function toString2(str: String): String {
336    let sb = new StringBuilder(str);
337    sb.toString();                              // applied
338    sb = sb;
339    sb.toString();                              // applied
340    sb = sb.append(1);
341    return sb.toString();                       // not applied, due to dominating append()-call
342}
343
344function doSmth() : void {
345}
346
347function doSmthWithSB(sb: StringBuilder) : void {
348}
349
350function toString3(str: String): String {
351    let sb = new StringBuilder(str);            // not removed, due to potential inlining of doSmth with potential deoptimize instructions
352    sb.toString();                              // applied
353    doSmth();
354    return sb.toString();                       // applied
355}
356
357function toString4(str: String): String {
358    let sb = new StringBuilder(str);
359    sb.toString();                              // applied
360    doSmthWithSB(sb);
361    return sb.toString();                       // not applied, due to dominating doSmthWithSB()-call
362}
363
364function toString5(str: String): String {
365    let sb = new StringBuilder(str);
366    sb.toString();                              // applied
367    let sb2 = sb;
368    doSmthWithSB(sb2);
369    return sb.toString();                       // not applied, due to dominating doSmthWithSB()-call
370}
371
372class A {
373    public sb: StringBuilder = new StringBuilder();
374}
375
376function doSmthWithA(a: A) : void {
377}
378
379function toString6(str: String): String {
380    let sb = new StringBuilder(str);
381    sb.toString();                              // applied
382    let a = new A;
383    a.sb = sb;
384    doSmthWithA(a);
385    return sb.toString();                       // not applied, due to dominating StoreObject-instruction (a.sb = sb)
386}
387
388let sb: StringBuilder = new StringBuilder();
389
390function toString7(str: String): String {
391    sb = new StringBuilder(str);                // the object is a global variable
392    sb.toString();                              // not applied, due to dominating StoreStatic-instruction
393    doSmth();
394    return sb.toString();                       // not applied, due to dominating StoreStatic-instruction
395}
396
397function toString8(str: String): String {
398    let sb = new StringBuilder(str);
399    sb.toString();                              // applied
400    sb.append(1);
401    return sb.toString();                       // not applied, due to dominating append()-call
402}
403
404function toString9(str: String): String {
405    let sb1 = new StringBuilder(str);
406    sb1.toString();                             // applied
407    let sb2 = new StringBuilder(str);
408    sb1.toString();                             // applied
409    sb2.toString();                             // applied
410    sb1.append(1);
411    sb1.toString();                             // not applied, due to dominating append()-call
412    sb2.toString();                             // applied
413    sb2.append(1);
414    return sb2.toString();                      // not applied, due to dominating append()-call
415}
416
417function toString10(str: String): String {
418    let sb = new StringBuilder(str);
419    sb.toString();                              // applied
420    let strings: FixedArray<string> = ["1"]               // insert NegativeCheck, BoundsCheck, RefTypeCheck instructions
421    sb.toString();                              // applied
422    sb.append(strings[0]);
423    return sb.toString();                       // not applied, due to dominating append()-call
424}
425
426function toString11(str: String): String {
427    let sb = new StringBuilder(str);
428    sb.toString();                              // applied
429    if (str.getLength() > 0)
430        sb.append(1);
431    return sb.toString();                       // not applied, due to dominating append()-call
432}
433
434function main(): int {
435    assertEQ(toString0("abcde"), "abcde", "Wrong at toString0")
436    assertEQ(toString1("abcde"), "abcde", "Wrong at toString1")
437    assertEQ(toString2("abcde"), "abcde1", "Wrong at toString2")
438    assertEQ(toString3("abcde"), "abcde", "Wrong at toString3")
439    assertEQ(toString4("abcde"), "abcde", "Wrong at toString4")
440    assertEQ(toString5("abcde"), "abcde", "Wrong at toString5")
441    assertEQ(toString6("abcde"), "abcde", "Wrong at toString6")
442    assertEQ(toString7("abcde"), "abcde", "Wrong at toString7")
443    assertEQ(toString8("abcde"), "abcde1", "Wrong at toString8")
444    assertEQ(toString9("abcde"), "abcde1", "Wrong at toString9")
445    assertEQ(toString10("abcde"), "abcde1", "Wrong at toString10")
446    assertEQ(toString11("abcde"), "abcde1", "Wrong at toString10")
447    return 0;
448}
449
450// Checker below based on plugins/ets/sdk/api/@ohos.url.ets
451// Expected successful compilation
452
453//! CHECKER       AOT IR Builder, Bugfix 25869
454//! SKIP_IF       @architecture == "arm32"
455//! RUN_PAOC      options: "--compiler-regex='.*encodePercentEncoding.*' --compiler-inlining=false --compiler-check-final=false"
456
457const HASH_TABLE: Array<string> = new Array<string>(256);
458const NO_ESCAPE_TABLE = new Int8Array(256);
459
460function encodePercentEncoding(str: string) {
461    let outVal = '';
462
463    const len = str.length;
464    let i = 0;
465    const UNICODE_0x80 = 0x80;
466
467    outer:
468    for (; i < len; i++) {
469        let c = str.charCodeAt(i as number);
470
471        while (c < UNICODE_0x80) {
472            if (NO_ESCAPE_TABLE[c] !== 1) {
473                outVal += HASH_TABLE[c];
474            }
475            if (++i == len)
476                break outer;
477        }
478    }
479    return outVal;
480}
481