tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

InlinableNatives.cpp (16125B)


      1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
      2 * vim: set ts=8 sts=2 et sw=2 tw=80:
      3 * This Source Code Form is subject to the terms of the Mozilla Public
      4 * License, v. 2.0. If a copy of the MPL was not distributed with this
      5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      6 
      7 #include "jit/InlinableNatives.h"
      8 
      9 #ifdef JS_HAS_INTL_API
     10 #  include "builtin/intl/Collator.h"
     11 #  include "builtin/intl/DateTimeFormat.h"
     12 #  include "builtin/intl/DisplayNames.h"
     13 #  include "builtin/intl/DurationFormat.h"
     14 #  include "builtin/intl/ListFormat.h"
     15 #  include "builtin/intl/NumberFormat.h"
     16 #  include "builtin/intl/PluralRules.h"
     17 #  include "builtin/intl/RelativeTimeFormat.h"
     18 #  include "builtin/intl/Segmenter.h"
     19 #endif
     20 #ifdef ENABLE_EXPLICIT_RESOURCE_MANAGEMENT
     21 #  include "builtin/AsyncDisposableStackObject.h"
     22 #  include "builtin/DisposableStackObject.h"
     23 #endif
     24 #include "builtin/MapObject.h"
     25 #include "js/experimental/JitInfo.h"
     26 #include "vm/ArrayBufferObject.h"
     27 #include "vm/AsyncIteration.h"
     28 #include "vm/Iteration.h"
     29 #include "vm/SharedArrayObject.h"
     30 
     31 using namespace js;
     32 using namespace js::jit;
     33 
     34 #define ADD_NATIVE(native)                   \
     35  const JSJitInfo js::jit::JitInfo_##native{ \
     36      {nullptr},                             \
     37      {uint16_t(InlinableNative::native)},   \
     38      {0},                                   \
     39      JSJitInfo::InlinableNative};
     40 INLINABLE_NATIVE_LIST(ADD_NATIVE)
     41 #undef ADD_NATIVE
     42 
     43 const JSClass* js::jit::InlinableNativeGuardToClass(InlinableNative native) {
     44  switch (native) {
     45 #ifdef JS_HAS_INTL_API
     46    // Intl natives.
     47    case InlinableNative::IntlGuardToCollator:
     48      return &CollatorObject::class_;
     49    case InlinableNative::IntlGuardToDateTimeFormat:
     50      return &DateTimeFormatObject::class_;
     51    case InlinableNative::IntlGuardToDisplayNames:
     52      return &DisplayNamesObject::class_;
     53    case InlinableNative::IntlGuardToDurationFormat:
     54      return &DurationFormatObject::class_;
     55    case InlinableNative::IntlGuardToListFormat:
     56      return &ListFormatObject::class_;
     57    case InlinableNative::IntlGuardToNumberFormat:
     58      return &NumberFormatObject::class_;
     59    case InlinableNative::IntlGuardToPluralRules:
     60      return &PluralRulesObject::class_;
     61    case InlinableNative::IntlGuardToRelativeTimeFormat:
     62      return &RelativeTimeFormatObject::class_;
     63    case InlinableNative::IntlGuardToSegmenter:
     64      return &SegmenterObject::class_;
     65    case InlinableNative::IntlGuardToSegments:
     66      return &SegmentsObject::class_;
     67    case InlinableNative::IntlGuardToSegmentIterator:
     68      return &SegmentIteratorObject::class_;
     69 #else
     70    case InlinableNative::IntlGuardToCollator:
     71    case InlinableNative::IntlGuardToDateTimeFormat:
     72    case InlinableNative::IntlGuardToDisplayNames:
     73    case InlinableNative::IntlGuardToListFormat:
     74    case InlinableNative::IntlGuardToNumberFormat:
     75    case InlinableNative::IntlGuardToPluralRules:
     76    case InlinableNative::IntlGuardToRelativeTimeFormat:
     77    case InlinableNative::IntlGuardToSegmenter:
     78    case InlinableNative::IntlGuardToSegments:
     79    case InlinableNative::IntlGuardToSegmentIterator:
     80      MOZ_CRASH("Intl API disabled");
     81 #endif
     82 
     83    // Utility intrinsics.
     84    case InlinableNative::IntrinsicGuardToArrayIterator:
     85      return &ArrayIteratorObject::class_;
     86    case InlinableNative::IntrinsicGuardToMapIterator:
     87      return &MapIteratorObject::class_;
     88    case InlinableNative::IntrinsicGuardToSetIterator:
     89      return &SetIteratorObject::class_;
     90    case InlinableNative::IntrinsicGuardToStringIterator:
     91      return &StringIteratorObject::class_;
     92    case InlinableNative::IntrinsicGuardToRegExpStringIterator:
     93      return &RegExpStringIteratorObject::class_;
     94    case InlinableNative::IntrinsicGuardToWrapForValidIterator:
     95      return &WrapForValidIteratorObject::class_;
     96    case InlinableNative::IntrinsicGuardToIteratorHelper:
     97      return &IteratorHelperObject::class_;
     98 #ifdef NIGHTLY_BUILD
     99    case InlinableNative::IntrinsicGuardToIteratorRange:
    100      return &IteratorRangeObject::class_;
    101 #endif
    102    case InlinableNative::IntrinsicGuardToAsyncIteratorHelper:
    103      return &AsyncIteratorHelperObject::class_;
    104 #ifdef ENABLE_EXPLICIT_RESOURCE_MANAGEMENT
    105    case InlinableNative::IntrinsicGuardToAsyncDisposableStack:
    106      return &AsyncDisposableStackObject::class_;
    107    case InlinableNative::IntrinsicGuardToDisposableStack:
    108      return &DisposableStackObject::class_;
    109 #endif
    110 
    111    case InlinableNative::IntrinsicGuardToMapObject:
    112      return &MapObject::class_;
    113    case InlinableNative::IntrinsicGuardToSetObject:
    114      return &SetObject::class_;
    115    case InlinableNative::IntrinsicGuardToArrayBuffer:
    116      return &FixedLengthArrayBufferObject::class_;
    117    case InlinableNative::IntrinsicGuardToSharedArrayBuffer:
    118      return &FixedLengthSharedArrayBufferObject::class_;
    119 
    120    default:
    121      MOZ_CRASH("Not a GuardTo instruction");
    122  }
    123 }
    124 
    125 // Returns true if |native| can be inlined cross-realm. Especially inlined
    126 // natives that can allocate objects or throw exceptions shouldn't be inlined
    127 // cross-realm without a careful analysis because we might use the wrong realm!
    128 //
    129 // Note that self-hosting intrinsics are never called cross-realm. See the
    130 // MOZ_CRASH below.
    131 //
    132 // If you are adding a new inlinable native, the safe thing is to |return false|
    133 // here.
    134 bool js::jit::CanInlineNativeCrossRealm(InlinableNative native) {
    135  switch (native) {
    136    case InlinableNative::MathAbs:
    137    case InlinableNative::MathFloor:
    138    case InlinableNative::MathCeil:
    139    case InlinableNative::MathRound:
    140    case InlinableNative::MathClz32:
    141    case InlinableNative::MathSqrt:
    142    case InlinableNative::MathATan2:
    143    case InlinableNative::MathHypot:
    144    case InlinableNative::MathMax:
    145    case InlinableNative::MathMin:
    146    case InlinableNative::MathPow:
    147    case InlinableNative::MathImul:
    148    case InlinableNative::MathFRound:
    149    case InlinableNative::MathF16Round:
    150    case InlinableNative::MathTrunc:
    151    case InlinableNative::MathSign:
    152    case InlinableNative::MathSin:
    153    case InlinableNative::MathTan:
    154    case InlinableNative::MathCos:
    155    case InlinableNative::MathExp:
    156    case InlinableNative::MathLog:
    157    case InlinableNative::MathASin:
    158    case InlinableNative::MathATan:
    159    case InlinableNative::MathACos:
    160    case InlinableNative::MathLog10:
    161    case InlinableNative::MathLog2:
    162    case InlinableNative::MathLog1P:
    163    case InlinableNative::MathExpM1:
    164    case InlinableNative::MathCosH:
    165    case InlinableNative::MathSinH:
    166    case InlinableNative::MathTanH:
    167    case InlinableNative::MathACosH:
    168    case InlinableNative::MathASinH:
    169    case InlinableNative::MathATanH:
    170    case InlinableNative::MathCbrt:
    171    case InlinableNative::Boolean:
    172      return true;
    173 
    174    case InlinableNative::Array:
    175      // Cross-realm case handled by inlineArray.
    176      return true;
    177 
    178    case InlinableNative::MathRandom:
    179      // RNG state is per-realm.
    180      return false;
    181 
    182    case InlinableNative::IntlGuardToCollator:
    183    case InlinableNative::IntlGuardToDateTimeFormat:
    184    case InlinableNative::IntlGuardToDisplayNames:
    185    case InlinableNative::IntlGuardToDurationFormat:
    186    case InlinableNative::IntlGuardToListFormat:
    187    case InlinableNative::IntlGuardToNumberFormat:
    188    case InlinableNative::IntlGuardToPluralRules:
    189    case InlinableNative::IntlGuardToRelativeTimeFormat:
    190    case InlinableNative::IntlGuardToSegmenter:
    191    case InlinableNative::IntlGuardToSegments:
    192    case InlinableNative::IntlGuardToSegmentIterator:
    193    case InlinableNative::IsRegExpObject:
    194    case InlinableNative::IsOptimizableRegExpObject:
    195    case InlinableNative::IsPossiblyWrappedRegExpObject:
    196    case InlinableNative::IsRegExpPrototypeOptimizable:
    197    case InlinableNative::RegExpMatcher:
    198    case InlinableNative::RegExpSearcher:
    199    case InlinableNative::RegExpSearcherLastLimit:
    200    case InlinableNative::RegExpHasCaptureGroups:
    201    case InlinableNative::GetFirstDollarIndex:
    202    case InlinableNative::IntrinsicNewArrayIterator:
    203    case InlinableNative::IntrinsicNewStringIterator:
    204    case InlinableNative::IntrinsicNewRegExpStringIterator:
    205    case InlinableNative::IntrinsicStringReplaceString:
    206    case InlinableNative::IntrinsicStringSplitString:
    207    case InlinableNative::IntrinsicUnsafeSetReservedSlot:
    208    case InlinableNative::IntrinsicUnsafeGetReservedSlot:
    209    case InlinableNative::IntrinsicUnsafeGetObjectFromReservedSlot:
    210    case InlinableNative::IntrinsicUnsafeGetInt32FromReservedSlot:
    211    case InlinableNative::IntrinsicUnsafeGetStringFromReservedSlot:
    212    case InlinableNative::IntrinsicIsCallable:
    213    case InlinableNative::IntrinsicIsConstructor:
    214    case InlinableNative::IntrinsicToObject:
    215    case InlinableNative::IntrinsicIsObject:
    216    case InlinableNative::IntrinsicIsCrossRealmArrayConstructor:
    217    case InlinableNative::IntrinsicCanOptimizeArraySpecies:
    218    case InlinableNative::IntrinsicToInteger:
    219    case InlinableNative::IntrinsicToLength:
    220    case InlinableNative::IntrinsicIsConstructing:
    221    case InlinableNative::IntrinsicIsSuspendedGenerator:
    222    case InlinableNative::IntrinsicSubstringKernel:
    223    case InlinableNative::IntrinsicGuardToArrayIterator:
    224    case InlinableNative::IntrinsicGuardToMapIterator:
    225    case InlinableNative::IntrinsicGuardToSetIterator:
    226    case InlinableNative::IntrinsicGuardToStringIterator:
    227    case InlinableNative::IntrinsicGuardToRegExpStringIterator:
    228    case InlinableNative::IntrinsicGuardToWrapForValidIterator:
    229    case InlinableNative::IntrinsicGuardToIteratorHelper:
    230    case InlinableNative::IntrinsicGuardToAsyncIteratorHelper:
    231 #ifdef NIGHTLY_BUILD
    232    case InlinableNative::IntrinsicGuardToIteratorRange:
    233 #endif
    234    case InlinableNative::IntrinsicIsPackedArray:
    235    case InlinableNative::IntrinsicGuardToMapObject:
    236    case InlinableNative::IntrinsicGetNextMapEntryForIterator:
    237    case InlinableNative::IntrinsicGuardToSetObject:
    238    case InlinableNative::IntrinsicGetNextSetEntryForIterator:
    239    case InlinableNative::IntrinsicGuardToArrayBuffer:
    240    case InlinableNative::IntrinsicGuardToSharedArrayBuffer:
    241    case InlinableNative::IntrinsicIsTypedArrayConstructor:
    242    case InlinableNative::IntrinsicIsTypedArray:
    243    case InlinableNative::IntrinsicIsPossiblyWrappedTypedArray:
    244    case InlinableNative::IntrinsicPossiblyWrappedTypedArrayLength:
    245    case InlinableNative::IntrinsicRegExpBuiltinExec:
    246    case InlinableNative::IntrinsicRegExpBuiltinExecForTest:
    247    case InlinableNative::IntrinsicRegExpExec:
    248    case InlinableNative::IntrinsicRegExpExecForTest:
    249    case InlinableNative::IntrinsicTypedArrayLength:
    250    case InlinableNative::IntrinsicArrayIteratorPrototypeOptimizable:
    251 #ifdef ENABLE_EXPLICIT_RESOURCE_MANAGEMENT
    252    case InlinableNative::IntrinsicGuardToAsyncDisposableStack:
    253    case InlinableNative::IntrinsicGuardToDisposableStack:
    254 #endif
    255      MOZ_CRASH("Unexpected cross-realm intrinsic call");
    256 
    257    case InlinableNative::TestBailout:
    258    case InlinableNative::TestAssertFloat32:
    259    case InlinableNative::TestAssertRecoveredOnBailout:
    260      // Testing functions, not worth inlining cross-realm.
    261      return false;
    262 
    263    case InlinableNative::ArrayIsArray:
    264    case InlinableNative::ArrayJoin:
    265    case InlinableNative::ArrayPop:
    266    case InlinableNative::ArrayShift:
    267    case InlinableNative::ArrayPush:
    268    case InlinableNative::ArraySlice:
    269    case InlinableNative::ArrayBufferByteLength:
    270    case InlinableNative::AtomicsCompareExchange:
    271    case InlinableNative::AtomicsExchange:
    272    case InlinableNative::AtomicsLoad:
    273    case InlinableNative::AtomicsStore:
    274    case InlinableNative::AtomicsAdd:
    275    case InlinableNative::AtomicsSub:
    276    case InlinableNative::AtomicsAnd:
    277    case InlinableNative::AtomicsOr:
    278    case InlinableNative::AtomicsXor:
    279    case InlinableNative::AtomicsIsLockFree:
    280    case InlinableNative::AtomicsPause:
    281    case InlinableNative::BigInt:
    282    case InlinableNative::BigIntAsIntN:
    283    case InlinableNative::BigIntAsUintN:
    284    case InlinableNative::DataViewGetInt8:
    285    case InlinableNative::DataViewGetUint8:
    286    case InlinableNative::DataViewGetInt16:
    287    case InlinableNative::DataViewGetUint16:
    288    case InlinableNative::DataViewGetInt32:
    289    case InlinableNative::DataViewGetUint32:
    290    case InlinableNative::DataViewGetFloat16:
    291    case InlinableNative::DataViewGetFloat32:
    292    case InlinableNative::DataViewGetFloat64:
    293    case InlinableNative::DataViewGetBigInt64:
    294    case InlinableNative::DataViewGetBigUint64:
    295    case InlinableNative::DataViewSetInt8:
    296    case InlinableNative::DataViewSetUint8:
    297    case InlinableNative::DataViewSetInt16:
    298    case InlinableNative::DataViewSetUint16:
    299    case InlinableNative::DataViewSetInt32:
    300    case InlinableNative::DataViewSetUint32:
    301    case InlinableNative::DataViewSetFloat16:
    302    case InlinableNative::DataViewSetFloat32:
    303    case InlinableNative::DataViewSetFloat64:
    304    case InlinableNative::DataViewSetBigInt64:
    305    case InlinableNative::DataViewSetBigUint64:
    306    case InlinableNative::DataViewByteLength:
    307    case InlinableNative::DataViewByteOffset:
    308    case InlinableNative::DateGetTime:
    309    case InlinableNative::DateGetFullYear:
    310    case InlinableNative::DateGetMonth:
    311    case InlinableNative::DateGetDate:
    312    case InlinableNative::DateGetDay:
    313    case InlinableNative::DateGetHours:
    314    case InlinableNative::DateGetMinutes:
    315    case InlinableNative::DateGetSeconds:
    316    case InlinableNative::FunctionBind:
    317    case InlinableNative::MapConstructor:
    318    case InlinableNative::MapGet:
    319    case InlinableNative::MapHas:
    320    case InlinableNative::MapDelete:
    321    case InlinableNative::MapSet:
    322    case InlinableNative::MapSize:
    323    case InlinableNative::Number:
    324    case InlinableNative::NumberParseInt:
    325    case InlinableNative::NumberToString:
    326    case InlinableNative::ReflectGetPrototypeOf:
    327    case InlinableNative::RegExpDotAll:
    328    case InlinableNative::RegExpGlobal:
    329    case InlinableNative::RegExpHasIndices:
    330    case InlinableNative::RegExpIgnoreCase:
    331    case InlinableNative::RegExpMultiline:
    332    case InlinableNative::RegExpSticky:
    333    case InlinableNative::RegExpUnicode:
    334    case InlinableNative::RegExpUnicodeSets:
    335    case InlinableNative::SetConstructor:
    336    case InlinableNative::SetHas:
    337    case InlinableNative::SetDelete:
    338    case InlinableNative::SetAdd:
    339    case InlinableNative::SetSize:
    340    case InlinableNative::SharedArrayBufferByteLength:
    341    case InlinableNative::String:
    342    case InlinableNative::StringToString:
    343    case InlinableNative::StringValueOf:
    344    case InlinableNative::StringCharCodeAt:
    345    case InlinableNative::StringCodePointAt:
    346    case InlinableNative::StringFromCharCode:
    347    case InlinableNative::StringFromCodePoint:
    348    case InlinableNative::StringCharAt:
    349    case InlinableNative::StringAt:
    350    case InlinableNative::StringIncludes:
    351    case InlinableNative::StringIndexOf:
    352    case InlinableNative::StringLastIndexOf:
    353    case InlinableNative::StringStartsWith:
    354    case InlinableNative::StringEndsWith:
    355    case InlinableNative::StringToLowerCase:
    356    case InlinableNative::StringToUpperCase:
    357    case InlinableNative::StringToLocaleLowerCase:
    358    case InlinableNative::StringToLocaleUpperCase:
    359    case InlinableNative::StringTrim:
    360    case InlinableNative::StringTrimStart:
    361    case InlinableNative::StringTrimEnd:
    362    case InlinableNative::Object:
    363    case InlinableNative::ObjectCreate:
    364    case InlinableNative::ObjectIs:
    365    case InlinableNative::ObjectIsPrototypeOf:
    366    case InlinableNative::ObjectKeys:
    367    case InlinableNative::ObjectToString:
    368    case InlinableNative::TypedArrayConstructor:
    369    case InlinableNative::TypedArrayFill:
    370    case InlinableNative::TypedArraySet:
    371    case InlinableNative::TypedArraySubarray:
    372    case InlinableNative::TypedArrayLength:
    373    case InlinableNative::TypedArrayByteLength:
    374    case InlinableNative::TypedArrayByteOffset:
    375    case InlinableNative::WeakMapGet:
    376    case InlinableNative::WeakMapHas:
    377    case InlinableNative::WeakSetHas:
    378 #ifdef FUZZING_JS_FUZZILLI
    379    case InlinableNative::FuzzilliHash:
    380 #endif
    381      // Default to false for most natives.
    382      return false;
    383 
    384    case InlinableNative::Limit:
    385      break;
    386  }
    387  MOZ_CRASH("Unknown native");
    388 }