Index: src/api.cc |
diff --git a/src/api.cc b/src/api.cc |
index a59b934d3456e5bb36882b2d108ae4a86737966f..aa5d8ba68e8b5dc0084c9a53719f760742edc366 100644 |
--- a/src/api.cc |
+++ b/src/api.cc |
@@ -2174,6 +2174,65 @@ bool Value::IsDate() const { |
} |
+bool Value::IsStringObject() const { |
+ i::Isolate* isolate = i::Isolate::Current(); |
+ if (IsDeadCheck(isolate, "v8::Value::IsStringObject()")) return false; |
+ i::Handle<i::Object> obj = Utils::OpenHandle(this); |
+ return obj->HasSpecificClassOf(isolate->heap()->String_symbol()); |
+} |
+ |
+ |
+bool Value::IsNumberObject() const { |
+ i::Isolate* isolate = i::Isolate::Current(); |
+ if (IsDeadCheck(isolate, "v8::Value::IsNumberObject()")) return false; |
+ i::Handle<i::Object> obj = Utils::OpenHandle(this); |
+ return obj->HasSpecificClassOf(isolate->heap()->Number_symbol()); |
+} |
+ |
+ |
+static i::Object* LookupBuiltin(i::Isolate* isolate, |
+ const char* builtin_name) { |
+ i::Handle<i::String> symbol = |
+ isolate->factory()->LookupAsciiSymbol(builtin_name); |
+ i::Handle<i::JSBuiltinsObject> builtins = isolate->js_builtins_object(); |
+ return builtins->GetPropertyNoExceptionThrown(*symbol); |
+} |
+ |
+ |
+static bool CheckConstructor(i::Isolate* isolate, |
+ i::Handle<i::JSObject> obj, |
+ const char* class_name) { |
+ return obj->map()->constructor() == LookupBuiltin(isolate, class_name); |
+} |
+ |
+ |
+bool Value::IsNativeError() const { |
+ i::Isolate* isolate = i::Isolate::Current(); |
+ if (IsDeadCheck(isolate, "v8::Value::IsNativeError()")) return false; |
+ i::Handle<i::Object> obj = Utils::OpenHandle(this); |
+ if (obj->IsJSObject()) { |
+ i::Handle<i::JSObject> js_obj(i::JSObject::cast(*obj)); |
+ return CheckConstructor(isolate, js_obj, "$Error") || |
+ CheckConstructor(isolate, js_obj, "$EvalError") || |
+ CheckConstructor(isolate, js_obj, "$RangeError") || |
+ CheckConstructor(isolate, js_obj, "$ReferenceError") || |
+ CheckConstructor(isolate, js_obj, "$SyntaxError") || |
+ CheckConstructor(isolate, js_obj, "$TypeError") || |
+ CheckConstructor(isolate, js_obj, "$URIError"); |
+ } else { |
+ return false; |
+ } |
+} |
+ |
+ |
+bool Value::IsBooleanObject() const { |
+ i::Isolate* isolate = i::Isolate::Current(); |
+ if (IsDeadCheck(isolate, "v8::Value::IsBooleanObject()")) return false; |
+ i::Handle<i::Object> obj = Utils::OpenHandle(this); |
+ return obj->HasSpecificClassOf(isolate->heap()->Boolean_symbol()); |
+} |
+ |
+ |
bool Value::IsRegExp() const { |
if (IsDeadCheck(i::Isolate::Current(), "v8::Value::IsRegExp()")) return false; |
i::Handle<i::Object> obj = Utils::OpenHandle(this); |
@@ -2369,6 +2428,36 @@ void v8::Date::CheckCast(v8::Value* that) { |
} |
+void v8::StringObject::CheckCast(v8::Value* that) { |
+ i::Isolate* isolate = i::Isolate::Current(); |
+ if (IsDeadCheck(isolate, "v8::StringObject::Cast()")) return; |
+ i::Handle<i::Object> obj = Utils::OpenHandle(that); |
+ ApiCheck(obj->HasSpecificClassOf(isolate->heap()->String_symbol()), |
+ "v8::StringObject::Cast()", |
+ "Could not convert to StringObject"); |
+} |
+ |
+ |
+void v8::NumberObject::CheckCast(v8::Value* that) { |
+ i::Isolate* isolate = i::Isolate::Current(); |
+ if (IsDeadCheck(isolate, "v8::NumberObject::Cast()")) return; |
+ i::Handle<i::Object> obj = Utils::OpenHandle(that); |
+ ApiCheck(obj->HasSpecificClassOf(isolate->heap()->Number_symbol()), |
+ "v8::NumberObject::Cast()", |
+ "Could not convert to NumberObject"); |
+} |
+ |
+ |
+void v8::BooleanObject::CheckCast(v8::Value* that) { |
+ i::Isolate* isolate = i::Isolate::Current(); |
+ if (IsDeadCheck(isolate, "v8::BooleanObject::Cast()")) return; |
+ i::Handle<i::Object> obj = Utils::OpenHandle(that); |
+ ApiCheck(obj->HasSpecificClassOf(isolate->heap()->Boolean_symbol()), |
+ "v8::BooleanObject::Cast()", |
+ "Could not convert to BooleanObject"); |
+} |
+ |
+ |
void v8::RegExp::CheckCast(v8::Value* that) { |
if (IsDeadCheck(i::Isolate::Current(), "v8::RegExp::Cast()")) return; |
i::Handle<i::Object> obj = Utils::OpenHandle(that); |
@@ -4402,6 +4491,73 @@ Local<v8::Object> v8::Object::New() { |
} |
+Local<v8::Value> v8::NumberObject::New(double value) { |
+ i::Isolate* isolate = i::Isolate::Current(); |
+ EnsureInitializedForIsolate(isolate, "v8::NumberObject::New()"); |
+ LOG_API(isolate, "NumberObject::New"); |
+ ENTER_V8(isolate); |
+ i::Handle<i::Object> number = isolate->factory()->NewNumber(value); |
+ i::Handle<i::Object> obj = isolate->factory()->ToObject(number); |
+ return Utils::ToLocal(obj); |
+} |
+ |
+ |
+double v8::NumberObject::NumberValue() const { |
+ i::Isolate* isolate = i::Isolate::Current(); |
+ if (IsDeadCheck(isolate, "v8::NumberObject::NumberValue()")) return 0; |
+ LOG_API(isolate, "NumberObject::NumberValue"); |
+ i::Handle<i::Object> obj = Utils::OpenHandle(this); |
+ i::Handle<i::JSValue> jsvalue = i::Handle<i::JSValue>::cast(obj); |
+ return jsvalue->value()->Number(); |
+} |
+ |
+ |
+Local<v8::Value> v8::BooleanObject::New(bool value) { |
+ i::Isolate* isolate = i::Isolate::Current(); |
+ EnsureInitializedForIsolate(isolate, "v8::BooleanObject::New()"); |
+ LOG_API(isolate, "BooleanObject::New"); |
+ ENTER_V8(isolate); |
+ i::Handle<i::Object> boolean(value ? isolate->heap()->true_value() |
+ : isolate->heap()->false_value()); |
+ i::Handle<i::Object> obj = isolate->factory()->ToObject(boolean); |
+ return Utils::ToLocal(obj); |
+} |
+ |
+ |
+bool v8::BooleanObject::BooleanValue() const { |
+ i::Isolate* isolate = i::Isolate::Current(); |
+ if (IsDeadCheck(isolate, "v8::BooleanObject::BooleanValue()")) return 0; |
+ LOG_API(isolate, "BooleanObject::BooleanValue"); |
+ i::Handle<i::Object> obj = Utils::OpenHandle(this); |
+ i::Handle<i::JSValue> jsvalue = i::Handle<i::JSValue>::cast(obj); |
+ return jsvalue->value()->IsTrue(); |
+} |
+ |
+ |
+Local<v8::Value> v8::StringObject::New(Handle<String> value) { |
+ i::Isolate* isolate = i::Isolate::Current(); |
+ EnsureInitializedForIsolate(isolate, "v8::StringObject::New()"); |
+ LOG_API(isolate, "StringObject::New"); |
+ ENTER_V8(isolate); |
+ i::Handle<i::Object> obj = |
+ isolate->factory()->ToObject(Utils::OpenHandle(*value)); |
+ return Utils::ToLocal(obj); |
+} |
+ |
+ |
+Local<v8::String> v8::StringObject::StringValue() const { |
+ i::Isolate* isolate = i::Isolate::Current(); |
+ if (IsDeadCheck(isolate, "v8::StringObject::StringValue()")) { |
+ return Local<v8::String>(); |
+ } |
+ LOG_API(isolate, "StringObject::StringValue"); |
+ 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::String>(i::String::cast(jsvalue->value()))); |
+} |
+ |
+ |
Local<v8::Value> v8::Date::New(double time) { |
i::Isolate* isolate = i::Isolate::Current(); |
EnsureInitializedForIsolate(isolate, "v8::Date::New()"); |