Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index ea2c202c9e38da9ffae0a23f555b926c0fb3c596..e2fa3b5371db5213cb889f99f030916a22aba083 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -28,6 +28,7 @@ |
#include "v8.h" |
#include "api.h" |
+#include "arguments.h" |
#include "bootstrapper.h" |
#include "debug.h" |
#include "execution.h" |
@@ -158,14 +159,12 @@ Object* Object::GetPropertyWithCallback(Object* receiver, |
Object* fun_obj = data->getter(); |
v8::AccessorGetter call_fun = v8::ToCData<v8::AccessorGetter>(fun_obj); |
HandleScope scope; |
- Handle<JSObject> self(JSObject::cast(receiver)); |
- Handle<JSObject> holder_handle(JSObject::cast(holder)); |
+ JSObject* self = JSObject::cast(receiver); |
+ JSObject* holder_handle = JSObject::cast(holder); |
Handle<String> key(name); |
- Handle<Object> fun_data(data->data()); |
- LOG(ApiNamedPropertyAccess("load", *self, name)); |
- v8::AccessorInfo info(v8::Utils::ToLocal(self), |
- v8::Utils::ToLocal(fun_data), |
- v8::Utils::ToLocal(holder_handle)); |
+ LOG(ApiNamedPropertyAccess("load", self, name)); |
+ CustomArguments args(data->data(), self, holder_handle); |
+ v8::AccessorInfo info(args.end()); |
v8::Handle<v8::Value> result; |
{ |
// Leaving JavaScript. |
@@ -1538,11 +1537,9 @@ Object* JSObject::SetPropertyWithInterceptor(String* name, |
Handle<Object> value_handle(value); |
Handle<InterceptorInfo> interceptor(GetNamedInterceptor()); |
if (!interceptor->setter()->IsUndefined()) { |
- Handle<Object> data_handle(interceptor->data()); |
LOG(ApiNamedPropertyAccess("interceptor-named-set", this, name)); |
- v8::AccessorInfo info(v8::Utils::ToLocal(this_handle), |
- v8::Utils::ToLocal(data_handle), |
- v8::Utils::ToLocal(this_handle)); |
+ CustomArguments args(interceptor->data(), this, this); |
+ v8::AccessorInfo info(args.end()); |
v8::NamedPropertySetter setter = |
v8::ToCData<v8::NamedPropertySetter>(interceptor->setter()); |
v8::Handle<v8::Value> result; |
@@ -1605,14 +1602,10 @@ Object* JSObject::SetPropertyWithCallback(Object* structure, |
Object* call_obj = data->setter(); |
v8::AccessorSetter call_fun = v8::ToCData<v8::AccessorSetter>(call_obj); |
if (call_fun == NULL) return value; |
- Handle<JSObject> self(this); |
- Handle<JSObject> holder_handle(JSObject::cast(holder)); |
Handle<String> key(name); |
- Handle<Object> fun_data(data->data()); |
LOG(ApiNamedPropertyAccess("store", this, name)); |
- v8::AccessorInfo info(v8::Utils::ToLocal(self), |
- v8::Utils::ToLocal(fun_data), |
- v8::Utils::ToLocal(holder_handle)); |
+ CustomArguments args(data->data(), this, JSObject::cast(holder)); |
+ v8::AccessorInfo info(args.end()); |
{ |
// Leaving JavaScript. |
VMState state(EXTERNAL); |
@@ -2036,10 +2029,8 @@ PropertyAttributes JSObject::GetPropertyAttributeWithInterceptor( |
Handle<JSObject> receiver_handle(receiver); |
Handle<JSObject> holder_handle(this); |
Handle<String> name_handle(name); |
- Handle<Object> data_handle(interceptor->data()); |
- v8::AccessorInfo info(v8::Utils::ToLocal(receiver_handle), |
- v8::Utils::ToLocal(data_handle), |
- v8::Utils::ToLocal(holder_handle)); |
+ CustomArguments args(interceptor->data(), receiver, this); |
+ v8::AccessorInfo info(args.end()); |
if (!interceptor->query()->IsUndefined()) { |
v8::NamedPropertyQuery query = |
v8::ToCData<v8::NamedPropertyQuery>(interceptor->query()); |
@@ -2307,11 +2298,9 @@ Object* JSObject::DeletePropertyWithInterceptor(String* name) { |
if (!interceptor->deleter()->IsUndefined()) { |
v8::NamedPropertyDeleter deleter = |
v8::ToCData<v8::NamedPropertyDeleter>(interceptor->deleter()); |
- Handle<Object> data_handle(interceptor->data()); |
LOG(ApiNamedPropertyAccess("interceptor-named-delete", *this_handle, name)); |
- v8::AccessorInfo info(v8::Utils::ToLocal(this_handle), |
- v8::Utils::ToLocal(data_handle), |
- v8::Utils::ToLocal(this_handle)); |
+ CustomArguments args(interceptor->data(), this, this); |
+ v8::AccessorInfo info(args.end()); |
v8::Handle<v8::Boolean> result; |
{ |
// Leaving JavaScript. |
@@ -2370,11 +2359,9 @@ Object* JSObject::DeleteElementWithInterceptor(uint32_t index) { |
v8::IndexedPropertyDeleter deleter = |
v8::ToCData<v8::IndexedPropertyDeleter>(interceptor->deleter()); |
Handle<JSObject> this_handle(this); |
- Handle<Object> data_handle(interceptor->data()); |
LOG(ApiIndexedPropertyAccess("interceptor-indexed-delete", this, index)); |
- v8::AccessorInfo info(v8::Utils::ToLocal(this_handle), |
- v8::Utils::ToLocal(data_handle), |
- v8::Utils::ToLocal(this_handle)); |
+ CustomArguments args(interceptor->data(), this, this); |
+ v8::AccessorInfo info(args.end()); |
v8::Handle<v8::Boolean> result; |
{ |
// Leaving JavaScript. |
@@ -3971,35 +3958,75 @@ const unibrow::byte* String::ReadBlock(String* input, |
} |
-FlatStringReader* FlatStringReader::top_ = NULL; |
+Relocatable* Relocatable::top_ = NULL; |
+ |
+ |
+void Relocatable::PostGarbageCollectionProcessing() { |
+ Relocatable* current = top_; |
+ while (current != NULL) { |
+ current->PostGarbageCollection(); |
+ current = current->prev_; |
+ } |
+} |
+ |
+ |
+// Reserve space for statics needing saving and restoring. |
+int Relocatable::ArchiveSpacePerThread() { |
+ return sizeof(top_); |
+} |
+ |
+ |
+// Archive statics that are thread local. |
+char* Relocatable::ArchiveState(char* to) { |
+ *reinterpret_cast<Relocatable**>(to) = top_; |
+ top_ = NULL; |
+ return to + ArchiveSpacePerThread(); |
+} |
+ |
+ |
+// Restore statics that are thread local. |
+char* Relocatable::RestoreState(char* from) { |
+ top_ = *reinterpret_cast<Relocatable**>(from); |
+ return from + ArchiveSpacePerThread(); |
+} |
+ |
+ |
+char* Relocatable::Iterate(ObjectVisitor* v, char* thread_storage) { |
+ Relocatable* top = *reinterpret_cast<Relocatable**>(thread_storage); |
+ Iterate(v, top); |
+ return thread_storage + ArchiveSpacePerThread(); |
+} |
+ |
+ |
+void Relocatable::Iterate(ObjectVisitor* v) { |
+ Iterate(v, top_); |
+} |
+ |
+ |
+void Relocatable::Iterate(ObjectVisitor* v, Relocatable* top) { |
+ Relocatable* current = top; |
+ while (current != NULL) { |
+ current->IterateInstance(v); |
+ current = current->prev_; |
+ } |
+} |
FlatStringReader::FlatStringReader(Handle<String> str) |
: str_(str.location()), |
- length_(str->length()), |
- prev_(top_) { |
- top_ = this; |
- RefreshState(); |
+ length_(str->length()) { |
+ PostGarbageCollection(); |
} |
FlatStringReader::FlatStringReader(Vector<const char> input) |
- : str_(NULL), |
+ : str_(0), |
is_ascii_(true), |
length_(input.length()), |
- start_(input.start()), |
- prev_(top_) { |
- top_ = this; |
-} |
+ start_(input.start()) { } |
-FlatStringReader::~FlatStringReader() { |
- ASSERT_EQ(top_, this); |
- top_ = prev_; |
-} |
- |
- |
-void FlatStringReader::RefreshState() { |
+void FlatStringReader::PostGarbageCollection() { |
if (str_ == NULL) return; |
Handle<String> str(str_); |
ASSERT(str->IsFlat()); |
@@ -4012,15 +4039,6 @@ void FlatStringReader::RefreshState() { |
} |
-void FlatStringReader::PostGarbageCollectionProcessing() { |
- FlatStringReader* current = top_; |
- while (current != NULL) { |
- current->RefreshState(); |
- current = current->prev_; |
- } |
-} |
- |
- |
void StringInputBuffer::Seek(unsigned pos) { |
Reset(pos, input_); |
} |
@@ -5429,10 +5447,8 @@ bool JSObject::HasElementWithInterceptor(JSObject* receiver, uint32_t index) { |
Handle<InterceptorInfo> interceptor(GetIndexedInterceptor()); |
Handle<JSObject> receiver_handle(receiver); |
Handle<JSObject> holder_handle(this); |
- Handle<Object> data_handle(interceptor->data()); |
- v8::AccessorInfo info(v8::Utils::ToLocal(receiver_handle), |
- v8::Utils::ToLocal(data_handle), |
- v8::Utils::ToLocal(holder_handle)); |
+ CustomArguments args(interceptor->data(), receiver, this); |
+ v8::AccessorInfo info(args.end()); |
if (!interceptor->query()->IsUndefined()) { |
v8::IndexedPropertyQuery query = |
v8::ToCData<v8::IndexedPropertyQuery>(interceptor->query()); |
@@ -5564,11 +5580,9 @@ Object* JSObject::SetElementWithInterceptor(uint32_t index, Object* value) { |
if (!interceptor->setter()->IsUndefined()) { |
v8::IndexedPropertySetter setter = |
v8::ToCData<v8::IndexedPropertySetter>(interceptor->setter()); |
- Handle<Object> data_handle(interceptor->data()); |
LOG(ApiIndexedPropertyAccess("interceptor-indexed-set", this, index)); |
- v8::AccessorInfo info(v8::Utils::ToLocal(this_handle), |
- v8::Utils::ToLocal(data_handle), |
- v8::Utils::ToLocal(this_handle)); |
+ CustomArguments args(interceptor->data(), this, this); |
+ v8::AccessorInfo info(args.end()); |
v8::Handle<v8::Value> result; |
{ |
// Leaving JavaScript. |
@@ -5836,13 +5850,11 @@ Object* JSObject::GetElementWithInterceptor(JSObject* receiver, |
Handle<JSObject> holder_handle(this); |
if (!interceptor->getter()->IsUndefined()) { |
- Handle<Object> data_handle(interceptor->data()); |
v8::IndexedPropertyGetter getter = |
v8::ToCData<v8::IndexedPropertyGetter>(interceptor->getter()); |
LOG(ApiIndexedPropertyAccess("interceptor-indexed-get", this, index)); |
- v8::AccessorInfo info(v8::Utils::ToLocal(this_handle), |
- v8::Utils::ToLocal(data_handle), |
- v8::Utils::ToLocal(holder_handle)); |
+ CustomArguments args(interceptor->data(), receiver, this); |
+ v8::AccessorInfo info(args.end()); |
v8::Handle<v8::Value> result; |
{ |
// Leaving JavaScript. |
@@ -6074,15 +6086,13 @@ Object* JSObject::GetPropertyWithInterceptor( |
Handle<JSObject> receiver_handle(receiver); |
Handle<JSObject> holder_handle(this); |
Handle<String> name_handle(name); |
- Handle<Object> data_handle(interceptor->data()); |
if (!interceptor->getter()->IsUndefined()) { |
v8::NamedPropertyGetter getter = |
v8::ToCData<v8::NamedPropertyGetter>(interceptor->getter()); |
LOG(ApiNamedPropertyAccess("interceptor-named-get", *holder_handle, name)); |
- v8::AccessorInfo info(v8::Utils::ToLocal(receiver_handle), |
- v8::Utils::ToLocal(data_handle), |
- v8::Utils::ToLocal(holder_handle)); |
+ CustomArguments args(interceptor->data(), receiver, this); |
+ v8::AccessorInfo info(args.end()); |
v8::Handle<v8::Value> result; |
{ |
// Leaving JavaScript. |