https://github.com/mozilla/gecko-dev
Raw File
Tip revision: 3ce80458676b54c02b7404359f7bb4b7be6411aa authored by Dianna Smith on 04 September 2024, 01:57:27 UTC
Bug 1915540 - addressing ESlint test failure. r=dsmith
Tip revision: 3ce8045
Reflect.js
/* 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/. */

// ES2017 draft rev a785b0832b071f505a694e1946182adeab84c972
// 7.3.17 CreateListFromArrayLike (obj [ , elementTypes ] )
function CreateListFromArrayLikeForArgs(obj) {
  // Step 1 (not applicable).

  // Step 2.
  assert(
    IsObject(obj),
    "object must be passed to CreateListFromArrayLikeForArgs"
  );

  // Step 3.
  var len = ToLength(obj.length);

  // This version of CreateListFromArrayLike is only used for argument lists.
  if (len > MAX_ARGS_LENGTH) {
    ThrowRangeError(JSMSG_TOO_MANY_ARGUMENTS);
  }

  // Steps 4-6.
  var list = std_Array(len);
  for (var i = 0; i < len; i++) {
    DefineDataProperty(list, i, obj[i]);
  }

  // Step 7.
  return list;
}

// ES2017 draft rev a785b0832b071f505a694e1946182adeab84c972
// 26.1.1 Reflect.apply ( target, thisArgument, argumentsList )
function Reflect_apply(target, thisArgument, argumentsList) {
  // Step 1.
  if (!IsCallable(target)) {
    ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(0, target));
  }

  // Step 2.
  if (!IsObject(argumentsList)) {
    ThrowTypeError(
      JSMSG_OBJECT_REQUIRED_ARG,
      "`argumentsList`",
      "Reflect.apply",
      ToSource(argumentsList)
    );
  }

  // Steps 2-4.
  return callFunction(std_Function_apply, target, thisArgument, argumentsList);
}
// This function is only barely too long for normal inlining.
SetIsInlinableLargeFunction(Reflect_apply);

// ES2017 draft rev a785b0832b071f505a694e1946182adeab84c972
// 26.1.2 Reflect.construct ( target, argumentsList [ , newTarget ] )
function Reflect_construct(target, argumentsList /*, newTarget*/) {
  // Step 1.
  if (!IsConstructor(target)) {
    ThrowTypeError(JSMSG_NOT_CONSTRUCTOR, DecompileArg(0, target));
  }

  // Steps 2-3.
  var newTarget;
  if (ArgumentsLength() > 2) {
    newTarget = GetArgument(2);
    if (!IsConstructor(newTarget)) {
      ThrowTypeError(JSMSG_NOT_CONSTRUCTOR, DecompileArg(2, newTarget));
    }
  } else {
    newTarget = target;
  }

  // Step 4.
  if (!IsObject(argumentsList)) {
    ThrowTypeError(
      JSMSG_OBJECT_REQUIRED_ARG,
      "`argumentsList`",
      "Reflect.construct",
      ToSource(argumentsList)
    );
  }

  // Fast path when we can avoid calling CreateListFromArrayLikeForArgs().
  var args =
    IsPackedArray(argumentsList) && argumentsList.length <= MAX_ARGS_LENGTH
      ? argumentsList
      : CreateListFromArrayLikeForArgs(argumentsList);

  // Step 5.
  switch (args.length) {
    case 0:
      return constructContentFunction(target, newTarget);
    case 1:
      return constructContentFunction(target, newTarget, SPREAD(args, 1));
    case 2:
      return constructContentFunction(target, newTarget, SPREAD(args, 2));
    case 3:
      return constructContentFunction(target, newTarget, SPREAD(args, 3));
    case 4:
      return constructContentFunction(target, newTarget, SPREAD(args, 4));
    case 5:
      return constructContentFunction(target, newTarget, SPREAD(args, 5));
    case 6:
      return constructContentFunction(target, newTarget, SPREAD(args, 6));
    case 7:
      return constructContentFunction(target, newTarget, SPREAD(args, 7));
    case 8:
      return constructContentFunction(target, newTarget, SPREAD(args, 8));
    case 9:
      return constructContentFunction(target, newTarget, SPREAD(args, 9));
    case 10:
      return constructContentFunction(target, newTarget, SPREAD(args, 10));
    case 11:
      return constructContentFunction(target, newTarget, SPREAD(args, 11));
    case 12:
      return constructContentFunction(target, newTarget, SPREAD(args, 12));
    default:
      return ConstructFunction(target, newTarget, args);
  }
}

// ES2017 draft rev 6859bb9ccaea9c6ede81d71e5320e3833b92cb3e
// 26.1.3 Reflect.defineProperty ( target, propertyKey, attributes )
function Reflect_defineProperty(obj, propertyKey, attributes) {
  // Steps 1-4.
  return ObjectOrReflectDefineProperty(obj, propertyKey, attributes, false);
}

// ES2017 draft rev 6859bb9ccaea9c6ede81d71e5320e3833b92cb3e
// 26.1.6 Reflect.getOwnPropertyDescriptor ( target, propertyKey )
function Reflect_getOwnPropertyDescriptor(target, propertyKey) {
  // Step 1.
  if (!IsObject(target)) {
    ThrowTypeError(JSMSG_OBJECT_REQUIRED, DecompileArg(0, target));
  }

  // Steps 2-3.
  // The other steps are identical to Object.getOwnPropertyDescriptor().
  return ObjectGetOwnPropertyDescriptor(target, propertyKey);
}

// ES2017 draft rev a785b0832b071f505a694e1946182adeab84c972
// 26.1.8 Reflect.has ( target, propertyKey )
function Reflect_has(target, propertyKey) {
  // Step 1.
  if (!IsObject(target)) {
    ThrowTypeError(
      JSMSG_OBJECT_REQUIRED_ARG,
      "`target`",
      "Reflect.has",
      ToSource(target)
    );
  }

  // Steps 2-3 are identical to the runtime semantics of the "in" operator.
  return propertyKey in target;
}

// ES2018 draft rev 0525bb33861c7f4e9850f8a222c89642947c4b9c
// 26.1.5 Reflect.get ( target, propertyKey [ , receiver ] )
function Reflect_get(target, propertyKey /*, receiver*/) {
  // Step 1.
  if (!IsObject(target)) {
    ThrowTypeError(
      JSMSG_OBJECT_REQUIRED_ARG,
      "`target`",
      "Reflect.get",
      ToSource(target)
    );
  }

  // Step 3 (reordered).
  if (ArgumentsLength() > 2) {
    // Steps 2, 4.
    return getPropertySuper(target, propertyKey, GetArgument(2));
  }

  // Steps 2, 4.
  return target[propertyKey];
}
back to top