Index: src/api.cc |
diff --git a/src/api.cc b/src/api.cc |
index 65663ba5c66c6dfcb1e210d31949fa59ed642d71..86508887de14566a49b6e371a02f946a48d6a0db 100644 |
--- a/src/api.cc |
+++ b/src/api.cc |
@@ -2367,6 +2367,12 @@ bool Value::FullIsString() const { |
} |
+bool Value::IsSymbol() const { |
+ if (IsDeadCheck(i::Isolate::Current(), "v8::Value::IsSymbol()")) return false; |
+ return Utils::OpenHandle(this)->IsSymbol(); |
+} |
+ |
+ |
bool Value::IsArray() const { |
if (IsDeadCheck(i::Isolate::Current(), "v8::Value::IsArray()")) return false; |
return Utils::OpenHandle(this)->IsJSArray(); |
@@ -2451,6 +2457,16 @@ bool Value::IsStringObject() const { |
} |
+bool Value::IsSymbolObject() const { |
+ // TODO(svenpanne): these and other test functions should be written such |
+ // that they do not use Isolate::Current(). |
+ i::Isolate* isolate = i::Isolate::Current(); |
+ if (IsDeadCheck(isolate, "v8::Value::IsSymbolObject()")) return false; |
+ i::Handle<i::Object> obj = Utils::OpenHandle(this); |
+ return obj->HasSpecificClassOf(isolate->heap()->Symbol_string()); |
+} |
+ |
+ |
bool Value::IsNumberObject() const { |
i::Isolate* isolate = i::Isolate::Current(); |
if (IsDeadCheck(isolate, "v8::Value::IsNumberObject()")) return false; |
@@ -2664,6 +2680,15 @@ void v8::String::CheckCast(v8::Value* that) { |
} |
+void v8::Symbol::CheckCast(v8::Value* that) { |
+ if (IsDeadCheck(i::Isolate::Current(), "v8::Symbol::Cast()")) return; |
+ i::Handle<i::Object> obj = Utils::OpenHandle(that); |
+ ApiCheck(obj->IsSymbol(), |
+ "v8::Symbol::Cast()", |
+ "Could not convert to symbol"); |
+} |
+ |
+ |
void v8::Number::CheckCast(v8::Value* that) { |
if (IsDeadCheck(i::Isolate::Current(), "v8::Number::Cast()")) return; |
i::Handle<i::Object> obj = Utils::OpenHandle(that); |
@@ -2711,6 +2736,16 @@ void v8::StringObject::CheckCast(v8::Value* that) { |
} |
+void v8::SymbolObject::CheckCast(v8::Value* that) { |
+ i::Isolate* isolate = i::Isolate::Current(); |
+ if (IsDeadCheck(isolate, "v8::SymbolObject::Cast()")) return; |
+ i::Handle<i::Object> obj = Utils::OpenHandle(that); |
+ ApiCheck(obj->HasSpecificClassOf(isolate->heap()->Symbol_string()), |
+ "v8::SymbolObject::Cast()", |
+ "Could not convert to SymbolObject"); |
+} |
+ |
+ |
void v8::NumberObject::CheckCast(v8::Value* that) { |
i::Isolate* isolate = i::Isolate::Current(); |
if (IsDeadCheck(isolate, "v8::NumberObject::Cast()")) return; |
@@ -3079,13 +3114,13 @@ PropertyAttribute v8::Object::GetPropertyAttributes(v8::Handle<Value> key) { |
i::HandleScope scope(isolate); |
i::Handle<i::JSObject> self = Utils::OpenHandle(this); |
i::Handle<i::Object> key_obj = Utils::OpenHandle(*key); |
- if (!key_obj->IsString()) { |
+ if (!key_obj->IsName()) { |
EXCEPTION_PREAMBLE(isolate); |
key_obj = i::Execution::ToString(key_obj, &has_pending_exception); |
EXCEPTION_BAILOUT_CHECK(isolate, static_cast<PropertyAttribute>(NONE)); |
} |
- i::Handle<i::String> key_string = i::Handle<i::String>::cast(key_obj); |
- PropertyAttributes result = self->GetPropertyAttribute(*key_string); |
+ i::Handle<i::Name> key_name = i::Handle<i::Name>::cast(key_obj); |
+ PropertyAttributes result = self->GetPropertyAttribute(*key_name); |
if (result == ABSENT) return static_cast<PropertyAttribute>(NONE); |
return static_cast<PropertyAttribute>(result); |
} |
@@ -3255,24 +3290,32 @@ Local<String> v8::Object::GetConstructorName() { |
} |
-bool v8::Object::Delete(v8::Handle<String> key) { |
+bool v8::Object::Delete(v8::Handle<Value> key) { |
i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); |
ON_BAILOUT(isolate, "v8::Object::Delete()", return false); |
ENTER_V8(isolate); |
i::HandleScope scope(isolate); |
i::Handle<i::JSObject> self = Utils::OpenHandle(this); |
- i::Handle<i::String> key_obj = Utils::OpenHandle(*key); |
- return i::JSObject::DeleteProperty(self, key_obj)->IsTrue(); |
+ i::Handle<i::Object> key_obj = Utils::OpenHandle(*key); |
+ EXCEPTION_PREAMBLE(isolate); |
+ i::Handle<i::Object> obj = i::DeleteProperty(self, key_obj); |
+ has_pending_exception = obj.is_null(); |
+ EXCEPTION_BAILOUT_CHECK(isolate, false); |
+ return obj->IsTrue(); |
} |
-bool v8::Object::Has(v8::Handle<String> key) { |
+bool v8::Object::Has(v8::Handle<Value> key) { |
i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); |
ON_BAILOUT(isolate, "v8::Object::Has()", return false); |
ENTER_V8(isolate); |
- i::Handle<i::JSObject> self = Utils::OpenHandle(this); |
- i::Handle<i::String> key_obj = Utils::OpenHandle(*key); |
- return self->HasProperty(*key_obj); |
+ i::Handle<i::JSReceiver> self = Utils::OpenHandle(this); |
+ i::Handle<i::Object> key_obj = Utils::OpenHandle(*key); |
+ EXCEPTION_PREAMBLE(isolate); |
+ i::Handle<i::Object> obj = i::HasProperty(self, key_obj); |
+ has_pending_exception = obj.is_null(); |
+ EXCEPTION_BAILOUT_CHECK(isolate, false); |
+ return obj->IsTrue(); |
} |
@@ -4591,6 +4634,15 @@ const v8::String::ExternalAsciiStringResource* |
} |
+Local<Value> Symbol::Name() const { |
+ if (IsDeadCheck(i::Isolate::Current(), "v8::Symbol::Name()")) |
+ return Local<Value>(); |
+ i::Handle<i::Symbol> sym = Utils::OpenHandle(this); |
+ i::Handle<i::Object> name(sym->name(), sym->GetIsolate()); |
+ return Utils::ToLocal(name); |
+} |
+ |
+ |
double Number::Value() const { |
if (IsDeadCheck(i::Isolate::Current(), "v8::Number::Value()")) return 0; |
i::Handle<i::Object> obj = Utils::OpenHandle(this); |
@@ -5429,6 +5481,29 @@ Local<v8::String> v8::StringObject::StringValue() const { |
} |
+Local<v8::Value> v8::SymbolObject::New(Isolate* isolate, Handle<Symbol> value) { |
+ i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
+ EnsureInitializedForIsolate(i_isolate, "v8::SymbolObject::New()"); |
+ LOG_API(i_isolate, "SymbolObject::New"); |
+ ENTER_V8(i_isolate); |
+ i::Handle<i::Object> obj = |
+ i_isolate->factory()->ToObject(Utils::OpenHandle(*value)); |
+ return Utils::ToLocal(obj); |
+} |
+ |
+ |
+Local<v8::Symbol> v8::SymbolObject::SymbolValue() const { |
+ i::Isolate* isolate = i::Isolate::Current(); |
+ if (IsDeadCheck(isolate, "v8::SymbolObject::SymbolValue()")) |
+ return Local<v8::Symbol>(); |
+ LOG_API(isolate, "SymbolObject::SymbolValue"); |
+ i::Handle<i::Object> obj = Utils::OpenHandle(this); |
+ i::Handle<i::JSValue> jsvalue = i::Handle<i::JSValue>::cast(obj); |
+ return Utils::ToLocal( |
+ i::Handle<i::Symbol>(i::Symbol::cast(jsvalue->value()))); |
+} |
+ |
+ |
Local<v8::Value> v8::Date::New(double time) { |
i::Isolate* isolate = i::Isolate::Current(); |
EnsureInitializedForIsolate(isolate, "v8::Date::New()"); |
@@ -5610,6 +5685,30 @@ Local<String> v8::String::NewSymbol(const char* data, int length) { |
} |
+Local<Symbol> v8::Symbol::New(Isolate* isolate) { |
+ i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
+ EnsureInitializedForIsolate(i_isolate, "v8::Symbol::New()"); |
+ LOG_API(i_isolate, "Symbol::New()"); |
+ ENTER_V8(i_isolate); |
+ i::Handle<i::Symbol> result = i_isolate->factory()->NewSymbol(); |
+ return Utils::ToLocal(result); |
+} |
+ |
+ |
+Local<Symbol> v8::Symbol::New(Isolate* isolate, const char* data, int length) { |
+ i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
+ EnsureInitializedForIsolate(i_isolate, "v8::Symbol::New()"); |
+ LOG_API(i_isolate, "Symbol::New(char)"); |
+ ENTER_V8(i_isolate); |
+ if (length == -1) length = i::StrLength(data); |
+ i::Handle<i::String> name = i_isolate->factory()->NewStringFromUtf8( |
+ i::Vector<const char>(data, length)); |
+ i::Handle<i::Symbol> result = i_isolate->factory()->NewSymbol(); |
+ result->set_name(*name); |
+ return Utils::ToLocal(result); |
+} |
+ |
+ |
Local<Number> v8::Number::New(double value) { |
i::Isolate* isolate = i::Isolate::Current(); |
EnsureInitializedForIsolate(isolate, "v8::Number::New()"); |