diff options
Diffstat (limited to '')
-rw-r--r-- | js/src/vm/StencilEnums.h | 328 |
1 files changed, 328 insertions, 0 deletions
diff --git a/js/src/vm/StencilEnums.h b/js/src/vm/StencilEnums.h new file mode 100644 index 0000000000..65d9116286 --- /dev/null +++ b/js/src/vm/StencilEnums.h @@ -0,0 +1,328 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * vim: set ts=8 sts=2 et sw=2 tw=80: + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef vm_StencilEnums_h +#define vm_StencilEnums_h + +#include <stdint.h> // uint8_t + +// +// Enum definitions shared between frontend, stencil, and the VM. +// + +namespace js { + +// [SMDOC] Try Notes +// +// Trynotes are attached to regions that are involved with +// exception unwinding. They can be broken up into four categories: +// +// 1. Catch and Finally: Basic exception handling. A Catch trynote +// covers the range of the associated try. A Finally trynote covers +// the try and the catch. +// +// 2. ForIn and Destructuring: These operations create an iterator +// which must be cleaned up (by calling IteratorClose) during +// exception unwinding. +// +// 3. ForOf and ForOfIterclose: For-of loops handle unwinding using +// catch blocks. These trynotes are used for for-of breaks/returns, +// which create regions that are lexically within a for-of block, +// but logically outside of it. See TryNoteIter::settle for more +// details. +// +// 4. Loop: This represents normal for/while/do-while loops. It is +// unnecessary for exception unwinding, but storing the boundaries +// of loops here is helpful for heuristics that need to know +// whether a given op is inside a loop. +enum class TryNoteKind : uint8_t { + Catch, + Finally, + ForIn, + Destructuring, + ForOf, + ForOfIterClose, + Loop +}; + +// [SMDOC] Script Flags +// +// Interpreted scripts represented by the BaseScript type use two flag words to +// encode an assortment of conditions and attributes about the script. +// +// The "immutable" flags are a combination of input flags describing aspects of +// the execution context that affect parsing (such as if we are an ES module or +// normal script), and flags derived from source text. These flags are preserved +// during cloning and serializing. As well, they should never change after the +// BaseScript is created (although there are currently a few exceptions for +// de-/re-lazification that remain). +// +// The "mutable" flags are temporary flags that are used by subsystems in the +// engine such as the debugger or JITs. These flags are not preserved through +// serialization or cloning since the attributes are generally associated with +// one specific instance of a BaseScript. + +enum class ImmutableScriptFlagsEnum : uint32_t { + // Input Flags + // + // These flags are from CompileOptions or the Parser entry point. They + // generally cannot be derived from the source text alone. + // ---- + + // A script may have one of the following kinds: Global, Eval, Module, + // Function. At most one flag can be set, with a default of Global. + IsForEval = 1 << 0, + IsModule = 1 << 1, + IsFunction = 1 << 2, + + // The script is compiled as engine-internal self-hosted JavaScript. This mode + // is used to implement certain library functions and has special parse, + // bytecode, and runtime behaviour that differs from normal script. + SelfHosted = 1 << 3, + + // The script was compiled with the default mode set to strict mode. Note that + // this tracks the default value, while the actual mode used (after processing + // source and its directives) is the `Strict` flag below. + ForceStrict = 1 << 4, + + // The script has a non-syntactic scope on its environment chain. That is, + // there may be objects about which we know nothing between the outermost + // syntactic scope and the global. + HasNonSyntacticScope = 1 << 5, + + // The script return value will not be used and simplified code will be + // generated. This can only be applied to top-level scripts. The value this + // script returns will be UndefinedValue instead of what the spec normally + // prescribes. + NoScriptRval = 1 << 6, + + // TreatAsRunOnce roughly indicates that a script is expected to be run no + // more than once. This affects optimizations and heuristics. + // + // On top-level global/eval/module scripts, this is set when the embedding + // ensures this script will not be re-used. In this case, parser literals may + // be exposed directly instead of being cloned. + TreatAsRunOnce = 1 << 7, + // ---- + + // Parser Flags + // + // Flags computed by the Parser from the source text and input flags. + // ---- + + // Generated code will execute in strict mode. This is due to either the + // ForceStrict flag being specified above, or due to source text itself (such + // as "use strict" directives). + Strict = 1 << 8, + + // Script is parsed with a top-level goal of Module. This may be a top-level + // or an inner-function script. + HasModuleGoal = 1 << 9, + + // Script contains inner functions. + // + // Note: This prevents relazification since inner function close-over the + // current scripts scopes. + HasInnerFunctions = 1 << 10, + + // There is a direct eval statement in this script OR in any of its inner + // functions. + // + // Note: This prevents relazification since it can introduce inner functions. + HasDirectEval = 1 << 11, + + // The (static) bindings of this script must support dynamic name access for + // read/write. The environment chain is used to do these dynamic lookups and + // optimizations to avoid allocating environments are suppressed. + // + // This includes direct-eval, `with`, and `delete` in this script OR in any of + // its inner functions. + // + // Note: Access through the arguments object is not considered dynamic binding + // access since it does not go through the normal name lookup mechanism. + BindingsAccessedDynamically = 1 << 12, + + // A tagged template exists in the body (which will use JSOp::CallSiteObj in + // bytecode). + // + // Note: This prevents relazification since the template's object is + // observable to the user and cannot be recreated. + HasCallSiteObj = 1 << 13, + + // Parser Flags for Functions + // ---- + + // This function's initial prototype is one of Function, GeneratorFunction, + // AsyncFunction, or AsyncGeneratorFunction as indicated by these flags. + // + // If either of these flags is set, the script may suspend and resume as it + // executes. Stack frames for this script also have a generator object. + IsAsync = 1 << 14, + IsGenerator = 1 << 15, + + // This function's body serves as the `var` environment for a non-strict + // direct eval. This matters because it's the only way bindings can be + // dynamically added to a local environment, possibly shadowing other + // variables. + FunHasExtensibleScope = 1 << 16, + + // This function has an internal .this binding and we need to emit + // JSOp::FunctionThis in the prologue to initialize it. This binding may be + // used directly for "this", or indirectly (such as class constructors). + FunctionHasThisBinding = 1 << 17, + + // This function is a class method that must uses an internal [[HomeObject]] + // slot. This slot is initialized when the class definition is executed in the + // enclosing function. + NeedsHomeObject = 1 << 18, + + // This function is a constructor for a derived class. This is a class that + // uses the `extends` syntax. + IsDerivedClassConstructor = 1 << 19, + + // This function is a field initializer lambda for a class. + IsFieldInitializer = 1 << 20, + + // This function has a rest (`...`) parameter. + HasRest = 1 << 21, + + // This function needs a call object or named lambda environment to be created + // in order to execute the function. This is done in the Stack or JIT frame + // setup code _before_ the bytecode prologue starts. + NeedsFunctionEnvironmentObjects = 1 << 22, + + // An extra VarScope is used as the body scope instead of the normal + // FunctionScope. This is needed when parameter expressions are used AND the + // function has var bindings or a sloppy-direct-eval. For example, + // `function(x = eval("")) { var y; }` + FunctionHasExtraBodyVarScope = 1 << 23, + + // This function must define the implicit `arguments` binding on the function + // scope. If there are no free uses or an appropriate explicit binding exists, + // then this flag is unset. + // + // Note: Parameter expressions will not see an explicit `var arguments;` + // binding in the body and an implicit binding on the function-scope must + // still be used in that case. + ShouldDeclareArguments = 1 << 24, + + // This function has a local (implicit or explicit) `arguments` binding. This + // binding is initialized by the JSOp::Arguments bytecode. + // + // Technically, every function has a binding named `arguments`. Internally, + // this binding is only added when `arguments` is mentioned by the function + // body. + // + // Examples: + // ``` + // // Explicit definition + // function f() { var arguments; return arguments; } + // + // // Implicit use + // function f() { return arguments; } + // + // // Implicit use in arrow function + // function f() { return () => arguments; } + // + // // Implicit use in parameter expression + // function f(a = arguments) { return a; } + // ``` + ArgumentsHasVarBinding = 1 << 25, + + // This function requires the `arguments` binding to be initialized with the + // real arguments object. If unset, but ArgumentsHasVarBinding is set then an + // analysis pass will determine if an efficient placeholder value can be used + // instead. + // See the implementation of JSOp::Arguments opcode. + AlwaysNeedsArgsObj = 1 << 26, + + // This function must use the "mapped" form of an arguments object. This flag + // is set independently of whether we actually use an `arguments` binding. The + // conditions are specified in the ECMAScript spec. + HasMappedArgsObj = 1 << 27, +}; + +enum class MutableScriptFlagsEnum : uint32_t { + // Number of times the |warmUpCount| was forcibly discarded. The counter is + // reset when a script is successfully jit-compiled. + WarmupResets_MASK = 0xFF, + + // If treatAsRunOnce, whether script has executed. + HasRunOnce = 1 << 8, + + // Script has been reused for a clone. + HasBeenCloned = 1 << 9, + + // Script has an entry in Realm::scriptCountsMap. + HasScriptCounts = 1 << 10, + + // Script has an entry in Realm::debugScriptMap. + HasDebugScript = 1 << 11, + + // See: JSScript::ensureHasAnalyzedArgsUsage. + NeedsArgsAnalysis = 1 << 12, + NeedsArgsObj = 1 << 13, + + // Script supports relazification where it releases bytecode and gcthings to + // save memory. This process is opt-in since various complexities may disallow + // this for some scripts. + // NOTE: Must check for isRelazifiable() before setting this flag. + AllowRelazify = 1 << 14, + + // Set if the script has opted into spew. + SpewEnabled = 1 << 15, + + // Set if we care about a script's final warmup count. + NeedsFinalWarmUpCount = 1 << 16, + + // + // IonMonkey compilation hints. + // + + // Whether Baseline or Ion compilation has been disabled for this script. + // IonDisabled is equivalent to |jitScript->canIonCompile() == false| but + // JitScript can be discarded on GC and we don't want this to affect + // observable behavior (see ArgumentsGetterImpl comment). + BaselineDisabled = 1 << 17, + IonDisabled = 1 << 18, + + // Script has had hoisted bounds checks fail. + FailedBoundsCheck = 1 << 19, + + // Script has had hoisted shape guard fail. + FailedShapeGuard = 1 << 20, + + // Script has had instruction hoisted by LICM fail. + HadLICMInvalidation = 1 << 21, + + // An overflow happened where Range Analysis hoped it would not. The next + // compile should be more conservative. + HadEagerTruncationBailout = 1 << 22, + + // This script should not be inlined into others. This happens after inlining + // has failed. + Uninlineable = 1 << 23, + + // An idempotent IC has triggered invalidation and should be deoptimized. + InvalidatedIdempotentCache = 1 << 24, + + // Lexical check did fail and bail out. + FailedLexicalCheck = 1 << 25, + + // A guard inserted by phi specialization failed. + HadSpeculativePhiBailout = 1 << 26, + + // An unbox folded with a load failed. + HadUnboxFoldingBailout = 1 << 27, + + // Large self-hosted methods that should be inlined anyway by the JIT for + // performance reasons can be marked with this flag. + IsInlinableLargeFunction = 1 << 28, +}; + +} // namespace js + +#endif /* vm_StencilEnums_h */ |