current commit
261004.7 · deps: update V8 to 15.2.124.38
// Copyright 2020 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.

@abstract
@cppObjectLayoutDefinition
extern class JSFunctionOrBoundFunctionOrWrappedFunction extends JSObject {}

@cppObjectLayoutDefinition
extern class JSBoundFunction extends
    JSFunctionOrBoundFunctionOrWrappedFunction {
  // The wrapped function object.
  bound_target_function: Callable;
  // The value that is always passed as the this value when calling the wrapped
  // function.
  bound_this: JSAny|SourceTextModule;
  // A list of values whose elements are used as the first arguments to any call
  // to the wrapped function.
  bound_arguments: FixedArray;
}

@cppObjectLayoutDefinition
extern class JSWrappedFunction extends
    JSFunctionOrBoundFunctionOrWrappedFunction {
  // The wrapped function object.
  wrapped_target_function: Callable;
  // The creation context.
  context: NativeContext;
}

// This abstract class represents JS function objects with and without
// prototype. Respective subclass defines the layout of the object in memory.
// This class does not use the generated verifier, so if you change anything
// here, please also update JSFunctionVerify in objects-debug.cc.
@abstract
@cppObjectLayoutDefinition
extern class JSFunction extends JSFunctionOrBoundFunctionOrWrappedFunction {
  dispatch_handle: int32;
  @if(TAGGED_SIZE_8_BYTES) padding: int32;
  shared_function_info: SharedFunctionInfo;
  context: Context;
  feedback_cell: FeedbackCell;
}

// These operators are in order to reduce the code churn related to splitting
// JSFunction into JSFunctionWithoutPrototype and JSFunctionWithPrototype.
// Only the latter has prototype_or_initial_map field but we keep on using
// JSFunction as general function type.
extern operator '.prototype_or_initial_map' macro
    LoadJSFunctionPrototypeOrInitialMap(JSFunction): JSReceiver|Map|Tuple2|
    TheHole;
extern operator '.prototype_or_initial_map=' macro
    StoreJSFunctionPrototypeOrInitialMap(
        JSFunction, JSReceiver|Map|Tuple2|TheHole): void;

// Defines layout and instance type for JSFunctions without prototype.
@cppObjectLayoutDefinition
extern class JSFunctionWithoutPrototype extends JSFunction {}

// Defines layout and instance type for JSFunctions with prototype.
@highestInstanceTypeWithinParentClassRange
@cppObjectLayoutDefinition
extern class JSFunctionWithPrototype extends JSFunction {
  // The field can be in the following states:
  //  - TheHole - function's prototype was never accessed and thus it's not
  //      initialized yet,
  //  - JSReceiver - function has an instance prototype but initial map was
  //      not created yet (in this case the value is the prototype),
  //  - Map - this is the function's initial map and the function has an
  //      instance prototype,
  //  - Tuple2<Map|JSReceiver, JSAny && !JSReceiver> - function has a
  //      non-instance prototype, value1 contains initial map or instance
  //      prototype value, value2 contains the non-instance prototype value.
  prototype_or_initial_map: JSReceiver|Map|Tuple2|TheHole;
}

// Class constructors are special, because they are callable, but [[Call]] will
// raise an exception.
// See ES6 section 9.2.1 [[Call]] ( thisArgument, argumentsList ).
@doNotGenerateCast
@highestInstanceTypeWithinParentClassRange
extern class JSClassConstructor extends JSFunctionWithPrototype
    generates 'JSFunction';