Fixing shell/js

This commit is contained in:
Luke Wagner 2010-05-17 18:49:58 -07:00
parent 5be73c94d8
commit 8a79b8e8e7
30 changed files with 307 additions and 313 deletions

View File

@ -116,6 +116,13 @@ JS_STATIC_ASSERT(sizeof(JSBool) == sizeof(int32));
#define CHECK_REQUEST(cx) ((void)0)
#endif
JS_PUBLIC_DATA(jsval) JSVAL_NULL = { JSVAL_NULL_MASK, JS_PADDING_INIT_VALUE() { NULL } };
JS_PUBLIC_DATA(jsval) JSVAL_ZERO = { JSVAL_INT32_MASK, JS_PADDING_INIT_VALUE() { 0 } };
JS_PUBLIC_DATA(jsval) JSVAL_ONE = { JSVAL_INT32_MASK, JS_PADDING_INIT_VALUE() { 1 } };
JS_PUBLIC_DATA(jsval) JSVAL_FALSE = { JSVAL_BOOLEAN_MASK, JS_PADDING_INIT_VALUE() { false } };
JS_PUBLIC_DATA(jsval) JSVAL_TRUE = { JSVAL_BOOLEAN_MASK, JS_PADDING_INIT_VALUE() { true } };
JS_PUBLIC_DATA(jsval) JSVAL_VOID = { JSVAL_UNDEFINED_MASK, JS_PADDING_INIT_VALUE() };
JS_PUBLIC_API(int64)
JS_Now()
{
@ -1033,8 +1040,6 @@ JS_SetGlobalObject(JSContext *cx, JSObject *obj)
#endif
}
JS_BEGIN_EXTERN_C
JSObject *
js_InitFunctionAndObjectClasses(JSContext *cx, JSObject *obj)
{
@ -1138,8 +1143,6 @@ out:
return fun_proto;
}
JS_END_EXTERN_C
JS_PUBLIC_API(JSBool)
JS_InitStandardClasses(JSContext *cx, JSObject *obj)
{
@ -1149,7 +1152,7 @@ JS_InitStandardClasses(JSContext *cx, JSObject *obj)
/* Define a top-level property 'undefined' with the undefined value. */
atom = cx->runtime->atomState.typeAtoms[JSTYPE_VOID];
if (!obj->defineProperty(cx, ATOM_TO_JSID(atom), sUndefinedValue,
if (!obj->defineProperty(cx, ATOM_TO_JSID(atom), undefinedValue(),
PropertyStub, PropertyStub,
JSPROP_PERMANENT | JSPROP_READONLY)) {
return JS_FALSE;
@ -1356,7 +1359,7 @@ JS_ResolveStandardClass(JSContext *cx, JSObject *obj, jsval id,
atom = rt->atomState.typeAtoms[JSTYPE_VOID];
if (idstr == ATOM_TO_STRING(atom)) {
*resolved = JS_TRUE;
return obj->defineProperty(cx, ATOM_TO_JSID(atom), sUndefinedValue,
return obj->defineProperty(cx, ATOM_TO_JSID(atom), undefinedValue(),
PropertyStub, PropertyStub,
JSPROP_PERMANENT | JSPROP_READONLY);
}
@ -1447,7 +1450,7 @@ JS_EnumerateStandardClasses(JSContext *cx, JSObject *obj)
/* Check whether we need to bind 'undefined' and define it if so. */
atom = rt->atomState.typeAtoms[JSTYPE_VOID];
if (!AlreadyHasOwnProperty(cx, obj, atom) &&
!obj->defineProperty(cx, ATOM_TO_JSID(atom), sUndefinedValue,
!obj->defineProperty(cx, ATOM_TO_JSID(atom), undefinedValue(),
PropertyStub, PropertyStub,
JSPROP_PERMANENT | JSPROP_READONLY)) {
return JS_FALSE;
@ -1683,6 +1686,13 @@ JS_strdup(JSContext *cx, const char *s)
return (char *)memcpy(p, s, n);
}
JS_PUBLIC_API(JSBool)
JS_NewNumberValue(JSContext *cx, jsdouble d, jsval *rval)
{
Valueify(rval)->setNumber(d);
return JS_TRUE;
}
#undef JS_AddRoot
JS_PUBLIC_API(JSBool)
@ -2536,10 +2546,10 @@ JSID_TO_JSVAL(jsid id)
}
JS_PUBLIC_API(JSBool)
JS_ValueToId(JSContext *cx, const jsval *vp, jsid *idp)
JS_ValueToId(JSContext *cx, jsval v, jsid *idp)
{
CHECK_REQUEST(cx);
return ValueToId(cx, Valueify(*vp), idp);
return ValueToId(cx, Valueify(v), idp);
}
JS_PUBLIC_API(JSBool)
@ -2927,7 +2937,7 @@ JS_DefineProperties(JSContext *cx, JSObject *obj, JSPropertySpec *ps)
CHECK_REQUEST(cx);
for (ok = JS_TRUE; ps->name; ps++) {
ok = DefineProperty(cx, obj, ps->name, sUndefinedValue,
ok = DefineProperty(cx, obj, ps->name, undefinedValue(),
Valueify(ps->getter), Valueify(ps->setter), ps->flags,
JSScopeProperty::HAS_SHORTID, ps->tinyid);
if (!ok)

View File

@ -52,12 +52,12 @@
JS_BEGIN_EXTERN_C
/* Well-known JS values, initialized on startup. */
extern jsval JSVAL_NULL;
extern jsval JSVAL_ZERO;
extern jsval JSVAL_ONE;
extern jsval JSVAL_FALSE;
extern jsval JSVAL_TRUE;
extern jsval JSVAL_VOID;
extern JS_PUBLIC_DATA(jsval) JSVAL_NULL;
extern JS_PUBLIC_DATA(jsval) JSVAL_ZERO;
extern JS_PUBLIC_DATA(jsval) JSVAL_ONE;
extern JS_PUBLIC_DATA(jsval) JSVAL_FALSE;
extern JS_PUBLIC_DATA(jsval) JSVAL_TRUE;
extern JS_PUBLIC_DATA(jsval) JSVAL_VOID;
/*
* Exact value equality, corresponding to == on old word-sized jsvals.
@ -929,6 +929,9 @@ JS_updateMallocCounter(JSContext *cx, size_t nbytes);
extern JS_PUBLIC_API(char *)
JS_strdup(JSContext *cx, const char *s);
extern JS_PUBLIC_API(JSBool)
JS_NewNumberValue(JSContext *cx, jsdouble d, jsval *rval);
/*
* A GC root is a pointer to a jsval, JSObject *, or JSString * that itself
* points into the GC heap. JS_AddValueRoot takes pointers to jsvals and
@ -3042,12 +3045,6 @@ class ObjPtr
protected:
typedef JSValueMaskType MaskType;
static const MaskType NullMask = JSVAL_NULL_MASK;
static const MaskType NonFunObjMask = JSVAL_NONFUNOBJ_MASK;
static const MaskType FunObjMask = JSVAL_FUNOBJ_MASK;
static const MaskType ObjectMask = NonFunObjMask | FunObjMask;
MaskType mask;
JSObject *obj;
@ -3063,31 +3060,31 @@ class ObjPtr
}
ObjPtr(NullTag) {
mask = NullMask;
mask = JSVAL_NULL_MASK;
obj = NULL;
}
ObjPtr(FunObjTag arg) {
JS_ASSERT(JS_ObjectIsFunction(NULL, &arg.obj));
mask = FunObjMask;
mask = JSVAL_FUNOBJ_MASK;
obj = &arg.obj;
}
ObjPtr(FunObjOrNull arg) {
JS_ASSERT_IF(arg.obj, JS_ObjectIsFunction(NULL, arg.obj));
mask = arg.obj ? FunObjMask : NullMask;
mask = arg.obj ? JSVAL_FUNOBJ_MASK : JSVAL_NULL_MASK;
obj = arg.obj;
}
ObjPtr(NonFunObjTag arg) {
JS_ASSERT(!JS_ObjectIsFunction(NULL, &arg.obj));
mask = NonFunObjMask;
mask = JSVAL_NONFUNOBJ_MASK;
obj = &arg.obj;
}
ObjPtr(NonFunObjOrNull arg) {
JS_ASSERT_IF(arg.obj, !JS_ObjectIsFunction(NULL, arg.obj));
mask = arg.obj ? NonFunObjMask : NullMask;
mask = arg.obj ? JSVAL_NONFUNOBJ_MASK : JSVAL_NULL_MASK;
obj = arg.obj;
}
@ -3097,11 +3094,11 @@ class ObjPtr
/* Accessors */
bool isNull() const {
return mask == NullMask;
return mask == JSVAL_NULL_MASK;
}
bool isFunObj() const {
return mask == FunObjMask;
return mask == JSVAL_FUNOBJ_MASK;
}
JSObject &asFunObj() const {
@ -3110,7 +3107,7 @@ class ObjPtr
}
bool isNonFunObj() const {
return mask == NonFunObjMask;
return mask == JSVAL_NONFUNOBJ_MASK;
}
JSObject &asNonFunObj() const {
@ -3119,8 +3116,8 @@ class ObjPtr
}
bool isObject() const {
JS_ASSERT((mask != NullMask) == bool(mask & ObjectMask));
return mask != NullMask;
JS_ASSERT((mask != JSVAL_NULL_MASK) == bool(mask & JSVAL_OBJECT_MASK));
return mask != JSVAL_NULL_MASK;
}
operator JSObject *() const {
@ -3140,31 +3137,31 @@ class ObjPtr
/* Assignment */
void setNull() {
mask = NullMask;
mask = JSVAL_NULL_MASK;
obj = NULL;
}
void setFunObj(JSObject &arg) {
JS_ASSERT(JS_ObjectIsFunction(NULL, &arg));
mask = FunObjMask;
mask = JSVAL_FUNOBJ_MASK;
obj = &arg;
}
void setFunObjOrNull(JSObject *arg) {
JS_ASSERT_IF(arg, JS_ObjectIsFunction(NULL, arg));
mask = arg ? FunObjMask : NullMask;
mask = arg ? JSVAL_FUNOBJ_MASK : JSVAL_NULL_MASK;
obj = arg;
}
void setNonFunObj(JSObject &arg) {
JS_ASSERT(!JS_ObjectIsFunction(NULL, &arg));
mask = NonFunObjMask;
mask = JSVAL_NONFUNOBJ_MASK;
obj = &arg;
}
void setNonFunObjOrNull(JSObject *arg) {
JS_ASSERT_IF(arg, !JS_ObjectIsFunction(NULL, arg));
mask = arg ? NonFunObjMask : NullMask;
mask = arg ? JSVAL_NONFUNOBJ_MASK : JSVAL_NULL_MASK;
obj = arg;
}
@ -3200,29 +3197,14 @@ class Value
*/
friend bool StrictlyEqual(JSContext *, const Value &, const Value &);
friend bool Interpret(JSContext *); /* grep "value representation" */
friend bool PrimitiveThisTest(JSFunction *, const Value &);
friend class PrimitiveValue;
protected:
/* Type masks */
typedef JSValueMaskType MaskType;
static const MaskType NullMask = JSVAL_NULL_MASK;
static const MaskType UndefinedMask = JSVAL_UNDEFINED_MASK;
static const MaskType Int32Mask = JSVAL_INT32_MASK;
static const MaskType DoubleMask = JSVAL_DOUBLE_MASK;
static const MaskType StringMask = JSVAL_STRING_MASK;
static const MaskType NonFunObjMask = JSVAL_NONFUNOBJ_MASK;
static const MaskType FunObjMask = JSVAL_FUNOBJ_MASK;
static const MaskType BooleanMask = JSVAL_BOOLEAN_MASK;
static const MaskType MagicMask = JSVAL_MAGIC_MASK;
/* Standard collections of types. */
static const MaskType NumberMask = Int32Mask | DoubleMask;
static const MaskType ObjectMask = NonFunObjMask | FunObjMask;
static const MaskType GCThingMask = ObjectMask | StringMask;
static bool isSingleton(MaskType m) { return !(m & ~UndefinedMask); }
static bool isObjectOrNull(MaskType m) { return !(m & ~ObjectMask); }
static bool isSingleton(MaskType m) { return !(m & ~JSVAL_UNDEFINED_MASK); }
static bool isObjectOrNull(MaskType m) { return !(m & ~JSVAL_OBJECT_MASK); }
union Data
{
@ -3261,59 +3243,59 @@ class Value
}
Value(NullTag) {
mask = NullMask;
mask = JSVAL_NULL_MASK;
data.obj = NULL;
}
Value(UndefinedTag) {
mask = UndefinedMask;
mask = JSVAL_UNDEFINED_MASK;
/* N.B. data is undefined */
}
Value(Int32Tag arg) {
mask = Int32Mask;
mask = JSVAL_INT32_MASK;
data.i32 = arg.i32;
}
Value(DoubleTag arg) {
mask = DoubleMask;
mask = JSVAL_DOUBLE_MASK;
data.dbl = arg.dbl;
}
inline Value(NumberTag arg);
Value(JSString *arg) {
mask = StringMask;
mask = JSVAL_STRING_MASK;
data.str = arg;
}
Value(FunObjTag arg) {
JS_ASSERT(JS_ObjectIsFunction(NULL, &arg.obj));
mask = FunObjMask;
mask = JSVAL_FUNOBJ_MASK;
data.obj = &arg.obj;
}
Value(FunObjOrNull arg) {
JS_ASSERT_IF(arg.obj, JS_ObjectIsFunction(NULL, arg.obj));
mask = arg.obj ? FunObjMask : NullMask;
mask = arg.obj ? JSVAL_FUNOBJ_MASK : JSVAL_NULL_MASK;
data.obj = arg.obj;
}
Value(FunObjOrUndefinedTag arg) {
JS_ASSERT_IF(arg.obj, JS_ObjectIsFunction(NULL, arg.obj));
mask = arg.obj ? FunObjMask : UndefinedMask;
mask = arg.obj ? JSVAL_FUNOBJ_MASK : JSVAL_UNDEFINED_MASK;
data.obj = arg.obj;
}
Value(NonFunObjTag arg) {
JS_ASSERT(JS_ObjectIsFunction(NULL, &arg.obj));
mask = NonFunObjMask;
mask = JSVAL_NONFUNOBJ_MASK;
data.obj = &arg.obj;
}
Value(NonFunObjOrNull arg) {
JS_ASSERT_IF(arg.obj, !JS_ObjectIsFunction(NULL, arg.obj));
mask = arg.obj ? NonFunObjMask : NullMask;
mask = arg.obj ? JSVAL_NONFUNOBJ_MASK : JSVAL_NULL_MASK;
data.obj = arg.obj;
}
@ -3321,12 +3303,12 @@ class Value
inline Value(ObjectOrNullTag arg);
Value(BooleanTag arg) {
mask = BooleanMask;
mask = JSVAL_BOOLEAN_MASK;
data.boo = arg.boo;
}
Value(JSWhyMagic arg) {
mask = MagicMask;
mask = JSVAL_MAGIC_MASK;
#ifdef DEBUG
data.why = arg;
#endif
@ -3344,17 +3326,17 @@ class Value
/* Mutators */
void setNull() {
mask = NullMask;
mask = JSVAL_NULL_MASK;
data.obj = NULL;
}
void setUndefined() {
/* N.B. data is undefined. */
mask = UndefinedMask;
mask = JSVAL_UNDEFINED_MASK;
}
void setInt32(int32 i) {
mask = Int32Mask;
mask = JSVAL_INT32_MASK;
data.i32 = i;
}
@ -3365,7 +3347,7 @@ class Value
void setDouble(double d) {
JS_ASSERT(size_t(&data.dbl) % sizeof(double) == 0);
mask = DoubleMask;
mask = JSVAL_DOUBLE_MASK;
data.dbl = d;
}
@ -3373,10 +3355,10 @@ class Value
void setNumber(uint32 ui) {
if (ui > JSVAL_INT_MAX) {
mask = DoubleMask;
mask = JSVAL_DOUBLE_MASK;
data.dbl = ui;
} else {
mask = Int32Mask;
mask = JSVAL_INT32_MASK;
data.i32 = ui;
}
}
@ -3388,37 +3370,37 @@ class Value
}
void setString(JSString *str) {
mask = StringMask;
mask = JSVAL_STRING_MASK;
data.str = str;
}
void setFunObj(JSObject &arg) {
JS_ASSERT(JS_ObjectIsFunction(NULL, &arg));
mask = FunObjMask;
mask = JSVAL_FUNOBJ_MASK;
data.obj = &arg;
}
void setFunObjOrNull(JSObject *arg) {
JS_ASSERT_IF(arg, JS_ObjectIsFunction(NULL, arg));
mask = arg ? FunObjMask : NullMask;
mask = arg ? JSVAL_FUNOBJ_MASK : JSVAL_NULL_MASK;
data.obj = arg;
}
void setFunObjOrUndefined(JSObject *arg) {
JS_ASSERT_IF(arg, JS_ObjectIsFunction(NULL, arg));
mask = arg ? FunObjMask : UndefinedMask;
mask = arg ? JSVAL_FUNOBJ_MASK : JSVAL_UNDEFINED_MASK;
data.obj = arg;
}
void setNonFunObj(JSObject &arg) {
JS_ASSERT(!JS_ObjectIsFunction(NULL, &arg));
mask = NonFunObjMask;
mask = JSVAL_NONFUNOBJ_MASK;
data.obj = &arg;
}
void setNonFunObjOrNull(JSObject *arg) {
JS_ASSERT_IF(arg, !JS_ObjectIsFunction(NULL, arg));
mask = arg ? NonFunObjMask : NullMask;
mask = arg ? JSVAL_NONFUNOBJ_MASK : JSVAL_NULL_MASK;
data.obj = arg;
}
@ -3426,12 +3408,12 @@ class Value
inline void setObjectOrNull(JSObject *arg);
void setBoolean(bool b) {
mask = BooleanMask;
mask = JSVAL_BOOLEAN_MASK;
data.boo = b;
}
void setMagic(JSWhyMagic why) {
mask = MagicMask;
mask = JSVAL_MAGIC_MASK;
#ifdef DEBUG
data.why = why;
#endif
@ -3463,11 +3445,11 @@ class Value
/* Accessors */
bool isUndefined() const {
return mask == UndefinedMask;
return mask == JSVAL_UNDEFINED_MASK;
}
bool isNull() const {
return mask == NullMask;
return mask == JSVAL_NULL_MASK;
}
bool isNullOrUndefined() const {
@ -3475,7 +3457,7 @@ class Value
}
bool isInt32() const {
return mask == Int32Mask;
return mask == JSVAL_INT32_MASK;
}
int32 asInt32() const {
@ -3488,7 +3470,7 @@ class Value
}
bool isDouble() const {
return mask == DoubleMask;
return mask == JSVAL_DOUBLE_MASK;
}
double asDouble() const {
@ -3497,7 +3479,7 @@ class Value
}
bool isNumber() const {
return bool(mask & NumberMask);
return bool(mask & JSVAL_NUMBER_MASK);
}
double asNumber() const {
@ -3506,7 +3488,7 @@ class Value
}
bool isString() const {
return mask == StringMask;
return mask == JSVAL_STRING_MASK;
}
JSString *asString() const {
@ -3515,7 +3497,7 @@ class Value
}
bool isNonFunObj() const {
return mask == NonFunObjMask;
return mask == JSVAL_NONFUNOBJ_MASK;
}
JSObject &asNonFunObj() const {
@ -3524,7 +3506,7 @@ class Value
}
bool isFunObj() const {
return mask == FunObjMask;
return mask == JSVAL_FUNOBJ_MASK;
}
JSObject &asFunObj() const {
@ -3533,7 +3515,7 @@ class Value
}
bool isObject() const {
return bool(mask & ObjectMask);
return bool(mask & JSVAL_OBJECT_MASK);
}
bool isPrimitive() const {
@ -3560,7 +3542,7 @@ class Value
}
bool isGCThing() const {
return bool(mask & GCThingMask);
return bool(mask & JSVAL_GCTHING_MASK);
}
void *asGCThing() const {
@ -3570,19 +3552,19 @@ class Value
int32 traceKind() const {
JS_ASSERT(isGCThing());
return mask == StringMask;
return mask == JSVAL_STRING_MASK;
}
bool isBoolean() const {
return mask == BooleanMask;
return mask == JSVAL_BOOLEAN_MASK;
}
bool isTrue() const {
return (mask == BooleanMask) & data.boo;
return (mask == JSVAL_BOOLEAN_MASK) & data.boo;
}
bool isFalse() const {
return (mask == BooleanMask) & !data.boo;
return (mask == JSVAL_BOOLEAN_MASK) & !data.boo;
}
bool asBoolean() const {
@ -3591,16 +3573,16 @@ class Value
}
bool isMagic() const {
return mask == MagicMask;
return mask == JSVAL_MAGIC_MASK;
}
bool isMagic(JSWhyMagic why) const {
JS_ASSERT_IF(mask == MagicMask, data.why == why);
JS_ASSERT_IF(mask == JSVAL_MAGIC_MASK, data.why == why);
return isMagic();
}
JSWhyMagic whyMagic() const {
JS_ASSERT(mask == MagicMask);
JS_ASSERT(mask == JSVAL_MAGIC_MASK);
return data.why;
}
@ -3614,32 +3596,32 @@ class Value
*/
Value(PrivateVoidPtrTag arg) {
mask = Int32Mask;
mask = JSVAL_INT32_MASK;
data.ptr = arg.ptr;
}
void setPrivateVoidPtr(void *ptr) {
mask = Int32Mask;
mask = JSVAL_INT32_MASK;
data.ptr = ptr;
}
void *asPrivateVoidPtr() const {
JS_ASSERT(mask == Int32Mask);
JS_ASSERT(mask == JSVAL_INT32_MASK);
return data.ptr;
}
void setPrivateUint32(uint32 u) {
mask = Int32Mask;
mask = JSVAL_INT32_MASK;
data.u32 = u;
}
uint32 asPrivateUint32() const {
JS_ASSERT(mask == Int32Mask);
JS_ASSERT(mask == JSVAL_INT32_MASK);
return data.u32;
}
uint32 &asPrivateUint32Ref() {
JS_ASSERT(mask == Int32Mask);
JS_ASSERT(mask == JSVAL_INT32_MASK);
return data.u32;
}
};
@ -3666,7 +3648,7 @@ JS_STATIC_ASSERT(sizeof(CopyableValue) == sizeof(Value));
inline CopyableValue &copyable_cast(Value &v) { return static_cast<CopyableValue &>(v); }
inline const CopyableValue &copyable_cast(const Value &v) { return static_cast<const CopyableValue &>(v); }
JS_ALWAYS_INLINE
inline
Value::Value(const CopyableValue &v) {
mask = v.mask;
data = v.data;
@ -3676,28 +3658,24 @@ Value::Value(const CopyableValue &v) {
* As asserted above, js::Value and jsval are layout equivalent. To provide
* widespread casting, the following safe casts are provided.
*/
static JS_ALWAYS_INLINE jsval * Jsvalify(Value *v) { return (jsval *)v; }
static JS_ALWAYS_INLINE const jsval * Jsvalify(const Value *v) { return (const jsval *)v; }
static JS_ALWAYS_INLINE jsval & Jsvalify(Value &v) { return (jsval &)v; }
static JS_ALWAYS_INLINE const jsval & Jsvalify(const Value &v) { return (const jsval &)v; }
static JS_ALWAYS_INLINE Value * Valueify(jsval *v) { return (Value *)v; }
static JS_ALWAYS_INLINE const Value * Valueify(const jsval *v) { return (const Value *)v; }
static JS_ALWAYS_INLINE Value & Valueify(jsval &v) { return (Value &)v; }
static JS_ALWAYS_INLINE const Value & Valueify(const jsval &v) { return (const Value &)v; }
static inline jsval * Jsvalify(Value *v) { return (jsval *)v; }
static inline const jsval * Jsvalify(const Value *v) { return (const jsval *)v; }
static inline jsval & Jsvalify(Value &v) { return (jsval &)v; }
static inline const jsval & Jsvalify(const Value &v) { return (const jsval &)v; }
static inline Value * Valueify(jsval *v) { return (Value *)v; }
static inline const Value * Valueify(const jsval *v) { return (const Value *)v; }
static inline Value & Valueify(jsval &v) { return (Value &)v; }
static inline const Value & Valueify(const jsval &v) { return (const Value &)v; }
JS_ALWAYS_INLINE bool
inline bool
equalTypeAndPayload(const Value &l, const Value &r)
{
return EQUAL_TYPE_AND_PAYLOAD(Jsvalify(&l), Jsvalify(&r));
}
/*
* N.B. It is more efficient to use setNull/isNull/setUndefined/isUndefined
* than to copy/compare these global values.
*/
extern const Value sNullValue;
extern const Value sUndefinedValue;
extern const ObjPtr sNullObjPtr;
/* Convenience inlines. */
static inline CopyableValue undefinedValue() { return copyable_cast(Value(UndefinedTag())); }
static inline CopyableValue nullValue() { return copyable_cast(Value(NullTag())); }
/*
* js::Class is layout compatible and thus

View File

@ -1162,7 +1162,7 @@ js_MakeArraySlow(JSContext *cx, JSObject *obj)
jsid id;
JSScopeProperty *sprop;
if (!JS_ValueToId(cx, INT_TO_JSVAL(i), &id))
if (!ValueToId(cx, Int32Tag(i), &id))
goto out_bad;
if (obj->getDenseArrayElement(i).isMagic(JS_ARRAY_HOLE)) {
@ -2108,7 +2108,7 @@ array_sort(JSContext *cx, uintN argc, Value *vp)
while (undefs != 0) {
--undefs;
if (!JS_CHECK_OPERATION_LIMIT(cx) ||
!SetArrayElement(cx, obj, newlen++, sUndefinedValue)) {
!SetArrayElement(cx, obj, newlen++, Value(UndefinedTag()))) {
return false;
}
}
@ -2696,7 +2696,7 @@ array_indexOfHelper(JSContext *cx, JSBool isLast, uintN argc, Value *vp)
if (argc <= 1) {
i = isLast ? length - 1 : 0;
tosearch.copy((argc != 0) ? vp[2] : sUndefinedValue);
tosearch.copy((argc != 0) ? vp[2] : Value(UndefinedTag()));
} else {
jsdouble start;

View File

@ -1311,7 +1311,7 @@ js_InternNonIntElementIdSlow(JSContext *cx, JSObject *obj, const Value &idval,
}
if (js_ValueToStringId(cx, idval, idp)) {
vp->setString(ATOM_TO_STRING(JSID_TO_ATOM(*idp)));
vp->setString(JSID_TO_STRING(*idp));
return true;
}
return false;

View File

@ -830,7 +830,7 @@ JS_SetWatchPoint(JSContext *cx, JSObject *obj, jsid id,
sprop = js_FindWatchPoint(rt, obj->scope(), propid);
if (!sprop) {
/* Make a new property in obj so we can watch for the first set. */
if (!js_DefineNativeProperty(cx, obj, propid, sUndefinedValue, NULL, NULL,
if (!js_DefineNativeProperty(cx, obj, propid, Value(UndefinedTag()), NULL, NULL,
JSPROP_ENUMERATE, 0, 0, &prop)) {
return JS_FALSE;
}
@ -844,9 +844,10 @@ JS_SetWatchPoint(JSContext *cx, JSObject *obj, jsid id,
intN shortid;
if (pobj->isNative()) {
value.copy(SPROP_HAS_VALID_SLOT(sprop, pobj->scope())
? pobj->lockedGetSlot(sprop->slot)
: sUndefinedValue);
if (SPROP_HAS_VALID_SLOT(sprop, pobj->scope()))
value.copy(pobj->lockedGetSlot(sprop->slot));
else
value.setUndefined();
getter = sprop->getter();
setter = sprop->setter();
attrs = sprop->attributes();

View File

@ -1041,8 +1041,7 @@ js_InitExceptionClasses(JSContext *cx, JSObject *obj)
}
/* Add the name property to the prototype. */
if (!JS_DefineProperty(cx, proto, js_name_str,
STRING_TO_JSVAL(ATOM_TO_STRING(atom)),
if (!JS_DefineProperty(cx, proto, js_name_str, ATOM_TO_JSVAL(atom),
NULL, NULL, JSPROP_ENUMERATE)) {
return NULL;
}

View File

@ -602,7 +602,8 @@ args_resolve(JSContext *cx, JSObject *obj, jsid id, uintN flags,
* XXX ECMA specs DontEnum even for indexed properties, contrary to
* other array-like objects.
*/
if (!js_DefineProperty(cx, obj, id, &sUndefinedValue, ArgGetter, ArgSetter, JSPROP_SHARED))
Value undef = undefinedValue();
if (!js_DefineProperty(cx, obj, id, &undef, ArgGetter, ArgSetter, JSPROP_SHARED))
return JS_FALSE;
*objp = obj;
}
@ -1218,7 +1219,7 @@ call_resolve(JSContext *cx, JSObject *obj, jsid id, uintN flags,
getter = js_GetCallVarChecked;
}
}
if (!js_DefineNativeProperty(cx, obj, id, sUndefinedValue, getter, setter,
if (!js_DefineNativeProperty(cx, obj, id, Value(UndefinedTag()), getter, setter,
attrs, JSScopeProperty::HAS_SHORTID, (int16) slot,
NULL, JSDNP_DONT_PURGE)) {
return JS_FALSE;
@ -1232,7 +1233,7 @@ call_resolve(JSContext *cx, JSObject *obj, jsid id, uintN flags,
* arguments object reference in a Call prototype's |arguments| slot.
*/
if (id == ATOM_TO_JSID(cx->runtime->atomState.argumentsAtom)) {
if (!js_DefineNativeProperty(cx, obj, id, sUndefinedValue,
if (!js_DefineNativeProperty(cx, obj, id, Value(UndefinedTag()),
GetCallArguments, SetCallArguments,
JSPROP_PERMANENT | JSPROP_SHARED,
0, 0, NULL, JSDNP_DONT_PURGE)) {
@ -1499,7 +1500,7 @@ fun_resolve(JSContext *cx, JSObject *obj, jsid id, uintN flags, JSObject **objp)
JS_ASSERT(!IsInternalFunctionObject(obj));
if (!js_DefineNativeProperty(cx, obj,
ATOM_TO_JSID(atom), sUndefinedValue,
ATOM_TO_JSID(atom), Value(UndefinedTag()),
fun_getProperty, PropertyStub,
lfp->attrs, JSScopeProperty::HAS_SHORTID,
lfp->tinyid, NULL)) {

View File

@ -1187,7 +1187,7 @@ js_AddRootRT(JSRuntime *rt, Value *vp, const char *name)
}
JSBool
js_AddRootRT(JSRuntime *rt, void **rp, const char *name)
js_AddGCThingRootRT(JSRuntime *rt, void **rp, const char *name)
{
/*
* Due to the long-standing, but now removed, use of rt->gcLock across the

View File

@ -397,13 +397,13 @@ namespace js {
const Value::MaskType PrimitiveValue::Masks[PrimitiveValue::THISP_ARRAY_SIZE] = {
0, /* 000 */
Value::StringMask, /* 001 */
Value::NumberMask, /* 010 */
Value::NumberMask | Value::StringMask, /* 011 */
Value::BooleanMask, /* 100 */
Value::BooleanMask | Value::StringMask, /* 101 */
Value::BooleanMask | Value::NumberMask, /* 110 */
Value::BooleanMask | Value::NumberMask | Value::StringMask /* 111 */
JSVAL_STRING_MASK, /* 001 */
JSVAL_NUMBER_MASK, /* 010 */
JSVAL_NUMBER_MASK | JSVAL_STRING_MASK, /* 011 */
JSVAL_BOOLEAN_MASK, /* 100 */
JSVAL_BOOLEAN_MASK | JSVAL_STRING_MASK, /* 101 */
JSVAL_BOOLEAN_MASK | JSVAL_NUMBER_MASK, /* 110 */
JSVAL_BOOLEAN_MASK | JSVAL_NUMBER_MASK | JSVAL_STRING_MASK /* 111 */
};
/*
@ -486,7 +486,7 @@ Invoke(JSContext *cx, const InvokeArgsGuard &args, uintN flags)
vp[1].setObjectOrNull(parent);
} else if (vp[1].isPrimitive()) {
JS_ASSERT(!(flags & JSINVOKE_CONSTRUCT));
if (PrimitiveThisTest(fun, vp[1]))
if (PrimitiveValue::test(fun, vp[1]))
goto start_call;
}
}
@ -960,7 +960,7 @@ EqualObjects(JSContext *cx, JSObject *lobj, JSObject *robj)
bool
StrictlyEqual(JSContext *cx, const Value &lval, const Value &rval)
{
JS_STATIC_ASSERT(Value::NullMask == 0);
JS_STATIC_ASSERT(JSVAL_NULL_MASK == 0);
Value::MaskType lmask = lval.mask, rmask = rval.mask;
Value::MaskType maskor = lmask | rmask;
@ -968,27 +968,27 @@ StrictlyEqual(JSContext *cx, const Value &lval, const Value &rval)
if (lmask == rmask) {
if (Value::isSingleton(lmask))
return true;
if (lmask == Value::Int32Mask)
if (lmask == JSVAL_INT32_MASK)
return lval.data.i32 == rval.data.i32;
if (lmask == Value::DoubleMask)
if (lmask == JSVAL_DOUBLE_MASK)
return JSDOUBLE_COMPARE(lval.data.dbl, ==, rval.data.dbl, JS_FALSE);
if (lmask == Value::StringMask)
if (lmask == JSVAL_STRING_MASK)
return js_EqualStrings(lval.data.str, rval.data.str);
if (lmask & Value::ObjectMask)
if (lmask & JSVAL_OBJECT_MASK)
return EqualObjects(cx, lval.data.obj, rval.data.obj);
JS_ASSERT(lmask == Value::BooleanMask);
JS_ASSERT(lmask == JSVAL_BOOLEAN_MASK);
return lval.data.boo == rval.data.boo;
}
/* Watch out for null */
if (maskor == Value::NumberMask) {
double ld = lmask == Value::DoubleMask ? lval.data.dbl : lval.data.i32;
double rd = rmask == Value::DoubleMask ? rval.data.dbl : rval.data.i32;
if (maskor == JSVAL_NUMBER_MASK) {
double ld = lmask == JSVAL_DOUBLE_MASK ? lval.data.dbl : lval.data.i32;
double rd = rmask == JSVAL_DOUBLE_MASK ? rval.data.dbl : rval.data.i32;
return JSDOUBLE_COMPARE(ld, ==, rd, JS_FALSE);
}
if (maskor == Value::ObjectMask)
if (maskor == JSVAL_OBJECT_MASK)
return EqualObjects(cx, lval.data.obj, rval.data.obj);
return false;
@ -1184,27 +1184,27 @@ IdToValue(jsid id)
}
bool
ValueToId(JSContext *cx, const Value *vp, jsid *idp)
ValueToId(JSContext *cx, const Value &v, jsid *idp)
{
int32_t i;
if (ValueFitsInInt32(*vp, &i) && INT32_FITS_IN_JSID(i)) {
if (ValueFitsInInt32(v, &i) && INT32_FITS_IN_JSID(i)) {
*idp = INT_TO_JSID(i);
return true;
}
#if JS_HAS_XML_SUPPORT
if (vp->isObject()) {
Class *clasp = vp->asObject().getClass();
if (v.isObject()) {
Class *clasp = v.asObject().getClass();
if (JS_UNLIKELY(clasp == &js_QNameClass.base ||
clasp == &js_AttributeNameClass ||
clasp == &js_AnyNameClass)) {
*idp = OBJECT_TO_JSID(&vp->asObject());
*idp = OBJECT_TO_JSID(&v.asObject());
return true;
}
}
#endif
return js_ValueToStringId(cx, *vp, idp);
return js_ValueToStringId(cx, v, idp);
}
} /* namespace js */
@ -2592,7 +2592,7 @@ Interpret(JSContext *cx)
if (!ok)
goto error;
cx->throwing = true;
cx->exception = tvr.value();
cx->exception.copy(tvr.value());
}
}
} while (++tn != tnlimit);

View File

@ -1014,7 +1014,7 @@ CloseGenerator(JSContext *cx, JSObject *obj)
if (gen->state == JSGEN_CLOSED)
return JS_TRUE;
return SendToGenerator(cx, JSGENOP_CLOSE, obj, gen, sUndefinedValue);
return SendToGenerator(cx, JSGENOP_CLOSE, obj, gen, Value(UndefinedTag()));
}
/*
@ -1062,7 +1062,7 @@ generator_op(JSContext *cx, JSGeneratorOp op, Value *vp, uintN argc)
case JSGENOP_SEND:
return js_ThrowStopIteration(cx);
case JSGENOP_THROW:
SetPendingException(cx, argc >= 1 ? vp[2] : sUndefinedValue);
SetPendingException(cx, argc >= 1 ? vp[2] : Value(UndefinedTag()));
return JS_FALSE;
default:
JS_ASSERT(op == JSGENOP_CLOSE);
@ -1071,7 +1071,7 @@ generator_op(JSContext *cx, JSGeneratorOp op, Value *vp, uintN argc)
}
bool undef = ((op == JSGENOP_SEND || op == JSGENOP_THROW) && argc != 0);
if (!SendToGenerator(cx, op, obj, gen, undef ? vp[2] : sUndefinedValue))
if (!SendToGenerator(cx, op, obj, gen, undef ? vp[2] : Value(UndefinedTag())))
return JS_FALSE;
vp->copy(gen->getFloatingFrame()->rval);
return JS_TRUE;

View File

@ -1510,7 +1510,7 @@ js_HasOwnPropertyHelper(JSContext *cx, JSLookupPropOp lookup, uintN argc,
Value *vp)
{
jsid id;
if (!ValueToId(cx, argc != 0 ? vp[2] : sUndefinedValue, &id))
if (!ValueToId(cx, argc != 0 ? vp[2] : Value(UndefinedTag()), &id))
return JS_FALSE;
JSObject *obj = ComputeThisObjectFromVp(cx, vp);
@ -1586,7 +1586,7 @@ obj_isPrototypeOf(JSContext *cx, uintN argc, Value *vp)
JSObject *obj = ComputeThisObjectFromVp(cx, vp);
if (!obj)
return JS_FALSE;
const Value &v = argc != 0 ? vp[2] : sUndefinedValue;
const Value &v = argc != 0 ? vp[2] : Value(UndefinedTag());
vp->setBoolean(js_IsDelegate(cx, obj, v));
return JS_TRUE;
}
@ -1596,7 +1596,7 @@ static JSBool
obj_propertyIsEnumerable(JSContext *cx, uintN argc, Value *vp)
{
jsid id;
if (!ValueToId(cx, argc != 0 ? vp[2] : sUndefinedValue, &id))
if (!ValueToId(cx, argc != 0 ? vp[2] : Value(UndefinedTag()), &id))
return JS_FALSE;
JSObject *obj = ComputeThisObjectFromVp(cx, vp);
@ -1678,7 +1678,7 @@ js_obj_defineGetter(JSContext *cx, uintN argc, Value *vp)
if (!obj->checkAccess(cx, id, JSACC_WATCH, &junk, &attrs))
return JS_FALSE;
vp->setUndefined();
return obj->defineProperty(cx, id, sUndefinedValue, getter, PropertyStub,
return obj->defineProperty(cx, id, Value(UndefinedTag()), getter, PropertyStub,
JSPROP_ENUMERATE | JSPROP_GETTER | JSPROP_SHARED);
}
@ -1708,7 +1708,7 @@ js_obj_defineSetter(JSContext *cx, uintN argc, Value *vp)
if (!obj->checkAccess(cx, id, JSACC_WATCH, &junk, &attrs))
return JS_FALSE;
vp->setUndefined();
return obj->defineProperty(cx, id, sUndefinedValue, PropertyStub, setter,
return obj->defineProperty(cx, id, Value(UndefinedTag()), PropertyStub, setter,
JSPROP_ENUMERATE | JSPROP_SETTER | JSPROP_SHARED);
}
@ -1716,7 +1716,7 @@ static JSBool
obj_lookupGetter(JSContext *cx, uintN argc, Value *vp)
{
jsid id;
if (!ValueToId(cx, argc != 0 ? vp[2] : sUndefinedValue, &id))
if (!ValueToId(cx, argc != 0 ? vp[2] : Value(UndefinedTag()), &id))
return JS_FALSE;
JSObject *obj = ComputeThisObjectFromVp(cx, vp);
JSObject *pobj;
@ -1739,7 +1739,7 @@ static JSBool
obj_lookupSetter(JSContext *cx, uintN argc, Value *vp)
{
jsid id;
if (!ValueToId(cx, argc != 0 ? vp[2] : sUndefinedValue, &id))
if (!ValueToId(cx, argc != 0 ? vp[2] : Value(UndefinedTag()), &id))
return JS_FALSE;
JSObject *obj = ComputeThisObjectFromVp(cx, vp);
JSObject *pobj;
@ -1864,7 +1864,7 @@ obj_getOwnPropertyDescriptor(JSContext *cx, uintN argc, Value *vp)
}
JSObject *obj = &vp[2].asObject();
AutoIdRooter nameidr(cx);
if (!ValueToId(cx, argc >= 2 ? vp[3] : sUndefinedValue, nameidr.addr()))
if (!ValueToId(cx, argc >= 2 ? vp[3] : Value(UndefinedTag()), nameidr.addr()))
return JS_FALSE;
return js_GetOwnPropertyDescriptor(cx, obj, nameidr.id(), vp);
}
@ -1872,7 +1872,7 @@ obj_getOwnPropertyDescriptor(JSContext *cx, uintN argc, Value *vp)
static JSBool
obj_keys(JSContext *cx, uintN argc, Value *vp)
{
const Value &v = argc == 0 ? sUndefinedValue : vp[2];
const Value &v = argc == 0 ? Value(UndefinedTag()) : vp[2];
if (!v.isObject()) {
JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_NOT_NONNULL_OBJECT);
return JS_FALSE;
@ -1902,7 +1902,7 @@ obj_keys(JSContext *cx, uintN argc, Value *vp)
jsid id;
if (!js_ValueToStringId(cx, idval, &id))
return JS_FALSE;
aobj->setDenseArrayElement(i, Value(ATOM_TO_STRING(JSID_TO_ATOM(id))));
aobj->setDenseArrayElement(i, JSID_TO_STRING(id));
} else {
/*
* Object-valued ids are a possibility admitted by SpiderMonkey for
@ -2051,7 +2051,7 @@ Reject(JSContext *cx, uintN errorNumber, bool throwError, jsid id, bool *rval)
if (!js_ValueToStringId(cx, IdToValue(id), &idstr))
return JS_FALSE;
JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, errorNumber,
JS_GetStringBytes(ATOM_TO_STRING(JSID_TO_ATOM(idstr))));
JS_GetStringBytes(JSID_TO_STRING(idstr)));
return JS_FALSE;
}
@ -2118,7 +2118,8 @@ DefinePropertyOnObject(JSContext *cx, JSObject *obj, const PropertyDescriptor &d
if (!js_CheckAccess(cx, obj, desc.id, JSACC_WATCH, &dummy, &dummyAttrs))
return JS_FALSE;
return js_DefineProperty(cx, obj, desc.id, &sUndefinedValue,
Value undef = undefinedValue();
return js_DefineProperty(cx, obj, desc.id, &undef,
desc.getter(), desc.setter(), desc.attrs);
}
@ -2428,7 +2429,7 @@ static JSBool
obj_defineProperty(JSContext* cx, uintN argc, Value* vp)
{
/* 15.2.3.6 steps 1 and 5. */
const Value &v = (argc == 0) ? sUndefinedValue : vp[2];
const Value &v = (argc == 0) ? Value(UndefinedTag()) : vp[2];
if (v.isPrimitive()) {
JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_NOT_NONNULL_OBJECT);
return JS_FALSE;
@ -2438,11 +2439,11 @@ obj_defineProperty(JSContext* cx, uintN argc, Value* vp)
/* 15.2.3.6 step 2. */
AutoIdRooter nameidr(cx);
if (!ValueToId(cx, argc >= 2 ? vp[3] : sUndefinedValue, nameidr.addr()))
if (!ValueToId(cx, argc >= 2 ? vp[3] : Value(UndefinedTag()), nameidr.addr()))
return JS_FALSE;
/* 15.2.3.6 step 3. */
const Value &descval = argc >= 3 ? vp[4] : sUndefinedValue;
const Value &descval = argc >= 3 ? vp[4] : Value(UndefinedTag());
/* 15.2.3.6 step 4 */
JSBool junk;
@ -3148,7 +3149,7 @@ js_DefineBlockVariable(JSContext *cx, JSObject *obj, jsid id, intN index)
JS_ASSERT(!OBJ_IS_CLONED_BLOCK(obj));
/* Use JSPROP_ENUMERATE to aid the disassembler. */
return js_DefineNativeProperty(cx, obj, id, sUndefinedValue,
return js_DefineNativeProperty(cx, obj, id, Value(UndefinedTag()),
block_getProperty,
block_setProperty,
JSPROP_ENUMERATE | JSPROP_PERMANENT | JSPROP_SHARED,
@ -3836,7 +3837,7 @@ js_FreeSlot(JSContext *cx, JSObject *obj, uint32 slot)
{
JSScope *scope = obj->scope();
JS_ASSERT(scope->object == obj);
obj->lockedSetSlot(slot, sUndefinedValue);
obj->lockedSetSlot(slot, Value(UndefinedTag()));
if (scope->freeslot == slot + 1)
scope->freeslot = slot;
}
@ -4877,7 +4878,7 @@ js_SetPropertyHelper(JSContext *cx, JSObject *obj, jsid id, uintN defineHow,
if (!obj->getParent() &&
(defineHow & JSDNP_UNQUALIFIED) &&
!js_CheckUndeclaredVarAssignment(cx, ATOM_TO_STRING(JSID_TO_ATOM(id)))) {
!js_CheckUndeclaredVarAssignment(cx, JSID_TO_STRING(id))) {
return JS_FALSE;
}
}
@ -5044,7 +5045,7 @@ js_SetPropertyHelper(JSContext *cx, JSObject *obj, jsid id, uintN defineHow,
* in js_DefineNativeProperty.
*/
if (SPROP_HAS_VALID_SLOT(sprop, scope))
obj->lockedSetSlot(sprop->slot, sUndefinedValue);
obj->lockedSetSlot(sprop->slot, Value(UndefinedTag()));
/* XXXbe called with obj locked */
if (!AddPropertyHelper(cx, clasp, obj, scope, sprop, vp)) {
@ -5794,7 +5795,7 @@ js_XDRObject(JSXDRState *xdr, JSObject **objp)
classId = JS_XDRFindClassIdByName(xdr, clasp->name);
classDef = !classId;
if (classDef) {
if (!JS_XDRRegisterClass(xdr, clasp, &classId))
if (!JS_XDRRegisterClass(xdr, Jsvalify(clasp), &classId))
return JS_FALSE;
protoKey = JSCLASS_CACHED_PROTO_KEY(clasp);
if (protoKey != JSProto_Null) {
@ -5833,10 +5834,10 @@ js_XDRObject(JSXDRState *xdr, JSObject **objp)
if (!js_GetClassPrototype(cx, NULL, protoKey, &proto, clasp))
return JS_FALSE;
clasp = proto->getClass();
if (!JS_XDRRegisterClass(xdr, clasp, &classId))
if (!JS_XDRRegisterClass(xdr, Jsvalify(clasp), &classId))
return JS_FALSE;
} else {
clasp = JS_XDRFindClassById(xdr, classId);
clasp = Valueify(JS_XDRFindClassById(xdr, classId));
if (!clasp) {
char numBuf[12];
JS_snprintf(numBuf, sizeof numBuf, "%ld", (long)classId);
@ -5932,7 +5933,7 @@ js_PrintObjectSlotName(JSTracer *trc, char *buf, size_t bufsize)
if (JSID_IS_INT(id)) {
JS_snprintf(buf, bufsize, "%ld", (long)JSID_TO_INT(id));
} else if (JSID_IS_ATOM(id)) {
js_PutEscapedString(buf, bufsize, ATOM_TO_STRING(JSID_TO_ATOM(id)), 0);
js_PutEscapedString(buf, bufsize, JSID_TO_STRING(id), 0);
} else {
JS_snprintf(buf, bufsize, "**FINALIZED ATOM KEY**");
}
@ -6022,7 +6023,7 @@ js_Clear(JSContext *cx, JSObject *obj)
i = obj->numSlots();
n = JSSLOT_FREE(obj->getClass());
while (--i >= n)
obj->setSlot(i, sUndefinedValue);
obj->setSlot(i, Value(UndefinedTag()));
scope->freeslot = n;
}
JS_UNLOCK_OBJ(cx, obj);
@ -6324,7 +6325,7 @@ dumpScopeProp(JSScopeProperty *sprop)
if (attrs & JSPROP_SHARED) fprintf(stderr, "shared ");
if (sprop->isAlias()) fprintf(stderr, "alias ");
if (JSID_IS_ATOM(id))
dumpString(ATOM_TO_STRING(JSID_TO_ATOM(id)));
dumpString(JSID_TO_STRING(id));
else if (JSID_IS_INT(id))
fprintf(stderr, "%d", (int) JSID_TO_INT(id));
else

View File

@ -433,10 +433,10 @@ struct JSObject {
fslots[JSSLOT_PRIVATE].setPrivateVoidPtr(data);
}
static const js::Value &defaultPrivate(js::Class *clasp) {
return (clasp->flags & JSCLASS_HAS_PRIVATE)
? js::sNullValue
: js::sUndefinedValue;
static js::CopyableValue defaultPrivate(js::Class *clasp) {
if (clasp->flags & JSCLASS_HAS_PRIVATE)
return copyable_cast(js::Value(js::NullTag()));
return copyable_cast(js::Value(js::UndefinedTag()));
}
/*

View File

@ -653,56 +653,69 @@ NewObject(JSContext *cx, js::Class *clasp, JSObject *proto,
JS_ALWAYS_INLINE
ObjPtr::ObjPtr(ObjectTag arg)
{
mask = arg.obj.isFunction() ? FunObjMask : NonFunObjMask;
mask = arg.obj.isFunction() ? JSVAL_FUNOBJ_MASK : JSVAL_NONFUNOBJ_MASK;
obj = &arg.obj;
}
JS_ALWAYS_INLINE
ObjPtr::ObjPtr(ObjectOrNullTag arg)
{
mask = arg.obj ? arg.obj->isFunction() ? FunObjMask : NonFunObjMask : NullMask;
if (arg.obj) {
if (arg.obj->isFunction())
mask = JSVAL_FUNOBJ_MASK;
else
mask = JSVAL_NONFUNOBJ_MASK;
} else {
mask = JSVAL_NULL_MASK;
}
obj = arg.obj;
}
JS_ALWAYS_INLINE void
ObjPtr::setObject(JSObject &arg)
{
mask = arg.isFunction() ? FunObjMask : NonFunObjMask;
mask = arg.isFunction() ? JSVAL_FUNOBJ_MASK : JSVAL_NONFUNOBJ_MASK;
obj = &arg;
}
JS_ALWAYS_INLINE void
ObjPtr::setObjectOrNull(JSObject *arg)
{
mask = arg ? arg->isFunction() ? FunObjMask : NonFunObjMask : NullMask;
mask = arg ? arg->isFunction() ? JSVAL_FUNOBJ_MASK
: JSVAL_NONFUNOBJ_MASK
: JSVAL_NULL_MASK;
obj = arg;
}
JS_ALWAYS_INLINE
Value::Value(ObjectTag arg)
{
mask = arg.obj.isFunction() ? FunObjMask : NonFunObjMask;
mask = arg.obj.isFunction() ? JSVAL_FUNOBJ_MASK : JSVAL_NONFUNOBJ_MASK;
data.obj = &arg.obj;
}
JS_ALWAYS_INLINE
Value::Value(ObjectOrNullTag arg)
{
mask = arg.obj ? arg.obj->isFunction() ? FunObjMask : NonFunObjMask : NullMask;
mask = arg.obj ? arg.obj->isFunction() ? JSVAL_FUNOBJ_MASK
: JSVAL_NONFUNOBJ_MASK
: JSVAL_NULL_MASK;
data.obj = arg.obj;
}
JS_ALWAYS_INLINE void
Value::setObject(JSObject &arg)
{
mask = arg.isFunction() ? FunObjMask : NonFunObjMask;
mask = arg.isFunction() ? JSVAL_FUNOBJ_MASK : JSVAL_NONFUNOBJ_MASK;
data.obj = &arg;
}
JS_ALWAYS_INLINE void
Value::setObjectOrNull(JSObject *arg)
{
mask = arg ? arg->isFunction() ? FunObjMask : NonFunObjMask : NullMask;
mask = arg ? arg->isFunction() ? JSVAL_FUNOBJ_MASK
: JSVAL_NONFUNOBJ_MASK
: JSVAL_NULL_MASK;
data.obj = arg;
}

View File

@ -1188,7 +1188,7 @@ js_ConsumeJSONText(JSContext *cx, JSONParser *jp, const jschar *data, uint32 len
static JSBool
json_toSource(JSContext *cx, uintN argc, jsval *vp)
{
*vp = STRING_TO_JSVAL(ATOM_TO_STRING(CLASS_ATOM(cx, JSON)));
*vp = ATOM_TO_JSVAL(CLASS_ATOM(cx, JSON));
return JS_TRUE;
}
#endif

View File

@ -45,8 +45,6 @@
#define JSON_MAX_DEPTH 2048
#define JSON_PARSER_BUFSIZE 1024
JS_BEGIN_EXTERN_C
extern js::Class js_JSONClass;
extern JSObject *
@ -92,6 +90,4 @@ js_ConsumeJSONText(JSContext *cx, JSONParser *jp, const jschar *data, uint32 len
extern bool
js_FinishJSONParse(JSContext *cx, JSONParser *jp, jsval reviver);
JS_END_EXTERN_C
#endif /* json_h___ */

View File

@ -312,7 +312,7 @@ ToDisassemblySource(JSContext *cx, jsval v)
if (clasp == &js_RegExpClass) {
AutoValueRooter tvr(cx);
if (!js_regexp_toString(cx, obj, Jsvalify(tvr.addr())))
if (!js_regexp_toString(cx, obj, tvr.addr()))
return NULL;
return js_GetStringBytes(cx, JSVAL_TO_STRING(Jsvalify(tvr.value())));
}
@ -372,7 +372,7 @@ js_Disassemble1(JSContext *cx, JSScript *script, jsbytecode *pc,
index = js_GetIndexFromBytecode(cx, script, pc, 0);
if (type == JOF_ATOM) {
JS_GET_SCRIPT_ATOM(script, pc, index, atom);
v = STRING_TO_JSVAL(ATOM_TO_STRING(atom));
v = ATOM_TO_JSVAL(atom);
} else {
if (type == JOF_OBJECT)
obj = script->getObject(index);
@ -440,7 +440,7 @@ js_Disassemble1(JSContext *cx, JSScript *script, jsbytecode *pc,
off = GetJumpOffset(pc, pc2);
pc2 += jmplen;
bytes = ToDisassemblySource(cx, STRING_TO_JSVAL(ATOM_TO_STRING(atom)));
bytes = ToDisassemblySource(cx, ATOM_TO_JSVAL(atom));
if (!bytes)
return 0;
fprintf(fp, "\n\t%s: %d", bytes, (intN) off);
@ -464,7 +464,7 @@ js_Disassemble1(JSContext *cx, JSScript *script, jsbytecode *pc,
index = js_GetIndexFromBytecode(cx, script, pc, SLOTNO_LEN);
if (type == JOF_SLOTATOM) {
JS_GET_SCRIPT_ATOM(script, pc, index, atom);
v = STRING_TO_JSVAL(ATOM_TO_STRING((atom)));
v = ATOM_TO_JSVAL(atom);
} else {
obj = script->getObject(index);
v = OBJECT_TO_JSVAL(obj);
@ -4018,7 +4018,7 @@ Decompile(SprintStack *ss, jsbytecode *pc, intN nb, JSOp nextop)
case JSOP_DOUBLE:
GET_DOUBLE_FROM_BYTECODE(jp->script, pc, 0, atom);
val = STRING_TO_JSVAL(ATOM_TO_STRING(atom));
val = ATOM_TO_JSVAL(atom);
LOCAL_ASSERT(JSVAL_IS_DOUBLE(val));
todo = SprintDoubleValue(&ss->sprinter, val, &saveop);
break;
@ -4195,7 +4195,7 @@ Decompile(SprintStack *ss, jsbytecode *pc, intN nb, JSOp nextop)
case JSOP_REGEXP:
GET_REGEXP_FROM_BYTECODE(jp->script, pc, 0, obj);
do_regexp:
if (!js_regexp_toString(cx, obj, &val))
if (!js_regexp_toString(cx, obj, Valueify(&val)))
return NULL;
str = JSVAL_TO_STRING(val);
goto sprint_string;
@ -4304,7 +4304,7 @@ Decompile(SprintStack *ss, jsbytecode *pc, intN nb, JSOp nextop)
pc2 += INDEX_LEN;
off2 = GetJumpOffset(pc, pc2);
pc2 += jmplen;
table[k].key = STRING_TO_JSVAL(ATOM_TO_STRING(atom));
table[k].key = ATOM_TO_JSVAL(atom);
table[k].offset = off2;
}

View File

@ -823,8 +823,8 @@ END_CASE(JSOP_BITAND)
*/
#if JS_HAS_XML_SUPPORT
#define XML_EQUALITY_OP(OP) \
if ((lmask == Value::NonFunObjMask && lref.asObject().isXML()) || \
(rmask == Value::NonFunObjMask && rref.asObject().isXML())) { \
if ((lmask == JSVAL_NONFUNOBJ_MASK && lref.asObject().isXML()) || \
(rmask == JSVAL_NONFUNOBJ_MASK && rref.asObject().isXML())) { \
if (!js_TestXMLEquality(cx, lref, rref, &cond)) \
goto error; \
cond = cond OP true; \
@ -856,41 +856,41 @@ END_CASE(JSOP_BITAND)
if ((maskxor = lmask ^ rmask) == 0) { \
if (Value::isSingleton(lmask)) { \
cond = true OP true; \
} else if (lmask == Value::Int32Mask) { \
} else if (lmask == JSVAL_INT32_MASK) { \
cond = lref.asInt32() OP rref.asInt32(); \
} else if (lmask == Value::DoubleMask) { \
} else if (lmask == JSVAL_DOUBLE_MASK) { \
double l = lref.asDouble(), r = rref.asDouble(); \
cond = JSDOUBLE_COMPARE(l, OP, r, IFNAN); \
} else if (lmask & Value::ObjectMask) { \
} else if (lmask & JSVAL_OBJECT_MASK) { \
JSObject *l = &lref.asObject(), *r = &rref.asObject(); \
EXTENDED_EQUALITY_OP(OP) \
cond = l OP r; \
} else if (lmask == Value::StringMask) { \
} else if (lmask == JSVAL_STRING_MASK) { \
JSString *l = lref.asString(), *r = rref.asString(); \
cond = js_EqualStrings(l, r) OP true; \
} else { \
cond = lref.asBoolean() OP rref.asBoolean(); \
} \
} else { \
if (maskxor == Value::UndefinedMask) { \
if (maskxor == JSVAL_UNDEFINED_MASK) { \
cond = true OP true; \
} else { \
JS_ASSERT(maskxor == (lmask | rmask)); \
Value::MaskType maskor = maskxor; \
if (maskor & Value::ObjectMask) { \
if (lmask & Value::ObjectMask) { \
if (maskor & JSVAL_OBJECT_MASK) { \
if (lmask & JSVAL_OBJECT_MASK) { \
if (!lref.asObject().defaultValue(cx, JSTYPE_VOID, &lref)) \
goto error; \
lmask = lref.mask; \
} \
if (rmask & Value::ObjectMask) { \
if (rmask & JSVAL_OBJECT_MASK) { \
if (!rref.asObject().defaultValue(cx, JSTYPE_VOID, &rref)) \
goto error; \
rmask = rref.mask; \
} \
maskor = lmask | rmask; \
} \
if (maskor == Value::StringMask) { \
if (maskor == JSVAL_STRING_MASK) { \
JSString *l = lref.asString(), *r = rref.asString(); \
cond = js_EqualStrings(l, r) OP true; \
} else { \
@ -980,18 +980,18 @@ END_CASE(JSOP_CASEX)
JSValueMaskType maskand = lmask & rmask; \
bool cond; \
/* Optimize for two int-tagged operands (typical loop control). */ \
if (maskand == Value::Int32Mask) { \
if (maskand == JSVAL_INT32_MASK) { \
cond = lref.asInt32() OP rref.asInt32(); \
} else { \
if (lmask & Value::ObjectMask) { \
if (lmask & JSVAL_OBJECT_MASK) { \
if (!lref.asObject().defaultValue(cx, JSTYPE_NUMBER, &lref)) \
goto error; \
} \
if (rmask & Value::ObjectMask) { \
if (rmask & JSVAL_OBJECT_MASK) { \
if (!rref.asObject().defaultValue(cx, JSTYPE_NUMBER, &rref)) \
goto error; \
} \
if (maskand == Value::StringMask) { \
if (maskand == JSVAL_STRING_MASK) { \
JSString *l = lref.asString(), *r = rref.asString(); \
cond = js_CompareStrings(l, r) OP 0; \
} else { \
@ -1072,7 +1072,7 @@ BEGIN_CASE(JSOP_ADD)
Value::MaskType rmask = rref.mask;
Value::MaskType lmask = lref.mask;
if ((lmask & rmask) == Value::Int32Mask) {
if ((lmask & rmask) == JSVAL_INT32_MASK) {
int32_t l = lref.asInt32(), r = rref.asInt32();
int32_t sum = l + r;
regs.sp--;
@ -1082,8 +1082,8 @@ BEGIN_CASE(JSOP_ADD)
regs.sp[-1].setInt32(sum);
} else
#if JS_HAS_XML_SUPPORT
if (lmask == Value::NonFunObjMask && lref.asObject().isXML() &&
rmask == Value::NonFunObjMask && rref.asObject().isXML()) {
if (lmask == JSVAL_NONFUNOBJ_MASK && lref.asObject().isXML() &&
rmask == JSVAL_NONFUNOBJ_MASK && rref.asObject().isXML()) {
Value rval;
if (!js_ConcatenateXML(cx, &lref.asObject(), &rref.asObject(), &rval))
goto error;
@ -1100,12 +1100,12 @@ BEGIN_CASE(JSOP_ADD)
if (!rref.asObject().defaultValue(cx, JSTYPE_VOID, &rref))
goto error;
}
if ((lmask | rmask) & Value::StringMask) {
if ((lmask | rmask) & JSVAL_STRING_MASK) {
JSString *str1, *str2;
if (lmask == rmask) {
str1 = lref.asString();
str2 = rref.asString();
} else if (lmask == Value::StringMask) {
} else if (lmask == JSVAL_STRING_MASK) {
str1 = lref.asString();
str2 = js_ValueToString(cx, rref);
if (!str2)
@ -1832,8 +1832,8 @@ BEGIN_CASE(JSOP_CALLPROP)
if (lval.isPrimitive()) {
/* FIXME: https://bugzilla.mozilla.org/show_bug.cgi?id=412571 */
if (!rval.isFunObj() ||
!PrimitiveThisTest(GET_FUNCTION_PRIVATE(cx, &rval.asFunObj()),
lval)) {
!PrimitiveValue::test(GET_FUNCTION_PRIVATE(cx, &rval.asFunObj()),
lval)) {
if (!js_PrimitiveToObject(cx, &regs.sp[-1]))
goto error;
}
@ -2403,7 +2403,7 @@ BEGIN_CASE(JSOP_APPLY)
DTrace::enterJSFun(cx, NULL, fun, fp, argc, vp + 2, &lval);
JS_ASSERT(fun->u.n.extra == 0);
JS_ASSERT(vp[1].isObject() || PrimitiveThisTest(fun, vp[1]));
JS_ASSERT(vp[1].isObject() || PrimitiveValue::test(fun, vp[1]));
JSBool ok = ((FastNative) fun->u.n.native)(cx, argc, vp);
DTrace::exitJSFun(cx, NULL, fun, *vp, &lval);
regs.sp = vp + 1;
@ -3049,7 +3049,7 @@ BEGIN_CASE(JSOP_DEFVAR)
/* Bind a variable only if it's not yet defined. */
if (!prop) {
if (!js_DefineNativeProperty(cx, obj, id, sUndefinedValue, PropertyStub, PropertyStub,
if (!js_DefineNativeProperty(cx, obj, id, Value(UndefinedTag()), PropertyStub, PropertyStub,
attrs, 0, 0, &prop)) {
goto error;
}
@ -3554,7 +3554,7 @@ BEGIN_CASE(JSOP_SETTER)
if (!CheckRedeclaration(cx, obj, id, attrs, NULL, NULL))
goto error;
if (!obj->defineProperty(cx, id, sUndefinedValue, getter, setter, attrs))
if (!obj->defineProperty(cx, id, Value(UndefinedTag()), getter, setter, attrs))
goto error;
regs.sp += i;

View File

@ -3922,7 +3922,7 @@ CheckDestructuring(JSContext *cx, BindData *data,
ok = !!js_DefineNativeProperty(cx, tc->blockChain,
ATOM_TO_JSID(cx->runtime->
atomState.emptyAtom),
sUndefinedValue, NULL, NULL,
Value(UndefinedTag()), NULL, NULL,
JSPROP_ENUMERATE |
JSPROP_PERMANENT |
JSPROP_SHARED,

View File

@ -623,7 +623,7 @@ JSScopeProperty::dump(JSContext *cx, FILE *fp)
} else {
JSString *str;
if (JSID_IS_ATOM(id)) {
str = ATOM_TO_STRING(JSID_TO_ATOM(id));
str = JSID_TO_STRING(id);
} else {
JS_ASSERT(JSID_IS_OBJECT(id));
str = js_ValueToString(cx, IdToValue(id));

View File

@ -183,10 +183,12 @@ typedef struct JSONParser JSONParser;
typedef uint32 JSValueMaskType;
# define JSVAL_TYPE_BITS 32
# define JS_INSERT_VALUE_PADDING() uint32 padding;
# define JS_PADDING_INIT_VALUE() 0,
#elif JS_BITS_PER_WORD == 64
typedef JSUint64 JSValueMaskType;
# define JSVAL_TYPE_BITS 32
# define JS_INSERT_VALUE_PADDING()
# define JS_PADDING_INIT_VALUE()
#else
# error "Unsupported word size"
#endif
@ -201,6 +203,10 @@ typedef JSUint64 JSValueMaskType;
#define JSVAL_BOOLEAN_MASK ((JSValueMaskType)0x40)
#define JSVAL_MAGIC_MASK ((JSValueMaskType)0x80)
#define JSVAL_OBJECT_MASK (JSVAL_NONFUNOBJ_MASK | JSVAL_FUNOBJ_MASK)
#define JSVAL_NUMBER_MASK (JSVAL_INT32_MASK | JSVAL_DOUBLE_MASK)
#define JSVAL_GCTHING_MASK (JSVAL_OBJECT_MASK | JSVAL_STRING_MASK)
/*
* Magic value enumeration (private engine detail)
*
@ -481,6 +487,7 @@ typedef jsboxedword jsid;
#define JSID_IS_VOID(id) JSBOXEDWORD_IS_VOID((jsboxedword)(id))
#define JSID_IS_ATOM(id) JSBOXEDWORD_IS_STRING((jsboxedword)(id))
#define JSID_TO_ATOM(id) ((JSAtom *)(id))
#define JSID_TO_STRING(id) ATOM_TO_STRING(JSID_TO_ATOM(id))
#define ATOM_TO_JSID(atom) (JS_ASSERT(ATOM_IS_STRING(atom)), \
(jsid)(atom))

View File

@ -5028,7 +5028,8 @@ js_ExecuteRegExp(JSContext *cx, JSRegExp *re, JSString *str, size_t *indexp,
if (test)
continue;
if (parsub->index == -1) {
ok = js_DefineProperty(cx, obj, INT_TO_JSID(num + 1), &sUndefinedValue,
Value undef = undefinedValue();
ok = js_DefineProperty(cx, obj, INT_TO_JSID(num + 1), &undef,
NULL, NULL, JSPROP_ENUMERATE);
} else {
parstr = js_NewDependentString(cx, str,

View File

@ -154,7 +154,7 @@ js_InitRegExpClass(JSContext *cx, JSObject *obj);
* Export js_regexp_toString to the decompiler.
*/
extern JSBool
js_regexp_toString(JSContext *cx, JSObject *obj, jsval *vp);
js_regexp_toString(JSContext *cx, JSObject *obj, js::Value *vp);
/*
* Create, serialize/deserialize, or clone a RegExp object.

View File

@ -1253,7 +1253,7 @@ PrintPropertyGetterOrSetter(JSTracer *trc, char *buf, size_t bufsize)
if (JSID_IS_ATOM(id)) {
n = js_PutEscapedString(buf, bufsize - 1,
ATOM_TO_STRING(JSID_TO_ATOM(id)), 0);
JSID_TO_STRING(id), 0);
if (n < bufsize - 1)
JS_snprintf(buf + n, bufsize - n, " %s", name);
} else if (JSID_IS_INT(sprop->id)) {
@ -1276,7 +1276,7 @@ PrintPropertyMethod(JSTracer *trc, char *buf, size_t bufsize)
JS_ASSERT(!JSID_IS_NULL(id));
JS_ASSERT(JSID_IS_ATOM(id));
n = js_PutEscapedString(buf, bufsize - 1, ATOM_TO_STRING(JSID_TO_ATOM(id)), 0);
n = js_PutEscapedString(buf, bufsize - 1, JSID_TO_STRING(id), 0);
if (n < bufsize - 1)
JS_snprintf(buf + n, bufsize - n, " method");
}

View File

@ -507,7 +507,7 @@ str_uneval(JSContext *cx, uintN argc, Value *vp)
{
JSString *str;
str = js_ValueToSource(cx, argc != 0 ? vp[2] : sUndefinedValue);
str = js_ValueToSource(cx, argc != 0 ? vp[2] : undefinedValue());
if (!str)
return JS_FALSE;
vp->setString(str);
@ -3015,7 +3015,7 @@ js_InitStringClass(JSContext *cx, JSObject *obj)
return NULL;
proto->setPrimitiveThis(cx->runtime->emptyString);
if (!js_DefineNativeProperty(cx, proto, ATOM_TO_JSID(cx->runtime->atomState.lengthAtom),
sUndefinedValue, NULL, NULL,
undefinedValue(), NULL, NULL,
JSPROP_READONLY | JSPROP_PERMANENT | JSPROP_SHARED, 0, 0,
NULL)) {
return JS_FALSE;

View File

@ -168,8 +168,6 @@ struct JS_FRIEND_API(TypedArray) {
/* Friend API methods */
JS_BEGIN_EXTERN_C
JS_FRIEND_API(JSObject *)
js_InitTypedArrayClasses(JSContext *cx, JSObject *obj);
@ -217,6 +215,4 @@ js_CreateTypedArrayWithBuffer(JSContext *cx, jsint atype, JSObject *bufArg,
JS_FRIEND_API(JSBool)
js_ReparentTypedArrayToScope(JSContext *cx, JSObject *obj, JSObject *scope);
JS_END_EXTERN_C
#endif /* jstypedarray_h */

View File

@ -804,14 +804,14 @@ JS_XDRFindClassIdByName(JSXDRState *xdr, const char *name)
return 0;
}
JS_PUBLIC_API(Class *)
JS_PUBLIC_API(JSClass *)
JS_XDRFindClassById(JSXDRState *xdr, uint32 id)
{
uintN i = CLASS_ID_TO_INDEX(id);
if (i >= xdr->numclasses)
return NULL;
return Valueify(xdr->registry[i]);
return xdr->registry[i];
}
#endif /* JS_HAS_XDR */

View File

@ -173,12 +173,12 @@ extern JS_PUBLIC_API(JSBool)
JS_XDRScript(JSXDRState *xdr, JSScript **scriptp);
extern JS_PUBLIC_API(JSBool)
JS_XDRRegisterClass(JSXDRState *xdr, js::Class *clasp, uint32 *lp);
JS_XDRRegisterClass(JSXDRState *xdr, JSClass *clasp, uint32 *lp);
extern JS_PUBLIC_API(uint32)
JS_XDRFindClassIdByName(JSXDRState *xdr, const char *name);
extern JS_PUBLIC_API(js::Class *)
extern JS_PUBLIC_API(JSClass *)
JS_XDRFindClassById(JSXDRState *xdr, uint32 id);
/*

View File

@ -530,23 +530,23 @@ NewXMLQName(JSContext *cx, JSString *uri, JSString *prefix, JSString *localName,
}
JSObject *
js_ConstructXMLQNameObject(JSContext *cx, jsval nsval, jsval lnval)
js_ConstructXMLQNameObject(JSContext *cx, const Value &nsval, const Value &lnval)
{
jsval argv[2];
Value argv[2];
/*
* ECMA-357 11.1.2,
* The _QualifiedIdentifier : PropertySelector :: PropertySelector_
* production, step 2.
*/
if (!JSVAL_IS_PRIMITIVE(nsval) &&
JSVAL_TO_OBJECT(nsval)->getClass() == &js_AnyNameClass) {
nsval = JSVAL_NULL;
if (nsval.isObject() &&
nsval.asObject().getClass() == &js_AnyNameClass) {
argv[0].setNull();
} else {
argv[0].copy(nsval);
}
argv[0] = nsval;
argv[1] = lnval;
return js_ConstructObject(cx, &js_QNameClass.base, NULL, NULL, 2, Valueify(argv));
argv[1].copy(lnval);
return js_ConstructObject(cx, &js_QNameClass.base, NULL, NULL, 2, argv);
}
static JSBool
@ -4945,7 +4945,7 @@ xml_defaultValue(JSContext *cx, JSObject *obj, JSType hint, Value *vp)
if (!obj)
return JS_FALSE;
}
vp->setObject(*obj);
vp->setNonFunObj(*obj);
return JS_TRUE;
}
@ -5175,10 +5175,10 @@ js_TestXMLEquality(JSContext *cx, const Value &v1, const Value &v2, JSBool *bp)
}
JSBool
js_ConcatenateXML(JSContext *cx, JSObject *obj, jsval v, jsval *vp)
js_ConcatenateXML(JSContext *cx, JSObject *obj, JSObject *robj, Value *vp)
{
JSBool ok;
JSObject *listobj, *robj;
JSObject *listobj;
JSXML *list, *lxml, *rxml;
JS_ASSERT(JS_InstanceOf(cx, obj, Jsvalify(&js_XMLClass), NULL));
@ -5198,23 +5198,15 @@ js_ConcatenateXML(JSContext *cx, JSObject *obj, jsval v, jsval *vp)
if (!ok)
goto out;
if (VALUE_IS_XML(cx, v)) {
rxml = (JSXML *) JSVAL_TO_OBJECT(v)->getPrivate();
} else {
robj = ToXML(cx, v);
if (!robj) {
ok = JS_FALSE;
goto out;
}
rxml = (JSXML *) robj->getPrivate();
}
JS_ASSERT(robj->isXML());
rxml = (JSXML *) robj->getPrivate();
ok = Append(cx, list, rxml);
if (!ok)
goto out;
*vp = OBJECT_TO_JSVAL(listobj);
vp->setNonFunObj(*listobj);
out:
js_LeaveLocalRootScopeWithResult(cx, Valueify(*vp));
js_LeaveLocalRootScopeWithResult(cx, *vp);
return ok;
}
@ -5386,7 +5378,7 @@ xml_attribute(JSContext *cx, uintN argc, jsval *vp)
static JSBool
xml_attributes(JSContext *cx, uintN argc, jsval *vp)
{
jsval name = STRING_TO_JSVAL(ATOM_TO_STRING(cx->runtime->atomState.starAtom));
jsval name = ATOM_TO_JSVAL(cx->runtime->atomState.starAtom);
JSObject *qn = ToAttributeName(cx, name);
if (!qn)
return JS_FALSE;
@ -5644,7 +5636,7 @@ xml_descendants(JSContext *cx, uintN argc, jsval *vp)
XML_METHOD_PROLOG;
name = argc == 0 ? STRING_TO_JSVAL(ATOM_TO_STRING(cx->runtime->atomState.starAtom)) : vp[2];
name = argc == 0 ? ATOM_TO_JSVAL(cx->runtime->atomState.starAtom) : vp[2];
/*
* N.B. name is not actually a jsid: name may contain an non-interned
@ -5725,7 +5717,7 @@ xml_elements(JSContext *cx, uintN argc, jsval *vp)
XML_METHOD_PROLOG;
name = (argc == 0) ? STRING_TO_JSVAL(ATOM_TO_STRING(cx->runtime->atomState.starAtom)) : vp[2];
name = (argc == 0) ? ATOM_TO_JSVAL(cx->runtime->atomState.starAtom) : vp[2];
nameqn = ToXMLName(cx, name, &funid);
if (!nameqn)
return JS_FALSE;
@ -5887,7 +5879,7 @@ class AutoNamespaceArray : public js::AutoNamespaces {
JSObject *ns = XMLARRAY_MEMBER(&array, i, JSObject);
if (!ns)
continue;
tvr.addr()->setObject(*ns);
tvr.addr()->setNonFunObj(*ns);
if (!arrayobj->setProperty(context, INT_TO_JSID(i), tvr.addr()))
return false;
}
@ -6286,7 +6278,7 @@ xml_processingInstructions(JSContext *cx, uintN argc, jsval *vp)
XML_METHOD_PROLOG;
name = (argc == 0) ? STRING_TO_JSVAL(ATOM_TO_STRING(cx->runtime->atomState.starAtom)) : vp[2];
name = (argc == 0) ? ATOM_TO_JSVAL(cx->runtime->atomState.starAtom) : vp[2];
nameqn = ToXMLName(cx, name, &funid);
if (!nameqn)
return JS_FALSE;
@ -6424,8 +6416,7 @@ xml_replace(JSContext *cx, uintN argc, jsval *vp)
goto done;
if (argc <= 1) {
value = STRING_TO_JSVAL(ATOM_TO_STRING(cx->runtime->atomState.
typeAtoms[JSTYPE_VOID]));
value = ATOM_TO_JSVAL(cx->runtime->atomState.typeAtoms[JSTYPE_VOID]);
} else {
value = vp[3];
vxml = VALUE_IS_XML(cx, value)
@ -6553,8 +6544,7 @@ xml_setName(JSContext *cx, uintN argc, jsval *vp)
return JS_TRUE;
if (argc == 0) {
name = STRING_TO_JSVAL(ATOM_TO_STRING(cx->runtime->atomState.
typeAtoms[JSTYPE_VOID]));
name = ATOM_TO_JSVAL(cx->runtime->atomState.typeAtoms[JSTYPE_VOID]);
} else {
name = vp[2];
if (!JSVAL_IS_PRIMITIVE(name) &&
@ -7306,7 +7296,7 @@ js_InitXMLClasses(JSContext *cx, JSObject *obj)
}
JSBool
js_GetFunctionNamespace(JSContext *cx, jsval *vp)
js_GetFunctionNamespace(JSContext *cx, Value *vp)
{
JSRuntime *rt;
JSObject *obj;
@ -7360,7 +7350,7 @@ js_GetFunctionNamespace(JSContext *cx, jsval *vp)
}
JS_UNLOCK_GC(rt);
}
*vp = OBJECT_TO_JSVAL(obj);
vp->setNonFunObj(*obj);
return JS_TRUE;
}
@ -7415,22 +7405,21 @@ js_GetDefaultXMLNamespace(JSContext *cx, jsval *vp)
}
JSBool
js_SetDefaultXMLNamespace(JSContext *cx, jsval v)
js_SetDefaultXMLNamespace(JSContext *cx, const Value &v)
{
jsval argv[2];
Value argv[2];
JSObject *ns, *varobj;
JSStackFrame *fp;
argv[0] = STRING_TO_JSVAL(cx->runtime->emptyString);
argv[1] = v;
ns = js_ConstructObject(cx, &js_NamespaceClass.base, NULL, NULL, 2, Valueify(argv));
argv[0].setString(cx->runtime->emptyString);
argv[1].copy(v);
ns = js_ConstructObject(cx, &js_NamespaceClass.base, NULL, NULL, 2, argv);
if (!ns)
return JS_FALSE;
v = OBJECT_TO_JSVAL(ns);
fp = js_GetTopStackFrame(cx);
varobj = fp->varobj(cx);
if (!varobj->defineProperty(cx, JS_DEFAULT_XML_NAMESPACE_ID, Valueify(v),
if (!varobj->defineProperty(cx, JS_DEFAULT_XML_NAMESPACE_ID, NonFunObjTag(*ns),
PropertyStub, PropertyStub,
JSPROP_PERMANENT)) {
return JS_FALSE;
@ -7439,14 +7428,14 @@ js_SetDefaultXMLNamespace(JSContext *cx, jsval v)
}
JSBool
js_ToAttributeName(JSContext *cx, jsval *vp)
js_ToAttributeName(JSContext *cx, Value *vp)
{
JSObject *qn;
qn = ToAttributeName(cx, *vp);
qn = ToAttributeName(cx, Jsvalify(*vp));
if (!qn)
return JS_FALSE;
*vp = OBJECT_TO_JSVAL(qn);
vp->setObject(*qn);
return JS_TRUE;
}
@ -7509,16 +7498,16 @@ js_EscapeElementValue(JSContext *cx, JSString *str)
}
JSString *
js_ValueToXMLString(JSContext *cx, jsval v)
js_ValueToXMLString(JSContext *cx, const Value &v)
{
return ToXMLString(cx, v, 0);
return ToXMLString(cx, Jsvalify(v), 0);
}
static JSBool
anyname_toString(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
jsval *rval)
{
*rval = STRING_TO_JSVAL(ATOM_TO_STRING(cx->runtime->atomState.starAtom));
*rval = ATOM_TO_JSVAL(cx->runtime->atomState.starAtom);
return JS_TRUE;
}
@ -7589,7 +7578,7 @@ js_GetAnyName(JSContext *cx, jsid *idp)
}
JSBool
js_FindXMLProperty(JSContext *cx, jsval nameval, JSObject **objp, jsid *idp)
js_FindXMLProperty(JSContext *cx, const Value &nameval, JSObject **objp, jsid *idp)
{
JSObject *nameobj;
jsval v;
@ -7601,10 +7590,10 @@ js_FindXMLProperty(JSContext *cx, jsval nameval, JSObject **objp, jsid *idp)
JSProperty *prop;
const char *printable;
JS_ASSERT(!JSVAL_IS_PRIMITIVE(nameval));
nameobj = JSVAL_TO_OBJECT(nameval);
JS_ASSERT(nameval.isObject());
nameobj = &nameval.asObject();
if (nameobj->getClass() == &js_AnyNameClass) {
v = STRING_TO_JSVAL(ATOM_TO_STRING(cx->runtime->atomState.starAtom));
v = ATOM_TO_JSVAL(cx->runtime->atomState.starAtom);
nameobj = js_ConstructObject(cx, &js_QNameClass.base, NULL, NULL, 1,
Valueify(&v));
if (!nameobj)
@ -7891,15 +7880,15 @@ js_StepXMLListFilter(JSContext *cx, JSBool initialized)
}
JSObject *
js_ValueToXMLObject(JSContext *cx, jsval v)
js_ValueToXMLObject(JSContext *cx, const Value &v)
{
return ToXML(cx, v);
return ToXML(cx, Jsvalify(v));
}
JSObject *
js_ValueToXMLListObject(JSContext *cx, jsval v)
js_ValueToXMLListObject(JSContext *cx, const Value &v)
{
return ToXMLList(cx, v);
return ToXMLList(cx, Jsvalify(v));
}
JSObject *

View File

@ -256,7 +256,7 @@ extern JSObject *
js_InitXMLClasses(JSContext *cx, JSObject *obj);
extern JSBool
js_GetFunctionNamespace(JSContext *cx, const js::Value *vp);
js_GetFunctionNamespace(JSContext *cx, js::Value *vp);
/*
* If obj is QName corresponding to function::name, set *funidp to name's id,

View File

@ -38,6 +38,8 @@
*
* ***** END LICENSE BLOCK ***** */
#define __STDC_LIMIT_MACROS
/*
* JS shell.
*/
@ -223,10 +225,10 @@ public:
if (!JS_ReportPendingException(cx))
JS_ClearPendingException(cx);
}
JS_AddNamedRoot(cx, &mStr, "Value ToString helper");
JS_AddNamedStringRoot(cx, &mStr, "Value ToString helper");
}
~ToString() {
JS_RemoveRoot(cx, &mStr);
JS_RemoveStringRoot(cx, &mStr);
}
JSBool threw() { return !mStr; }
jsval getJSVal() { return STRING_TO_JSVAL(mStr); }
@ -1328,7 +1330,7 @@ CountHeap(JSContext *cx, uintN argc, jsval *vp)
if (JSVAL_IS_TRACEABLE(v)) {
startThing = JSVAL_TO_TRACEABLE(v);
startTraceKind = JSVAL_TRACE_KIND(v);
} else if (v != JSVAL_NULL) {
} else if (!JSVAL_IS_NULL(v)) {
JS_ReportError(cx,
"the first argument is not null or a heap-allocated "
"thing");