summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwolfbeast <mcwerewolf@wolfbeast.com>2019-05-16 21:34:42 +0000
committerwolfbeast <mcwerewolf@wolfbeast.com>2019-05-16 21:34:42 +0000
commit201d8ee48926569fee200fbc9b4d506554869b5d (patch)
tree4b1b65914205517668df1cca2e9ea003b17fd67b
parentfa8bfa1a00ca88dd0ff5f8dcfb89dee5fd01c639 (diff)
downloadUXP-201d8ee48926569fee200fbc9b4d506554869b5d.tar
UXP-201d8ee48926569fee200fbc9b4d506554869b5d.tar.gz
UXP-201d8ee48926569fee200fbc9b4d506554869b5d.tar.lz
UXP-201d8ee48926569fee200fbc9b4d506554869b5d.tar.xz
UXP-201d8ee48926569fee200fbc9b4d506554869b5d.zip
Remove Unboxed Objects from vm/ - Part 2
-rw-r--r--js/src/jsobj.cpp75
-rw-r--r--js/src/vm/ReceiverGuard.cpp1
-rw-r--r--js/src/vm/ReceiverGuard.h5
3 files changed, 17 insertions, 64 deletions
diff --git a/js/src/jsobj.cpp b/js/src/jsobj.cpp
index 7852b3365..f22ecb445 100644
--- a/js/src/jsobj.cpp
+++ b/js/src/jsobj.cpp
@@ -870,9 +870,6 @@ static inline JSObject*
CreateThisForFunctionWithGroup(JSContext* cx, HandleObjectGroup group,
NewObjectKind newKind)
{
- if (group->maybeUnboxedLayout() && newKind != SingletonObject)
- return UnboxedPlainObject::create(cx, group, newKind);
-
if (TypeNewScript* newScript = group->newScript()) {
if (newScript->analyzed()) {
// The definite properties analysis has been performed for this
@@ -1167,46 +1164,27 @@ static bool
GetScriptPlainObjectProperties(JSContext* cx, HandleObject obj,
MutableHandle<IdValueVector> properties)
{
- if (obj->is<PlainObject>()) {
- PlainObject* nobj = &obj->as<PlainObject>();
-
- if (!properties.appendN(IdValuePair(), nobj->slotSpan()))
- return false;
+ MOZ_ASSERT(obj->is<PlainObject>());
+ PlainObject* nobj = &obj->as<PlainObject>();
- for (Shape::Range<NoGC> r(nobj->lastProperty()); !r.empty(); r.popFront()) {
- Shape& shape = r.front();
- MOZ_ASSERT(shape.isDataDescriptor());
- uint32_t slot = shape.slot();
- properties[slot].get().id = shape.propid();
- properties[slot].get().value = nobj->getSlot(slot);
- }
-
- for (size_t i = 0; i < nobj->getDenseInitializedLength(); i++) {
- Value v = nobj->getDenseElement(i);
- if (!v.isMagic(JS_ELEMENTS_HOLE) && !properties.append(IdValuePair(INT_TO_JSID(i), v)))
- return false;
- }
+ if (!properties.appendN(IdValuePair(), nobj->slotSpan()))
+ return false;
- return true;
+ for (Shape::Range<NoGC> r(nobj->lastProperty()); !r.empty(); r.popFront()) {
+ Shape& shape = r.front();
+ MOZ_ASSERT(shape.isDataDescriptor());
+ uint32_t slot = shape.slot();
+ properties[slot].get().id = shape.propid();
+ properties[slot].get().value = nobj->getSlot(slot);
}
- if (obj->is<UnboxedPlainObject>()) {
- UnboxedPlainObject* nobj = &obj->as<UnboxedPlainObject>();
-
- const UnboxedLayout& layout = nobj->layout();
- if (!properties.appendN(IdValuePair(), layout.properties().length()))
+ for (size_t i = 0; i < nobj->getDenseInitializedLength(); i++) {
+ Value v = nobj->getDenseElement(i);
+ if (!v.isMagic(JS_ELEMENTS_HOLE) && !properties.append(IdValuePair(INT_TO_JSID(i), v)))
return false;
-
- for (size_t i = 0; i < layout.properties().length(); i++) {
- const UnboxedLayout::Property& property = layout.properties()[i];
- properties[i].get().id = NameToId(property.name);
- properties[i].get().value = nobj->getValue(property);
- }
-
- return true;
}
- MOZ_CRASH("Bad object kind");
+ return true;
}
static bool
@@ -1228,8 +1206,9 @@ js::DeepCloneObjectLiteral(JSContext* cx, HandleObject obj, NewObjectKind newKin
/* NB: Keep this in sync with XDRObjectLiteral. */
MOZ_ASSERT_IF(obj->isSingleton(),
cx->compartment()->behaviors().getSingletonsAsTemplates());
- MOZ_ASSERT(obj->is<PlainObject>() || obj->is<UnboxedPlainObject>() ||
- obj->is<ArrayObject>() || obj->is<UnboxedArrayObject>());
+ MOZ_ASSERT(obj->is<PlainObject>() ||
+ obj->is<ArrayObject>() ||
+ obj->is<UnboxedArrayObject>());
MOZ_ASSERT(newKind != SingletonObject);
if (obj->is<ArrayObject>() || obj->is<UnboxedArrayObject>()) {
@@ -1348,7 +1327,6 @@ js::XDRObjectLiteral(XDRState<mode>* xdr, MutableHandleObject obj)
{
if (mode == XDR_ENCODE) {
MOZ_ASSERT(obj->is<PlainObject>() ||
- obj->is<UnboxedPlainObject>() ||
obj->is<ArrayObject>() ||
obj->is<UnboxedArrayObject>());
isArray = (obj->is<ArrayObject>() || obj->is<UnboxedArrayObject>()) ? 1 : 0;
@@ -2334,11 +2312,6 @@ js::LookupOwnPropertyPure(ExclusiveContext* cx, JSObject* obj, jsid id, Shape**
// us the resolve hook won't define a property with this id.
if (ClassMayResolveId(cx->names(), obj->getClass(), id, obj))
return false;
- } else if (obj->is<UnboxedPlainObject>()) {
- if (obj->as<UnboxedPlainObject>().containsUnboxedOrExpandoProperty(cx, id)) {
- MarkNonNativePropertyFound<NoGC>(propp);
- return true;
- }
} else if (obj->is<UnboxedArrayObject>()) {
if (obj->as<UnboxedArrayObject>().containsProperty(cx, id)) {
MarkNonNativePropertyFound<NoGC>(propp);
@@ -2591,11 +2564,6 @@ js::SetPrototype(JSContext* cx, HandleObject obj, HandleObject proto, JS::Object
break;
}
- // Convert unboxed objects to their native representations before changing
- // their prototype/group, as they depend on the group for their layout.
- if (!MaybeConvertUnboxedObjectToNative(cx, obj))
- return false;
-
Rooted<TaggedProto> taggedProto(cx, TaggedProto(proto));
if (!SetClassAndProto(cx, obj, obj->getClass(), taggedProto))
return false;
@@ -2619,9 +2587,6 @@ js::PreventExtensions(JSContext* cx, HandleObject obj, ObjectOpResult& result, I
if (!obj->nonProxyIsExtensible())
return result.succeed();
- if (!MaybeConvertUnboxedObjectToNative(cx, obj))
- return false;
-
// Force lazy properties to be resolved.
AutoIdVector props(cx);
if (!js::GetPropertyKeys(cx, obj, JSITER_HIDDEN | JSITER_OWNONLY, &props))
@@ -3715,12 +3680,6 @@ JSObject::allocKindForTenure(const js::Nursery& nursery) const
if (IsProxy(this))
return as<ProxyObject>().allocKindForTenure();
- // Unboxed plain objects are sized according to the data they store.
- if (is<UnboxedPlainObject>()) {
- size_t nbytes = as<UnboxedPlainObject>().layoutDontCheckGeneration().size();
- return GetGCObjectKindForBytes(UnboxedPlainObject::offsetOfData() + nbytes);
- }
-
// Unboxed arrays use inline data if their size is small enough.
if (is<UnboxedArrayObject>()) {
const UnboxedArrayObject* nobj = &as<UnboxedArrayObject>();
diff --git a/js/src/vm/ReceiverGuard.cpp b/js/src/vm/ReceiverGuard.cpp
index 97df908c3..11c2d0727 100644
--- a/js/src/vm/ReceiverGuard.cpp
+++ b/js/src/vm/ReceiverGuard.cpp
@@ -7,7 +7,6 @@
#include "vm/ReceiverGuard.h"
#include "builtin/TypedObject.h"
-#include "vm/UnboxedObject.h"
#include "jsobjinlines.h"
using namespace js;
diff --git a/js/src/vm/ReceiverGuard.h b/js/src/vm/ReceiverGuard.h
index 459cc0012..c14f0d83b 100644
--- a/js/src/vm/ReceiverGuard.h
+++ b/js/src/vm/ReceiverGuard.h
@@ -28,11 +28,6 @@ namespace js {
// TypedObject: The structure of a typed object is determined by its group.
// All typed objects with the same group have the same class, prototype, and
// own properties.
-//
-// UnboxedPlainObject: The structure of an unboxed plain object is determined
-// by its group and its expando object's shape, if there is one. All unboxed
-// plain objects with the same group and expando shape have the same
-// properties except those stored in the expando's dense elements.
class HeapReceiverGuard;
class RootedReceiverGuard;