Chromium Code Reviews| Index: src/api.cc |
| diff --git a/src/api.cc b/src/api.cc |
| index a59b934d3456e5bb36882b2d108ae4a86737966f..d60fd4e8ff256b7018c4cbbaac524b3681739e6a 100644 |
| --- a/src/api.cc |
| +++ b/src/api.cc |
| @@ -2174,6 +2174,77 @@ bool Value::IsDate() const { |
| } |
| +bool Value::IsBoxedString() const { |
| + i::Isolate* isolate = i::Isolate::Current(); |
| + if (IsDeadCheck(isolate, "v8::Value::IsBoxedString()")) return false; |
| + i::Handle<i::Object> obj = Utils::OpenHandle(this); |
| + return obj->HasSpecificClassOf(isolate->heap()->String_symbol()); |
| +} |
| + |
| + |
| +bool Value::IsBoxedNumber() const { |
| + i::Isolate* isolate = i::Isolate::Current(); |
| + if (IsDeadCheck(isolate, "v8::Value::IsBoxedNumber()")) 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::IsMath() const { |
|
Vyacheslav Egorov (Chromium)
2011/07/12 20:38:12
Lets pull IsMath() from API for now.
zarko
2011/07/12 21:42:06
Done.
|
| + i::Isolate* isolate = i::Isolate::Current(); |
| + if (IsDeadCheck(isolate, "v8::Value::IsMath()")) return false; |
| + i::Handle<i::Object> obj = Utils::OpenHandle(this); |
| + if (obj->IsJSObject()) { |
| + return i::JSObject::cast(*obj) == LookupBuiltin(isolate, "$Math"); |
| + } else { |
| + return false; |
| + } |
| +} |
| + |
| + |
| +bool Value::IsBoxedBoolean() const { |
| + i::Isolate* isolate = i::Isolate::Current(); |
| + if (IsDeadCheck(isolate, "v8::Value::IsBoxedBoolean()")) 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 +2440,36 @@ void v8::Date::CheckCast(v8::Value* that) { |
| } |
| +void v8::BoxedString::CheckCast(v8::Value* that) { |
| + i::Isolate* isolate = i::Isolate::Current(); |
| + if (IsDeadCheck(isolate, "v8::BoxedString::Cast()")) return; |
| + i::Handle<i::Object> obj = Utils::OpenHandle(that); |
| + ApiCheck(obj->HasSpecificClassOf(isolate->heap()->String_symbol()), |
| + "v8::BoxedString::Cast()", |
| + "Could not convert to boxed String"); |
| +} |
| + |
| + |
| +void v8::BoxedNumber::CheckCast(v8::Value* that) { |
| + i::Isolate* isolate = i::Isolate::Current(); |
| + if (IsDeadCheck(isolate, "v8::BoxedNumber::Cast()")) return; |
| + i::Handle<i::Object> obj = Utils::OpenHandle(that); |
| + ApiCheck(obj->HasSpecificClassOf(isolate->heap()->Number_symbol()), |
| + "v8::BoxedNumber::Cast()", |
| + "Could not convert to boxed Number"); |
| +} |
| + |
| + |
| +void v8::BoxedBoolean::CheckCast(v8::Value* that) { |
| + i::Isolate* isolate = i::Isolate::Current(); |
| + if (IsDeadCheck(isolate, "v8::BoxedBoolean::Cast()")) return; |
| + i::Handle<i::Object> obj = Utils::OpenHandle(that); |
| + ApiCheck(obj->HasSpecificClassOf(isolate->heap()->Boolean_symbol()), |
| + "v8::BoxedBoolean::Cast()", |
| + "Could not convert to boxed Boolean"); |
| +} |
| + |
| + |
| 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 +4503,70 @@ Local<v8::Object> v8::Object::New() { |
| } |
| +Local<v8::Value> v8::BoxedNumber::New(double value) { |
| + i::Isolate* isolate = i::Isolate::Current(); |
| + EnsureInitializedForIsolate(isolate, "v8::BoxedNumber::New()"); |
| + LOG_API(isolate, "BoxedNumber::New"); |
| + ENTER_V8(isolate); |
| + i::Handle<i::Object> obj = isolate->factory()->NewBoxedNumber(value); |
| + return Utils::ToLocal(obj); |
| +} |
| + |
| + |
| +double v8::BoxedNumber::NumberValue() const { |
| + i::Isolate* isolate = i::Isolate::Current(); |
| + if (IsDeadCheck(isolate, "v8::BoxedNumber::NumberValue()")) return 0; |
| + LOG_API(isolate, "BoxedNumber::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::BoxedBoolean::New(bool value) { |
| + i::Isolate* isolate = i::Isolate::Current(); |
| + EnsureInitializedForIsolate(isolate, "v8::BoxedBoolean::New()"); |
| + LOG_API(isolate, "BoxedBoolean::New"); |
| + ENTER_V8(isolate); |
| + i::Handle<i::Object> obj = isolate->factory()->NewBoxedBoolean(value); |
| + return Utils::ToLocal(obj); |
| +} |
| + |
| + |
| +bool v8::BoxedBoolean::BooleanValue() const { |
| + i::Isolate* isolate = i::Isolate::Current(); |
| + if (IsDeadCheck(isolate, "v8::BoxedBoolean::BooleanValue()")) return 0; |
| + LOG_API(isolate, "BoxedBoolean::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::BoxedString::New(Handle<String> value) { |
| + i::Isolate* isolate = i::Isolate::Current(); |
| + EnsureInitializedForIsolate(isolate, "v8::BoxedString::New()"); |
| + LOG_API(isolate, "BoxedString::New"); |
| + ENTER_V8(isolate); |
| + i::Handle<i::Object> obj = |
| + isolate->factory()->NewBoxedString(Utils::OpenHandle(*value)); |
| + return Utils::ToLocal(obj); |
| +} |
| + |
| + |
| +Local<v8::String> v8::BoxedString::StringValue() const { |
| + i::Isolate* isolate = i::Isolate::Current(); |
| + if (IsDeadCheck(isolate, "v8::BoxedString::StringValue()")) { |
| + return Local<v8::String>(); |
| + } |
| + LOG_API(isolate, "BoxedString::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()"); |