| Index: src/api.cc
|
| ===================================================================
|
| --- src/api.cc (revision 9808)
|
| +++ src/api.cc (working copy)
|
| @@ -2794,7 +2794,7 @@
|
| ENTER_V8(isolate);
|
| i::Handle<i::JSObject> self = Utils::OpenHandle(this);
|
| EXCEPTION_PREAMBLE(isolate);
|
| - i::Handle<i::Object> result = i::GetElement(self, index);
|
| + i::Handle<i::Object> result = i::Object::GetElement(self, index);
|
| has_pending_exception = result.is_null();
|
| EXCEPTION_BAILOUT_CHECK(isolate, Local<Value>());
|
| return Utils::ToLocal(result);
|
| @@ -2874,8 +2874,10 @@
|
| ENTER_V8(isolate);
|
| i::HandleScope scope(isolate);
|
| i::Handle<i::JSObject> self = Utils::OpenHandle(this);
|
| + bool threw = false;
|
| i::Handle<i::FixedArray> value =
|
| - i::GetKeysInFixedArrayFor(self, i::INCLUDE_PROTOS);
|
| + i::GetKeysInFixedArrayFor(self, i::INCLUDE_PROTOS, &threw);
|
| + if (threw) return Local<v8::Array>();
|
| // Because we use caching to speed up enumeration it is important
|
| // to never change the result of the basic enumeration function so
|
| // we clone the result.
|
| @@ -2893,8 +2895,10 @@
|
| ENTER_V8(isolate);
|
| i::HandleScope scope(isolate);
|
| i::Handle<i::JSObject> self = Utils::OpenHandle(this);
|
| + bool threw = false;
|
| i::Handle<i::FixedArray> value =
|
| - i::GetKeysInFixedArrayFor(self, i::LOCAL_ONLY);
|
| + i::GetKeysInFixedArrayFor(self, i::LOCAL_ONLY, &threw);
|
| + if (threw) return Local<v8::Array>();
|
| // Because we use caching to speed up enumeration it is important
|
| // to never change the result of the basic enumeration function so
|
| // we clone the result.
|
| @@ -3093,7 +3097,10 @@
|
| // If the property being looked up is a callback, it can throw
|
| // an exception.
|
| EXCEPTION_PREAMBLE(isolate);
|
| - i::Handle<i::Object> result = i::GetProperty(receiver, name, lookup);
|
| + PropertyAttributes ignored;
|
| + i::Handle<i::Object> result =
|
| + i::Object::GetProperty(receiver, receiver, lookup, name,
|
| + &ignored);
|
| has_pending_exception = result.is_null();
|
| EXCEPTION_BAILOUT_CHECK(isolate, Local<Value>());
|
|
|
| @@ -3110,7 +3117,7 @@
|
| ENTER_V8(isolate);
|
| i::Handle<i::JSObject> self_obj = Utils::OpenHandle(this);
|
| i::Handle<i::String> key_obj = Utils::OpenHandle(*key);
|
| - i::LookupResult lookup;
|
| + i::LookupResult lookup(isolate);
|
| self_obj->LookupRealNamedPropertyInPrototypes(*key_obj, &lookup);
|
| return GetPropertyByLookup(isolate, self_obj, key_obj, &lookup);
|
| }
|
| @@ -3123,7 +3130,7 @@
|
| ENTER_V8(isolate);
|
| i::Handle<i::JSObject> self_obj = Utils::OpenHandle(this);
|
| i::Handle<i::String> key_obj = Utils::OpenHandle(*key);
|
| - i::LookupResult lookup;
|
| + i::LookupResult lookup(isolate);
|
| self_obj->LookupRealNamedProperty(*key_obj, &lookup);
|
| return GetPropertyByLookup(isolate, self_obj, key_obj, &lookup);
|
| }
|
| @@ -3634,13 +3641,30 @@
|
| if (IsDeadCheck(isolate, "v8::String::WriteUtf8()")) return 0;
|
| LOG_API(isolate, "String::WriteUtf8");
|
| ENTER_V8(isolate);
|
| + i::Handle<i::String> str = Utils::OpenHandle(this);
|
| + if (str->IsAsciiRepresentation()) {
|
| + int len;
|
| + if (capacity == -1) {
|
| + capacity = str->length() + 1;
|
| + len = str->length();
|
| + } else {
|
| + len = i::Min(capacity, str->length());
|
| + }
|
| + i::String::WriteToFlat(*str, buffer, 0, len);
|
| + if (nchars_ref != NULL) *nchars_ref = len;
|
| + if (!(options & NO_NULL_TERMINATION) && capacity > len) {
|
| + buffer[len] = '\0';
|
| + return len + 1;
|
| + }
|
| + return len;
|
| + }
|
| +
|
| i::StringInputBuffer& write_input_buffer = *isolate->write_input_buffer();
|
| - i::Handle<i::String> str = Utils::OpenHandle(this);
|
| isolate->string_tracker()->RecordWrite(str);
|
| if (options & HINT_MANY_WRITES_EXPECTED) {
|
| // Flatten the string for efficiency. This applies whether we are
|
| // using StringInputBuffer or Get(i) to access the characters.
|
| - str->TryFlatten();
|
| + FlattenString(str);
|
| }
|
| write_input_buffer.Reset(0, *str);
|
| int len = str->length();
|
| @@ -3961,6 +3985,15 @@
|
|
|
|
|
| void v8::V8::GetHeapStatistics(HeapStatistics* heap_statistics) {
|
| + if (!i::Isolate::Current()->IsInitialized()) {
|
| + // Isolate is unitialized thus heap is not configured yet.
|
| + heap_statistics->set_total_heap_size(0);
|
| + heap_statistics->set_total_heap_size_executable(0);
|
| + heap_statistics->set_used_heap_size(0);
|
| + heap_statistics->set_heap_size_limit(0);
|
| + return;
|
| + }
|
| +
|
| i::Heap* heap = i::Isolate::Current()->heap();
|
| heap_statistics->set_total_heap_size(heap->CommittedMemory());
|
| heap_statistics->set_total_heap_size_executable(
|
| @@ -3973,14 +4006,15 @@
|
| bool v8::V8::IdleNotification() {
|
| // Returning true tells the caller that it need not
|
| // continue to call IdleNotification.
|
| - if (!i::Isolate::Current()->IsInitialized()) return true;
|
| + i::Isolate* isolate = i::Isolate::Current();
|
| + if (isolate == NULL || !isolate->IsInitialized()) return true;
|
| return i::V8::IdleNotification();
|
| }
|
|
|
|
|
| void v8::V8::LowMemoryNotification() {
|
| i::Isolate* isolate = i::Isolate::Current();
|
| - if (!isolate->IsInitialized()) return;
|
| + if (isolate == NULL || !isolate->IsInitialized()) return;
|
| isolate->heap()->CollectAllAvailableGarbage();
|
| }
|
|
|
| @@ -4075,8 +4109,9 @@
|
| }
|
| // Leave V8.
|
|
|
| - if (env.is_null())
|
| + if (env.is_null()) {
|
| return Persistent<Context>();
|
| + }
|
| return Persistent<Context>(Utils::ToLocal(env));
|
| }
|
|
|
|
|