// Copyright 2018 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.

#include 'src/builtins/builtins-collections-gen.h'

namespace collections {
  @export
  macro LoadKeyValuePairNoSideEffects(implicit context: Context)(o: JSAny):
      KeyValuePair labels MayHaveSideEffects {
    typeswitch (o) {
      case (a: FastJSArray): {
        const length: Smi = a.length;
        typeswitch (a.elements) {
          case (elements: FixedArray): {
            return KeyValuePair{
              key: length > 0 ? array::LoadElementOrUndefined(elements, 0) :
                                Undefined,
              value: length > 1 ? array::LoadElementOrUndefined(elements, 1) :
                                  Undefined
            };
          }
          case (elements: FixedDoubleArray): {
            return KeyValuePair{
              key: length > 0 ? array::LoadElementOrUndefined(elements, 0) :
                                Undefined,
              value: length > 1 ? array::LoadElementOrUndefined(elements, 1) :
                                  Undefined
            };
          }
          case (FixedArrayBase): deferred {
            unreachable;
          }
        }
      }
      case (JSReceiver): {
        goto MayHaveSideEffects;
      }
      case (o: JSAny): deferred {
        ThrowTypeError(MessageTemplate::kIteratorValueNotAnObject, o);
      }
    }
  }

  @export
  transitioning macro LoadKeyValuePair(implicit context: Context)(o: JSAny):
      KeyValuePair {
    try {
      return LoadKeyValuePairNoSideEffects(o) otherwise Generic;
    }
    label Generic {
      return KeyValuePair{
        key: GetProperty(o, Convert<Smi>(0)),
        value: GetProperty(o, Convert<Smi>(1))
      };
    }
  }
}