JSObject * RegExpCompartment::createMatchResultTemplateObject(JSContext *cx) { JS_ASSERT(!matchResultTemplateObject_); /* Create template array object */ RootedObject templateObject(cx, NewDenseUnallocatedArray(cx, 0, nullptr, TenuredObject)); if (!templateObject) return matchResultTemplateObject_; // = nullptr /* Set dummy index property */ RootedValue index(cx, Int32Value(0)); if (!baseops::DefineProperty(cx, templateObject, cx->names().index, index, JS_PropertyStub, JS_StrictPropertyStub, JSPROP_ENUMERATE)) return matchResultTemplateObject_; // = nullptr /* Set dummy input property */ RootedValue inputVal(cx, StringValue(cx->runtime()->emptyString)); if (!baseops::DefineProperty(cx, templateObject, cx->names().input, inputVal, JS_PropertyStub, JS_StrictPropertyStub, JSPROP_ENUMERATE)) return matchResultTemplateObject_; // = nullptr // Make sure that the properties are in the right slots. DebugOnly<Shape *> shape = templateObject->lastProperty(); JS_ASSERT(shape->previous()->slot() == 0 && shape->previous()->propidRef() == NameToId(cx->names().index)); JS_ASSERT(shape->slot() == 1 && shape->propidRef() == NameToId(cx->names().input)); matchResultTemplateObject_ = templateObject; return matchResultTemplateObject_; }
NativeObject* JSCompartment::getOrCreateIterResultTemplateObject(JSContext* cx) { if (iterResultTemplate_) return iterResultTemplate_; // Create template plain object RootedNativeObject templateObject(cx, NewBuiltinClassInstance<PlainObject>(cx, TenuredObject)); if (!templateObject) return iterResultTemplate_; // = nullptr // Create a new group for the template. Rooted<TaggedProto> proto(cx, templateObject->taggedProto()); RootedObjectGroup group(cx, ObjectGroupCompartment::makeGroup(cx, templateObject->getClass(), proto)); if (!group) return iterResultTemplate_; // = nullptr templateObject->setGroup(group); // Set dummy `value` property if (!NativeDefineDataProperty(cx, templateObject, cx->names().value, UndefinedHandleValue, JSPROP_ENUMERATE)) { return iterResultTemplate_; // = nullptr } // Set dummy `done` property if (!NativeDefineDataProperty(cx, templateObject, cx->names().done, TrueHandleValue, JSPROP_ENUMERATE)) { return iterResultTemplate_; // = nullptr } if (!group->unknownProperties()) { // Update `value` property typeset, since it can be any value. HeapTypeSet* types = group->maybeGetProperty(NameToId(cx->names().value)); MOZ_ASSERT(types); { AutoEnterAnalysis enter(cx); types->makeUnknown(cx); } } // Make sure that the properties are in the right slots. DebugOnly<Shape*> shape = templateObject->lastProperty(); MOZ_ASSERT(shape->previous()->slot() == JSCompartment::IterResultObjectValueSlot && shape->previous()->propidRef() == NameToId(cx->names().value)); MOZ_ASSERT(shape->slot() == JSCompartment::IterResultObjectDoneSlot && shape->propidRef() == NameToId(cx->names().done)); iterResultTemplate_.set(templateObject); return iterResultTemplate_; }
ArrayObject* RegExpCompartment::createMatchResultTemplateObject(JSContext* cx) { MOZ_ASSERT(!matchResultTemplateObject_); /* Create template array object */ RootedArrayObject templateObject(cx, NewDenseUnallocatedArray(cx, RegExpObject::MaxPairCount, nullptr, TenuredObject)); if (!templateObject) return matchResultTemplateObject_; // = nullptr // Create a new group for the template. Rooted<TaggedProto> proto(cx, templateObject->getTaggedProto()); ObjectGroup* group = ObjectGroupCompartment::makeGroup(cx, templateObject->getClass(), proto); if (!group) return matchResultTemplateObject_; // = nullptr templateObject->setGroup(group); /* Set dummy index property */ RootedValue index(cx, Int32Value(0)); if (!NativeDefineProperty(cx, templateObject, cx->names().index, index, nullptr, nullptr, JSPROP_ENUMERATE)) { return matchResultTemplateObject_; // = nullptr } /* Set dummy input property */ RootedValue inputVal(cx, StringValue(cx->runtime()->emptyString)); if (!NativeDefineProperty(cx, templateObject, cx->names().input, inputVal, nullptr, nullptr, JSPROP_ENUMERATE)) { return matchResultTemplateObject_; // = nullptr } // Make sure that the properties are in the right slots. DebugOnly<Shape*> shape = templateObject->lastProperty(); MOZ_ASSERT(shape->previous()->slot() == 0 && shape->previous()->propidRef() == NameToId(cx->names().index)); MOZ_ASSERT(shape->slot() == 1 && shape->propidRef() == NameToId(cx->names().input)); // Make sure type information reflects the indexed properties which might // be added. AddTypePropertyId(cx, templateObject, JSID_VOID, TypeSet::StringType()); AddTypePropertyId(cx, templateObject, JSID_VOID, TypeSet::UndefinedType()); matchResultTemplateObject_.set(templateObject); return matchResultTemplateObject_; }
ArrayObject * RegExpCompartment::createMatchResultTemplateObject(JSContext *cx) { MOZ_ASSERT(!matchResultTemplateObject_); /* Create template array object */ RootedArrayObject templateObject(cx, NewDenseUnallocatedArray(cx, 0, nullptr, TenuredObject)); if (!templateObject) return matchResultTemplateObject_; // = nullptr // Create a new type for the template. Rooted<TaggedProto> proto(cx, templateObject->getTaggedProto()); types::TypeObject *type = cx->compartment()->types.newTypeObject(cx, templateObject->getClass(), proto); templateObject->setType(type); /* Set dummy index property */ RootedValue index(cx, Int32Value(0)); if (!baseops::DefineProperty(cx, templateObject, cx->names().index, index, JS_PropertyStub, JS_StrictPropertyStub, JSPROP_ENUMERATE)) return matchResultTemplateObject_; // = nullptr /* Set dummy input property */ RootedValue inputVal(cx, StringValue(cx->runtime()->emptyString)); if (!baseops::DefineProperty(cx, templateObject, cx->names().input, inputVal, JS_PropertyStub, JS_StrictPropertyStub, JSPROP_ENUMERATE)) return matchResultTemplateObject_; // = nullptr // Make sure that the properties are in the right slots. DebugOnly<Shape *> shape = templateObject->lastProperty(); MOZ_ASSERT(shape->previous()->slot() == 0 && shape->previous()->propidRef() == NameToId(cx->names().index)); MOZ_ASSERT(shape->slot() == 1 && shape->propidRef() == NameToId(cx->names().input)); // Make sure type information reflects the indexed properties which might // be added. types::AddTypePropertyId(cx, templateObject, JSID_VOID, types::Type::StringType()); types::AddTypePropertyId(cx, templateObject, JSID_VOID, types::Type::UndefinedType()); matchResultTemplateObject_.set(templateObject); return matchResultTemplateObject_; }