13af6ab5fSopenharmony_ci/*
23af6ab5fSopenharmony_ci * Copyright (c) 2021-2024 Huawei Device Co., Ltd.
33af6ab5fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
43af6ab5fSopenharmony_ci * you may not use this file except in compliance with the License.
53af6ab5fSopenharmony_ci * You may obtain a copy of the License at
63af6ab5fSopenharmony_ci *
73af6ab5fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
83af6ab5fSopenharmony_ci *
93af6ab5fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
103af6ab5fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
113af6ab5fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
123af6ab5fSopenharmony_ci * See the License for the specific language governing permissions and
133af6ab5fSopenharmony_ci * limitations under the License.
143af6ab5fSopenharmony_ci */
153af6ab5fSopenharmony_ci
163af6ab5fSopenharmony_ciclass UserClassType
173af6ab5fSopenharmony_ci{
183af6ab5fSopenharmony_ci    v : int = 0;
193af6ab5fSopenharmony_ci    constructor (p : int)
203af6ab5fSopenharmony_ci    {
213af6ab5fSopenharmony_ci        this.v = p;
223af6ab5fSopenharmony_ci    }
233af6ab5fSopenharmony_ci
243af6ab5fSopenharmony_ci    override toString() : string {
253af6ab5fSopenharmony_ci        return Int.valueOf(this.v).toString();
263af6ab5fSopenharmony_ci    }
273af6ab5fSopenharmony_ci}
283af6ab5fSopenharmony_ci
293af6ab5fSopenharmony_cienum UserEnumType 
303af6ab5fSopenharmony_ci{ 
313af6ab5fSopenharmony_ci    Red, 
323af6ab5fSopenharmony_ci    Green, 
333af6ab5fSopenharmony_ci    Blue
343af6ab5fSopenharmony_ci};
353af6ab5fSopenharmony_ci
363af6ab5fSopenharmony_cilet g_array : int [] = [1,2,3];
373af6ab5fSopenharmony_cilet g_array2 : int [] = [11,12,13];
383af6ab5fSopenharmony_cilet g_Array : Array<Int> = new Array<Int>(new Int(4), new Int(5), new Int(6));
393af6ab5fSopenharmony_cilet g_Array2 : Array<Int> = new Array<Int>(new Int(14), new Int(15), new Int(16));
403af6ab5fSopenharmony_cilet g_Object : Object = new Object();
413af6ab5fSopenharmony_cilet g_Object2 : Object = new Object();
423af6ab5fSopenharmony_cilet g_Class : UserClassType = new UserClassType(25);
433af6ab5fSopenharmony_cilet g_Class2 : UserClassType = new UserClassType(250);
443af6ab5fSopenharmony_ci
453af6ab5fSopenharmony_ci
463af6ab5fSopenharmony_ci
473af6ab5fSopenharmony_ciclass GlobalClass
483af6ab5fSopenharmony_ci{
493af6ab5fSopenharmony_ci    static s_field : int = 13;
503af6ab5fSopenharmony_ci    field : int = 14;
513af6ab5fSopenharmony_ci
523af6ab5fSopenharmony_ci    static s_method_boxing_local_class() {
533af6ab5fSopenharmony_ci        // predefined value types
543af6ab5fSopenharmony_ci        let l_number : number = 1;
553af6ab5fSopenharmony_ci        let l_byte : byte = 2;
563af6ab5fSopenharmony_ci        let l_short : short = 3;
573af6ab5fSopenharmony_ci        let l_int : int = 4;
583af6ab5fSopenharmony_ci        let l_long : long = 5;
593af6ab5fSopenharmony_ci        let l_float : float = 6.0;
603af6ab5fSopenharmony_ci        let l_double : double = 7.0;
613af6ab5fSopenharmony_ci        let l_boolean : boolean = false;
623af6ab5fSopenharmony_ci        let l_char : char = c'x';
633af6ab5fSopenharmony_ci        
643af6ab5fSopenharmony_ci        // user defined value types
653af6ab5fSopenharmony_ci        let l_enum : UserEnumType = UserEnumType.Red;
663af6ab5fSopenharmony_ci
673af6ab5fSopenharmony_ci        // predefined reference types
683af6ab5fSopenharmony_ci        let l_Number : Number = new Number(11);
693af6ab5fSopenharmony_ci        let l_Byte : Byte = new Byte(12 as byte);
703af6ab5fSopenharmony_ci        let l_Short : Short = new Short(13 as short);
713af6ab5fSopenharmony_ci        let l_Int : Int = new Int(14 as int);
723af6ab5fSopenharmony_ci        let l_Long : Long = new Long(15 as long);
733af6ab5fSopenharmony_ci        let l_Float : Float = new Float(16.0);
743af6ab5fSopenharmony_ci        let l_Double : Double = new Double(17.0);
753af6ab5fSopenharmony_ci        let l_Boolean: Boolean = new Boolean(false);
763af6ab5fSopenharmony_ci        let l_Char : Char = new Char(c'X');
773af6ab5fSopenharmony_ci
783af6ab5fSopenharmony_ci        let l_string : string = "something";
793af6ab5fSopenharmony_ci        let l_String : String = new String("Something");
803af6ab5fSopenharmony_ci        let l_array : int [] = g_array;
813af6ab5fSopenharmony_ci        let l_Array : Array<Int> = g_Array;
823af6ab5fSopenharmony_ci        //let l_bigint : bigint = 20n;
833af6ab5fSopenharmony_ci        //let l_BigInt : BigInt = new BigInt(21n);
843af6ab5fSopenharmony_ci        let l_Object : Object = g_Object;
853af6ab5fSopenharmony_ci
863af6ab5fSopenharmony_ci        // user defined reference types
873af6ab5fSopenharmony_ci        let l_Class : UserClassType = g_Class;
883af6ab5fSopenharmony_ci
893af6ab5fSopenharmony_ci        class LocalClassBoxing
903af6ab5fSopenharmony_ci        {
913af6ab5fSopenharmony_ci            local_field : int = 1000;
923af6ab5fSopenharmony_ci            static local_s_field : int = 2000;
933af6ab5fSopenharmony_ci
943af6ab5fSopenharmony_ci            static local_s_method(lp : int) : void 
953af6ab5fSopenharmony_ci            {
963af6ab5fSopenharmony_ci                assert(lp == 300);
973af6ab5fSopenharmony_ci                assert(LocalClassBoxing.local_s_field == 2000);
983af6ab5fSopenharmony_ci
993af6ab5fSopenharmony_ci                LocalClassBoxing.local_s_field = 5000;
1003af6ab5fSopenharmony_ci                assert(LocalClassBoxing.local_s_field == 5000);
1013af6ab5fSopenharmony_ci            } 
1023af6ab5fSopenharmony_ci
1033af6ab5fSopenharmony_ci            local_method(lp : int) : void 
1043af6ab5fSopenharmony_ci            {
1053af6ab5fSopenharmony_ci                // Parameter
1063af6ab5fSopenharmony_ci                assert(lp == 400);
1073af6ab5fSopenharmony_ci                // Local class object field
1083af6ab5fSopenharmony_ci                assert(this.local_field == 1000);
1093af6ab5fSopenharmony_ci                // Local class static field
1103af6ab5fSopenharmony_ci                assert(LocalClassBoxing.local_s_field == 5000);
1113af6ab5fSopenharmony_ci                // Outer class static field
1123af6ab5fSopenharmony_ci                assert(GlobalClass.s_field == 13);
1133af6ab5fSopenharmony_ci                // Predefined value types
1143af6ab5fSopenharmony_ci                assert(l_number == 1);
1153af6ab5fSopenharmony_ci                assert(l_byte == 2);
1163af6ab5fSopenharmony_ci                assert(l_short == 3);
1173af6ab5fSopenharmony_ci                assert(l_int == 4);
1183af6ab5fSopenharmony_ci                assert(l_long == 5);
1193af6ab5fSopenharmony_ci                assert(l_float == 6);
1203af6ab5fSopenharmony_ci                assert(l_double == 7);
1213af6ab5fSopenharmony_ci                assert(l_boolean == false);
1223af6ab5fSopenharmony_ci                assert(l_char == c'x');
1233af6ab5fSopenharmony_ci                // User defined value type
1243af6ab5fSopenharmony_ci                assert(l_enum == UserEnumType.Red);
1253af6ab5fSopenharmony_ci                // Predefined reference types
1263af6ab5fSopenharmony_ci                assert(l_Number == Number.valueOf(11));
1273af6ab5fSopenharmony_ci                assert(l_Byte == Byte.valueOf(12 as byte));
1283af6ab5fSopenharmony_ci                assert(l_Short == Short.valueOf(13 as short));
1293af6ab5fSopenharmony_ci                assert(l_Int == Int.valueOf(14 as int));
1303af6ab5fSopenharmony_ci                assert(l_Long == Long.valueOf(15 as long));
1313af6ab5fSopenharmony_ci                assert(l_Float == Float.valueOf(16 as float));
1323af6ab5fSopenharmony_ci                assert(l_Double == Double.valueOf(17 as double));
1333af6ab5fSopenharmony_ci                assert(l_Boolean == Boolean.valueOf(false));
1343af6ab5fSopenharmony_ci                assert(l_Char == Char.valueOf(c'X'));
1353af6ab5fSopenharmony_ci                assert(l_string == "something");
1363af6ab5fSopenharmony_ci                assert(l_String == "Something");
1373af6ab5fSopenharmony_ci                // assert(l_array == g_array);
1383af6ab5fSopenharmony_ci                // assert(l_Array == g_Array);
1393af6ab5fSopenharmony_ci                assert(l_Object == g_Object);
1403af6ab5fSopenharmony_ci                assert(l_Class == g_Class);
1413af6ab5fSopenharmony_ci
1423af6ab5fSopenharmony_ci                this.local_field = 1100;
1433af6ab5fSopenharmony_ci                LocalClassBoxing.local_s_field = 5100;
1443af6ab5fSopenharmony_ci
1453af6ab5fSopenharmony_ci                l_number = 101;
1463af6ab5fSopenharmony_ci                l_byte = 102;
1473af6ab5fSopenharmony_ci                l_short = 103;
1483af6ab5fSopenharmony_ci                l_int = 104;
1493af6ab5fSopenharmony_ci                l_long = 105;
1503af6ab5fSopenharmony_ci                l_float = 106.0;
1513af6ab5fSopenharmony_ci                l_double = 107.0;
1523af6ab5fSopenharmony_ci                l_boolean = true;
1533af6ab5fSopenharmony_ci                l_char = c'y';
1543af6ab5fSopenharmony_ci                //l_enum = UserEnumType.Green;
1553af6ab5fSopenharmony_ci
1563af6ab5fSopenharmony_ci                l_Number = new Number(111);
1573af6ab5fSopenharmony_ci                l_Byte = new Byte(112 as byte);
1583af6ab5fSopenharmony_ci                l_Short = new Short(113 as short);
1593af6ab5fSopenharmony_ci                l_Int = new Int(114 as int);
1603af6ab5fSopenharmony_ci                l_Long = new Long(115 as long);
1613af6ab5fSopenharmony_ci                l_Float = new Float(116.0);
1623af6ab5fSopenharmony_ci                l_Double = new Double(117.0);
1633af6ab5fSopenharmony_ci                l_Boolean = new Boolean(true);
1643af6ab5fSopenharmony_ci                l_Char = new Char(c'Y');
1653af6ab5fSopenharmony_ci
1663af6ab5fSopenharmony_ci                l_string = "something new";
1673af6ab5fSopenharmony_ci                l_String = new String("Something new");
1683af6ab5fSopenharmony_ci                l_array = g_array2;
1693af6ab5fSopenharmony_ci                l_Array = g_Array2;
1703af6ab5fSopenharmony_ci                l_Object = g_Object2;
1713af6ab5fSopenharmony_ci                l_Class = g_Class2;
1723af6ab5fSopenharmony_ci            }
1733af6ab5fSopenharmony_ci        };
1743af6ab5fSopenharmony_ci        LocalClassBoxing.local_s_field = 2000;  // due to the jit loop
1753af6ab5fSopenharmony_ci        LocalClassBoxing.local_s_method(300);
1763af6ab5fSopenharmony_ci
1773af6ab5fSopenharmony_ci        let lcb = new LocalClassBoxing();
1783af6ab5fSopenharmony_ci        lcb.local_method(400);        
1793af6ab5fSopenharmony_ci
1803af6ab5fSopenharmony_ci        assert(lcb.local_field == 1100);
1813af6ab5fSopenharmony_ci        assert(LocalClassBoxing.local_s_field == 5100);
1823af6ab5fSopenharmony_ci        assert(l_number == 101);
1833af6ab5fSopenharmony_ci        assert(l_byte == 102);
1843af6ab5fSopenharmony_ci        assert(l_short == 103);
1853af6ab5fSopenharmony_ci        assert(l_int == 104);
1863af6ab5fSopenharmony_ci        assert(l_long == 105);
1873af6ab5fSopenharmony_ci        assert(l_float == 106);
1883af6ab5fSopenharmony_ci        assert(l_double == 107);
1893af6ab5fSopenharmony_ci        assert(l_boolean == true);
1903af6ab5fSopenharmony_ci        assert(l_char == c'y');
1913af6ab5fSopenharmony_ci        
1923af6ab5fSopenharmony_ci        //assert(l_enum == UserEnumType.Green);
1933af6ab5fSopenharmony_ci        
1943af6ab5fSopenharmony_ci        // Predefined reference types
1953af6ab5fSopenharmony_ci        assert(l_Number == Number.valueOf(111));
1963af6ab5fSopenharmony_ci        assert(l_Byte == Byte.valueOf(112 as byte));
1973af6ab5fSopenharmony_ci        assert(l_Short == Short.valueOf(113 as short));
1983af6ab5fSopenharmony_ci        assert(l_Int == Int.valueOf(114 as int));
1993af6ab5fSopenharmony_ci        assert(l_Long == Long.valueOf(115 as long));
2003af6ab5fSopenharmony_ci        assert(l_Float == Float.valueOf(116 as float));
2013af6ab5fSopenharmony_ci        assert(l_Double == Double.valueOf(117 as double));
2023af6ab5fSopenharmony_ci        assert(l_Boolean == Boolean.valueOf(true));
2033af6ab5fSopenharmony_ci        assert(l_Char == Char.valueOf(c'Y'));
2043af6ab5fSopenharmony_ci        assert(l_string == "something new");
2053af6ab5fSopenharmony_ci        assert(l_String == "Something new");
2063af6ab5fSopenharmony_ci        //assert(l_array == g_array2);
2073af6ab5fSopenharmony_ci        //assert(l_Array == g_Array2);
2083af6ab5fSopenharmony_ci        assert(l_Object == g_Object2);
2093af6ab5fSopenharmony_ci        assert(l_Class == g_Class2);
2103af6ab5fSopenharmony_ci    }
2113af6ab5fSopenharmony_ci}
2123af6ab5fSopenharmony_ci
2133af6ab5fSopenharmony_ci
2143af6ab5fSopenharmony_cifunction main() : int
2153af6ab5fSopenharmony_ci{
2163af6ab5fSopenharmony_ci    GlobalClass.s_method_boxing_local_class();
2173af6ab5fSopenharmony_ci    return 0;
2183af6ab5fSopenharmony_ci}
219