// Copyright 2012 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef V8_OBJECTS_CONTEXTS_H_ #define V8_OBJECTS_CONTEXTS_H_ #include "include/v8-promise.h" #include "src/objects/fixed-array.h" #include "src/objects/function-kind.h" #include "src/objects/ordered-hash-table.h" // Has to be the last include (doesn't have include guards): #include "src/objects/object-macros.h" namespace v8 { namespace internal { class ConstTrackingLetCell; class JSGlobalObject; class JSGlobalProxy; class MicrotaskQueue; class NativeContext; class RegExpMatchInfo; struct VariableLookupResult; enum ContextLookupFlags { … }; // Heap-allocated activation contexts. // // Contexts are implemented as FixedArray-like objects having a fixed // header with a set of common fields. // // Note: Context must have no virtual functions and Context objects // must always be allocated via Heap::AllocateContext() or // Factory::NewContext. #define NATIVE_CONTEXT_FIELDS(V) … #include "torque-generated/src/objects/contexts-tq.inc" // JSFunctions are pairs (context, function code), sometimes also called // closures. A Context object is used to represent function contexts and // dynamically pushed 'with' contexts (or 'scopes' in ECMA-262 speak). // // At runtime, the contexts build a stack in parallel to the execution // stack, with the top-most context being the current context. All contexts // have the following slots: // // [ scope_info ] This is the scope info describing the current context. It // contains the names of statically allocated context slots, // and stack-allocated locals. The names are needed for // dynamic lookups in the presence of 'with' or 'eval', and // for the debugger. // // [ previous ] A pointer to the previous context. // // [ extension ] Additional data. This slot is only available when // ScopeInfo::HasContextExtensionSlot returns true. // // For native contexts, it contains the global object. // For module contexts, it contains the module object. // For await contexts, it contains the generator object. // For var block contexts, it may contain an "extension // object". // For with contexts, it contains an "extension object". // // An "extension object" is used to dynamically extend a // context with additional variables, namely in the // implementation of the 'with' construct and the 'eval' // construct. For instance, Context::Lookup also searches // the extension object for properties. (Storing the // extension object is the original purpose of this context // slot, hence the name.) // // In addition, function contexts with sloppy eval may have statically // allocated context slots to store local variables/functions that are accessed // from inner functions (via static context addresses) or through 'eval' // (dynamic context lookups). // The native context contains additional slots for fast access to native // properties. // // Finally, with Harmony scoping, the JSFunction representing a top level // script will have the ScriptContext rather than a FunctionContext. // Script contexts from all top-level scripts are gathered in // ScriptContextTable. class Context : public TorqueGeneratedContext<Context, HeapObject> { … }; class NativeContext : public Context { … }; class ScriptContextTableShape final : public AllStatic { … }; // A table of all script contexts. Every loaded top-level script with top-level // lexical declarations contributes its ScriptContext into this table. class ScriptContextTable : public TaggedArrayBase<ScriptContextTable, ScriptContextTableShape> { … }; ContextField; } // namespace internal } // namespace v8 #include "src/objects/object-macros-undef.h" #endif // V8_OBJECTS_CONTEXTS_H_