text: // Copyright 2013 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.
  
  "use strict";
  
  // This file relies on the fact that the following declaration has been made
  // in runtime.js and symbol.js:
  // var $Object = global.Object;
  // var $Symbol = global.Symbol;
  
  var kBuiltinStringTags = {
    "__proto__": null,
    "Arguments": true,
    "Array": true,
    "Boolean": true,
    "Date": true,
    "Error": true,
    "Function": true,
    "Number": true,
    "RegExp": true,
    "String": true
  };
  
  DefaultObjectToString = ObjectToStringHarmony;
  // ES6 draft 08-24-14, section 19.1.3.6
  function ObjectToStringHarmony() {
    if (IS_UNDEFINED(this) && !IS_UNDETECTABLE(this)) return "[object Undefined]";
    if (IS_NULL(this)) return "[object Null]";
    var O = ToObject(this);
    var builtinTag = %_ClassOf(O);
    var tag = O[symbolToStringTag];
    if (IS_UNDEFINED(tag)) {
      tag = builtinTag;
    } else if (!IS_STRING(tag)) {
      return "[object ???]"
    } else if (tag !== builtinTag && kBuiltinStringTags[tag]) {
      return "[object ~" + tag + "]";
    }
    return "[object " + tag + "]";
  }
  
  function HarmonyToStringExtendSymbolPrototype() {
    %CheckIsBootstrapping();
  
    InstallConstants($Symbol, $Array(
      // TODO(dslomov, caitp): Move to symbol.js when shipping
     "toStringTag", symbolToStringTag
    ));
  }
  
  HarmonyToStringExtendSymbolPrototype();
  
  function HarmonyToStringExtendObjectPrototype() {
    %CheckIsBootstrapping();
  
    // Can't use InstallFunctions() because will fail in Debug mode.
    // Emulate InstallFunctions() here.
    %FunctionSetName(ObjectToStringHarmony, "toString");
    %FunctionRemovePrototype(ObjectToStringHarmony);
    %SetNativeFlag(ObjectToStringHarmony);
  
    // Set up the non-enumerable functions on the Array prototype object.
    var desc = ToPropertyDescriptor({
      value: ObjectToStringHarmony
    });
    DefineOwnProperty($Object.prototype, "toString", desc, false);
  
    %ToFastProperties($Object.prototype);
  }
  
  HarmonyToStringExtendObjectPrototype();
  