code: function ArrayFrom(arrayLike, mapfn, receiver) {
    var items = TO_OBJECT(arrayLike);
    var mapping = !IS_UNDEFINED(mapfn);
  
    if (mapping) {
      if (!IS_CALLABLE(mapfn)) {
        throw MakeTypeError(kCalledNonCallable, mapfn);
      }
    }
  
    var iterable = GetMethod(items, iteratorSymbol);
    var k;
    var result;
    var mappedValue;
    var nextValue;
  
    if (!IS_UNDEFINED(iterable)) {
      result = %IsConstructor(this) ? new this() : [];
      k = 0;
  
      for (nextValue of
           { [iteratorSymbol]() { return GetIterator(items, iterable) } }) {
        if (mapping) {
          mappedValue = %_Call(mapfn, receiver, nextValue, k);
        } else {
          mappedValue = nextValue;
        }
        %CreateDataProperty(result, k, mappedValue);
        k++;
      }
      result.length = k;
      return result;
    } else {
      var len = TO_LENGTH(items.length);
      result = %IsConstructor(this) ? new this(len) : new GlobalArray(len);
  
      for (k = 0; k < len; ++k) {
        nextValue = items[k];
        if (mapping) {
          mappedValue = %_Call(mapfn, receiver, nextValue, k);
        } else {
          mappedValue = nextValue;
        }
        %CreateDataProperty(result, k, mappedValue);
      }
  
      result.length = k;
      return result;
    }
  }
docs: ES6, draft 10-14-14, section 22.1.2.1