1 /** 2 * Copyright (c) 2021-2024 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 #ifndef ES2PANDA_COMPILER_CHECKER_TYPES_GLOBAL_TYPES_HOLDER_H 17 #define ES2PANDA_COMPILER_CHECKER_TYPES_GLOBAL_TYPES_HOLDER_H 18 19 #include "checker/types/type.h" 20 21 namespace ark::es2panda::checker { 22 enum class GlobalTypeId : std::size_t { 23 NUMBER, 24 ANY, 25 STRING, 26 BOOLEAN, 27 VOID, 28 NULL_ID, 29 UNDEFINED, 30 UNKNOWN, 31 NEVER, 32 NON_PRIMITIVE, 33 BIGINT, 34 FALSE_ID, 35 TRUE_ID, 36 NUMBER_OR_BIGINT, 37 STRING_OR_NUMBER, 38 ZERO, 39 EMPTY_STRING, 40 ZERO_BIGINT, 41 PRIMITIVE, 42 EMPTY_TUPLE, 43 EMPTY_OBJECT, 44 RESOLVING_RETURN_TYPE, 45 ERROR_TYPE, 46 BYTE, 47 SHORT, 48 INT, 49 LONG, 50 FLOAT, 51 DOUBLE, 52 CHAR, 53 ETS_BOOLEAN, 54 ETS_STRING, 55 ETS_VOID, 56 ETS_OBJECT_BUILTIN, 57 ETS_NULL, 58 ETS_UNDEFINED, 59 ETS_NULLISH_TYPE, 60 ETS_NULLISH_OBJECT, 61 ETS_WILDCARD, 62 ETS_BOOLEAN_BUILTIN, 63 ETS_BYTE_BUILTIN, 64 ETS_CHAR_BUILTIN, 65 ETS_COMPARABLE_BUILTIN, 66 ETS_CONSOLE_BUILTIN, 67 ETS_DATE_BUILTIN, 68 ETS_DOUBLE_BUILTIN, 69 ETS_EXCEPTION_BUILTIN, 70 ETS_FLOAT_BUILTIN, 71 ETS_FLOATING_BUILTIN, 72 ETS_INTEGER_BUILTIN, 73 ETS_INTEGRAL_BUILTIN, 74 ETS_LONG_BUILTIN, 75 ETS_MAP_BUILTIN, 76 ETS_ERROR_BUILTIN, 77 ETS_RUNTIME_BUILTIN, 78 ETS_SET_BUILTIN, 79 ETS_SHORT_BUILTIN, 80 ETS_STACK_TRACE_ELEMENT_BUILTIN, 81 ETS_STACK_TRACE_BUILTIN, 82 ETS_NULL_POINTER_EXCEPTION_BUILTIN, 83 ETS_ARRAY_INDEX_OUT_OF_BOUNDS_ERROR_BUILTIN, 84 ETS_ARITHMETIC_ERROR_BUILTIN, 85 ETS_CLASS_NOT_FOUND_EXCEPTION_BUILTIN, 86 ETS_CLASS_CAST_ERROR_BUILTIN, 87 ETS_OUT_OF_MEMORY_ERROR_BUILTIN, 88 ETS_NO_SUCH_METHOD_ERROR_BUILTIN, 89 ETS_ASSERTION_ERROR_BUILTIN, 90 ETS_DIVIDE_BY_ZERO_ERROR_BUILTIN, 91 ETS_NULL_POINTER_ERROR_BUILTIN, 92 ETS_UNCAUGHT_EXCEPTION_ERROR_BUILTIN, 93 ETS_STRING_BUILTIN, 94 ETS_STRING_BUILDER_BUILTIN, 95 ETS_TYPE_BUILTIN, 96 ETS_TYPES_BUILTIN, 97 ETS_PROMISE_BUILTIN, 98 ETS_REGEXP_BUILTIN, 99 ETS_ARRAY_BUILTIN, 100 ETS_INTEROP_JSRUNTIME_BUILTIN, 101 ETS_INTEROP_JSVALUE_BUILTIN, 102 ETS_BOX_BUILTIN, 103 ETS_BOOLEAN_BOX_BUILTIN, 104 ETS_BYTE_BOX_BUILTIN, 105 ETS_CHAR_BOX_BUILTIN, 106 ETS_SHORT_BOX_BUILTIN, 107 ETS_INT_BOX_BUILTIN, 108 ETS_LONG_BOX_BUILTIN, 109 ETS_FLOAT_BOX_BUILTIN, 110 ETS_DOUBLE_BOX_BUILTIN, 111 ETS_NEVER_BUILTIN, 112 ETS_BIG_INT_BUILTIN, 113 ETS_BIG_INT, 114 115 ETS_FUNCTION0_CLASS, 116 ETS_FUNCTION1_CLASS, 117 ETS_FUNCTION2_CLASS, 118 ETS_FUNCTION3_CLASS, 119 ETS_FUNCTION4_CLASS, 120 ETS_FUNCTION5_CLASS, 121 ETS_FUNCTION6_CLASS, 122 ETS_FUNCTION7_CLASS, 123 ETS_FUNCTION8_CLASS, 124 ETS_FUNCTION9_CLASS, 125 ETS_FUNCTION10_CLASS, 126 ETS_FUNCTION11_CLASS, 127 ETS_FUNCTION12_CLASS, 128 ETS_FUNCTION13_CLASS, 129 ETS_FUNCTION14_CLASS, 130 ETS_FUNCTION15_CLASS, 131 ETS_FUNCTION16_CLASS, 132 ETS_FUNCTIONN_CLASS, 133 134 TYPE_ERROR, 135 136 COUNT, 137 }; 138 139 class GlobalTypesHolder { 140 public: 141 explicit GlobalTypesHolder(ArenaAllocator *allocator); 142 ~GlobalTypesHolder() = default; 143 NO_COPY_SEMANTIC(GlobalTypesHolder); 144 NO_MOVE_SEMANTIC(GlobalTypesHolder); 145 146 void AddETSEscompatLayer(); 147 void AddEtsSpecificTypes(ArenaAllocator *allocator); 148 void AddEtsSpecificBuiltinTypes(); 149 void AddTSSpecificTypes(ArenaAllocator *allocator); 150 151 // TS specific types 152 Type *GlobalNumberType(); 153 Type *GlobalAnyType(); 154 Type *GlobalStringType(); 155 Type *GlobalBooleanType(); 156 Type *GlobalVoidType(); 157 Type *GlobalNullType(); 158 Type *GlobalUndefinedType(); 159 Type *GlobalUnknownType(); 160 Type *GlobalNeverType(); 161 Type *GlobalNonPrimitiveType(); 162 Type *GlobalBigintType(); 163 Type *GlobalFalseType(); 164 Type *GlobalTrueType(); 165 Type *GlobalNumberOrBigintType(); 166 Type *GlobalStringOrNumberType(); 167 Type *GlobalZeroType(); 168 Type *GlobalEmptyStringType(); 169 Type *GlobalZeroBigintType(); 170 Type *GlobalPrimitiveType(); 171 Type *GlobalEmptyTupleType(); 172 Type *GlobalEmptyObjectType(); 173 Type *GlobalResolvingReturnType(); 174 Type *GlobalErrorType(); 175 176 // ETS specific types 177 Type *GlobalByteType(); 178 Type *GlobalShortType(); 179 Type *GlobalIntType(); 180 Type *GlobalLongType(); 181 Type *GlobalFloatType(); 182 Type *GlobalDoubleType(); 183 Type *GlobalCharType(); 184 Type *GlobalETSBooleanType(); 185 Type *GlobalETSStringLiteralType(); 186 Type *GlobalETSVoidType(); 187 Type *GlobalETSObjectType(); 188 Type *GlobalETSNullType(); 189 Type *GlobalETSUndefinedType(); 190 Type *GlobalETSNullishType(); 191 Type *GlobalETSNullishObjectType(); 192 Type *GlobalWildcardType(); 193 Type *GlobalETSBooleanBuiltinType(); 194 Type *GlobalByteBuiltinType(); 195 Type *GlobalCharBuiltinType(); 196 Type *GlobalComparableBuiltinType(); 197 Type *GlobalConsoleBuiltinType(); 198 Type *GlobalDoubleBuiltinType(); 199 Type *GlobalExceptionBuiltinType(); 200 Type *GlobalFloatBuiltinType(); 201 Type *GlobalFloatingBuiltinType(); 202 Type *GlobalIntegerBuiltinType(); 203 Type *GlobalIntegralBuiltinType(); 204 Type *GlobalLongBuiltinType(); 205 Type *GlobalErrorBuiltinType(); 206 Type *GlobalRuntimeBuiltinType(); 207 Type *GlobalShortBuiltinType(); 208 Type *GlobalStackTraceElementBuiltinType(); 209 Type *GlobalStackTraceBuiltinType(); 210 Type *GlobalNullPointerExceptionBuiltinType(); 211 Type *GlobalArrayIndexOutOfBoundsErrorBuiltinType(); 212 Type *GlobalArithmeticErrorBuiltinType(); 213 Type *GlobalClassNotFoundExceptionBuiltinType(); 214 [[nodiscard]] Type *GlobalClassCastErrorBuiltinType() const noexcept; 215 Type *GlobalETSStringBuiltinType(); 216 Type *GlobalETSBigIntBuiltinType(); 217 Type *GlobalETSBigIntLiteralType(); 218 Type *GlobalStringBuilderBuiltinType(); 219 Type *GlobalTypeBuiltinType(); 220 Type *GlobalTypesBuiltinType(); 221 Type *GlobalPromiseBuiltinType(); 222 Type *GlobalBoxBuiltinType(); 223 Type *GlobalBooleanBoxBuiltinType(); 224 Type *GlobalByteBoxBuiltinType(); 225 Type *GlobalCharBoxBuiltinType(); 226 Type *GlobalShortBoxBuiltinType(); 227 Type *GlobalIntBoxBuiltinType(); 228 Type *GlobalLongBoxBuiltinType(); 229 Type *GlobalFloatBoxBuiltinType(); 230 Type *GlobalDoubleBoxBuiltinType(); 231 Type *GlobalBuiltinNeverType(); 232 233 // Functional types 234 size_t VariadicFunctionTypeThreshold(); 235 Type *GlobalFunctionBuiltinType(size_t nargs); 236 237 // ETS escompat layer 238 Type *GlobalArrayBuiltinType(); 239 Type *GlobalClassOutOfMemoryErrorBuiltinType(); 240 Type *GlobalNoSuchMethodErrorBuiltinType(); 241 Type *GlobalAssertionErrorBuiltinType(); 242 Type *GlobalDivideByZeroErrorBuiltinType(); 243 Type *GlobalNullPointerErrorBuiltinType(); 244 Type *GlobalUncaughtExceptionErrorBuiltinType(); 245 Type *GlobalMapBuiltinType(); 246 Type *GlobalRegExpBuiltinType(); 247 Type *GlobalSetBuiltinType(); 248 249 // JS specific types 250 Type *GlobalJSRuntimeBuiltinType(); 251 Type *GlobalJSValueBuiltinType(); 252 253 Type *GlobalTypeError(); 254 255 void InitializeBuiltin(util::StringView name, Type *type); 256 257 using Holder = std::array<Type *, static_cast<size_t>(GlobalTypeId::COUNT)>; 258 GlobalTypes()259 Holder &GlobalTypes() 260 { 261 return globalTypes_; 262 } 263 GlobalTypes()264 const Holder &GlobalTypes() const 265 { 266 return globalTypes_; 267 } 268 269 private: 270 Holder globalTypes_ {}; 271 ArenaMap<util::StringView, GlobalTypeId> builtinNameMappings_; 272 }; 273 } // namespace ark::es2panda::checker 274 275 #endif /* ES2PANDA_COMPILER_CHECKER_TYPES_TS_GLOBAL_TYPES_HOLDER_H */ 276