| OLD | NEW |
| 1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 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 439 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 450 | 450 |
| 451 void V8::DisposeGlobal(i::Object** obj) { | 451 void V8::DisposeGlobal(i::Object** obj) { |
| 452 LOG_API("DisposeGlobal"); | 452 LOG_API("DisposeGlobal"); |
| 453 if (!i::V8::IsRunning()) return; | 453 if (!i::V8::IsRunning()) return; |
| 454 i::GlobalHandles::Destroy(obj); | 454 i::GlobalHandles::Destroy(obj); |
| 455 } | 455 } |
| 456 | 456 |
| 457 // --- H a n d l e s --- | 457 // --- H a n d l e s --- |
| 458 | 458 |
| 459 | 459 |
| 460 HandleScope::HandleScope() : is_closed_(false) { | 460 HandleScope::HandleScope() |
| 461 : prev_next_(i::HandleScope::current_.next), |
| 462 prev_limit_(i::HandleScope::current_.limit), |
| 463 is_closed_(false) { |
| 461 API_ENTRY_CHECK("HandleScope::HandleScope"); | 464 API_ENTRY_CHECK("HandleScope::HandleScope"); |
| 462 i::HandleScope::Enter(&previous_); | 465 i::HandleScope::current_.level++; |
| 463 } | 466 } |
| 464 | 467 |
| 465 | 468 |
| 466 HandleScope::~HandleScope() { | 469 HandleScope::~HandleScope() { |
| 467 if (!is_closed_) { | 470 if (!is_closed_) { |
| 468 i::HandleScope::Leave(&previous_); | 471 Leave(); |
| 469 } | 472 } |
| 470 } | 473 } |
| 471 | 474 |
| 472 | 475 |
| 476 void HandleScope::Leave() { |
| 477 i::HandleScope::current_.level--; |
| 478 ASSERT(i::HandleScope::current_.level >= 0); |
| 479 i::HandleScope::current_.next = prev_next_; |
| 480 if (i::HandleScope::current_.limit != prev_limit_) { |
| 481 i::HandleScope::current_.limit = prev_limit_; |
| 482 i::HandleScope::DeleteExtensions(); |
| 483 } |
| 484 |
| 485 #ifdef DEBUG |
| 486 i::HandleScope::ZapRange(prev_next_, prev_limit_); |
| 487 #endif |
| 488 } |
| 489 |
| 490 |
| 473 int HandleScope::NumberOfHandles() { | 491 int HandleScope::NumberOfHandles() { |
| 474 return i::HandleScope::NumberOfHandles(); | 492 return i::HandleScope::NumberOfHandles(); |
| 475 } | 493 } |
| 476 | 494 |
| 477 | 495 |
| 478 i::Object** v8::HandleScope::CreateHandle(i::Object* value) { | 496 i::Object** v8::HandleScope::CreateHandle(i::Object* value) { |
| 479 return i::HandleScope::CreateHandle(value); | 497 return i::HandleScope::CreateHandle(value); |
| 480 } | 498 } |
| 481 | 499 |
| 482 | 500 |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 546 return 0; | 564 return 0; |
| 547 } | 565 } |
| 548 LOG_API("CloseHandleScope"); | 566 LOG_API("CloseHandleScope"); |
| 549 | 567 |
| 550 // Read the result before popping the handle block. | 568 // Read the result before popping the handle block. |
| 551 i::Object* result = NULL; | 569 i::Object* result = NULL; |
| 552 if (value != NULL) { | 570 if (value != NULL) { |
| 553 result = *value; | 571 result = *value; |
| 554 } | 572 } |
| 555 is_closed_ = true; | 573 is_closed_ = true; |
| 556 i::HandleScope::Leave(&previous_); | 574 Leave(); |
| 557 | 575 |
| 558 if (value == NULL) { | 576 if (value == NULL) { |
| 559 return NULL; | 577 return NULL; |
| 560 } | 578 } |
| 561 | 579 |
| 562 // Allocate a new handle on the previous handle block. | 580 // Allocate a new handle on the previous handle block. |
| 563 i::Handle<i::Object> handle(result); | 581 i::Handle<i::Object> handle(result); |
| 564 return handle.location(); | 582 return handle.location(); |
| 565 } | 583 } |
| 566 | 584 |
| (...skipping 915 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1482 return scope.Close(Utils::StackTraceToLocal(stackTrace)); | 1500 return scope.Close(Utils::StackTraceToLocal(stackTrace)); |
| 1483 } | 1501 } |
| 1484 | 1502 |
| 1485 | 1503 |
| 1486 static i::Handle<i::Object> CallV8HeapFunction(const char* name, | 1504 static i::Handle<i::Object> CallV8HeapFunction(const char* name, |
| 1487 i::Handle<i::Object> recv, | 1505 i::Handle<i::Object> recv, |
| 1488 int argc, | 1506 int argc, |
| 1489 i::Object** argv[], | 1507 i::Object** argv[], |
| 1490 bool* has_pending_exception) { | 1508 bool* has_pending_exception) { |
| 1491 i::Handle<i::String> fmt_str = i::Factory::LookupAsciiSymbol(name); | 1509 i::Handle<i::String> fmt_str = i::Factory::LookupAsciiSymbol(name); |
| 1492 i::Object* object_fun = i::Top::builtins()->GetProperty(*fmt_str); | 1510 i::Object* object_fun = |
| 1511 i::Top::builtins()->GetPropertyNoExceptionThrown(*fmt_str); |
| 1493 i::Handle<i::JSFunction> fun = | 1512 i::Handle<i::JSFunction> fun = |
| 1494 i::Handle<i::JSFunction>(i::JSFunction::cast(object_fun)); | 1513 i::Handle<i::JSFunction>(i::JSFunction::cast(object_fun)); |
| 1495 i::Handle<i::Object> value = | 1514 i::Handle<i::Object> value = |
| 1496 i::Execution::Call(fun, recv, argc, argv, has_pending_exception); | 1515 i::Execution::Call(fun, recv, argc, argv, has_pending_exception); |
| 1497 return value; | 1516 return value; |
| 1498 } | 1517 } |
| 1499 | 1518 |
| 1500 | 1519 |
| 1501 static i::Handle<i::Object> CallV8HeapFunction(const char* name, | 1520 static i::Handle<i::Object> CallV8HeapFunction(const char* name, |
| 1502 i::Handle<i::Object> data, | 1521 i::Handle<i::Object> data, |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1598 } | 1617 } |
| 1599 | 1618 |
| 1600 | 1619 |
| 1601 // --- S t a c k T r a c e --- | 1620 // --- S t a c k T r a c e --- |
| 1602 | 1621 |
| 1603 Local<StackFrame> StackTrace::GetFrame(uint32_t index) const { | 1622 Local<StackFrame> StackTrace::GetFrame(uint32_t index) const { |
| 1604 if (IsDeadCheck("v8::StackTrace::GetFrame()")) return Local<StackFrame>(); | 1623 if (IsDeadCheck("v8::StackTrace::GetFrame()")) return Local<StackFrame>(); |
| 1605 ENTER_V8; | 1624 ENTER_V8; |
| 1606 HandleScope scope; | 1625 HandleScope scope; |
| 1607 i::Handle<i::JSArray> self = Utils::OpenHandle(this); | 1626 i::Handle<i::JSArray> self = Utils::OpenHandle(this); |
| 1608 i::Handle<i::JSObject> obj(i::JSObject::cast(self->GetElement(index))); | 1627 i::Object* raw_object = self->GetElementNoExceptionThrown(index); |
| 1628 i::Handle<i::JSObject> obj(i::JSObject::cast(raw_object)); |
| 1609 return scope.Close(Utils::StackFrameToLocal(obj)); | 1629 return scope.Close(Utils::StackFrameToLocal(obj)); |
| 1610 } | 1630 } |
| 1611 | 1631 |
| 1612 | 1632 |
| 1613 int StackTrace::GetFrameCount() const { | 1633 int StackTrace::GetFrameCount() const { |
| 1614 if (IsDeadCheck("v8::StackTrace::GetFrameCount()")) return -1; | 1634 if (IsDeadCheck("v8::StackTrace::GetFrameCount()")) return -1; |
| 1615 ENTER_V8; | 1635 ENTER_V8; |
| 1616 return i::Smi::cast(Utils::OpenHandle(this)->length())->value(); | 1636 return i::Smi::cast(Utils::OpenHandle(this)->length())->value(); |
| 1617 } | 1637 } |
| 1618 | 1638 |
| (...skipping 895 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2514 Handle<String> key) { | 2534 Handle<String> key) { |
| 2515 ON_BAILOUT("v8::Object::GetRealNamedPropertyInPrototypeChain()", | 2535 ON_BAILOUT("v8::Object::GetRealNamedPropertyInPrototypeChain()", |
| 2516 return Local<Value>()); | 2536 return Local<Value>()); |
| 2517 ENTER_V8; | 2537 ENTER_V8; |
| 2518 i::Handle<i::JSObject> self_obj = Utils::OpenHandle(this); | 2538 i::Handle<i::JSObject> self_obj = Utils::OpenHandle(this); |
| 2519 i::Handle<i::String> key_obj = Utils::OpenHandle(*key); | 2539 i::Handle<i::String> key_obj = Utils::OpenHandle(*key); |
| 2520 i::LookupResult lookup; | 2540 i::LookupResult lookup; |
| 2521 self_obj->LookupRealNamedPropertyInPrototypes(*key_obj, &lookup); | 2541 self_obj->LookupRealNamedPropertyInPrototypes(*key_obj, &lookup); |
| 2522 if (lookup.IsProperty()) { | 2542 if (lookup.IsProperty()) { |
| 2523 PropertyAttributes attributes; | 2543 PropertyAttributes attributes; |
| 2524 i::Handle<i::Object> result(self_obj->GetProperty(*self_obj, | 2544 i::Object* property = |
| 2525 &lookup, | 2545 self_obj->GetProperty(*self_obj, |
| 2526 *key_obj, | 2546 &lookup, |
| 2527 &attributes)); | 2547 *key_obj, |
| 2548 &attributes)->ToObjectUnchecked(); |
| 2549 i::Handle<i::Object> result(property); |
| 2528 return Utils::ToLocal(result); | 2550 return Utils::ToLocal(result); |
| 2529 } | 2551 } |
| 2530 return Local<Value>(); // No real property was found in prototype chain. | 2552 return Local<Value>(); // No real property was found in prototype chain. |
| 2531 } | 2553 } |
| 2532 | 2554 |
| 2533 | 2555 |
| 2534 Local<Value> v8::Object::GetRealNamedProperty(Handle<String> key) { | 2556 Local<Value> v8::Object::GetRealNamedProperty(Handle<String> key) { |
| 2535 ON_BAILOUT("v8::Object::GetRealNamedProperty()", return Local<Value>()); | 2557 ON_BAILOUT("v8::Object::GetRealNamedProperty()", return Local<Value>()); |
| 2536 ENTER_V8; | 2558 ENTER_V8; |
| 2537 i::Handle<i::JSObject> self_obj = Utils::OpenHandle(this); | 2559 i::Handle<i::JSObject> self_obj = Utils::OpenHandle(this); |
| 2538 i::Handle<i::String> key_obj = Utils::OpenHandle(*key); | 2560 i::Handle<i::String> key_obj = Utils::OpenHandle(*key); |
| 2539 i::LookupResult lookup; | 2561 i::LookupResult lookup; |
| 2540 self_obj->LookupRealNamedProperty(*key_obj, &lookup); | 2562 self_obj->LookupRealNamedProperty(*key_obj, &lookup); |
| 2541 if (lookup.IsProperty()) { | 2563 if (lookup.IsProperty()) { |
| 2542 PropertyAttributes attributes; | 2564 PropertyAttributes attributes; |
| 2543 i::Handle<i::Object> result(self_obj->GetProperty(*self_obj, | 2565 i::Object* property = |
| 2544 &lookup, | 2566 self_obj->GetProperty(*self_obj, |
| 2545 *key_obj, | 2567 &lookup, |
| 2546 &attributes)); | 2568 *key_obj, |
| 2569 &attributes)->ToObjectUnchecked(); |
| 2570 i::Handle<i::Object> result(property); |
| 2547 return Utils::ToLocal(result); | 2571 return Utils::ToLocal(result); |
| 2548 } | 2572 } |
| 2549 return Local<Value>(); // No real property was found in prototype chain. | 2573 return Local<Value>(); // No real property was found in prototype chain. |
| 2550 } | 2574 } |
| 2551 | 2575 |
| 2552 | 2576 |
| 2553 // Turns on access checks by copying the map and setting the check flag. | 2577 // Turns on access checks by copying the map and setting the check flag. |
| 2554 // Because the object gets a new map, existing inline cache caching | 2578 // Because the object gets a new map, existing inline cache caching |
| 2555 // the old map of this object will fail. | 2579 // the old map of this object will fail. |
| 2556 void v8::Object::TurnOnAccessCheck() { | 2580 void v8::Object::TurnOnAccessCheck() { |
| (...skipping 2412 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4969 | 4993 |
| 4970 | 4994 |
| 4971 char* HandleScopeImplementer::Iterate(ObjectVisitor* v, char* storage) { | 4995 char* HandleScopeImplementer::Iterate(ObjectVisitor* v, char* storage) { |
| 4972 HandleScopeImplementer* thread_local = | 4996 HandleScopeImplementer* thread_local = |
| 4973 reinterpret_cast<HandleScopeImplementer*>(storage); | 4997 reinterpret_cast<HandleScopeImplementer*>(storage); |
| 4974 thread_local->IterateThis(v); | 4998 thread_local->IterateThis(v); |
| 4975 return storage + ArchiveSpacePerThread(); | 4999 return storage + ArchiveSpacePerThread(); |
| 4976 } | 5000 } |
| 4977 | 5001 |
| 4978 } } // namespace v8::internal | 5002 } } // namespace v8::internal |
| OLD | NEW |