Chromium Code Reviews| Index: src/api.cc |
| diff --git a/src/api.cc b/src/api.cc |
| index 65663ba5c66c6dfcb1e210d31949fa59ed642d71..ef7126b10b8e5c19f1d9fda0b9674b137f23e8b5 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,14 @@ bool Value::IsStringObject() const { |
| } |
| +bool Value::IsSymbolObject() const { |
| + 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()); |
|
Sven Panne
2013/04/08 14:04:51
Can we somehow make this test without the Isolate:
rossberg
2013/04/09 08:55:24
As discussed offline, keeping it like this for now
|
| +} |
| + |
| + |
| bool Value::IsNumberObject() const { |
| i::Isolate* isolate = i::Isolate::Current(); |
| if (IsDeadCheck(isolate, "v8::Value::IsNumberObject()")) return false; |
| @@ -2664,6 +2678,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 +2734,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()), |
|
Sven Panne
2013/04/08 14:04:51
Same comment as for IsSymbolObject.
rossberg
2013/04/09 08:55:24
Same here.
|
| + "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 +3112,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 +3288,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 +4632,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 +5479,29 @@ Local<v8::String> v8::StringObject::StringValue() const { |
| } |
| +Local<v8::Value> v8::SymbolObject::New(Handle<Symbol> value) { |
| + i::Isolate* isolate = i::Isolate::Current(); |
| + EnsureInitializedForIsolate(isolate, "v8::SymbolObject::New()"); |
| + LOG_API(isolate, "SymbolObject::New"); |
| + ENTER_V8(isolate); |
| + i::Handle<i::Object> obj = |
| + 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 +5683,30 @@ Local<String> v8::String::NewSymbol(const char* data, int length) { |
| } |
| +Local<Symbol> v8::Symbol::New() { |
| + i::Isolate* isolate = i::Isolate::Current(); |
| + EnsureInitializedForIsolate(isolate, "v8::Symbol::New()"); |
| + LOG_API(isolate, "Symbol::New()"); |
| + ENTER_V8(isolate); |
| + i::Handle<i::Symbol> result = isolate->factory()->NewSymbol(); |
| + return Utils::ToLocal(result); |
| +} |
| + |
| + |
| +Local<Symbol> v8::Symbol::New(const char* data, int length) { |
| + i::Isolate* isolate = i::Isolate::Current(); |
| + EnsureInitializedForIsolate(isolate, "v8::Symbol::New()"); |
| + LOG_API(isolate, "Symbol::New(char)"); |
| + ENTER_V8(isolate); |
| + if (length == -1) length = i::StrLength(data); |
| + i::Handle<i::String> name = isolate->factory()->NewStringFromUtf8( |
| + i::Vector<const char>(data, length)); |
| + i::Handle<i::Symbol> result = 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()"); |