| Index: src/api.cc
|
| diff --git a/src/api.cc b/src/api.cc
|
| index f259c1c4067faf8d71cdddca9de1cef93fea159b..0a9d81c2fe63caf2d2bd2f0012db18d214a88fbf 100644
|
| --- a/src/api.cc
|
| +++ b/src/api.cc
|
| @@ -969,6 +969,9 @@ static void InitializeFunctionTemplate(
|
| info->set_flag(0);
|
| }
|
|
|
| +static Local<ObjectTemplate> ObjectTemplateNew(
|
| + i::Isolate* isolate, v8::Local<FunctionTemplate> constructor,
|
| + bool do_not_cache);
|
|
|
| Local<ObjectTemplate> FunctionTemplate::PrototypeTemplate() {
|
| i::Isolate* i_isolate = Utils::OpenHandle(this)->GetIsolate();
|
| @@ -976,8 +979,9 @@ Local<ObjectTemplate> FunctionTemplate::PrototypeTemplate() {
|
| i::Handle<i::Object> result(Utils::OpenHandle(this)->prototype_template(),
|
| i_isolate);
|
| if (result->IsUndefined()) {
|
| - v8::Isolate* isolate = reinterpret_cast<v8::Isolate*>(i_isolate);
|
| - result = Utils::OpenHandle(*ObjectTemplate::New(isolate));
|
| + // Do not cache prototype objects.
|
| + result = Utils::OpenHandle(
|
| + *ObjectTemplateNew(i_isolate, Local<FunctionTemplate>(), true));
|
| Utils::OpenHandle(this)->set_prototype_template(*result);
|
| }
|
| return ToApiHandle<ObjectTemplate>(result);
|
| @@ -1227,9 +1231,9 @@ Local<ObjectTemplate> ObjectTemplate::New() {
|
| return New(i::Isolate::Current(), Local<FunctionTemplate>());
|
| }
|
|
|
| -
|
| -Local<ObjectTemplate> ObjectTemplate::New(
|
| - i::Isolate* isolate, v8::Local<FunctionTemplate> constructor) {
|
| +static Local<ObjectTemplate> ObjectTemplateNew(
|
| + i::Isolate* isolate, v8::Local<FunctionTemplate> constructor,
|
| + bool do_not_cache) {
|
| // Changes to the environment cannot be captured in the snapshot. Expect no
|
| // object templates when the isolate is created for serialization.
|
| DCHECK(!isolate->serializer_enabled());
|
| @@ -1240,12 +1244,22 @@ Local<ObjectTemplate> ObjectTemplate::New(
|
| i::Handle<i::ObjectTemplateInfo> obj =
|
| i::Handle<i::ObjectTemplateInfo>::cast(struct_obj);
|
| InitializeTemplate(obj, Consts::OBJECT_TEMPLATE);
|
| + int next_serial_number = 0;
|
| + if (!do_not_cache) {
|
| + next_serial_number = isolate->next_serial_number() + 1;
|
| + isolate->set_next_serial_number(next_serial_number);
|
| + }
|
| + obj->set_serial_number(i::Smi::FromInt(next_serial_number));
|
| if (!constructor.IsEmpty())
|
| obj->set_constructor(*Utils::OpenHandle(*constructor));
|
| obj->set_internal_field_count(i::Smi::FromInt(0));
|
| return Utils::ToLocal(obj);
|
| }
|
|
|
| +Local<ObjectTemplate> ObjectTemplate::New(
|
| + i::Isolate* isolate, v8::Local<FunctionTemplate> constructor) {
|
| + return ObjectTemplateNew(isolate, constructor, false);
|
| +}
|
|
|
| // Ensure that the object template has a constructor. If no
|
| // constructor is available we create one.
|
| @@ -1266,21 +1280,6 @@ static i::Handle<i::FunctionTemplateInfo> EnsureConstructor(
|
| }
|
|
|
|
|
| -static inline i::Handle<i::TemplateInfo> GetTemplateInfo(
|
| - i::Isolate* isolate,
|
| - Template* template_obj) {
|
| - return Utils::OpenHandle(template_obj);
|
| -}
|
| -
|
| -
|
| -// TODO(dcarney): remove this with ObjectTemplate::SetAccessor
|
| -static inline i::Handle<i::TemplateInfo> GetTemplateInfo(
|
| - i::Isolate* isolate,
|
| - ObjectTemplate* object_template) {
|
| - EnsureConstructor(isolate, object_template);
|
| - return Utils::OpenHandle(object_template);
|
| -}
|
| -
|
| template <typename Getter, typename Setter, typename Data, typename Template>
|
| static bool TemplateSetAccessor(Template* template_obj, v8::Local<Name> name,
|
| Getter getter, Setter setter, Data data,
|
| @@ -1288,13 +1287,13 @@ static bool TemplateSetAccessor(Template* template_obj, v8::Local<Name> name,
|
| PropertyAttribute attribute,
|
| v8::Local<AccessorSignature> signature,
|
| bool is_special_data_property) {
|
| - auto isolate = Utils::OpenHandle(template_obj)->GetIsolate();
|
| + auto info = Utils::OpenHandle(template_obj);
|
| + auto isolate = info->GetIsolate();
|
| ENTER_V8(isolate);
|
| i::HandleScope scope(isolate);
|
| auto obj = MakeAccessorInfo(name, getter, setter, data, settings, attribute,
|
| signature, is_special_data_property);
|
| if (obj.is_null()) return false;
|
| - auto info = GetTemplateInfo(isolate, template_obj);
|
| i::ApiNatives::AddNativeDataProperty(isolate, info, obj);
|
| return true;
|
| }
|
| @@ -3306,16 +3305,14 @@ double Value::NumberValue() const {
|
|
|
| Maybe<int64_t> Value::IntegerValue(Local<Context> context) const {
|
| auto obj = Utils::OpenHandle(this);
|
| - i::Handle<i::Object> num;
|
| if (obj->IsNumber()) {
|
| - num = obj;
|
| - } else {
|
| - PREPARE_FOR_EXECUTION_PRIMITIVE(context, "IntegerValue", int64_t);
|
| - has_pending_exception = !i::Object::ToInteger(isolate, obj).ToHandle(&num);
|
| - RETURN_ON_FAILED_EXECUTION_PRIMITIVE(int64_t);
|
| + return Just(NumberToInt64(*obj));
|
| }
|
| - return Just(num->IsSmi() ? static_cast<int64_t>(i::Smi::cast(*num)->value())
|
| - : static_cast<int64_t>(num->Number()));
|
| + PREPARE_FOR_EXECUTION_PRIMITIVE(context, "IntegerValue", int64_t);
|
| + i::Handle<i::Object> num;
|
| + has_pending_exception = !i::Object::ToInteger(isolate, obj).ToHandle(&num);
|
| + RETURN_ON_FAILED_EXECUTION_PRIMITIVE(int64_t);
|
| + return Just(NumberToInt64(*num));
|
| }
|
|
|
|
|
|
|