Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(382)

Side by Side Diff: src/api.cc

Issue 7344013: Expose APIs for detecting boxed primitives, native errors and Math. (Closed) Base URL: git://github.com/v8/v8.git@master
Patch Set: Get rid of unclear 'box' comments/strings. Created 9 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 2156 matching lines...) Expand 10 before | Expand all | Expand 10 after
2167 2167
2168 2168
2169 bool Value::IsDate() const { 2169 bool Value::IsDate() const {
2170 i::Isolate* isolate = i::Isolate::Current(); 2170 i::Isolate* isolate = i::Isolate::Current();
2171 if (IsDeadCheck(isolate, "v8::Value::IsDate()")) return false; 2171 if (IsDeadCheck(isolate, "v8::Value::IsDate()")) return false;
2172 i::Handle<i::Object> obj = Utils::OpenHandle(this); 2172 i::Handle<i::Object> obj = Utils::OpenHandle(this);
2173 return obj->HasSpecificClassOf(isolate->heap()->Date_symbol()); 2173 return obj->HasSpecificClassOf(isolate->heap()->Date_symbol());
2174 } 2174 }
2175 2175
2176 2176
2177 bool Value::IsStringObject() const {
2178 i::Isolate* isolate = i::Isolate::Current();
2179 if (IsDeadCheck(isolate, "v8::Value::IsStringObject()")) return false;
2180 i::Handle<i::Object> obj = Utils::OpenHandle(this);
2181 return obj->HasSpecificClassOf(isolate->heap()->String_symbol());
2182 }
2183
2184
2185 bool Value::IsNumberObject() const {
2186 i::Isolate* isolate = i::Isolate::Current();
2187 if (IsDeadCheck(isolate, "v8::Value::IsNumberObject()")) return false;
2188 i::Handle<i::Object> obj = Utils::OpenHandle(this);
2189 return obj->HasSpecificClassOf(isolate->heap()->Number_symbol());
2190 }
2191
2192
2193 static i::Object* LookupBuiltin(i::Isolate* isolate,
2194 const char* builtin_name) {
2195 i::Handle<i::String> symbol =
2196 isolate->factory()->LookupAsciiSymbol(builtin_name);
2197 i::Handle<i::JSBuiltinsObject> builtins = isolate->js_builtins_object();
2198 return builtins->GetPropertyNoExceptionThrown(*symbol);
2199 }
2200
2201
2202 static bool CheckConstructor(i::Isolate* isolate,
2203 i::Handle<i::JSObject> obj,
2204 const char* class_name) {
2205 return obj->map()->constructor() == LookupBuiltin(isolate, class_name);
2206 }
2207
2208
2209 bool Value::IsNativeError() const {
2210 i::Isolate* isolate = i::Isolate::Current();
2211 if (IsDeadCheck(isolate, "v8::Value::IsNativeError()")) return false;
2212 i::Handle<i::Object> obj = Utils::OpenHandle(this);
2213 if (obj->IsJSObject()) {
2214 i::Handle<i::JSObject> js_obj(i::JSObject::cast(*obj));
2215 return CheckConstructor(isolate, js_obj, "$Error") ||
2216 CheckConstructor(isolate, js_obj, "$EvalError") ||
2217 CheckConstructor(isolate, js_obj, "$RangeError") ||
2218 CheckConstructor(isolate, js_obj, "$ReferenceError") ||
2219 CheckConstructor(isolate, js_obj, "$SyntaxError") ||
2220 CheckConstructor(isolate, js_obj, "$TypeError") ||
2221 CheckConstructor(isolate, js_obj, "$URIError");
2222 } else {
2223 return false;
2224 }
2225 }
2226
2227
2228 bool Value::IsBooleanObject() const {
2229 i::Isolate* isolate = i::Isolate::Current();
2230 if (IsDeadCheck(isolate, "v8::Value::IsBooleanObject()")) return false;
2231 i::Handle<i::Object> obj = Utils::OpenHandle(this);
2232 return obj->HasSpecificClassOf(isolate->heap()->Boolean_symbol());
2233 }
2234
2235
2177 bool Value::IsRegExp() const { 2236 bool Value::IsRegExp() const {
2178 if (IsDeadCheck(i::Isolate::Current(), "v8::Value::IsRegExp()")) return false; 2237 if (IsDeadCheck(i::Isolate::Current(), "v8::Value::IsRegExp()")) return false;
2179 i::Handle<i::Object> obj = Utils::OpenHandle(this); 2238 i::Handle<i::Object> obj = Utils::OpenHandle(this);
2180 return obj->IsJSRegExp(); 2239 return obj->IsJSRegExp();
2181 } 2240 }
2182 2241
2183 2242
2184 Local<String> Value::ToString() const { 2243 Local<String> Value::ToString() const {
2185 i::Handle<i::Object> obj = Utils::OpenHandle(this); 2244 i::Handle<i::Object> obj = Utils::OpenHandle(this);
2186 i::Handle<i::Object> str; 2245 i::Handle<i::Object> str;
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
2362 void v8::Date::CheckCast(v8::Value* that) { 2421 void v8::Date::CheckCast(v8::Value* that) {
2363 i::Isolate* isolate = i::Isolate::Current(); 2422 i::Isolate* isolate = i::Isolate::Current();
2364 if (IsDeadCheck(isolate, "v8::Date::Cast()")) return; 2423 if (IsDeadCheck(isolate, "v8::Date::Cast()")) return;
2365 i::Handle<i::Object> obj = Utils::OpenHandle(that); 2424 i::Handle<i::Object> obj = Utils::OpenHandle(that);
2366 ApiCheck(obj->HasSpecificClassOf(isolate->heap()->Date_symbol()), 2425 ApiCheck(obj->HasSpecificClassOf(isolate->heap()->Date_symbol()),
2367 "v8::Date::Cast()", 2426 "v8::Date::Cast()",
2368 "Could not convert to date"); 2427 "Could not convert to date");
2369 } 2428 }
2370 2429
2371 2430
2431 void v8::StringObject::CheckCast(v8::Value* that) {
2432 i::Isolate* isolate = i::Isolate::Current();
2433 if (IsDeadCheck(isolate, "v8::StringObject::Cast()")) return;
2434 i::Handle<i::Object> obj = Utils::OpenHandle(that);
2435 ApiCheck(obj->HasSpecificClassOf(isolate->heap()->String_symbol()),
2436 "v8::StringObject::Cast()",
2437 "Could not convert to StringObject");
2438 }
2439
2440
2441 void v8::NumberObject::CheckCast(v8::Value* that) {
2442 i::Isolate* isolate = i::Isolate::Current();
2443 if (IsDeadCheck(isolate, "v8::NumberObject::Cast()")) return;
2444 i::Handle<i::Object> obj = Utils::OpenHandle(that);
2445 ApiCheck(obj->HasSpecificClassOf(isolate->heap()->Number_symbol()),
2446 "v8::NumberObject::Cast()",
2447 "Could not convert to NumberObject");
2448 }
2449
2450
2451 void v8::BooleanObject::CheckCast(v8::Value* that) {
2452 i::Isolate* isolate = i::Isolate::Current();
2453 if (IsDeadCheck(isolate, "v8::BooleanObject::Cast()")) return;
2454 i::Handle<i::Object> obj = Utils::OpenHandle(that);
2455 ApiCheck(obj->HasSpecificClassOf(isolate->heap()->Boolean_symbol()),
2456 "v8::BooleanObject::Cast()",
2457 "Could not convert to BooleanObject");
2458 }
2459
2460
2372 void v8::RegExp::CheckCast(v8::Value* that) { 2461 void v8::RegExp::CheckCast(v8::Value* that) {
2373 if (IsDeadCheck(i::Isolate::Current(), "v8::RegExp::Cast()")) return; 2462 if (IsDeadCheck(i::Isolate::Current(), "v8::RegExp::Cast()")) return;
2374 i::Handle<i::Object> obj = Utils::OpenHandle(that); 2463 i::Handle<i::Object> obj = Utils::OpenHandle(that);
2375 ApiCheck(obj->IsJSRegExp(), 2464 ApiCheck(obj->IsJSRegExp(),
2376 "v8::RegExp::Cast()", 2465 "v8::RegExp::Cast()",
2377 "Could not convert to regular expression"); 2466 "Could not convert to regular expression");
2378 } 2467 }
2379 2468
2380 2469
2381 bool Value::BooleanValue() const { 2470 bool Value::BooleanValue() const {
(...skipping 2013 matching lines...) Expand 10 before | Expand all | Expand 10 after
4395 i::Isolate* isolate = i::Isolate::Current(); 4484 i::Isolate* isolate = i::Isolate::Current();
4396 EnsureInitializedForIsolate(isolate, "v8::Object::New()"); 4485 EnsureInitializedForIsolate(isolate, "v8::Object::New()");
4397 LOG_API(isolate, "Object::New"); 4486 LOG_API(isolate, "Object::New");
4398 ENTER_V8(isolate); 4487 ENTER_V8(isolate);
4399 i::Handle<i::JSObject> obj = 4488 i::Handle<i::JSObject> obj =
4400 isolate->factory()->NewJSObject(isolate->object_function()); 4489 isolate->factory()->NewJSObject(isolate->object_function());
4401 return Utils::ToLocal(obj); 4490 return Utils::ToLocal(obj);
4402 } 4491 }
4403 4492
4404 4493
4494 Local<v8::Value> v8::NumberObject::New(double value) {
4495 i::Isolate* isolate = i::Isolate::Current();
4496 EnsureInitializedForIsolate(isolate, "v8::NumberObject::New()");
4497 LOG_API(isolate, "NumberObject::New");
4498 ENTER_V8(isolate);
4499 i::Handle<i::Object> number = isolate->factory()->NewNumber(value);
4500 i::Handle<i::Object> obj = isolate->factory()->ToObject(number);
4501 return Utils::ToLocal(obj);
4502 }
4503
4504
4505 double v8::NumberObject::NumberValue() const {
4506 i::Isolate* isolate = i::Isolate::Current();
4507 if (IsDeadCheck(isolate, "v8::NumberObject::NumberValue()")) return 0;
4508 LOG_API(isolate, "NumberObject::NumberValue");
4509 i::Handle<i::Object> obj = Utils::OpenHandle(this);
4510 i::Handle<i::JSValue> jsvalue = i::Handle<i::JSValue>::cast(obj);
4511 return jsvalue->value()->Number();
4512 }
4513
4514
4515 Local<v8::Value> v8::BooleanObject::New(bool value) {
4516 i::Isolate* isolate = i::Isolate::Current();
4517 EnsureInitializedForIsolate(isolate, "v8::BooleanObject::New()");
4518 LOG_API(isolate, "BooleanObject::New");
4519 ENTER_V8(isolate);
4520 i::Handle<i::Object> boolean(value ? isolate->heap()->true_value()
4521 : isolate->heap()->false_value());
4522 i::Handle<i::Object> obj = isolate->factory()->ToObject(boolean);
4523 return Utils::ToLocal(obj);
4524 }
4525
4526
4527 bool v8::BooleanObject::BooleanValue() const {
4528 i::Isolate* isolate = i::Isolate::Current();
4529 if (IsDeadCheck(isolate, "v8::BooleanObject::BooleanValue()")) return 0;
4530 LOG_API(isolate, "BooleanObject::BooleanValue");
4531 i::Handle<i::Object> obj = Utils::OpenHandle(this);
4532 i::Handle<i::JSValue> jsvalue = i::Handle<i::JSValue>::cast(obj);
4533 return jsvalue->value()->IsTrue();
4534 }
4535
4536
4537 Local<v8::Value> v8::StringObject::New(Handle<String> value) {
4538 i::Isolate* isolate = i::Isolate::Current();
4539 EnsureInitializedForIsolate(isolate, "v8::StringObject::New()");
4540 LOG_API(isolate, "StringObject::New");
4541 ENTER_V8(isolate);
4542 i::Handle<i::Object> obj =
4543 isolate->factory()->ToObject(Utils::OpenHandle(*value));
4544 return Utils::ToLocal(obj);
4545 }
4546
4547
4548 Local<v8::String> v8::StringObject::StringValue() const {
4549 i::Isolate* isolate = i::Isolate::Current();
4550 if (IsDeadCheck(isolate, "v8::StringObject::StringValue()")) {
4551 return Local<v8::String>();
4552 }
4553 LOG_API(isolate, "StringObject::StringValue");
4554 i::Handle<i::Object> obj = Utils::OpenHandle(this);
4555 i::Handle<i::JSValue> jsvalue = i::Handle<i::JSValue>::cast(obj);
4556 return Utils::ToLocal(
4557 i::Handle<i::String>(i::String::cast(jsvalue->value())));
4558 }
4559
4560
4405 Local<v8::Value> v8::Date::New(double time) { 4561 Local<v8::Value> v8::Date::New(double time) {
4406 i::Isolate* isolate = i::Isolate::Current(); 4562 i::Isolate* isolate = i::Isolate::Current();
4407 EnsureInitializedForIsolate(isolate, "v8::Date::New()"); 4563 EnsureInitializedForIsolate(isolate, "v8::Date::New()");
4408 LOG_API(isolate, "Date::New"); 4564 LOG_API(isolate, "Date::New");
4409 if (isnan(time)) { 4565 if (isnan(time)) {
4410 // Introduce only canonical NaN value into the VM, to avoid signaling NaNs. 4566 // Introduce only canonical NaN value into the VM, to avoid signaling NaNs.
4411 time = i::OS::nan_value(); 4567 time = i::OS::nan_value();
4412 } 4568 }
4413 ENTER_V8(isolate); 4569 ENTER_V8(isolate);
4414 EXCEPTION_PREAMBLE(isolate); 4570 EXCEPTION_PREAMBLE(isolate);
(...skipping 1651 matching lines...) Expand 10 before | Expand all | Expand 10 after
6066 6222
6067 6223
6068 char* HandleScopeImplementer::Iterate(ObjectVisitor* v, char* storage) { 6224 char* HandleScopeImplementer::Iterate(ObjectVisitor* v, char* storage) {
6069 HandleScopeImplementer* scope_implementer = 6225 HandleScopeImplementer* scope_implementer =
6070 reinterpret_cast<HandleScopeImplementer*>(storage); 6226 reinterpret_cast<HandleScopeImplementer*>(storage);
6071 scope_implementer->IterateThis(v); 6227 scope_implementer->IterateThis(v);
6072 return storage + ArchiveSpacePerThread(); 6228 return storage + ArchiveSpacePerThread();
6073 } 6229 }
6074 6230
6075 } } // namespace v8::internal 6231 } } // namespace v8::internal
OLDNEW
« include/v8.h ('K') | « include/v8.h ('k') | test/cctest/test-api.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698