| OLD | NEW |
| 1 // Copyright 2009 the V8 project authors. All rights reserved. | 1 // Copyright 2009 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 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 93 // --- D a t a t h a t i s s p e c i f i c t o a t h r e a d --- | 93 // --- D a t a t h a t i s s p e c i f i c t o a t h r e a d --- |
| 94 | 94 |
| 95 | 95 |
| 96 static i::HandleScopeImplementer thread_local; | 96 static i::HandleScopeImplementer thread_local; |
| 97 | 97 |
| 98 | 98 |
| 99 // --- E x c e p t i o n B e h a v i o r --- | 99 // --- E x c e p t i o n B e h a v i o r --- |
| 100 | 100 |
| 101 | 101 |
| 102 static FatalErrorCallback exception_behavior = NULL; | 102 static FatalErrorCallback exception_behavior = NULL; |
| 103 | 103 int i::Internals::kJSObjectType = JS_OBJECT_TYPE; |
| 104 int i::Internals::kFirstNonstringType = FIRST_NONSTRING_TYPE; |
| 105 int i::Internals::kProxyType = PROXY_TYPE; |
| 104 | 106 |
| 105 static void DefaultFatalErrorHandler(const char* location, | 107 static void DefaultFatalErrorHandler(const char* location, |
| 106 const char* message) { | 108 const char* message) { |
| 107 ENTER_V8; | 109 ENTER_V8; |
| 108 API_Fatal(location, message); | 110 API_Fatal(location, message); |
| 109 } | 111 } |
| 110 | 112 |
| 111 | 113 |
| 112 | 114 |
| 113 static FatalErrorCallback& GetFatalErrorHandler() { | 115 static FatalErrorCallback& GetFatalErrorHandler() { |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 216 } | 218 } |
| 217 | 219 |
| 218 | 220 |
| 219 ImplementationUtilities::HandleScopeData* | 221 ImplementationUtilities::HandleScopeData* |
| 220 ImplementationUtilities::CurrentHandleScope() { | 222 ImplementationUtilities::CurrentHandleScope() { |
| 221 return &i::HandleScope::current_; | 223 return &i::HandleScope::current_; |
| 222 } | 224 } |
| 223 | 225 |
| 224 | 226 |
| 225 #ifdef DEBUG | 227 #ifdef DEBUG |
| 226 void ImplementationUtilities::ZapHandleRange(void** begin, void** end) { | 228 void ImplementationUtilities::ZapHandleRange(i::Object** begin, |
| 229 i::Object** end) { |
| 227 i::HandleScope::ZapRange(begin, end); | 230 i::HandleScope::ZapRange(begin, end); |
| 228 } | 231 } |
| 229 #endif | 232 #endif |
| 230 | 233 |
| 231 | 234 |
| 232 v8::Handle<v8::Primitive> ImplementationUtilities::Undefined() { | 235 v8::Handle<v8::Primitive> ImplementationUtilities::Undefined() { |
| 233 if (!EnsureInitialized("v8::Undefined()")) return v8::Handle<v8::Primitive>(); | 236 if (!EnsureInitialized("v8::Undefined()")) return v8::Handle<v8::Primitive>(); |
| 234 return v8::Handle<Primitive>(ToApi<Primitive>(i::Factory::undefined_value())); | 237 return v8::Handle<Primitive>(ToApi<Primitive>(i::Factory::undefined_value())); |
| 235 } | 238 } |
| 236 | 239 |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 342 constraints->max_old_space_size()); | 345 constraints->max_old_space_size()); |
| 343 if (!result) return false; | 346 if (!result) return false; |
| 344 if (constraints->stack_limit() != NULL) { | 347 if (constraints->stack_limit() != NULL) { |
| 345 uintptr_t limit = reinterpret_cast<uintptr_t>(constraints->stack_limit()); | 348 uintptr_t limit = reinterpret_cast<uintptr_t>(constraints->stack_limit()); |
| 346 i::StackGuard::SetStackLimit(limit); | 349 i::StackGuard::SetStackLimit(limit); |
| 347 } | 350 } |
| 348 return true; | 351 return true; |
| 349 } | 352 } |
| 350 | 353 |
| 351 | 354 |
| 352 void** V8::GlobalizeReference(void** obj) { | 355 i::Object** V8::GlobalizeReference(i::Object** obj) { |
| 353 if (IsDeadCheck("V8::Persistent::New")) return NULL; | 356 if (IsDeadCheck("V8::Persistent::New")) return NULL; |
| 354 LOG_API("Persistent::New"); | 357 LOG_API("Persistent::New"); |
| 355 i::Handle<i::Object> result = | 358 i::Handle<i::Object> result = |
| 356 i::GlobalHandles::Create(*reinterpret_cast<i::Object**>(obj)); | 359 i::GlobalHandles::Create(*obj); |
| 357 return reinterpret_cast<void**>(result.location()); | 360 return result.location(); |
| 358 } | 361 } |
| 359 | 362 |
| 360 | 363 |
| 361 void V8::MakeWeak(void** object, void* parameters, | 364 void V8::MakeWeak(i::Object** object, void* parameters, |
| 362 WeakReferenceCallback callback) { | 365 WeakReferenceCallback callback) { |
| 363 LOG_API("MakeWeak"); | 366 LOG_API("MakeWeak"); |
| 364 i::GlobalHandles::MakeWeak(reinterpret_cast<i::Object**>(object), parameters, | 367 i::GlobalHandles::MakeWeak(object, parameters, callback); |
| 365 callback); | |
| 366 } | 368 } |
| 367 | 369 |
| 368 | 370 |
| 369 void V8::ClearWeak(void** obj) { | 371 void V8::ClearWeak(i::Object** obj) { |
| 370 LOG_API("ClearWeak"); | 372 LOG_API("ClearWeak"); |
| 371 i::GlobalHandles::ClearWeakness(reinterpret_cast<i::Object**>(obj)); | 373 i::GlobalHandles::ClearWeakness(obj); |
| 372 } | 374 } |
| 373 | 375 |
| 374 | 376 |
| 375 bool V8::IsGlobalNearDeath(void** obj) { | 377 bool V8::IsGlobalNearDeath(i::Object** obj) { |
| 376 LOG_API("IsGlobalNearDeath"); | 378 LOG_API("IsGlobalNearDeath"); |
| 377 if (!i::V8::IsRunning()) return false; | 379 if (!i::V8::IsRunning()) return false; |
| 378 return i::GlobalHandles::IsNearDeath(reinterpret_cast<i::Object**>(obj)); | 380 return i::GlobalHandles::IsNearDeath(obj); |
| 379 } | 381 } |
| 380 | 382 |
| 381 | 383 |
| 382 bool V8::IsGlobalWeak(void** obj) { | 384 bool V8::IsGlobalWeak(i::Object** obj) { |
| 383 LOG_API("IsGlobalWeak"); | 385 LOG_API("IsGlobalWeak"); |
| 384 if (!i::V8::IsRunning()) return false; | 386 if (!i::V8::IsRunning()) return false; |
| 385 return i::GlobalHandles::IsWeak(reinterpret_cast<i::Object**>(obj)); | 387 return i::GlobalHandles::IsWeak(obj); |
| 386 } | 388 } |
| 387 | 389 |
| 388 | 390 |
| 389 void V8::DisposeGlobal(void** obj) { | 391 void V8::DisposeGlobal(i::Object** obj) { |
| 390 LOG_API("DisposeGlobal"); | 392 LOG_API("DisposeGlobal"); |
| 391 if (!i::V8::IsRunning()) return; | 393 if (!i::V8::IsRunning()) return; |
| 392 i::Object** ptr = reinterpret_cast<i::Object**>(obj); | 394 if ((*obj)->IsGlobalContext()) i::Heap::NotifyContextDisposed(); |
| 393 if ((*ptr)->IsGlobalContext()) i::Heap::NotifyContextDisposed(); | 395 i::GlobalHandles::Destroy(obj); |
| 394 i::GlobalHandles::Destroy(ptr); | |
| 395 } | 396 } |
| 396 | 397 |
| 397 // --- H a n d l e s --- | 398 // --- H a n d l e s --- |
| 398 | 399 |
| 399 | 400 |
| 400 HandleScope::HandleScope() : is_closed_(false) { | 401 HandleScope::HandleScope() : is_closed_(false) { |
| 401 API_ENTRY_CHECK("HandleScope::HandleScope"); | 402 API_ENTRY_CHECK("HandleScope::HandleScope"); |
| 402 i::HandleScope::Enter(&previous_); | 403 i::HandleScope::Enter(&previous_); |
| 403 } | 404 } |
| 404 | 405 |
| 405 | 406 |
| 406 HandleScope::~HandleScope() { | 407 HandleScope::~HandleScope() { |
| 407 if (!is_closed_) { | 408 if (!is_closed_) { |
| 408 i::HandleScope::Leave(&previous_); | 409 i::HandleScope::Leave(&previous_); |
| 409 } | 410 } |
| 410 } | 411 } |
| 411 | 412 |
| 412 | 413 |
| 413 int HandleScope::NumberOfHandles() { | 414 int HandleScope::NumberOfHandles() { |
| 414 return i::HandleScope::NumberOfHandles(); | 415 return i::HandleScope::NumberOfHandles(); |
| 415 } | 416 } |
| 416 | 417 |
| 417 | 418 |
| 418 void** v8::HandleScope::CreateHandle(void* value) { | 419 i::Object** v8::HandleScope::CreateHandle(i::Object* value) { |
| 419 return reinterpret_cast<void**>( | 420 return i::HandleScope::CreateHandle(value); |
| 420 i::HandleScope::CreateHandle(reinterpret_cast<i::Object*>(value))); | |
| 421 } | 421 } |
| 422 | 422 |
| 423 | 423 |
| 424 void Context::Enter() { | 424 void Context::Enter() { |
| 425 if (IsDeadCheck("v8::Context::Enter()")) return; | 425 if (IsDeadCheck("v8::Context::Enter()")) return; |
| 426 ENTER_V8; | 426 ENTER_V8; |
| 427 i::Handle<i::Context> env = Utils::OpenHandle(this); | 427 i::Handle<i::Context> env = Utils::OpenHandle(this); |
| 428 thread_local.EnterContext(env); | 428 thread_local.EnterContext(env); |
| 429 | 429 |
| 430 thread_local.SaveContext(i::GlobalHandles::Create(i::Top::context())); | 430 thread_local.SaveContext(i::GlobalHandles::Create(i::Top::context())); |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 474 raw_result = env->data(); | 474 raw_result = env->data(); |
| 475 } else { | 475 } else { |
| 476 return Local<Value>(); | 476 return Local<Value>(); |
| 477 } | 477 } |
| 478 } | 478 } |
| 479 i::Handle<i::Object> result(raw_result); | 479 i::Handle<i::Object> result(raw_result); |
| 480 return Utils::ToLocal(result); | 480 return Utils::ToLocal(result); |
| 481 } | 481 } |
| 482 | 482 |
| 483 | 483 |
| 484 void** v8::HandleScope::RawClose(void** value) { | 484 i::Object** v8::HandleScope::RawClose(i::Object** value) { |
| 485 if (!ApiCheck(!is_closed_, | 485 if (!ApiCheck(!is_closed_, |
| 486 "v8::HandleScope::Close()", | 486 "v8::HandleScope::Close()", |
| 487 "Local scope has already been closed")) { | 487 "Local scope has already been closed")) { |
| 488 return 0; | 488 return 0; |
| 489 } | 489 } |
| 490 LOG_API("CloseHandleScope"); | 490 LOG_API("CloseHandleScope"); |
| 491 | 491 |
| 492 // Read the result before popping the handle block. | 492 // Read the result before popping the handle block. |
| 493 i::Object* result = reinterpret_cast<i::Object*>(*value); | 493 i::Object* result = *value; |
| 494 is_closed_ = true; | 494 is_closed_ = true; |
| 495 i::HandleScope::Leave(&previous_); | 495 i::HandleScope::Leave(&previous_); |
| 496 | 496 |
| 497 // Allocate a new handle on the previous handle block. | 497 // Allocate a new handle on the previous handle block. |
| 498 i::Handle<i::Object> handle(result); | 498 i::Handle<i::Object> handle(result); |
| 499 return reinterpret_cast<void**>(handle.location()); | 499 return handle.location(); |
| 500 } | 500 } |
| 501 | 501 |
| 502 | 502 |
| 503 // --- N e a n d e r --- | 503 // --- N e a n d e r --- |
| 504 | 504 |
| 505 | 505 |
| 506 // A constructor cannot easily return an error value, therefore it is necessary | 506 // A constructor cannot easily return an error value, therefore it is necessary |
| 507 // to check for a dead VM with ON_BAILOUT before constructing any Neander | 507 // to check for a dead VM with ON_BAILOUT before constructing any Neander |
| 508 // objects. To remind you about this there is no HandleScope in the | 508 // objects. To remind you about this there is no HandleScope in the |
| 509 // NeanderObject constructor. When you add one to the site calling the | 509 // NeanderObject constructor. When you add one to the site calling the |
| (...skipping 942 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1452 return Utils::OpenHandle(this)->IsFalse(); | 1452 return Utils::OpenHandle(this)->IsFalse(); |
| 1453 } | 1453 } |
| 1454 | 1454 |
| 1455 | 1455 |
| 1456 bool Value::IsFunction() const { | 1456 bool Value::IsFunction() const { |
| 1457 if (IsDeadCheck("v8::Value::IsFunction()")) return false; | 1457 if (IsDeadCheck("v8::Value::IsFunction()")) return false; |
| 1458 return Utils::OpenHandle(this)->IsJSFunction(); | 1458 return Utils::OpenHandle(this)->IsJSFunction(); |
| 1459 } | 1459 } |
| 1460 | 1460 |
| 1461 | 1461 |
| 1462 bool Value::IsString() const { | 1462 bool Value::FullIsString() const { |
| 1463 if (IsDeadCheck("v8::Value::IsString()")) return false; | 1463 if (IsDeadCheck("v8::Value::IsString()")) return false; |
| 1464 return Utils::OpenHandle(this)->IsString(); | 1464 bool result = Utils::OpenHandle(this)->IsString(); |
| 1465 ASSERT_EQ(result, QuickIsString()); |
| 1466 return result; |
| 1465 } | 1467 } |
| 1466 | 1468 |
| 1467 | 1469 |
| 1468 bool Value::IsArray() const { | 1470 bool Value::IsArray() const { |
| 1469 if (IsDeadCheck("v8::Value::IsArray()")) return false; | 1471 if (IsDeadCheck("v8::Value::IsArray()")) return false; |
| 1470 return Utils::OpenHandle(this)->IsJSArray(); | 1472 return Utils::OpenHandle(this)->IsJSArray(); |
| 1471 } | 1473 } |
| 1472 | 1474 |
| 1473 | 1475 |
| 1474 bool Value::IsObject() const { | 1476 bool Value::IsObject() const { |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1606 } else { | 1608 } else { |
| 1607 ENTER_V8; | 1609 ENTER_V8; |
| 1608 EXCEPTION_PREAMBLE(); | 1610 EXCEPTION_PREAMBLE(); |
| 1609 num = i::Execution::ToInteger(obj, &has_pending_exception); | 1611 num = i::Execution::ToInteger(obj, &has_pending_exception); |
| 1610 EXCEPTION_BAILOUT_CHECK(Local<Integer>()); | 1612 EXCEPTION_BAILOUT_CHECK(Local<Integer>()); |
| 1611 } | 1613 } |
| 1612 return Local<Integer>(ToApi<Integer>(num)); | 1614 return Local<Integer>(ToApi<Integer>(num)); |
| 1613 } | 1615 } |
| 1614 | 1616 |
| 1615 | 1617 |
| 1616 External* External::Cast(v8::Value* that) { | 1618 void External::CheckCast(v8::Value* that) { |
| 1617 if (IsDeadCheck("v8::External::Cast()")) return 0; | 1619 if (IsDeadCheck("v8::External::Cast()")) return; |
| 1618 i::Handle<i::Object> obj = Utils::OpenHandle(that); | 1620 i::Handle<i::Object> obj = Utils::OpenHandle(that); |
| 1619 ApiCheck(obj->IsProxy(), | 1621 ApiCheck(obj->IsProxy(), |
| 1620 "v8::External::Cast()", | 1622 "v8::External::Cast()", |
| 1621 "Could not convert to external"); | 1623 "Could not convert to external"); |
| 1622 return static_cast<External*>(that); | |
| 1623 } | 1624 } |
| 1624 | 1625 |
| 1625 | 1626 |
| 1626 v8::Object* v8::Object::Cast(Value* that) { | 1627 void v8::Object::CheckCast(Value* that) { |
| 1627 if (IsDeadCheck("v8::Object::Cast()")) return 0; | 1628 if (IsDeadCheck("v8::Object::Cast()")) return; |
| 1628 i::Handle<i::Object> obj = Utils::OpenHandle(that); | 1629 i::Handle<i::Object> obj = Utils::OpenHandle(that); |
| 1629 ApiCheck(obj->IsJSObject(), | 1630 ApiCheck(obj->IsJSObject(), |
| 1630 "v8::Object::Cast()", | 1631 "v8::Object::Cast()", |
| 1631 "Could not convert to object"); | 1632 "Could not convert to object"); |
| 1632 return static_cast<v8::Object*>(that); | |
| 1633 } | 1633 } |
| 1634 | 1634 |
| 1635 | 1635 |
| 1636 v8::Function* v8::Function::Cast(Value* that) { | 1636 void v8::Function::CheckCast(Value* that) { |
| 1637 if (IsDeadCheck("v8::Function::Cast()")) return 0; | 1637 if (IsDeadCheck("v8::Function::Cast()")) return; |
| 1638 i::Handle<i::Object> obj = Utils::OpenHandle(that); | 1638 i::Handle<i::Object> obj = Utils::OpenHandle(that); |
| 1639 ApiCheck(obj->IsJSFunction(), | 1639 ApiCheck(obj->IsJSFunction(), |
| 1640 "v8::Function::Cast()", | 1640 "v8::Function::Cast()", |
| 1641 "Could not convert to function"); | 1641 "Could not convert to function"); |
| 1642 return static_cast<v8::Function*>(that); | |
| 1643 } | 1642 } |
| 1644 | 1643 |
| 1645 | 1644 |
| 1646 v8::String* v8::String::Cast(v8::Value* that) { | 1645 void v8::String::CheckCast(v8::Value* that) { |
| 1647 if (IsDeadCheck("v8::String::Cast()")) return 0; | 1646 if (IsDeadCheck("v8::String::Cast()")) return; |
| 1648 i::Handle<i::Object> obj = Utils::OpenHandle(that); | 1647 i::Handle<i::Object> obj = Utils::OpenHandle(that); |
| 1649 ApiCheck(obj->IsString(), | 1648 ApiCheck(obj->IsString(), |
| 1650 "v8::String::Cast()", | 1649 "v8::String::Cast()", |
| 1651 "Could not convert to string"); | 1650 "Could not convert to string"); |
| 1652 return static_cast<v8::String*>(that); | |
| 1653 } | 1651 } |
| 1654 | 1652 |
| 1655 | 1653 |
| 1656 v8::Number* v8::Number::Cast(v8::Value* that) { | 1654 void v8::Number::CheckCast(v8::Value* that) { |
| 1657 if (IsDeadCheck("v8::Number::Cast()")) return 0; | 1655 if (IsDeadCheck("v8::Number::Cast()")) return; |
| 1658 i::Handle<i::Object> obj = Utils::OpenHandle(that); | 1656 i::Handle<i::Object> obj = Utils::OpenHandle(that); |
| 1659 ApiCheck(obj->IsNumber(), | 1657 ApiCheck(obj->IsNumber(), |
| 1660 "v8::Number::Cast()", | 1658 "v8::Number::Cast()", |
| 1661 "Could not convert to number"); | 1659 "Could not convert to number"); |
| 1662 return static_cast<v8::Number*>(that); | |
| 1663 } | 1660 } |
| 1664 | 1661 |
| 1665 | 1662 |
| 1666 v8::Integer* v8::Integer::Cast(v8::Value* that) { | 1663 void v8::Integer::CheckCast(v8::Value* that) { |
| 1667 if (IsDeadCheck("v8::Integer::Cast()")) return 0; | 1664 if (IsDeadCheck("v8::Integer::Cast()")) return; |
| 1668 i::Handle<i::Object> obj = Utils::OpenHandle(that); | 1665 i::Handle<i::Object> obj = Utils::OpenHandle(that); |
| 1669 ApiCheck(obj->IsNumber(), | 1666 ApiCheck(obj->IsNumber(), |
| 1670 "v8::Integer::Cast()", | 1667 "v8::Integer::Cast()", |
| 1671 "Could not convert to number"); | 1668 "Could not convert to number"); |
| 1672 return static_cast<v8::Integer*>(that); | |
| 1673 } | 1669 } |
| 1674 | 1670 |
| 1675 | 1671 |
| 1676 v8::Array* v8::Array::Cast(Value* that) { | 1672 void v8::Array::CheckCast(Value* that) { |
| 1677 if (IsDeadCheck("v8::Array::Cast()")) return 0; | 1673 if (IsDeadCheck("v8::Array::Cast()")) return; |
| 1678 i::Handle<i::Object> obj = Utils::OpenHandle(that); | 1674 i::Handle<i::Object> obj = Utils::OpenHandle(that); |
| 1679 ApiCheck(obj->IsJSArray(), | 1675 ApiCheck(obj->IsJSArray(), |
| 1680 "v8::Array::Cast()", | 1676 "v8::Array::Cast()", |
| 1681 "Could not convert to array"); | 1677 "Could not convert to array"); |
| 1682 return static_cast<v8::Array*>(that); | |
| 1683 } | 1678 } |
| 1684 | 1679 |
| 1685 | 1680 |
| 1686 v8::Date* v8::Date::Cast(v8::Value* that) { | 1681 void v8::Date::CheckCast(v8::Value* that) { |
| 1687 if (IsDeadCheck("v8::Date::Cast()")) return 0; | 1682 if (IsDeadCheck("v8::Date::Cast()")) return; |
| 1688 i::Handle<i::Object> obj = Utils::OpenHandle(that); | 1683 i::Handle<i::Object> obj = Utils::OpenHandle(that); |
| 1689 ApiCheck(obj->HasSpecificClassOf(i::Heap::Date_symbol()), | 1684 ApiCheck(obj->HasSpecificClassOf(i::Heap::Date_symbol()), |
| 1690 "v8::Date::Cast()", | 1685 "v8::Date::Cast()", |
| 1691 "Could not convert to date"); | 1686 "Could not convert to date"); |
| 1692 return static_cast<v8::Date*>(that); | |
| 1693 } | 1687 } |
| 1694 | 1688 |
| 1695 | 1689 |
| 1696 bool Value::BooleanValue() const { | 1690 bool Value::BooleanValue() const { |
| 1697 if (IsDeadCheck("v8::Value::BooleanValue()")) return false; | 1691 if (IsDeadCheck("v8::Value::BooleanValue()")) return false; |
| 1698 LOG_API("BooleanValue"); | 1692 LOG_API("BooleanValue"); |
| 1699 i::Handle<i::Object> obj = Utils::OpenHandle(this); | 1693 i::Handle<i::Object> obj = Utils::OpenHandle(this); |
| 1700 if (obj->IsBoolean()) { | 1694 if (obj->IsBoolean()) { |
| 1701 return obj->IsTrue(); | 1695 return obj->IsTrue(); |
| 1702 } else { | 1696 } else { |
| (...skipping 740 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2443 } | 2437 } |
| 2444 | 2438 |
| 2445 | 2439 |
| 2446 bool v8::String::IsExternalAscii() const { | 2440 bool v8::String::IsExternalAscii() const { |
| 2447 EnsureInitialized("v8::String::IsExternalAscii()"); | 2441 EnsureInitialized("v8::String::IsExternalAscii()"); |
| 2448 i::Handle<i::String> str = Utils::OpenHandle(this); | 2442 i::Handle<i::String> str = Utils::OpenHandle(this); |
| 2449 return i::StringShape(*str).IsExternalAscii(); | 2443 return i::StringShape(*str).IsExternalAscii(); |
| 2450 } | 2444 } |
| 2451 | 2445 |
| 2452 | 2446 |
| 2453 v8::String::ExternalStringResource* | 2447 void v8::String::VerifyExternalStringResource( |
| 2454 v8::String::GetExternalStringResource() const { | 2448 v8::String::ExternalStringResource* value) const { |
| 2455 EnsureInitialized("v8::String::GetExternalStringResource()"); | |
| 2456 i::Handle<i::String> str = Utils::OpenHandle(this); | 2449 i::Handle<i::String> str = Utils::OpenHandle(this); |
| 2450 v8::String::ExternalStringResource* expected; |
| 2457 if (i::StringShape(*str).IsExternalTwoByte()) { | 2451 if (i::StringShape(*str).IsExternalTwoByte()) { |
| 2458 void* resource = i::Handle<i::ExternalTwoByteString>::cast(str)->resource(); | 2452 void* resource = i::Handle<i::ExternalTwoByteString>::cast(str)->resource(); |
| 2459 return reinterpret_cast<ExternalStringResource*>(resource); | 2453 expected = reinterpret_cast<ExternalStringResource*>(resource); |
| 2460 } else { | 2454 } else { |
| 2461 return NULL; | 2455 expected = NULL; |
| 2462 } | 2456 } |
| 2457 CHECK_EQ(expected, value); |
| 2463 } | 2458 } |
| 2464 | 2459 |
| 2465 | 2460 |
| 2466 v8::String::ExternalAsciiStringResource* | 2461 v8::String::ExternalAsciiStringResource* |
| 2467 v8::String::GetExternalAsciiStringResource() const { | 2462 v8::String::GetExternalAsciiStringResource() const { |
| 2468 EnsureInitialized("v8::String::GetExternalAsciiStringResource()"); | 2463 EnsureInitialized("v8::String::GetExternalAsciiStringResource()"); |
| 2469 i::Handle<i::String> str = Utils::OpenHandle(this); | 2464 i::Handle<i::String> str = Utils::OpenHandle(this); |
| 2470 if (i::StringShape(*str).IsExternalAscii()) { | 2465 if (i::StringShape(*str).IsExternalAscii()) { |
| 2471 void* resource = i::Handle<i::ExternalAsciiString>::cast(str)->resource(); | 2466 void* resource = i::Handle<i::ExternalAsciiString>::cast(str)->resource(); |
| 2472 return reinterpret_cast<ExternalAsciiStringResource*>(resource); | 2467 return reinterpret_cast<ExternalAsciiStringResource*>(resource); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2512 } | 2507 } |
| 2513 | 2508 |
| 2514 | 2509 |
| 2515 int v8::Object::InternalFieldCount() { | 2510 int v8::Object::InternalFieldCount() { |
| 2516 if (IsDeadCheck("v8::Object::InternalFieldCount()")) return 0; | 2511 if (IsDeadCheck("v8::Object::InternalFieldCount()")) return 0; |
| 2517 i::Handle<i::JSObject> obj = Utils::OpenHandle(this); | 2512 i::Handle<i::JSObject> obj = Utils::OpenHandle(this); |
| 2518 return obj->GetInternalFieldCount(); | 2513 return obj->GetInternalFieldCount(); |
| 2519 } | 2514 } |
| 2520 | 2515 |
| 2521 | 2516 |
| 2522 Local<Value> v8::Object::GetInternalField(int index) { | 2517 Local<Value> v8::Object::CheckedGetInternalField(int index) { |
| 2523 if (IsDeadCheck("v8::Object::GetInternalField()")) return Local<Value>(); | 2518 if (IsDeadCheck("v8::Object::GetInternalField()")) return Local<Value>(); |
| 2524 i::Handle<i::JSObject> obj = Utils::OpenHandle(this); | 2519 i::Handle<i::JSObject> obj = Utils::OpenHandle(this); |
| 2525 if (!ApiCheck(index < obj->GetInternalFieldCount(), | 2520 if (!ApiCheck(index < obj->GetInternalFieldCount(), |
| 2526 "v8::Object::GetInternalField()", | 2521 "v8::Object::GetInternalField()", |
| 2527 "Reading internal field out of bounds")) { | 2522 "Reading internal field out of bounds")) { |
| 2528 return Local<Value>(); | 2523 return Local<Value>(); |
| 2529 } | 2524 } |
| 2530 i::Handle<i::Object> value(obj->GetInternalField(index)); | 2525 i::Handle<i::Object> value(obj->GetInternalField(index)); |
| 2531 return Utils::ToLocal(value); | 2526 Local<Value> result = Utils::ToLocal(value); |
| 2527 #ifdef DEBUG |
| 2528 Local<Value> unchecked = UncheckedGetInternalField(index); |
| 2529 ASSERT(unchecked.IsEmpty() || (unchecked == result)); |
| 2530 #endif |
| 2531 return result; |
| 2532 } | 2532 } |
| 2533 | 2533 |
| 2534 | 2534 |
| 2535 void v8::Object::SetInternalField(int index, v8::Handle<Value> value) { | 2535 void v8::Object::SetInternalField(int index, v8::Handle<Value> value) { |
| 2536 if (IsDeadCheck("v8::Object::SetInternalField()")) return; | 2536 if (IsDeadCheck("v8::Object::SetInternalField()")) return; |
| 2537 i::Handle<i::JSObject> obj = Utils::OpenHandle(this); | 2537 i::Handle<i::JSObject> obj = Utils::OpenHandle(this); |
| 2538 if (!ApiCheck(index < obj->GetInternalFieldCount(), | 2538 if (!ApiCheck(index < obj->GetInternalFieldCount(), |
| 2539 "v8::Object::SetInternalField()", | 2539 "v8::Object::SetInternalField()", |
| 2540 "Writing internal field out of bounds")) { | 2540 "Writing internal field out of bounds")) { |
| 2541 return; | 2541 return; |
| 2542 } | 2542 } |
| 2543 ENTER_V8; | 2543 ENTER_V8; |
| 2544 i::Handle<i::Object> val = Utils::OpenHandle(*value); | 2544 i::Handle<i::Object> val = Utils::OpenHandle(*value); |
| 2545 obj->SetInternalField(index, *val); | 2545 obj->SetInternalField(index, *val); |
| 2546 } | 2546 } |
| 2547 | 2547 |
| 2548 | 2548 |
| 2549 void* v8::Object::GetPointerFromInternalField(int index) { | |
| 2550 i::Handle<i::JSObject> obj = Utils::OpenHandle(this); | |
| 2551 i::Object* pointer = obj->GetInternalField(index); | |
| 2552 if (pointer->IsSmi()) { | |
| 2553 // Fast case, aligned native pointer. | |
| 2554 return pointer; | |
| 2555 } | |
| 2556 | |
| 2557 // Read from uninitialized field. | |
| 2558 if (!pointer->IsProxy()) { | |
| 2559 // Play safe even if it's something unexpected. | |
| 2560 ASSERT(pointer->IsUndefined()); | |
| 2561 return NULL; | |
| 2562 } | |
| 2563 | |
| 2564 // Unaligned native pointer. | |
| 2565 return reinterpret_cast<void*>(i::Proxy::cast(pointer)->proxy()); | |
| 2566 } | |
| 2567 | |
| 2568 | |
| 2569 void v8::Object::SetPointerInInternalField(int index, void* value) { | 2549 void v8::Object::SetPointerInInternalField(int index, void* value) { |
| 2570 i::Handle<i::JSObject> obj = Utils::OpenHandle(this); | 2550 SetInternalField(index, External::Wrap(value)); |
| 2571 i::Object* as_object = reinterpret_cast<i::Object*>(value); | |
| 2572 if (as_object->IsSmi()) { | |
| 2573 // Aligned pointer, store as is. | |
| 2574 obj->SetInternalField(index, as_object); | |
| 2575 } else { | |
| 2576 // Currently internal fields are used by DOM wrappers which only | |
| 2577 // get garbage collected by the mark-sweep collector, so we | |
| 2578 // pretenure the proxy. | |
| 2579 HandleScope scope; | |
| 2580 i::Handle<i::Proxy> proxy = | |
| 2581 i::Factory::NewProxy(reinterpret_cast<i::Address>(value), i::TENURED); | |
| 2582 if (!proxy.is_null()) obj->SetInternalField(index, *proxy); | |
| 2583 } | |
| 2584 } | 2551 } |
| 2585 | 2552 |
| 2586 | 2553 |
| 2587 // --- E n v i r o n m e n t --- | 2554 // --- E n v i r o n m e n t --- |
| 2588 | 2555 |
| 2589 bool v8::V8::Initialize() { | 2556 bool v8::V8::Initialize() { |
| 2590 if (i::V8::IsRunning()) return true; | 2557 if (i::V8::IsRunning()) return true; |
| 2591 ENTER_V8; | 2558 ENTER_V8; |
| 2592 HandleScope scope; | 2559 HandleScope scope; |
| 2593 if (i::Snapshot::Initialize()) { | 2560 if (i::Snapshot::Initialize()) { |
| (...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2829 static Local<External> ExternalNewImpl(void* data) { | 2796 static Local<External> ExternalNewImpl(void* data) { |
| 2830 return Utils::ToLocal(i::Factory::NewProxy(static_cast<i::Address>(data))); | 2797 return Utils::ToLocal(i::Factory::NewProxy(static_cast<i::Address>(data))); |
| 2831 } | 2798 } |
| 2832 | 2799 |
| 2833 static void* ExternalValueImpl(i::Handle<i::Object> obj) { | 2800 static void* ExternalValueImpl(i::Handle<i::Object> obj) { |
| 2834 return reinterpret_cast<void*>(i::Proxy::cast(*obj)->proxy()); | 2801 return reinterpret_cast<void*>(i::Proxy::cast(*obj)->proxy()); |
| 2835 } | 2802 } |
| 2836 | 2803 |
| 2837 | 2804 |
| 2838 static const intptr_t kAlignedPointerMask = 3; | 2805 static const intptr_t kAlignedPointerMask = 3; |
| 2839 static const int kAlignedPointerShift = 2; | |
| 2840 | |
| 2841 | 2806 |
| 2842 Local<Value> v8::External::Wrap(void* data) { | 2807 Local<Value> v8::External::Wrap(void* data) { |
| 2843 STATIC_ASSERT(sizeof(data) == sizeof(i::Address)); | 2808 STATIC_ASSERT(sizeof(data) == sizeof(i::Address)); |
| 2844 LOG_API("External::Wrap"); | 2809 LOG_API("External::Wrap"); |
| 2845 EnsureInitialized("v8::External::Wrap()"); | 2810 EnsureInitialized("v8::External::Wrap()"); |
| 2846 ENTER_V8; | 2811 ENTER_V8; |
| 2847 if ((reinterpret_cast<intptr_t>(data) & kAlignedPointerMask) == 0) { | 2812 if ((reinterpret_cast<intptr_t>(data) & kAlignedPointerMask) == 0) { |
| 2848 uintptr_t data_ptr = reinterpret_cast<uintptr_t>(data); | 2813 uintptr_t data_ptr = reinterpret_cast<uintptr_t>(data); |
| 2849 intptr_t data_value = | 2814 intptr_t data_value = |
| 2850 static_cast<intptr_t>(data_ptr >> kAlignedPointerShift); | 2815 static_cast<intptr_t>(data_ptr >> i::Internals::kAlignedPointerShift); |
| 2851 STATIC_ASSERT(sizeof(data_ptr) == sizeof(data_value)); | 2816 STATIC_ASSERT(sizeof(data_ptr) == sizeof(data_value)); |
| 2852 if (i::Smi::IsIntptrValid(data_value)) { | 2817 if (i::Smi::IsIntptrValid(data_value)) { |
| 2853 i::Handle<i::Object> obj(i::Smi::FromIntptr(data_value)); | 2818 i::Handle<i::Object> obj(i::Smi::FromIntptr(data_value)); |
| 2854 return Utils::ToLocal(obj); | 2819 return Utils::ToLocal(obj); |
| 2855 } | 2820 } |
| 2856 } | 2821 } |
| 2857 return ExternalNewImpl(data); | 2822 return ExternalNewImpl(data); |
| 2858 } | 2823 } |
| 2859 | 2824 |
| 2860 | 2825 |
| 2861 void* v8::External::Unwrap(v8::Handle<v8::Value> value) { | 2826 void* v8::External::FullUnwrap(v8::Handle<v8::Value> wrapper) { |
| 2862 if (IsDeadCheck("v8::External::Unwrap()")) return 0; | 2827 if (IsDeadCheck("v8::External::Unwrap()")) return 0; |
| 2863 i::Handle<i::Object> obj = Utils::OpenHandle(*value); | 2828 i::Handle<i::Object> obj = Utils::OpenHandle(*wrapper); |
| 2829 void* result; |
| 2864 if (obj->IsSmi()) { | 2830 if (obj->IsSmi()) { |
| 2865 // The external value was an aligned pointer. | 2831 // The external value was an aligned pointer. |
| 2866 uintptr_t result = static_cast<uintptr_t>( | 2832 uintptr_t value = static_cast<uintptr_t>( |
| 2867 i::Smi::cast(*obj)->value()) << kAlignedPointerShift; | 2833 i::Smi::cast(*obj)->value()) << i::Internals::kAlignedPointerShift; |
| 2868 return reinterpret_cast<void*>(result); | 2834 result = reinterpret_cast<void*>(value); |
| 2835 } else if (obj->IsProxy()) { |
| 2836 result = ExternalValueImpl(obj); |
| 2837 } else { |
| 2838 result = NULL; |
| 2869 } | 2839 } |
| 2870 return ExternalValueImpl(obj); | 2840 ASSERT_EQ(result, QuickUnwrap(wrapper)); |
| 2841 return result; |
| 2871 } | 2842 } |
| 2872 | 2843 |
| 2873 | 2844 |
| 2874 Local<External> v8::External::New(void* data) { | 2845 Local<External> v8::External::New(void* data) { |
| 2875 STATIC_ASSERT(sizeof(data) == sizeof(i::Address)); | 2846 STATIC_ASSERT(sizeof(data) == sizeof(i::Address)); |
| 2876 LOG_API("External::New"); | 2847 LOG_API("External::New"); |
| 2877 EnsureInitialized("v8::External::New()"); | 2848 EnsureInitialized("v8::External::New()"); |
| 2878 ENTER_V8; | 2849 ENTER_V8; |
| 2879 return ExternalNewImpl(data); | 2850 return ExternalNewImpl(data); |
| 2880 } | 2851 } |
| (...skipping 841 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3722 | 3693 |
| 3723 char* HandleScopeImplementer::RestoreThreadHelper(char* storage) { | 3694 char* HandleScopeImplementer::RestoreThreadHelper(char* storage) { |
| 3724 memcpy(this, storage, sizeof(*this)); | 3695 memcpy(this, storage, sizeof(*this)); |
| 3725 *v8::ImplementationUtilities::CurrentHandleScope() = handle_scope_data_; | 3696 *v8::ImplementationUtilities::CurrentHandleScope() = handle_scope_data_; |
| 3726 return storage + ArchiveSpacePerThread(); | 3697 return storage + ArchiveSpacePerThread(); |
| 3727 } | 3698 } |
| 3728 | 3699 |
| 3729 | 3700 |
| 3730 void HandleScopeImplementer::Iterate( | 3701 void HandleScopeImplementer::Iterate( |
| 3731 ObjectVisitor* v, | 3702 ObjectVisitor* v, |
| 3732 List<void**>* blocks, | 3703 List<i::Object**>* blocks, |
| 3733 v8::ImplementationUtilities::HandleScopeData* handle_data) { | 3704 v8::ImplementationUtilities::HandleScopeData* handle_data) { |
| 3734 // Iterate over all handles in the blocks except for the last. | 3705 // Iterate over all handles in the blocks except for the last. |
| 3735 for (int i = blocks->length() - 2; i >= 0; --i) { | 3706 for (int i = blocks->length() - 2; i >= 0; --i) { |
| 3736 Object** block = | 3707 Object** block = blocks->at(i); |
| 3737 reinterpret_cast<Object**>(blocks->at(i)); | |
| 3738 v->VisitPointers(block, &block[kHandleBlockSize]); | 3708 v->VisitPointers(block, &block[kHandleBlockSize]); |
| 3739 } | 3709 } |
| 3740 | 3710 |
| 3741 // Iterate over live handles in the last block (if any). | 3711 // Iterate over live handles in the last block (if any). |
| 3742 if (!blocks->is_empty()) { | 3712 if (!blocks->is_empty()) { |
| 3743 v->VisitPointers(reinterpret_cast<Object**>(blocks->last()), | 3713 v->VisitPointers(blocks->last(), handle_data->next); |
| 3744 reinterpret_cast<Object**>(handle_data->next)); | |
| 3745 } | 3714 } |
| 3746 } | 3715 } |
| 3747 | 3716 |
| 3748 | 3717 |
| 3749 void HandleScopeImplementer::Iterate(ObjectVisitor* v) { | 3718 void HandleScopeImplementer::Iterate(ObjectVisitor* v) { |
| 3750 v8::ImplementationUtilities::HandleScopeData* current = | 3719 v8::ImplementationUtilities::HandleScopeData* current = |
| 3751 v8::ImplementationUtilities::CurrentHandleScope(); | 3720 v8::ImplementationUtilities::CurrentHandleScope(); |
| 3752 Iterate(v, thread_local.Blocks(), current); | 3721 Iterate(v, thread_local.Blocks(), current); |
| 3753 } | 3722 } |
| 3754 | 3723 |
| 3755 | 3724 |
| 3756 char* HandleScopeImplementer::Iterate(ObjectVisitor* v, char* storage) { | 3725 char* HandleScopeImplementer::Iterate(ObjectVisitor* v, char* storage) { |
| 3757 HandleScopeImplementer* thread_local = | 3726 HandleScopeImplementer* thread_local = |
| 3758 reinterpret_cast<HandleScopeImplementer*>(storage); | 3727 reinterpret_cast<HandleScopeImplementer*>(storage); |
| 3759 List<void**>* blocks_of_archived_thread = thread_local->Blocks(); | 3728 List<internal::Object**>* blocks_of_archived_thread = thread_local->Blocks(); |
| 3760 v8::ImplementationUtilities::HandleScopeData* handle_data_of_archived_thread = | 3729 v8::ImplementationUtilities::HandleScopeData* handle_data_of_archived_thread = |
| 3761 &thread_local->handle_scope_data_; | 3730 &thread_local->handle_scope_data_; |
| 3762 Iterate(v, blocks_of_archived_thread, handle_data_of_archived_thread); | 3731 Iterate(v, blocks_of_archived_thread, handle_data_of_archived_thread); |
| 3763 | 3732 |
| 3764 return storage + ArchiveSpacePerThread(); | 3733 return storage + ArchiveSpacePerThread(); |
| 3765 } | 3734 } |
| 3766 | 3735 |
| 3767 } } // namespace v8::internal | 3736 } } // namespace v8::internal |
| OLD | NEW |