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()"); |