mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-09 16:57:36 +00:00
Bug 973238 Part 9 -- Move kind to type
namespace, insert some const qualifiers r=sfink
This commit is contained in:
parent
b9e4d229bf
commit
6b054db63c
2
CLOBBER
2
CLOBBER
@ -22,4 +22,4 @@
|
||||
# changes to stick? As of bug 928195, this shouldn't be necessary! Please
|
||||
# don't change CLOBBER for WebIDL changes any more.
|
||||
|
||||
Bug 973238 part 8 needs clobber due to self-hosted code (bug 1019955).
|
||||
Bug 973238 part 9 needs clobber due to self-hosted code (bug 1019955).
|
||||
|
@ -51,7 +51,7 @@ static bool GetX4Lane(JSContext *cx, unsigned argc, Value *vp) {
|
||||
|
||||
TypedObject &typedObj = args.thisv().toObject().as<TypedObject>();
|
||||
TypeDescr &descr = typedObj.typeDescr();
|
||||
if (descr.kind() != TypeDescr::X4 || descr.as<X4TypeDescr>().type() != Type32x4::type) {
|
||||
if (descr.kind() != type::X4 || descr.as<X4TypeDescr>().type() != Type32x4::type) {
|
||||
JS_ReportErrorNumber(cx, js_GetErrorMessage, nullptr, JSMSG_INCOMPATIBLE_PROTO,
|
||||
X4TypeDescr::class_.name, laneNames[lane],
|
||||
InformalValueTypeName(args.thisv()));
|
||||
@ -94,7 +94,7 @@ static bool SignMask(JSContext *cx, unsigned argc, Value *vp) {
|
||||
|
||||
TypedObject &typedObj = args.thisv().toObject().as<TypedObject>();
|
||||
TypeDescr &descr = typedObj.typeDescr();
|
||||
if (descr.kind() != TypeDescr::X4 || descr.as<X4TypeDescr>().type() != Type32x4::type) {
|
||||
if (descr.kind() != type::X4 || descr.as<X4TypeDescr>().type() != Type32x4::type) {
|
||||
JS_ReportErrorNumber(cx, js_GetErrorMessage, nullptr, JSMSG_INCOMPATIBLE_PROTO,
|
||||
X4TypeDescr::class_.name, "signMask",
|
||||
InformalValueTypeName(args.thisv()));
|
||||
@ -216,7 +216,7 @@ CreateX4Class(JSContext *cx,
|
||||
if (!x4)
|
||||
return nullptr;
|
||||
|
||||
x4->initReservedSlot(JS_DESCR_SLOT_KIND, Int32Value(TypeDescr::X4));
|
||||
x4->initReservedSlot(JS_DESCR_SLOT_KIND, Int32Value(type::X4));
|
||||
x4->initReservedSlot(JS_DESCR_SLOT_STRING_REPR, StringValue(stringRepr));
|
||||
x4->initReservedSlot(JS_DESCR_SLOT_ALIGNMENT, Int32Value(X4TypeDescr::size(type)));
|
||||
x4->initReservedSlot(JS_DESCR_SLOT_SIZE, Int32Value(X4TypeDescr::alignment(type)));
|
||||
@ -399,7 +399,7 @@ IsVectorObject(HandleValue v)
|
||||
return false;
|
||||
|
||||
TypeDescr &typeRepr = obj.as<TypedObject>().typeDescr();
|
||||
if (typeRepr.kind() != TypeDescr::X4)
|
||||
if (typeRepr.kind() != type::X4)
|
||||
return false;
|
||||
|
||||
return typeRepr.as<X4TypeDescr>().type() == V::type;
|
||||
|
@ -1015,7 +1015,7 @@ StructMetaTypeDescr::create(JSContext *cx,
|
||||
if (!descr)
|
||||
return nullptr;
|
||||
|
||||
descr->initReservedSlot(JS_DESCR_SLOT_KIND, Int32Value(TypeDescr::Struct));
|
||||
descr->initReservedSlot(JS_DESCR_SLOT_KIND, Int32Value(type::Struct));
|
||||
descr->initReservedSlot(JS_DESCR_SLOT_STRING_REPR, StringValue(stringRepr));
|
||||
descr->initReservedSlot(JS_DESCR_SLOT_ALIGNMENT, Int32Value(alignment));
|
||||
descr->initReservedSlot(JS_DESCR_SLOT_SIZE, Int32Value(totalSize.value()));
|
||||
@ -1120,13 +1120,13 @@ StructMetaTypeDescr::construct(JSContext *cx, unsigned int argc, Value *vp)
|
||||
}
|
||||
|
||||
size_t
|
||||
StructTypeDescr::fieldCount()
|
||||
StructTypeDescr::fieldCount() const
|
||||
{
|
||||
return getReservedSlot(JS_DESCR_SLOT_STRUCT_FIELD_NAMES).toObject().getDenseInitializedLength();
|
||||
}
|
||||
|
||||
bool
|
||||
StructTypeDescr::fieldIndex(jsid id, size_t *out)
|
||||
StructTypeDescr::fieldIndex(jsid id, size_t *out) const
|
||||
{
|
||||
JSObject &fieldNames = getReservedSlot(JS_DESCR_SLOT_STRUCT_FIELD_NAMES).toObject();
|
||||
size_t l = fieldNames.getDenseInitializedLength();
|
||||
@ -1141,14 +1141,14 @@ StructTypeDescr::fieldIndex(jsid id, size_t *out)
|
||||
}
|
||||
|
||||
JSAtom &
|
||||
StructTypeDescr::fieldName(size_t index)
|
||||
StructTypeDescr::fieldName(size_t index) const
|
||||
{
|
||||
JSObject &fieldNames = getReservedSlot(JS_DESCR_SLOT_STRUCT_FIELD_NAMES).toObject();
|
||||
return fieldNames.getDenseElement(index).toString()->asAtom();
|
||||
}
|
||||
|
||||
int32_t
|
||||
StructTypeDescr::fieldOffset(size_t index)
|
||||
StructTypeDescr::fieldOffset(size_t index) const
|
||||
{
|
||||
JSObject &fieldOffsets =
|
||||
getReservedSlot(JS_DESCR_SLOT_STRUCT_FIELD_OFFSETS).toObject();
|
||||
@ -1157,7 +1157,7 @@ StructTypeDescr::fieldOffset(size_t index)
|
||||
}
|
||||
|
||||
SizedTypeDescr&
|
||||
StructTypeDescr::fieldDescr(size_t index)
|
||||
StructTypeDescr::fieldDescr(size_t index) const
|
||||
{
|
||||
JSObject &fieldDescrs =
|
||||
getReservedSlot(JS_DESCR_SLOT_STRUCT_FIELD_TYPES).toObject();
|
||||
@ -1513,16 +1513,16 @@ static int32_t
|
||||
TypedObjLengthFromType(TypeDescr &descr)
|
||||
{
|
||||
switch (descr.kind()) {
|
||||
case TypeDescr::Scalar:
|
||||
case TypeDescr::Reference:
|
||||
case TypeDescr::Struct:
|
||||
case TypeDescr::X4:
|
||||
case type::Scalar:
|
||||
case type::Reference:
|
||||
case type::Struct:
|
||||
case type::X4:
|
||||
return 0;
|
||||
|
||||
case TypeDescr::SizedArray:
|
||||
case type::SizedArray:
|
||||
return descr.as<SizedArrayTypeDescr>().length();
|
||||
|
||||
case TypeDescr::UnsizedArray:
|
||||
case type::UnsizedArray:
|
||||
MOZ_ASSUME_UNREACHABLE("TypedObjLengthFromType() invoked on unsized type");
|
||||
}
|
||||
MOZ_ASSUME_UNREACHABLE("Invalid kind");
|
||||
@ -1562,11 +1562,11 @@ TypedObject::createZeroed(JSContext *cx,
|
||||
// Allocate and initialize the memory for this instance.
|
||||
// Also initialize the JS_TYPEDOBJ_SLOT_LENGTH slot.
|
||||
switch (descr->kind()) {
|
||||
case TypeDescr::Scalar:
|
||||
case TypeDescr::Reference:
|
||||
case TypeDescr::Struct:
|
||||
case TypeDescr::X4:
|
||||
case TypeDescr::SizedArray:
|
||||
case type::Scalar:
|
||||
case type::Reference:
|
||||
case type::Struct:
|
||||
case type::X4:
|
||||
case type::SizedArray:
|
||||
{
|
||||
size_t totalSize = descr->as<SizedTypeDescr>().size();
|
||||
Rooted<ArrayBufferObject*> buffer(cx);
|
||||
@ -1578,7 +1578,7 @@ TypedObject::createZeroed(JSContext *cx,
|
||||
return obj;
|
||||
}
|
||||
|
||||
case TypeDescr::UnsizedArray:
|
||||
case type::UnsizedArray:
|
||||
{
|
||||
Rooted<SizedTypeDescr*> elementTypeRepr(cx);
|
||||
elementTypeRepr = &descr->as<UnsizedArrayTypeDescr>().elementType();
|
||||
@ -1639,15 +1639,15 @@ TypedObject::obj_trace(JSTracer *trace, JSObject *object)
|
||||
return;
|
||||
|
||||
switch (descr.kind()) {
|
||||
case TypeDescr::Scalar:
|
||||
case TypeDescr::Reference:
|
||||
case TypeDescr::Struct:
|
||||
case TypeDescr::SizedArray:
|
||||
case TypeDescr::X4:
|
||||
case type::Scalar:
|
||||
case type::Reference:
|
||||
case type::Struct:
|
||||
case type::SizedArray:
|
||||
case type::X4:
|
||||
descr.as<SizedTypeDescr>().traceInstances(trace, mem, 1);
|
||||
break;
|
||||
|
||||
case TypeDescr::UnsizedArray:
|
||||
case type::UnsizedArray:
|
||||
descr.as<UnsizedArrayTypeDescr>().elementType().traceInstances(trace, mem, typedObj.length());
|
||||
break;
|
||||
}
|
||||
@ -1662,13 +1662,13 @@ TypedObject::obj_lookupGeneric(JSContext *cx, HandleObject obj, HandleId id,
|
||||
|
||||
Rooted<TypeDescr*> descr(cx, &obj->as<TypedObject>().typeDescr());
|
||||
switch (descr->kind()) {
|
||||
case TypeDescr::Scalar:
|
||||
case TypeDescr::Reference:
|
||||
case TypeDescr::X4:
|
||||
case type::Scalar:
|
||||
case type::Reference:
|
||||
case type::X4:
|
||||
break;
|
||||
|
||||
case TypeDescr::SizedArray:
|
||||
case TypeDescr::UnsizedArray:
|
||||
case type::SizedArray:
|
||||
case type::UnsizedArray:
|
||||
{
|
||||
uint32_t index;
|
||||
if (js_IdIsIndex(id, &index))
|
||||
@ -1682,7 +1682,7 @@ TypedObject::obj_lookupGeneric(JSContext *cx, HandleObject obj, HandleId id,
|
||||
break;
|
||||
}
|
||||
|
||||
case TypeDescr::Struct:
|
||||
case type::Struct:
|
||||
{
|
||||
StructTypeDescr &structDescr = descr->as<StructTypeDescr>();
|
||||
size_t index;
|
||||
@ -1788,15 +1788,15 @@ TypedObject::obj_getGeneric(JSContext *cx, HandleObject obj, HandleObject receiv
|
||||
// Handle everything else here:
|
||||
|
||||
switch (typedObj->typeDescr().kind()) {
|
||||
case TypeDescr::Scalar:
|
||||
case TypeDescr::Reference:
|
||||
case type::Scalar:
|
||||
case type::Reference:
|
||||
break;
|
||||
|
||||
case TypeDescr::X4:
|
||||
case type::X4:
|
||||
break;
|
||||
|
||||
case TypeDescr::SizedArray:
|
||||
case TypeDescr::UnsizedArray:
|
||||
case type::SizedArray:
|
||||
case type::UnsizedArray:
|
||||
if (JSID_IS_ATOM(id, cx->names().length)) {
|
||||
if (typedObj->owner().isNeutered() || !typedObj->typedMem()) { // unattached
|
||||
JS_ReportErrorNumber(
|
||||
@ -1810,7 +1810,7 @@ TypedObject::obj_getGeneric(JSContext *cx, HandleObject obj, HandleObject receiv
|
||||
}
|
||||
break;
|
||||
|
||||
case TypeDescr::Struct: {
|
||||
case type::Struct: {
|
||||
Rooted<StructTypeDescr*> descr(cx, &typedObj->typeDescr().as<StructTypeDescr>());
|
||||
|
||||
size_t fieldIndex;
|
||||
@ -1849,17 +1849,17 @@ TypedObject::obj_getElement(JSContext *cx, HandleObject obj, HandleObject receiv
|
||||
Rooted<TypeDescr *> descr(cx, &typedObj->typeDescr());
|
||||
|
||||
switch (descr->kind()) {
|
||||
case TypeDescr::Scalar:
|
||||
case TypeDescr::Reference:
|
||||
case TypeDescr::X4:
|
||||
case TypeDescr::Struct:
|
||||
case type::Scalar:
|
||||
case type::Reference:
|
||||
case type::X4:
|
||||
case type::Struct:
|
||||
break;
|
||||
|
||||
case TypeDescr::SizedArray:
|
||||
case type::SizedArray:
|
||||
return obj_getArrayElement<SizedArrayTypeDescr>(cx, typedObj, descr,
|
||||
index, vp);
|
||||
|
||||
case TypeDescr::UnsizedArray:
|
||||
case type::UnsizedArray:
|
||||
return obj_getArrayElement<UnsizedArrayTypeDescr>(cx, typedObj, descr,
|
||||
index, vp);
|
||||
}
|
||||
@ -1905,15 +1905,15 @@ TypedObject::obj_setGeneric(JSContext *cx, HandleObject obj, HandleId id,
|
||||
return obj_setElement(cx, obj, index, vp, strict);
|
||||
|
||||
switch (typedObj->typeDescr().kind()) {
|
||||
case ScalarTypeDescr::Scalar:
|
||||
case TypeDescr::Reference:
|
||||
case type::Scalar:
|
||||
case type::Reference:
|
||||
break;
|
||||
|
||||
case ScalarTypeDescr::X4:
|
||||
case type::X4:
|
||||
break;
|
||||
|
||||
case ScalarTypeDescr::SizedArray:
|
||||
case ScalarTypeDescr::UnsizedArray:
|
||||
case type::SizedArray:
|
||||
case type::UnsizedArray:
|
||||
if (JSID_IS_ATOM(id, cx->names().length)) {
|
||||
JS_ReportErrorNumber(cx, js_GetErrorMessage,
|
||||
nullptr, JSMSG_CANT_REDEFINE_ARRAY_LENGTH);
|
||||
@ -1921,7 +1921,7 @@ TypedObject::obj_setGeneric(JSContext *cx, HandleObject obj, HandleId id,
|
||||
}
|
||||
break;
|
||||
|
||||
case ScalarTypeDescr::Struct: {
|
||||
case type::Struct: {
|
||||
Rooted<StructTypeDescr*> descr(cx, &typedObj->typeDescr().as<StructTypeDescr>());
|
||||
|
||||
size_t fieldIndex;
|
||||
@ -1955,16 +1955,16 @@ TypedObject::obj_setElement(JSContext *cx, HandleObject obj, uint32_t index,
|
||||
Rooted<TypeDescr *> descr(cx, &typedObj->typeDescr());
|
||||
|
||||
switch (descr->kind()) {
|
||||
case TypeDescr::Scalar:
|
||||
case TypeDescr::Reference:
|
||||
case TypeDescr::X4:
|
||||
case TypeDescr::Struct:
|
||||
case type::Scalar:
|
||||
case type::Reference:
|
||||
case type::X4:
|
||||
case type::Struct:
|
||||
break;
|
||||
|
||||
case TypeDescr::SizedArray:
|
||||
case type::SizedArray:
|
||||
return obj_setArrayElement<SizedArrayTypeDescr>(cx, typedObj, descr, index, vp);
|
||||
|
||||
case TypeDescr::UnsizedArray:
|
||||
case type::UnsizedArray:
|
||||
return obj_setArrayElement<UnsizedArrayTypeDescr>(cx, typedObj, descr, index, vp);
|
||||
}
|
||||
|
||||
@ -2000,15 +2000,15 @@ TypedObject::obj_getGenericAttributes(JSContext *cx, HandleObject obj,
|
||||
uint32_t index;
|
||||
Rooted<TypedObject *> typedObj(cx, &obj->as<TypedObject>());
|
||||
switch (typedObj->typeDescr().kind()) {
|
||||
case TypeDescr::Scalar:
|
||||
case TypeDescr::Reference:
|
||||
case type::Scalar:
|
||||
case type::Reference:
|
||||
break;
|
||||
|
||||
case TypeDescr::X4:
|
||||
case type::X4:
|
||||
break;
|
||||
|
||||
case TypeDescr::SizedArray:
|
||||
case TypeDescr::UnsizedArray:
|
||||
case type::SizedArray:
|
||||
case type::UnsizedArray:
|
||||
if (js_IdIsIndex(id, &index)) {
|
||||
*attrsp = JSPROP_ENUMERATE | JSPROP_PERMANENT;
|
||||
return true;
|
||||
@ -2019,7 +2019,7 @@ TypedObject::obj_getGenericAttributes(JSContext *cx, HandleObject obj,
|
||||
}
|
||||
break;
|
||||
|
||||
case TypeDescr::Struct:
|
||||
case type::Struct:
|
||||
size_t index;
|
||||
if (typedObj->typeDescr().as<StructTypeDescr>().fieldIndex(id, &index)) {
|
||||
*attrsp = JSPROP_ENUMERATE | JSPROP_PERMANENT;
|
||||
@ -2043,16 +2043,16 @@ IsOwnId(JSContext *cx, HandleObject obj, HandleId id)
|
||||
uint32_t index;
|
||||
Rooted<TypedObject *> typedObj(cx, &obj->as<TypedObject>());
|
||||
switch (typedObj->typeDescr().kind()) {
|
||||
case TypeDescr::Scalar:
|
||||
case TypeDescr::Reference:
|
||||
case TypeDescr::X4:
|
||||
case type::Scalar:
|
||||
case type::Reference:
|
||||
case type::X4:
|
||||
return false;
|
||||
|
||||
case TypeDescr::SizedArray:
|
||||
case TypeDescr::UnsizedArray:
|
||||
case type::SizedArray:
|
||||
case type::UnsizedArray:
|
||||
return js_IdIsIndex(id, &index) || JSID_IS_ATOM(id, cx->names().length);
|
||||
|
||||
case TypeDescr::Struct:
|
||||
case type::Struct:
|
||||
size_t index;
|
||||
if (typedObj->typeDescr().as<StructTypeDescr>().fieldIndex(id, &index))
|
||||
return true;
|
||||
@ -2102,9 +2102,9 @@ TypedObject::obj_enumerate(JSContext *cx, HandleObject obj, JSIterateOp enum_op,
|
||||
Rooted<TypedObject *> typedObj(cx, &obj->as<TypedObject>());
|
||||
Rooted<TypeDescr *> descr(cx, &typedObj->typeDescr());
|
||||
switch (descr->kind()) {
|
||||
case TypeDescr::Scalar:
|
||||
case TypeDescr::Reference:
|
||||
case TypeDescr::X4:
|
||||
case type::Scalar:
|
||||
case type::Reference:
|
||||
case type::X4:
|
||||
switch (enum_op) {
|
||||
case JSENUMERATE_INIT_ALL:
|
||||
case JSENUMERATE_INIT:
|
||||
@ -2118,8 +2118,8 @@ TypedObject::obj_enumerate(JSContext *cx, HandleObject obj, JSIterateOp enum_op,
|
||||
}
|
||||
break;
|
||||
|
||||
case TypeDescr::SizedArray:
|
||||
case TypeDescr::UnsizedArray:
|
||||
case type::SizedArray:
|
||||
case type::UnsizedArray:
|
||||
switch (enum_op) {
|
||||
case JSENUMERATE_INIT_ALL:
|
||||
case JSENUMERATE_INIT:
|
||||
@ -2146,7 +2146,7 @@ TypedObject::obj_enumerate(JSContext *cx, HandleObject obj, JSIterateOp enum_op,
|
||||
}
|
||||
break;
|
||||
|
||||
case TypeDescr::Struct:
|
||||
case type::Struct:
|
||||
switch (enum_op) {
|
||||
case JSENUMERATE_INIT_ALL:
|
||||
case JSENUMERATE_INIT:
|
||||
@ -2262,16 +2262,16 @@ static int32_t
|
||||
LengthForType(TypeDescr &descr)
|
||||
{
|
||||
switch (descr.kind()) {
|
||||
case TypeDescr::Scalar:
|
||||
case TypeDescr::Reference:
|
||||
case TypeDescr::Struct:
|
||||
case TypeDescr::X4:
|
||||
case type::Scalar:
|
||||
case type::Reference:
|
||||
case type::Struct:
|
||||
case type::X4:
|
||||
return 0;
|
||||
|
||||
case TypeDescr::SizedArray:
|
||||
case type::SizedArray:
|
||||
return descr.as<SizedArrayTypeDescr>().length();
|
||||
|
||||
case TypeDescr::UnsizedArray:
|
||||
case type::UnsizedArray:
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -3080,15 +3080,15 @@ visitReferences(SizedTypeDescr &descr,
|
||||
return;
|
||||
|
||||
switch (descr.kind()) {
|
||||
case TypeDescr::Scalar:
|
||||
case TypeDescr::X4:
|
||||
case type::Scalar:
|
||||
case type::X4:
|
||||
return;
|
||||
|
||||
case TypeDescr::Reference:
|
||||
case type::Reference:
|
||||
visitor.visitReference(descr.as<ReferenceTypeDescr>(), mem);
|
||||
return;
|
||||
|
||||
case TypeDescr::SizedArray:
|
||||
case type::SizedArray:
|
||||
{
|
||||
SizedArrayTypeDescr &arrayDescr = descr.as<SizedArrayTypeDescr>();
|
||||
SizedTypeDescr &elementDescr = arrayDescr.elementType();
|
||||
@ -3099,12 +3099,12 @@ visitReferences(SizedTypeDescr &descr,
|
||||
return;
|
||||
}
|
||||
|
||||
case TypeDescr::UnsizedArray:
|
||||
case type::UnsizedArray:
|
||||
{
|
||||
MOZ_ASSUME_UNREACHABLE("Only Sized Type representations");
|
||||
}
|
||||
|
||||
case TypeDescr::Struct:
|
||||
case type::Struct:
|
||||
{
|
||||
StructTypeDescr &structDescr = descr.as<StructTypeDescr>();
|
||||
for (size_t i = 0; i < structDescr.fieldCount(); i++) {
|
||||
|
@ -126,6 +126,33 @@ static T ConvertScalar(double d)
|
||||
}
|
||||
}
|
||||
|
||||
namespace type {
|
||||
|
||||
enum Kind {
|
||||
Scalar = JS_TYPEREPR_SCALAR_KIND,
|
||||
Reference = JS_TYPEREPR_REFERENCE_KIND,
|
||||
X4 = JS_TYPEREPR_X4_KIND,
|
||||
Struct = JS_TYPEREPR_STRUCT_KIND,
|
||||
SizedArray = JS_TYPEREPR_SIZED_ARRAY_KIND,
|
||||
UnsizedArray = JS_TYPEREPR_UNSIZED_ARRAY_KIND,
|
||||
};
|
||||
|
||||
static inline bool isSized(type::Kind kind) {
|
||||
return kind > JS_TYPEREPR_MAX_UNSIZED_KIND;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// Typed Prototypes
|
||||
|
||||
class SizedTypeDescr;
|
||||
class SimpleTypeDescr;
|
||||
class ComplexTypeDescr;
|
||||
class X4TypeDescr;
|
||||
class StructTypeDescr;
|
||||
class SizedTypedProto;
|
||||
|
||||
/*
|
||||
* The prototype for a typed object. Currently, carries a link to the
|
||||
* type descriptor. Eventually will carry most of the type information
|
||||
@ -154,25 +181,21 @@ class TypeDescr : public JSObject
|
||||
// fun and rejoicing.
|
||||
static const Class class_;
|
||||
|
||||
enum Kind {
|
||||
Scalar = JS_TYPEREPR_SCALAR_KIND,
|
||||
Reference = JS_TYPEREPR_REFERENCE_KIND,
|
||||
X4 = JS_TYPEREPR_X4_KIND,
|
||||
Struct = JS_TYPEREPR_STRUCT_KIND,
|
||||
SizedArray = JS_TYPEREPR_SIZED_ARRAY_KIND,
|
||||
UnsizedArray = JS_TYPEREPR_UNSIZED_ARRAY_KIND,
|
||||
};
|
||||
|
||||
static bool isSized(Kind kind) {
|
||||
public:
|
||||
static bool isSized(type::Kind kind) {
|
||||
return kind > JS_TYPEREPR_MAX_UNSIZED_KIND;
|
||||
}
|
||||
|
||||
TypedProto &typedProto() const {
|
||||
return getReservedSlot(JS_DESCR_SLOT_TYPROTO).toObject().as<TypedProto>();
|
||||
}
|
||||
|
||||
JSAtom &stringRepr() const {
|
||||
return getReservedSlot(JS_DESCR_SLOT_STRING_REPR).toString()->asAtom();
|
||||
}
|
||||
|
||||
TypeDescr::Kind kind() const {
|
||||
return (TypeDescr::Kind) getReservedSlot(JS_DESCR_SLOT_KIND).toInt32();
|
||||
type::Kind kind() const {
|
||||
return (type::Kind) getReservedSlot(JS_DESCR_SLOT_KIND).toInt32();
|
||||
}
|
||||
|
||||
bool opaque() const {
|
||||
@ -183,7 +206,7 @@ class TypeDescr : public JSObject
|
||||
return !opaque();
|
||||
}
|
||||
|
||||
int32_t alignment() {
|
||||
int32_t alignment() const {
|
||||
return getReservedSlot(JS_DESCR_SLOT_ALIGNMENT).toInt32();
|
||||
}
|
||||
};
|
||||
@ -193,7 +216,7 @@ typedef Handle<TypeDescr*> HandleTypeDescr;
|
||||
class SizedTypeDescr : public TypeDescr
|
||||
{
|
||||
public:
|
||||
int32_t size() {
|
||||
int32_t size() const {
|
||||
return getReservedSlot(JS_DESCR_SLOT_SIZE).toInt32();
|
||||
}
|
||||
|
||||
@ -233,7 +256,7 @@ class ScalarTypeDescr : public SimpleTypeDescr
|
||||
};
|
||||
static const int32_t TYPE_MAX = TYPE_UINT8_CLAMPED + 1;
|
||||
|
||||
static const TypeDescr::Kind Kind = TypeDescr::Scalar;
|
||||
static const type::Kind Kind = type::Scalar;
|
||||
static const bool Opaque = false;
|
||||
static int32_t size(Type t);
|
||||
static int32_t alignment(Type t);
|
||||
@ -282,7 +305,7 @@ class ReferenceTypeDescr : public SimpleTypeDescr
|
||||
static const int32_t TYPE_MAX = TYPE_STRING + 1;
|
||||
static const char *typeName(Type type);
|
||||
|
||||
static const TypeDescr::Kind Kind = TypeDescr::Reference;
|
||||
static const type::Kind Kind = type::Reference;
|
||||
static const bool Opaque = true;
|
||||
static const Class class_;
|
||||
static int32_t size(Type t);
|
||||
@ -328,7 +351,7 @@ class X4TypeDescr : public ComplexTypeDescr
|
||||
TYPE_FLOAT32 = JS_X4TYPEREPR_FLOAT32,
|
||||
};
|
||||
|
||||
static const TypeDescr::Kind Kind = TypeDescr::X4;
|
||||
static const type::Kind Kind = type::X4;
|
||||
static const bool Opaque = false;
|
||||
static const Class class_;
|
||||
static int32_t size(Type t);
|
||||
@ -407,13 +430,13 @@ class UnsizedArrayTypeDescr : public TypeDescr
|
||||
{
|
||||
public:
|
||||
static const Class class_;
|
||||
static const TypeDescr::Kind Kind = TypeDescr::UnsizedArray;
|
||||
static const type::Kind Kind = type::UnsizedArray;
|
||||
|
||||
// This is the sized method on unsized array type objects. It
|
||||
// produces a sized variant.
|
||||
static bool dimension(JSContext *cx, unsigned int argc, jsval *vp);
|
||||
|
||||
SizedTypeDescr &elementType() {
|
||||
SizedTypeDescr &elementType() const {
|
||||
return getReservedSlot(JS_DESCR_SLOT_ARRAY_ELEM_TYPE).toObject().as<SizedTypeDescr>();
|
||||
}
|
||||
};
|
||||
@ -425,13 +448,13 @@ class SizedArrayTypeDescr : public ComplexTypeDescr
|
||||
{
|
||||
public:
|
||||
static const Class class_;
|
||||
static const TypeDescr::Kind Kind = TypeDescr::SizedArray;
|
||||
static const type::Kind Kind = type::SizedArray;
|
||||
|
||||
SizedTypeDescr &elementType() {
|
||||
SizedTypeDescr &elementType() const {
|
||||
return getReservedSlot(JS_DESCR_SLOT_ARRAY_ELEM_TYPE).toObject().as<SizedTypeDescr>();
|
||||
}
|
||||
|
||||
int32_t length() {
|
||||
int32_t length() const {
|
||||
return getReservedSlot(JS_DESCR_SLOT_SIZED_ARRAY_LENGTH).toInt32();
|
||||
}
|
||||
};
|
||||
@ -469,20 +492,20 @@ class StructTypeDescr : public ComplexTypeDescr
|
||||
static const Class class_;
|
||||
|
||||
// Returns the number of fields defined in this struct.
|
||||
size_t fieldCount();
|
||||
size_t fieldCount() const;
|
||||
|
||||
// Set `*out` to the index of the field named `id` and returns true,
|
||||
// or return false if no such field exists.
|
||||
bool fieldIndex(jsid id, size_t *out);
|
||||
bool fieldIndex(jsid id, size_t *out) const;
|
||||
|
||||
// Return the name of the field at index `index`.
|
||||
JSAtom &fieldName(size_t index);
|
||||
JSAtom &fieldName(size_t index) const;
|
||||
|
||||
// Return the type descr of the field at index `index`.
|
||||
SizedTypeDescr &fieldDescr(size_t index);
|
||||
SizedTypeDescr &fieldDescr(size_t index) const;
|
||||
|
||||
// Return the offset of the field at index `index`.
|
||||
int32_t fieldOffset(size_t index);
|
||||
int32_t fieldOffset(size_t index) const;
|
||||
};
|
||||
|
||||
typedef Handle<StructTypeDescr*> HandleStructTypeDescr;
|
||||
@ -670,14 +693,14 @@ class TypedObject : public ArrayBufferViewObject
|
||||
|
||||
int32_t size() const {
|
||||
switch (typeDescr().kind()) {
|
||||
case TypeDescr::Scalar:
|
||||
case TypeDescr::X4:
|
||||
case TypeDescr::Reference:
|
||||
case TypeDescr::Struct:
|
||||
case TypeDescr::SizedArray:
|
||||
case type::Scalar:
|
||||
case type::X4:
|
||||
case type::Reference:
|
||||
case type::Struct:
|
||||
case type::SizedArray:
|
||||
return typeDescr().as<SizedTypeDescr>().size();
|
||||
|
||||
case TypeDescr::UnsizedArray: {
|
||||
case type::UnsizedArray: {
|
||||
SizedTypeDescr &elementType = typeDescr().as<UnsizedArrayTypeDescr>().elementType();
|
||||
return elementType.size() * length();
|
||||
}
|
||||
|
@ -6770,19 +6770,19 @@ IonBuilder::getElemTryTypedObject(bool *emitted, MDefinition *obj, MDefinition *
|
||||
return true;
|
||||
|
||||
switch (elemDescrs.kind()) {
|
||||
case TypeDescr::X4:
|
||||
case type::X4:
|
||||
// FIXME (bug 894105): load into a MIRType_float32x4 etc
|
||||
return true;
|
||||
|
||||
case TypeDescr::Struct:
|
||||
case TypeDescr::SizedArray:
|
||||
case type::Struct:
|
||||
case type::SizedArray:
|
||||
return getElemTryComplexElemOfTypedObject(emitted,
|
||||
obj,
|
||||
index,
|
||||
objDescrs,
|
||||
elemDescrs,
|
||||
elemSize);
|
||||
case TypeDescr::Scalar:
|
||||
case type::Scalar:
|
||||
return getElemTryScalarElemOfTypedObject(emitted,
|
||||
obj,
|
||||
index,
|
||||
@ -6790,10 +6790,10 @@ IonBuilder::getElemTryTypedObject(bool *emitted, MDefinition *obj, MDefinition *
|
||||
elemDescrs,
|
||||
elemSize);
|
||||
|
||||
case TypeDescr::Reference:
|
||||
case type::Reference:
|
||||
return true;
|
||||
|
||||
case TypeDescr::UnsizedArray:
|
||||
case type::UnsizedArray:
|
||||
MOZ_ASSUME_UNREACHABLE("Unsized arrays cannot be element types");
|
||||
}
|
||||
|
||||
@ -7683,18 +7683,18 @@ IonBuilder::setElemTryTypedObject(bool *emitted, MDefinition *obj,
|
||||
return true;
|
||||
|
||||
switch (elemTypeDescrs.kind()) {
|
||||
case TypeDescr::X4:
|
||||
case type::X4:
|
||||
// FIXME (bug 894105): store a MIRType_float32x4 etc
|
||||
return true;
|
||||
|
||||
case TypeDescr::Reference:
|
||||
case TypeDescr::Struct:
|
||||
case TypeDescr::SizedArray:
|
||||
case TypeDescr::UnsizedArray:
|
||||
case type::Reference:
|
||||
case type::Struct:
|
||||
case type::SizedArray:
|
||||
case type::UnsizedArray:
|
||||
// For now, only optimize storing scalars.
|
||||
return true;
|
||||
|
||||
case TypeDescr::Scalar:
|
||||
case type::Scalar:
|
||||
return setElemTryScalarElemOfTypedObject(emitted,
|
||||
obj,
|
||||
index,
|
||||
@ -8708,15 +8708,15 @@ IonBuilder::getPropTryTypedObject(bool *emitted, MDefinition *obj, PropertyName
|
||||
return true;
|
||||
|
||||
switch (fieldDescrs.kind()) {
|
||||
case TypeDescr::Reference:
|
||||
case type::Reference:
|
||||
return true;
|
||||
|
||||
case TypeDescr::X4:
|
||||
case type::X4:
|
||||
// FIXME (bug 894104): load into a MIRType_float32x4 etc
|
||||
return true;
|
||||
|
||||
case TypeDescr::Struct:
|
||||
case TypeDescr::SizedArray:
|
||||
case type::Struct:
|
||||
case type::SizedArray:
|
||||
return getPropTryComplexPropOfTypedObject(emitted,
|
||||
obj,
|
||||
fieldOffset,
|
||||
@ -8724,14 +8724,14 @@ IonBuilder::getPropTryTypedObject(bool *emitted, MDefinition *obj, PropertyName
|
||||
fieldIndex,
|
||||
resultTypes);
|
||||
|
||||
case TypeDescr::Scalar:
|
||||
case type::Scalar:
|
||||
return getPropTryScalarPropOfTypedObject(emitted,
|
||||
obj,
|
||||
fieldOffset,
|
||||
fieldDescrs,
|
||||
resultTypes);
|
||||
|
||||
case TypeDescr::UnsizedArray:
|
||||
case type::UnsizedArray:
|
||||
MOZ_ASSUME_UNREACHABLE("Field of unsized array type");
|
||||
}
|
||||
|
||||
@ -9362,18 +9362,18 @@ IonBuilder::setPropTryTypedObject(bool *emitted, MDefinition *obj,
|
||||
return true;
|
||||
|
||||
switch (fieldDescrs.kind()) {
|
||||
case TypeDescr::X4:
|
||||
case type::X4:
|
||||
// FIXME (bug 894104): store into a MIRType_float32x4 etc
|
||||
return true;
|
||||
|
||||
case TypeDescr::Reference:
|
||||
case TypeDescr::Struct:
|
||||
case TypeDescr::SizedArray:
|
||||
case TypeDescr::UnsizedArray:
|
||||
case type::Reference:
|
||||
case type::Struct:
|
||||
case type::SizedArray:
|
||||
case type::UnsizedArray:
|
||||
// For now, only optimize storing scalars.
|
||||
return true;
|
||||
|
||||
case TypeDescr::Scalar:
|
||||
case type::Scalar:
|
||||
return setPropTryScalarPropOfTypedObject(emitted, obj, fieldOffset,
|
||||
value, fieldDescrs);
|
||||
}
|
||||
@ -10402,7 +10402,7 @@ IonBuilder::lookupTypedObjectField(MDefinition *typedObj,
|
||||
return false;
|
||||
|
||||
// Must be accessing a struct.
|
||||
if (!objDescrs.allOfKind(TypeDescr::Struct))
|
||||
if (!objDescrs.allOfKind(type::Struct))
|
||||
return true;
|
||||
|
||||
// Determine the type/offset of the field `name`, if any.
|
||||
|
@ -1460,7 +1460,7 @@ IonBuilder::elementAccessIsTypedObjectArrayOfScalarType(MDefinition* obj, MDefin
|
||||
if (!objDescrs.arrayElementType(*this, &elemDescrs))
|
||||
return false;
|
||||
|
||||
if (elemDescrs.empty() || elemDescrs.kind() != TypeDescr::Scalar)
|
||||
if (elemDescrs.empty() || elemDescrs.kind() != type::Scalar)
|
||||
return false;
|
||||
|
||||
JS_ASSERT(TypeDescr::isSized(elemDescrs.kind()));
|
||||
|
@ -176,14 +176,14 @@ TypeDescrSet::allOfArrayKind()
|
||||
return false;
|
||||
|
||||
switch (kind()) {
|
||||
case TypeDescr::SizedArray:
|
||||
case TypeDescr::UnsizedArray:
|
||||
case type::SizedArray:
|
||||
case type::UnsizedArray:
|
||||
return true;
|
||||
|
||||
case TypeDescr::X4:
|
||||
case TypeDescr::Reference:
|
||||
case TypeDescr::Scalar:
|
||||
case TypeDescr::Struct:
|
||||
case type::X4:
|
||||
case type::Reference:
|
||||
case type::Scalar:
|
||||
case type::Struct:
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -191,7 +191,7 @@ TypeDescrSet::allOfArrayKind()
|
||||
}
|
||||
|
||||
bool
|
||||
TypeDescrSet::allOfKind(TypeDescr::Kind aKind)
|
||||
TypeDescrSet::allOfKind(type::Kind aKind)
|
||||
{
|
||||
if (empty())
|
||||
return false;
|
||||
@ -226,7 +226,7 @@ TypeDescrSet::knownPrototype() const
|
||||
return &get(0)->as<ComplexTypeDescr>().instancePrototype();
|
||||
}
|
||||
|
||||
TypeDescr::Kind
|
||||
type::Kind
|
||||
TypeDescrSet::kind()
|
||||
{
|
||||
JS_ASSERT(!empty());
|
||||
@ -237,7 +237,7 @@ template<typename T>
|
||||
bool
|
||||
TypeDescrSet::genericType(typename T::Type *out)
|
||||
{
|
||||
JS_ASSERT(allOfKind(TypeDescr::Scalar));
|
||||
JS_ASSERT(allOfKind(type::Scalar));
|
||||
|
||||
typename T::Type type = get(0)->as<T>().type();
|
||||
for (size_t i = 1; i < length(); i++) {
|
||||
@ -271,10 +271,10 @@ bool
|
||||
TypeDescrSet::hasKnownArrayLength(int32_t *l)
|
||||
{
|
||||
switch (kind()) {
|
||||
case TypeDescr::UnsizedArray:
|
||||
case type::UnsizedArray:
|
||||
return false;
|
||||
|
||||
case TypeDescr::SizedArray:
|
||||
case type::SizedArray:
|
||||
{
|
||||
const size_t result = get(0)->as<SizedArrayTypeDescr>().length();
|
||||
for (size_t i = 1; i < length(); i++) {
|
||||
@ -297,12 +297,12 @@ TypeDescrSet::arrayElementType(IonBuilder &builder, TypeDescrSet *out)
|
||||
TypeDescrSetBuilder elementTypes;
|
||||
for (size_t i = 0; i < length(); i++) {
|
||||
switch (kind()) {
|
||||
case TypeDescr::UnsizedArray:
|
||||
case type::UnsizedArray:
|
||||
if (!elementTypes.insert(&get(i)->as<UnsizedArrayTypeDescr>().elementType()))
|
||||
return false;
|
||||
break;
|
||||
|
||||
case TypeDescr::SizedArray:
|
||||
case type::SizedArray:
|
||||
if (!elementTypes.insert(&get(i)->as<SizedArrayTypeDescr>().elementType()))
|
||||
return false;
|
||||
break;
|
||||
@ -321,7 +321,7 @@ TypeDescrSet::fieldNamed(IonBuilder &builder,
|
||||
TypeDescrSet *out,
|
||||
size_t *index)
|
||||
{
|
||||
JS_ASSERT(kind() == TypeDescr::Struct);
|
||||
JS_ASSERT(kind() == type::Struct);
|
||||
|
||||
// Initialize `*offset` and `*out` for the case where incompatible
|
||||
// or absent fields are found.
|
||||
|
@ -86,7 +86,7 @@ class TypeDescrSet {
|
||||
// Query the set
|
||||
|
||||
bool empty() const;
|
||||
bool allOfKind(TypeDescr::Kind kind);
|
||||
bool allOfKind(type::Kind kind);
|
||||
|
||||
// Returns true only when non-empty and `kind()` is
|
||||
// `TypeDescr::Array`
|
||||
@ -108,7 +108,7 @@ class TypeDescrSet {
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// The following operations are only valid on a non-empty set:
|
||||
|
||||
TypeDescr::Kind kind();
|
||||
type::Kind kind();
|
||||
|
||||
// Returns the prototype that a typed object whose type is within
|
||||
// this TypeDescrSet would have. Returns `null` if this cannot be
|
||||
@ -118,7 +118,7 @@ class TypeDescrSet {
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Scalar operations
|
||||
//
|
||||
// Only valid when `kind() == TypeDescr::Scalar`
|
||||
// Only valid when `kind() == type::Scalar`
|
||||
|
||||
// If all type descrs in this set have a single type, returns true
|
||||
// and sets *out. Else returns false.
|
||||
@ -127,7 +127,7 @@ class TypeDescrSet {
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Reference operations
|
||||
//
|
||||
// Only valid when `kind() == TypeDescr::Reference`
|
||||
// Only valid when `kind() == type::Reference`
|
||||
|
||||
// If all type descrs in this set have a single type, returns true
|
||||
// and sets *out. Else returns false.
|
||||
@ -136,7 +136,7 @@ class TypeDescrSet {
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Reference operations
|
||||
//
|
||||
// Only valid when `kind() == TypeDescr::X4`
|
||||
// Only valid when `kind() == type::X4`
|
||||
|
||||
// If all type descrs in this set have a single type, returns true
|
||||
// and sets *out. Else returns false.
|
||||
@ -145,7 +145,7 @@ class TypeDescrSet {
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// SizedArray operations
|
||||
//
|
||||
// Only valid when `kind() == TypeDescr::SizedArray`
|
||||
// Only valid when `kind() == type::SizedArray`
|
||||
|
||||
// Determines whether all arrays in this set have the same,
|
||||
// statically known, array length and return that length
|
||||
@ -160,7 +160,7 @@ class TypeDescrSet {
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Struct operations
|
||||
//
|
||||
// Only valid when `kind() == TypeDescr::Struct`
|
||||
// Only valid when `kind() == type::Struct`
|
||||
|
||||
// Searches the type in the set for a field named `id`. All
|
||||
// possible types must agree on the offset of the field within the
|
||||
|
Loading…
x
Reference in New Issue
Block a user