| Index: src/api.cc
|
| ===================================================================
|
| --- src/api.cc (revision 3964)
|
| +++ src/api.cc (working copy)
|
| @@ -34,10 +34,11 @@
|
| #include "debug.h"
|
| #include "execution.h"
|
| #include "global-handles.h"
|
| -#include "globals.h"
|
| +#include "messages.h"
|
| #include "platform.h"
|
| #include "serialize.h"
|
| #include "snapshot.h"
|
| +#include "top.h"
|
| #include "utils.h"
|
| #include "v8threads.h"
|
| #include "version.h"
|
| @@ -439,7 +440,6 @@
|
| void V8::DisposeGlobal(i::Object** obj) {
|
| LOG_API("DisposeGlobal");
|
| if (!i::V8::IsRunning()) return;
|
| - if ((*obj)->IsGlobalContext()) i::Heap::NotifyContextDisposed();
|
| i::GlobalHandles::Destroy(obj);
|
| }
|
|
|
| @@ -1577,6 +1577,18 @@
|
| }
|
|
|
|
|
| +bool Value::IsUint32() const {
|
| + if (IsDeadCheck("v8::Value::IsUint32()")) return false;
|
| + i::Handle<i::Object> obj = Utils::OpenHandle(this);
|
| + if (obj->IsSmi()) return i::Smi::cast(*obj)->value() >= 0;
|
| + if (obj->IsNumber()) {
|
| + double value = obj->Number();
|
| + return i::FastUI2D(i::FastD2UI(value)) == value;
|
| + }
|
| + return false;
|
| +}
|
| +
|
| +
|
| bool Value::IsDate() const {
|
| if (IsDeadCheck("v8::Value::IsDate()")) return false;
|
| i::Handle<i::Object> obj = Utils::OpenHandle(this);
|
| @@ -1982,6 +1994,23 @@
|
| }
|
|
|
|
|
| +bool v8::Object::Set(uint32_t index, v8::Handle<Value> value) {
|
| + ON_BAILOUT("v8::Object::Set()", return false);
|
| + ENTER_V8;
|
| + HandleScope scope;
|
| + i::Handle<i::JSObject> self = Utils::OpenHandle(this);
|
| + i::Handle<i::Object> value_obj = Utils::OpenHandle(*value);
|
| + EXCEPTION_PREAMBLE();
|
| + i::Handle<i::Object> obj = i::SetElement(
|
| + self,
|
| + index,
|
| + value_obj);
|
| + has_pending_exception = obj.is_null();
|
| + EXCEPTION_BAILOUT_CHECK(false);
|
| + return true;
|
| +}
|
| +
|
| +
|
| bool v8::Object::ForceSet(v8::Handle<Value> key,
|
| v8::Handle<Value> value,
|
| v8::PropertyAttribute attribs) {
|
| @@ -2030,6 +2059,18 @@
|
| }
|
|
|
|
|
| +Local<Value> v8::Object::Get(uint32_t index) {
|
| + ON_BAILOUT("v8::Object::Get()", return Local<v8::Value>());
|
| + ENTER_V8;
|
| + i::Handle<i::JSObject> self = Utils::OpenHandle(this);
|
| + EXCEPTION_PREAMBLE();
|
| + i::Handle<i::Object> result = i::GetElement(self, index);
|
| + has_pending_exception = result.is_null();
|
| + EXCEPTION_BAILOUT_CHECK(Local<Value>());
|
| + return Utils::ToLocal(result);
|
| +}
|
| +
|
| +
|
| Local<Value> v8::Object::GetPrototype() {
|
| ON_BAILOUT("v8::Object::GetPrototype()", return Local<v8::Value>());
|
| ENTER_V8;
|
| @@ -2622,7 +2663,7 @@
|
| StringTracker::RecordWrite(str);
|
| // Flatten the string for efficiency. This applies whether we are
|
| // using StringInputBuffer or Get(i) to access the characters.
|
| - str->TryFlattenIfNotFlat();
|
| + str->TryFlatten();
|
| int end = length;
|
| if ( (length == -1) || (length > str->length() - start) )
|
| end = str->length() - start;
|
| @@ -2735,6 +2776,17 @@
|
| }
|
|
|
|
|
| +uint32_t Uint32::Value() const {
|
| + if (IsDeadCheck("v8::Uint32::Value()")) return 0;
|
| + i::Handle<i::Object> obj = Utils::OpenHandle(this);
|
| + if (obj->IsSmi()) {
|
| + return i::Smi::cast(*obj)->value();
|
| + } else {
|
| + return static_cast<uint32_t>(obj->Number());
|
| + }
|
| +}
|
| +
|
| +
|
| int v8::Object::InternalFieldCount() {
|
| if (IsDeadCheck("v8::Object::InternalFieldCount()")) return 0;
|
| i::Handle<i::JSObject> obj = Utils::OpenHandle(this);
|
| @@ -2828,6 +2880,12 @@
|
| }
|
|
|
|
|
| +int v8::V8::ContextDisposedNotification() {
|
| + if (!i::V8::IsRunning()) return 0;
|
| + return i::Heap::NotifyContextDisposed();
|
| +}
|
| +
|
| +
|
| const char* v8::V8::GetVersion() {
|
| static v8::internal::EmbeddedVector<char, 128> buffer;
|
| v8::internal::Version::GetString(buffer);
|
| @@ -2855,14 +2913,6 @@
|
| LOG_API("Context::New");
|
| ON_BAILOUT("v8::Context::New()", return Persistent<Context>());
|
|
|
| -#if defined(ANDROID)
|
| - // On mobile device, full GC is expensive, leave it to the system to
|
| - // decide when should make a full GC.
|
| -#else
|
| - // Give the heap a chance to cleanup if we've disposed contexts.
|
| - i::Heap::CollectAllGarbageIfContextDisposed();
|
| -#endif
|
| -
|
| // Enter V8 via an ENTER_V8 scope.
|
| i::Handle<i::Context> env;
|
| {
|
| @@ -3569,6 +3619,15 @@
|
| }
|
|
|
|
|
| +bool V8::IsExecutionTerminating() {
|
| + if (!i::V8::IsRunning()) return false;
|
| + if (i::Top::has_scheduled_exception()) {
|
| + return i::Top::scheduled_exception() == i::Heap::termination_exception();
|
| + }
|
| + return false;
|
| +}
|
| +
|
| +
|
| String::Utf8Value::Utf8Value(v8::Handle<v8::Value> obj) {
|
| EnsureInitialized("v8::String::Utf8Value::Utf8Value()");
|
| if (obj.IsEmpty()) {
|
|
|