| Index: include/v8.h | 
| diff --git a/include/v8.h b/include/v8.h | 
| index 9adb1c041cf20bd2ed12d7a04dfe07c53cd1712b..d0c4f5409c3503b1c02f58e97fb8fc38f8c2d3df 100644 | 
| --- a/include/v8.h | 
| +++ b/include/v8.h | 
| @@ -127,6 +127,8 @@ class StackFrame; | 
| class StackTrace; | 
| class String; | 
| class StringObject; | 
| +class Symbol; | 
| +class SymbolObject; | 
| class Uint32; | 
| class Utils; | 
| class Value; | 
| @@ -973,6 +975,12 @@ class V8EXPORT Value : public Data { | 
| V8_INLINE(bool IsString() const); | 
|  | 
| /** | 
| +   * Returns true if this value is a symbol. | 
| +   * This is an experimental feature. | 
| +   */ | 
| +  bool IsSymbol() const; | 
| + | 
| +  /** | 
| * Returns true if this value is a function. | 
| */ | 
| bool IsFunction() const; | 
| @@ -1033,6 +1041,12 @@ class V8EXPORT Value : public Data { | 
| bool IsStringObject() const; | 
|  | 
| /** | 
| +   * Returns true if this value is a Symbol object. | 
| +   * This is an experimental feature. | 
| +   */ | 
| +  bool IsSymbolObject() const; | 
| + | 
| +  /** | 
| * Returns true if this value is a NativeError. | 
| */ | 
| bool IsNativeError() const; | 
| @@ -1311,7 +1325,11 @@ class V8EXPORT String : public Primitive { | 
| /** Allocates a new string from 16-bit character codes.*/ | 
| static Local<String> New(const uint16_t* data, int length = -1); | 
|  | 
| -  /** Creates a symbol. Returns one if it exists already.*/ | 
| +  /** | 
| +   * Creates an internalized string (historically called a "symbol", | 
| +   * not to be confused with ES6 symbols). Returns one if it exists already. | 
| +   * TODO(rossberg): Deprecate me when the new string API is here. | 
| +   */ | 
| static Local<String> NewSymbol(const char* data, int length = -1); | 
|  | 
| /** | 
| @@ -1450,6 +1468,29 @@ class V8EXPORT String : public Primitive { | 
|  | 
|  | 
| /** | 
| + * A JavaScript symbol (ECMA-262 edition 6) | 
| + * | 
| + * This is an experimental feature. Use at your own risk. | 
| + */ | 
| +class V8EXPORT Symbol : public Primitive { | 
| + public: | 
| +  // Returns the print name string of the symbol, or undefined if none. | 
| +  Local<Value> Name() const; | 
| + | 
| +  // Create a symbol without a print name. | 
| +  static Local<Symbol> New(Isolate* isolate); | 
| + | 
| +  // Create a symbol with a print name. | 
| +  static Local<Symbol> New(Isolate *isolate, const char* data, int length = -1); | 
| + | 
| +  V8_INLINE(static Symbol* Cast(v8::Value* obj)); | 
| + private: | 
| +  Symbol(); | 
| +  static void CheckCast(v8::Value* obj); | 
| +}; | 
| + | 
| + | 
| +/** | 
| * A JavaScript number value (ECMA-262, 4.3.20) | 
| */ | 
| class V8EXPORT Number : public Primitive { | 
| @@ -1590,11 +1631,9 @@ class V8EXPORT Object : public Value { | 
| */ | 
| PropertyAttribute GetPropertyAttributes(Handle<Value> key); | 
|  | 
| -  // TODO(1245389): Replace the type-specific versions of these | 
| -  // functions with generic ones that accept a Handle<Value> key. | 
| -  bool Has(Handle<String> key); | 
| +  bool Has(Handle<Value> key); | 
|  | 
| -  bool Delete(Handle<String> key); | 
| +  bool Delete(Handle<Value> key); | 
|  | 
| // Delete a property on this object bypassing interceptors and | 
| // ignoring dont-delete attributes. | 
| @@ -1982,6 +2021,27 @@ class V8EXPORT StringObject : public Object { | 
|  | 
|  | 
| /** | 
| + * A Symbol object (ECMA-262 edition 6). | 
| + * | 
| + * This is an experimental feature. Use at your own risk. | 
| + */ | 
| +class V8EXPORT SymbolObject : public Object { | 
| + public: | 
| +  static Local<Value> New(Isolate* isolate, Handle<Symbol> value); | 
| + | 
| +  /** | 
| +   * Returns the Symbol held by the object. | 
| +   */ | 
| +  Local<Symbol> SymbolValue() const; | 
| + | 
| +  V8_INLINE(static SymbolObject* Cast(v8::Value* obj)); | 
| + | 
| + private: | 
| +  static void CheckCast(v8::Value* obj); | 
| +}; | 
| + | 
| + | 
| +/** | 
| * An instance of the built-in RegExp constructor (ECMA-262, 15.10). | 
| */ | 
| class V8EXPORT RegExp : public Object { | 
| @@ -4847,6 +4907,14 @@ bool Value::QuickIsString() const { | 
| } | 
|  | 
|  | 
| +Symbol* Symbol::Cast(v8::Value* value) { | 
| +#ifdef V8_ENABLE_CHECKS | 
| +  CheckCast(value); | 
| +#endif | 
| +  return static_cast<Symbol*>(value); | 
| +} | 
| + | 
| + | 
| Number* Number::Cast(v8::Value* value) { | 
| #ifdef V8_ENABLE_CHECKS | 
| CheckCast(value); | 
| @@ -4879,6 +4947,14 @@ StringObject* StringObject::Cast(v8::Value* value) { | 
| } | 
|  | 
|  | 
| +SymbolObject* SymbolObject::Cast(v8::Value* value) { | 
| +#ifdef V8_ENABLE_CHECKS | 
| +  CheckCast(value); | 
| +#endif | 
| +  return static_cast<SymbolObject*>(value); | 
| +} | 
| + | 
| + | 
| NumberObject* NumberObject::Cast(v8::Value* value) { | 
| #ifdef V8_ENABLE_CHECKS | 
| CheckCast(value); | 
|  |