зеркало из https://github.com/mozilla/gecko-dev.git
Bug 891215 (part 12) - Slim down ScopeObject-inl.h. r=terrence.
--HG-- extra : rebase_source : ea982556f2203254cd8c79272d746d6271c3a904
This commit is contained in:
Родитель
a30a8a0d93
Коммит
f7993c1ab1
|
@ -13,30 +13,6 @@
|
|||
#include "jsobjinlines.h"
|
||||
#include "jsscriptinlines.h"
|
||||
|
||||
template<>
|
||||
inline bool
|
||||
JSObject::is<js::ClonedBlockObject>() const
|
||||
{
|
||||
return is<js::BlockObject>() && !!getProto();
|
||||
}
|
||||
|
||||
template<>
|
||||
inline bool
|
||||
JSObject::is<js::StaticBlockObject>() const
|
||||
{
|
||||
return is<js::BlockObject>() && !getProto();
|
||||
}
|
||||
|
||||
inline JSObject *
|
||||
JSObject::enclosingScope()
|
||||
{
|
||||
return is<js::ScopeObject>()
|
||||
? &as<js::ScopeObject>().enclosingScope()
|
||||
: is<js::DebugScopeObject>()
|
||||
? &as<js::DebugScopeObject>().enclosingScope()
|
||||
: getParent();
|
||||
}
|
||||
|
||||
namespace js {
|
||||
|
||||
inline void
|
||||
|
@ -47,13 +23,6 @@ ScopeObject::setEnclosingScope(HandleObject obj)
|
|||
setFixedSlot(SCOPE_CHAIN_SLOT, ObjectValue(*obj));
|
||||
}
|
||||
|
||||
inline const Value &
|
||||
ScopeObject::aliasedVar(ScopeCoordinate sc)
|
||||
{
|
||||
JS_ASSERT(is<CallObject>() || is<ClonedBlockObject>());
|
||||
return getSlot(sc.slot);
|
||||
}
|
||||
|
||||
inline void
|
||||
ScopeObject::setAliasedVar(JSContext *cx, ScopeCoordinate sc, PropertyName *name, const Value &v)
|
||||
{
|
||||
|
@ -68,33 +37,6 @@ ScopeObject::setAliasedVar(JSContext *cx, ScopeCoordinate sc, PropertyName *name
|
|||
types::AddTypePropertyId(cx, this, NameToId(name), v);
|
||||
}
|
||||
|
||||
/*static*/ inline size_t
|
||||
ScopeObject::offsetOfEnclosingScope()
|
||||
{
|
||||
return getFixedSlotOffset(SCOPE_CHAIN_SLOT);
|
||||
}
|
||||
|
||||
inline bool
|
||||
CallObject::isForEval() const
|
||||
{
|
||||
JS_ASSERT(getReservedSlot(CALLEE_SLOT).isObjectOrNull());
|
||||
JS_ASSERT_IF(getReservedSlot(CALLEE_SLOT).isObject(),
|
||||
getReservedSlot(CALLEE_SLOT).toObject().is<JSFunction>());
|
||||
return getReservedSlot(CALLEE_SLOT).isNull();
|
||||
}
|
||||
|
||||
inline JSFunction &
|
||||
CallObject::callee() const
|
||||
{
|
||||
return getReservedSlot(CALLEE_SLOT).toObject().as<JSFunction>();
|
||||
}
|
||||
|
||||
inline const Value &
|
||||
CallObject::aliasedVar(AliasedFormalIter fi)
|
||||
{
|
||||
return getSlot(fi.scopeSlot());
|
||||
}
|
||||
|
||||
inline void
|
||||
CallObject::setAliasedVar(JSContext *cx, AliasedFormalIter fi, PropertyName *name, const Value &v)
|
||||
{
|
||||
|
@ -104,55 +46,6 @@ CallObject::setAliasedVar(JSContext *cx, AliasedFormalIter fi, PropertyName *nam
|
|||
types::AddTypePropertyId(cx, this, NameToId(name), v);
|
||||
}
|
||||
|
||||
/*static*/ inline size_t
|
||||
CallObject::offsetOfCallee()
|
||||
{
|
||||
return getFixedSlotOffset(CALLEE_SLOT);
|
||||
}
|
||||
|
||||
inline uint32_t
|
||||
NestedScopeObject::stackDepth() const
|
||||
{
|
||||
return getReservedSlot(DEPTH_SLOT).toPrivateUint32();
|
||||
}
|
||||
|
||||
inline JSObject &
|
||||
WithObject::withThis() const
|
||||
{
|
||||
return getReservedSlot(THIS_SLOT).toObject();
|
||||
}
|
||||
|
||||
inline JSObject &
|
||||
WithObject::object() const
|
||||
{
|
||||
return *JSObject::getProto();
|
||||
}
|
||||
|
||||
inline uint32_t
|
||||
BlockObject::slotCount() const
|
||||
{
|
||||
return propertyCount();
|
||||
}
|
||||
|
||||
inline unsigned
|
||||
BlockObject::slotToLocalIndex(const Bindings &bindings, unsigned slot)
|
||||
{
|
||||
JS_ASSERT(slot < RESERVED_SLOTS + slotCount());
|
||||
return bindings.numVars() + stackDepth() + (slot - RESERVED_SLOTS);
|
||||
}
|
||||
|
||||
inline unsigned
|
||||
BlockObject::localIndexToSlot(const Bindings &bindings, unsigned i)
|
||||
{
|
||||
return RESERVED_SLOTS + (i - (bindings.numVars() + stackDepth()));
|
||||
}
|
||||
|
||||
inline const Value &
|
||||
BlockObject::slotValue(unsigned i)
|
||||
{
|
||||
return getSlotRef(RESERVED_SLOTS + i);
|
||||
}
|
||||
|
||||
inline void
|
||||
BlockObject::setSlotValue(unsigned i, const Value &v)
|
||||
{
|
||||
|
@ -178,19 +71,6 @@ StaticBlockObject::initEnclosingStaticScope(JSObject *obj)
|
|||
setReservedSlot(SCOPE_CHAIN_SLOT, ObjectOrNullValue(obj));
|
||||
}
|
||||
|
||||
inline StaticBlockObject *
|
||||
StaticBlockObject::enclosingBlock() const
|
||||
{
|
||||
JSObject *obj = getReservedSlot(SCOPE_CHAIN_SLOT).toObjectOrNull();
|
||||
return obj && obj->is<StaticBlockObject>() ? &obj->as<StaticBlockObject>() : NULL;
|
||||
}
|
||||
|
||||
inline JSObject *
|
||||
StaticBlockObject::enclosingStaticScope() const
|
||||
{
|
||||
return getReservedSlot(SCOPE_CHAIN_SLOT).toObjectOrNull();
|
||||
}
|
||||
|
||||
inline void
|
||||
StaticBlockObject::setStackDepth(uint32_t depth)
|
||||
{
|
||||
|
@ -205,13 +85,6 @@ StaticBlockObject::setDefinitionParseNode(unsigned i, frontend::Definition *def)
|
|||
setSlotValue(i, PrivateValue(def));
|
||||
}
|
||||
|
||||
inline frontend::Definition *
|
||||
StaticBlockObject::maybeDefinitionParseNode(unsigned i)
|
||||
{
|
||||
Value v = slotValue(i);
|
||||
return v.isUndefined() ? NULL : reinterpret_cast<frontend::Definition *>(v.toPrivate());
|
||||
}
|
||||
|
||||
inline void
|
||||
StaticBlockObject::setAliased(unsigned i, bool aliased)
|
||||
{
|
||||
|
@ -223,37 +96,6 @@ StaticBlockObject::setAliased(unsigned i, bool aliased)
|
|||
}
|
||||
}
|
||||
|
||||
inline bool
|
||||
StaticBlockObject::isAliased(unsigned i)
|
||||
{
|
||||
return slotValue(i).isTrue();
|
||||
}
|
||||
|
||||
inline bool
|
||||
StaticBlockObject::needsClone()
|
||||
{
|
||||
return !slotValue(0).isFalse();
|
||||
}
|
||||
|
||||
inline bool
|
||||
StaticBlockObject::containsVarAtDepth(uint32_t depth)
|
||||
{
|
||||
return depth >= stackDepth() && depth < stackDepth() + slotCount();
|
||||
}
|
||||
|
||||
inline StaticBlockObject &
|
||||
ClonedBlockObject::staticBlock() const
|
||||
{
|
||||
return getProto()->as<StaticBlockObject>();
|
||||
}
|
||||
|
||||
inline const Value &
|
||||
ClonedBlockObject::var(unsigned i, MaybeCheckAliasing checkAliasing)
|
||||
{
|
||||
JS_ASSERT_IF(checkAliasing, staticBlock().isAliased(i));
|
||||
return slotValue(i);
|
||||
}
|
||||
|
||||
inline void
|
||||
ClonedBlockObject::setVar(unsigned i, const Value &v, MaybeCheckAliasing checkAliasing)
|
||||
{
|
||||
|
|
|
@ -167,7 +167,7 @@ class ScopeObject : public JSObject
|
|||
inline JSObject &enclosingScope() const {
|
||||
return getReservedSlot(SCOPE_CHAIN_SLOT).toObject();
|
||||
}
|
||||
inline void setEnclosingScope(HandleObject obj);
|
||||
void setEnclosingScope(HandleObject obj);
|
||||
|
||||
/*
|
||||
* Get or set an aliased variable contained in this scope. Unaliased
|
||||
|
@ -176,12 +176,15 @@ class ScopeObject : public JSObject
|
|||
* take a ScopeCoordinate instead of just the slot index.
|
||||
*/
|
||||
inline const Value &aliasedVar(ScopeCoordinate sc);
|
||||
|
||||
inline void setAliasedVar(JSContext *cx, ScopeCoordinate sc, PropertyName *name, const Value &v);
|
||||
|
||||
/* For jit access. */
|
||||
static inline size_t offsetOfEnclosingScope();
|
||||
static size_t offsetOfEnclosingScope() {
|
||||
return getFixedSlotOffset(SCOPE_CHAIN_SLOT);
|
||||
}
|
||||
|
||||
static inline size_t enclosingScopeSlot() {
|
||||
static size_t enclosingScopeSlot() {
|
||||
return SCOPE_CHAIN_SLOT;
|
||||
}
|
||||
};
|
||||
|
@ -211,21 +214,34 @@ class CallObject : public ScopeObject
|
|||
static CallObject *createForStrictEval(JSContext *cx, AbstractFramePtr frame);
|
||||
|
||||
/* True if this is for a strict mode eval frame. */
|
||||
inline bool isForEval() const;
|
||||
bool isForEval() const {
|
||||
JS_ASSERT(getReservedSlot(CALLEE_SLOT).isObjectOrNull());
|
||||
JS_ASSERT_IF(getReservedSlot(CALLEE_SLOT).isObject(),
|
||||
getReservedSlot(CALLEE_SLOT).toObject().is<JSFunction>());
|
||||
return getReservedSlot(CALLEE_SLOT).isNull();
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns the function for which this CallObject was created. (This may
|
||||
* only be called if !isForEval.)
|
||||
*/
|
||||
inline JSFunction &callee() const;
|
||||
JSFunction &callee() const {
|
||||
return getReservedSlot(CALLEE_SLOT).toObject().as<JSFunction>();
|
||||
}
|
||||
|
||||
/* Get/set the aliased variable referred to by 'bi'. */
|
||||
inline const Value &aliasedVar(AliasedFormalIter fi);
|
||||
const Value &aliasedVar(AliasedFormalIter fi) {
|
||||
return getSlot(fi.scopeSlot());
|
||||
}
|
||||
|
||||
inline void setAliasedVar(JSContext *cx, AliasedFormalIter fi, PropertyName *name, const Value &v);
|
||||
|
||||
/* For jit access. */
|
||||
static inline size_t offsetOfCallee();
|
||||
static inline size_t calleeSlot() {
|
||||
static size_t offsetOfCallee() {
|
||||
return getFixedSlotOffset(CALLEE_SLOT);
|
||||
}
|
||||
|
||||
static size_t calleeSlot() {
|
||||
return CALLEE_SLOT;
|
||||
}
|
||||
};
|
||||
|
@ -258,7 +274,9 @@ class NestedScopeObject : public ScopeObject
|
|||
|
||||
public:
|
||||
/* Return the abstract stack depth right before entering this nested scope. */
|
||||
uint32_t stackDepth() const;
|
||||
uint32_t stackDepth() const {
|
||||
return getReservedSlot(DEPTH_SLOT).toPrivateUint32();
|
||||
}
|
||||
};
|
||||
|
||||
class WithObject : public NestedScopeObject
|
||||
|
@ -278,10 +296,14 @@ class WithObject : public NestedScopeObject
|
|||
create(JSContext *cx, HandleObject proto, HandleObject enclosing, uint32_t depth);
|
||||
|
||||
/* Return object for the 'this' class hook. */
|
||||
JSObject &withThis() const;
|
||||
JSObject &withThis() const {
|
||||
return getReservedSlot(THIS_SLOT).toObject();
|
||||
}
|
||||
|
||||
/* Return the 'o' in 'with (o)'. */
|
||||
JSObject &object() const;
|
||||
JSObject &object() const {
|
||||
return *JSObject::getProto();
|
||||
}
|
||||
};
|
||||
|
||||
class BlockObject : public NestedScopeObject
|
||||
|
@ -293,19 +315,30 @@ class BlockObject : public NestedScopeObject
|
|||
static Class class_;
|
||||
|
||||
/* Return the number of variables associated with this block. */
|
||||
inline uint32_t slotCount() const;
|
||||
uint32_t slotCount() const {
|
||||
return propertyCount();
|
||||
}
|
||||
|
||||
/*
|
||||
* Return the local corresponding to the ith binding where i is in the
|
||||
* range [0, slotCount()) and the return local index is in the range
|
||||
* [script->nfixed, script->nfixed + script->nslots).
|
||||
*/
|
||||
unsigned slotToLocalIndex(const Bindings &bindings, unsigned slot);
|
||||
unsigned localIndexToSlot(const Bindings &bindings, uint32_t i);
|
||||
unsigned slotToLocalIndex(const Bindings &bindings, unsigned slot) {
|
||||
JS_ASSERT(slot < RESERVED_SLOTS + slotCount());
|
||||
return bindings.numVars() + stackDepth() + (slot - RESERVED_SLOTS);
|
||||
}
|
||||
|
||||
unsigned localIndexToSlot(const Bindings &bindings, uint32_t i) {
|
||||
return RESERVED_SLOTS + (i - (bindings.numVars() + stackDepth()));
|
||||
}
|
||||
|
||||
protected:
|
||||
/* Blocks contain an object slot for each slot i: 0 <= i < slotCount. */
|
||||
inline const Value &slotValue(unsigned i);
|
||||
const Value &slotValue(unsigned i) {
|
||||
return getSlotRef(RESERVED_SLOTS + i);
|
||||
}
|
||||
|
||||
inline void setSlotValue(unsigned i, const Value &v);
|
||||
};
|
||||
|
||||
|
@ -315,7 +348,9 @@ class StaticBlockObject : public BlockObject
|
|||
static StaticBlockObject *create(JSContext *cx);
|
||||
|
||||
/* See StaticScopeIter comment. */
|
||||
inline JSObject *enclosingStaticScope() const;
|
||||
JSObject *enclosingStaticScope() const {
|
||||
return getReservedSlot(SCOPE_CHAIN_SLOT).toObjectOrNull();
|
||||
}
|
||||
|
||||
/*
|
||||
* A refinement of enclosingStaticScope that returns NULL if the enclosing
|
||||
|
@ -327,19 +362,25 @@ class StaticBlockObject : public BlockObject
|
|||
* Return whether this StaticBlockObject contains a variable stored at
|
||||
* the given stack depth (i.e., fp->base()[depth]).
|
||||
*/
|
||||
bool containsVarAtDepth(uint32_t depth);
|
||||
bool containsVarAtDepth(uint32_t depth) {
|
||||
return depth >= stackDepth() && depth < stackDepth() + slotCount();
|
||||
}
|
||||
|
||||
/*
|
||||
* A let binding is aliased if accessed lexically by nested functions or
|
||||
* dynamically through dynamic name lookup (eval, with, function::, etc).
|
||||
*/
|
||||
bool isAliased(unsigned i);
|
||||
bool isAliased(unsigned i) {
|
||||
return slotValue(i).isTrue();
|
||||
}
|
||||
|
||||
/*
|
||||
* A static block object is cloned (when entering the block) iff some
|
||||
* variable of the block isAliased.
|
||||
*/
|
||||
bool needsClone();
|
||||
bool needsClone() {
|
||||
return !slotValue(0).isFalse();
|
||||
}
|
||||
|
||||
/* Frontend-only functions ***********************************************/
|
||||
|
||||
|
@ -353,7 +394,10 @@ class StaticBlockObject : public BlockObject
|
|||
* a let var to its associated Definition parse node.
|
||||
*/
|
||||
void setDefinitionParseNode(unsigned i, frontend::Definition *def);
|
||||
frontend::Definition *maybeDefinitionParseNode(unsigned i);
|
||||
frontend::Definition *maybeDefinitionParseNode(unsigned i) {
|
||||
Value v = slotValue(i);
|
||||
return v.isUndefined() ? NULL : reinterpret_cast<frontend::Definition *>(v.toPrivate());
|
||||
}
|
||||
|
||||
/*
|
||||
* The parser uses 'enclosingBlock' as the prev-link in the pc->blockChain
|
||||
|
@ -375,11 +419,17 @@ class ClonedBlockObject : public BlockObject
|
|||
AbstractFramePtr frame);
|
||||
|
||||
/* The static block from which this block was cloned. */
|
||||
StaticBlockObject &staticBlock() const;
|
||||
StaticBlockObject &staticBlock() const {
|
||||
return getProto()->as<StaticBlockObject>();
|
||||
}
|
||||
|
||||
/* Assuming 'put' has been called, return the value of the ith let var. */
|
||||
const Value &var(unsigned i, MaybeCheckAliasing = CHECK_ALIASING);
|
||||
void setVar(unsigned i, const Value &v, MaybeCheckAliasing = CHECK_ALIASING);
|
||||
const Value &var(unsigned i, MaybeCheckAliasing checkAliasing = CHECK_ALIASING) {
|
||||
JS_ASSERT_IF(checkAliasing, staticBlock().isAliased(i));
|
||||
return slotValue(i);
|
||||
}
|
||||
|
||||
void setVar(unsigned i, const Value &v, MaybeCheckAliasing checkAliasing = CHECK_ALIASING);
|
||||
|
||||
/* Copy in all the unaliased formals and locals. */
|
||||
void copyUnaliasedValues(AbstractFramePtr frame);
|
||||
|
@ -653,4 +703,46 @@ JSObject::is<js::DebugScopeObject>() const
|
|||
return getClass() == &js::ObjectProxyClass && js_IsDebugScopeSlow(const_cast<JSObject*>(this));
|
||||
}
|
||||
|
||||
template<>
|
||||
inline bool
|
||||
JSObject::is<js::ClonedBlockObject>() const
|
||||
{
|
||||
return is<js::BlockObject>() && !!getProto();
|
||||
}
|
||||
|
||||
template<>
|
||||
inline bool
|
||||
JSObject::is<js::StaticBlockObject>() const
|
||||
{
|
||||
return is<js::BlockObject>() && !getProto();
|
||||
}
|
||||
|
||||
inline JSObject *
|
||||
JSObject::enclosingScope()
|
||||
{
|
||||
return is<js::ScopeObject>()
|
||||
? &as<js::ScopeObject>().enclosingScope()
|
||||
: is<js::DebugScopeObject>()
|
||||
? &as<js::DebugScopeObject>().enclosingScope()
|
||||
: getParent();
|
||||
}
|
||||
|
||||
namespace js {
|
||||
|
||||
inline const Value &
|
||||
ScopeObject::aliasedVar(ScopeCoordinate sc)
|
||||
{
|
||||
JS_ASSERT(is<CallObject>() || is<ClonedBlockObject>());
|
||||
return getSlot(sc.slot);
|
||||
}
|
||||
|
||||
inline StaticBlockObject *
|
||||
StaticBlockObject::enclosingBlock() const
|
||||
{
|
||||
JSObject *obj = getReservedSlot(SCOPE_CHAIN_SLOT).toObjectOrNull();
|
||||
return obj && obj->is<StaticBlockObject>() ? &obj->as<StaticBlockObject>() : NULL;
|
||||
}
|
||||
|
||||
} // namespace js
|
||||
|
||||
#endif /* vm_ScopeObject_h */
|
||||
|
|
Загрузка…
Ссылка в новой задаче