| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/api.h" | 5 #include "src/api.h" |
| 6 | 6 |
| 7 #include <string.h> // For memcpy, strlen. | 7 #include <string.h> // For memcpy, strlen. |
| 8 #ifdef V8_USE_ADDRESS_SANITIZER | 8 #ifdef V8_USE_ADDRESS_SANITIZER |
| 9 #include <sanitizer/asan_interface.h> | 9 #include <sanitizer/asan_interface.h> |
| 10 #endif // V8_USE_ADDRESS_SANITIZER | 10 #endif // V8_USE_ADDRESS_SANITIZER |
| (...skipping 1034 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1045 i::Handle<i::FixedArray> elements = isolate->factory()->NewFixedArray(size); | 1045 i::Handle<i::FixedArray> elements = isolate->factory()->NewFixedArray(size); |
| 1046 value_->set_elements(*elements); | 1046 value_->set_elements(*elements); |
| 1047 } | 1047 } |
| 1048 | 1048 |
| 1049 | 1049 |
| 1050 int NeanderObject::size() { | 1050 int NeanderObject::size() { |
| 1051 return i::FixedArray::cast(value_->elements())->length(); | 1051 return i::FixedArray::cast(value_->elements())->length(); |
| 1052 } | 1052 } |
| 1053 | 1053 |
| 1054 | 1054 |
| 1055 NeanderArray::NeanderArray(v8::internal::Isolate* isolate) : obj_(isolate, 2) { | |
| 1056 obj_.set(0, i::Smi::FromInt(0)); | |
| 1057 } | |
| 1058 | |
| 1059 | |
| 1060 int NeanderArray::length() { | |
| 1061 return i::Smi::cast(obj_.get(0))->value(); | |
| 1062 } | |
| 1063 | |
| 1064 | |
| 1065 i::Object* NeanderArray::get(int offset) { | |
| 1066 DCHECK_LE(0, offset); | |
| 1067 DCHECK_LT(offset, length()); | |
| 1068 return obj_.get(offset + 1); | |
| 1069 } | |
| 1070 | |
| 1071 | |
| 1072 // This method cannot easily return an error value, therefore it is necessary | |
| 1073 // to check for a dead VM with ON_BAILOUT before calling it. To remind you | |
| 1074 // about this there is no HandleScope in this method. When you add one to the | |
| 1075 // site calling this method you should check that you ensured the VM was not | |
| 1076 // dead first. | |
| 1077 void NeanderArray::add(i::Isolate* isolate, i::Handle<i::Object> value) { | |
| 1078 int length = this->length(); | |
| 1079 int size = obj_.size(); | |
| 1080 if (length == size - 1) { | |
| 1081 i::Factory* factory = isolate->factory(); | |
| 1082 i::Handle<i::FixedArray> new_elms = factory->NewFixedArray(2 * size); | |
| 1083 for (int i = 0; i < length; i++) | |
| 1084 new_elms->set(i + 1, get(i)); | |
| 1085 obj_.value()->set_elements(*new_elms); | |
| 1086 } | |
| 1087 obj_.set(length + 1, *value); | |
| 1088 obj_.set(0, i::Smi::FromInt(length + 1)); | |
| 1089 } | |
| 1090 | |
| 1091 | |
| 1092 void NeanderArray::set(int index, i::Object* value) { | |
| 1093 if (index < 0 || index >= this->length()) return; | |
| 1094 obj_.set(index + 1, value); | |
| 1095 } | |
| 1096 | |
| 1097 | |
| 1098 // --- T e m p l a t e --- | 1055 // --- T e m p l a t e --- |
| 1099 | 1056 |
| 1100 | 1057 |
| 1101 static void InitializeTemplate(i::Handle<i::TemplateInfo> that, int type) { | 1058 static void InitializeTemplate(i::Handle<i::TemplateInfo> that, int type) { |
| 1102 that->set_number_of_properties(0); | 1059 that->set_number_of_properties(0); |
| 1103 that->set_tag(i::Smi::FromInt(type)); | 1060 that->set_tag(i::Smi::FromInt(type)); |
| 1104 } | 1061 } |
| 1105 | 1062 |
| 1106 | 1063 |
| 1107 void Template::Set(v8::Local<Name> name, v8::Local<Data> value, | 1064 void Template::Set(v8::Local<Name> name, v8::Local<Data> value, |
| (...skipping 6867 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7975 bool Isolate::IsDead() { | 7932 bool Isolate::IsDead() { |
| 7976 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); | 7933 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); |
| 7977 return isolate->IsDead(); | 7934 return isolate->IsDead(); |
| 7978 } | 7935 } |
| 7979 | 7936 |
| 7980 | 7937 |
| 7981 bool Isolate::AddMessageListener(MessageCallback that, Local<Value> data) { | 7938 bool Isolate::AddMessageListener(MessageCallback that, Local<Value> data) { |
| 7982 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); | 7939 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); |
| 7983 ENTER_V8(isolate); | 7940 ENTER_V8(isolate); |
| 7984 i::HandleScope scope(isolate); | 7941 i::HandleScope scope(isolate); |
| 7985 NeanderArray listeners(isolate->factory()->message_listeners()); | 7942 i::Handle<i::TemplateList> list = isolate->factory()->message_listeners(); |
| 7986 NeanderObject obj(isolate, 2); | 7943 NeanderObject obj(isolate, 2); |
| 7987 obj.set(0, *isolate->factory()->NewForeign(FUNCTION_ADDR(that))); | 7944 obj.set(0, *isolate->factory()->NewForeign(FUNCTION_ADDR(that))); |
| 7988 obj.set(1, data.IsEmpty() ? isolate->heap()->undefined_value() | 7945 obj.set(1, data.IsEmpty() ? isolate->heap()->undefined_value() |
| 7989 : *Utils::OpenHandle(*data)); | 7946 : *Utils::OpenHandle(*data)); |
| 7990 listeners.add(isolate, obj.value()); | 7947 list = i::TemplateList::Add(isolate, list, obj.value()); |
| 7948 isolate->heap()->SetMessageListeners(*list); |
| 7991 return true; | 7949 return true; |
| 7992 } | 7950 } |
| 7993 | 7951 |
| 7994 | 7952 |
| 7995 void Isolate::RemoveMessageListeners(MessageCallback that) { | 7953 void Isolate::RemoveMessageListeners(MessageCallback that) { |
| 7996 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); | 7954 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); |
| 7997 ENTER_V8(isolate); | 7955 ENTER_V8(isolate); |
| 7998 i::HandleScope scope(isolate); | 7956 i::HandleScope scope(isolate); |
| 7999 NeanderArray listeners(isolate->factory()->message_listeners()); | 7957 i::DisallowHeapAllocation no_gc; |
| 8000 for (int i = 0; i < listeners.length(); i++) { | 7958 i::TemplateList* listeners = isolate->heap()->message_listeners(); |
| 8001 if (listeners.get(i)->IsUndefined(isolate)) continue; // skip deleted ones | 7959 for (int i = 0; i < listeners->length(); i++) { |
| 7960 if (listeners->get(i)->IsUndefined(isolate)) continue; // skip deleted ones |
| 8002 | 7961 |
| 8003 NeanderObject listener(i::JSObject::cast(listeners.get(i))); | 7962 NeanderObject listener(i::JSObject::cast(listeners->get(i))); |
| 8004 i::Handle<i::Foreign> callback_obj(i::Foreign::cast(listener.get(0))); | 7963 i::Foreign* callback_obj = i::Foreign::cast(listener.get(0)); |
| 8005 if (callback_obj->foreign_address() == FUNCTION_ADDR(that)) { | 7964 if (callback_obj->foreign_address() == FUNCTION_ADDR(that)) { |
| 8006 listeners.set(i, isolate->heap()->undefined_value()); | 7965 listeners->set(i, isolate->heap()->undefined_value()); |
| 8007 } | 7966 } |
| 8008 } | 7967 } |
| 8009 } | 7968 } |
| 8010 | 7969 |
| 8011 | 7970 |
| 8012 void Isolate::SetFailedAccessCheckCallbackFunction( | 7971 void Isolate::SetFailedAccessCheckCallbackFunction( |
| 8013 FailedAccessCheckCallback callback) { | 7972 FailedAccessCheckCallback callback) { |
| 8014 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); | 7973 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); |
| 8015 isolate->SetFailedAccessCheckCallback(callback); | 7974 isolate->SetFailedAccessCheckCallback(callback); |
| 8016 } | 7975 } |
| (...skipping 1021 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9038 Address callback_address = | 8997 Address callback_address = |
| 9039 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); | 8998 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); |
| 9040 VMState<EXTERNAL> state(isolate); | 8999 VMState<EXTERNAL> state(isolate); |
| 9041 ExternalCallbackScope call_scope(isolate, callback_address); | 9000 ExternalCallbackScope call_scope(isolate, callback_address); |
| 9042 callback(info); | 9001 callback(info); |
| 9043 } | 9002 } |
| 9044 | 9003 |
| 9045 | 9004 |
| 9046 } // namespace internal | 9005 } // namespace internal |
| 9047 } // namespace v8 | 9006 } // namespace v8 |
| OLD | NEW |