Add JS_StrictEq(), JS_SameValue(), and JS_SameValueZero() (#264)

* add `JS_StrictEq()`, `JS_SameValue()`, and `JS_SameValueZero()` all accepting `JSValueConst`
* make `js_strict_eq` accept `JSValueConst`, remove uses of this function internally and replace them with
`js_strict_eq2` instead.
This commit is contained in:
Kasper Isager Dalsgarð 2024-05-09 13:07:40 +02:00 committed by GitHub
parent 6f9d05fd2b
commit f3f2f42717
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 26 additions and 5 deletions

View file

@ -1132,7 +1132,7 @@ typedef enum JSStrictEqModeEnum {
static BOOL js_strict_eq2(JSContext *ctx, JSValue op1, JSValue op2, static BOOL js_strict_eq2(JSContext *ctx, JSValue op1, JSValue op2,
JSStrictEqModeEnum eq_mode); JSStrictEqModeEnum eq_mode);
static BOOL js_strict_eq(JSContext *ctx, JSValue op1, JSValue op2); static BOOL js_strict_eq(JSContext *ctx, JSValueConst op1, JSValueConst op2);
static BOOL js_same_value(JSContext *ctx, JSValueConst op1, JSValueConst op2); static BOOL js_same_value(JSContext *ctx, JSValueConst op1, JSValueConst op2);
static BOOL js_same_value_zero(JSContext *ctx, JSValueConst op1, JSValueConst op2); static BOOL js_same_value_zero(JSContext *ctx, JSValueConst op1, JSValueConst op2);
static JSValue JS_ToObject(JSContext *ctx, JSValueConst val); static JSValue JS_ToObject(JSContext *ctx, JSValueConst val);
@ -14239,7 +14239,7 @@ static no_inline __exception int js_eq_slow(JSContext *ctx, JSValue *sp,
goto exception; goto exception;
} }
} }
res = js_strict_eq(ctx, op1, op2); res = js_strict_eq2(ctx, op1, op2, JS_EQ_STRICT);
} else if (tag1 == JS_TAG_BOOL) { } else if (tag1 == JS_TAG_BOOL) {
op1 = JS_NewInt32(ctx, JS_VALUE_GET_INT(op1)); op1 = JS_NewInt32(ctx, JS_VALUE_GET_INT(op1));
goto redo; goto redo;
@ -14557,9 +14557,16 @@ static BOOL js_strict_eq2(JSContext *ctx, JSValue op1, JSValue op2,
return res; return res;
} }
static BOOL js_strict_eq(JSContext *ctx, JSValue op1, JSValue op2) static BOOL js_strict_eq(JSContext *ctx, JSValueConst op1, JSValueConst op2)
{ {
return js_strict_eq2(ctx, op1, op2, JS_EQ_STRICT); return js_strict_eq2(ctx,
JS_DupValue(ctx, op1), JS_DupValue(ctx, op2),
JS_EQ_STRICT);
}
BOOL JS_StrictEq(JSContext *ctx, JSValueConst op1, JSValueConst op2)
{
return js_strict_eq(ctx, op1, op2);
} }
static BOOL js_same_value(JSContext *ctx, JSValueConst op1, JSValueConst op2) static BOOL js_same_value(JSContext *ctx, JSValueConst op1, JSValueConst op2)
@ -14569,6 +14576,11 @@ static BOOL js_same_value(JSContext *ctx, JSValueConst op1, JSValueConst op2)
JS_EQ_SAME_VALUE); JS_EQ_SAME_VALUE);
} }
BOOL JS_SameValue(JSContext *ctx, JSValueConst op1, JSValueConst op2)
{
return js_same_value(ctx, op1, op2);
}
static BOOL js_same_value_zero(JSContext *ctx, JSValueConst op1, JSValueConst op2) static BOOL js_same_value_zero(JSContext *ctx, JSValueConst op1, JSValueConst op2)
{ {
return js_strict_eq2(ctx, return js_strict_eq2(ctx,
@ -14576,11 +14588,16 @@ static BOOL js_same_value_zero(JSContext *ctx, JSValueConst op1, JSValueConst op
JS_EQ_SAME_VALUE_ZERO); JS_EQ_SAME_VALUE_ZERO);
} }
BOOL JS_SameValueZero(JSContext *ctx, JSValueConst op1, JSValueConst op2)
{
return js_same_value_zero(ctx, op1, op2);
}
static no_inline int js_strict_eq_slow(JSContext *ctx, JSValue *sp, static no_inline int js_strict_eq_slow(JSContext *ctx, JSValue *sp,
BOOL is_neq) BOOL is_neq)
{ {
BOOL res; BOOL res;
res = js_strict_eq(ctx, sp[-2], sp[-1]); res = js_strict_eq2(ctx, sp[-2], sp[-1], JS_EQ_STRICT);
sp[-2] = JS_NewBool(ctx, res ^ is_neq); sp[-2] = JS_NewBool(ctx, res ^ is_neq);
return 0; return 0;
} }

View file

@ -684,6 +684,10 @@ static inline JSValue JS_DupValueRT(JSRuntime *rt, JSValueConst v)
return (JSValue)v; return (JSValue)v;
} }
JS_BOOL JS_StrictEq(JSContext *ctx, JSValueConst op1, JSValueConst op2);
JS_BOOL JS_SameValue(JSContext *ctx, JSValueConst op1, JSValueConst op2);
JS_BOOL JS_SameValueZero(JSContext *ctx, JSValueConst op1, JSValueConst op2);
int JS_ToBool(JSContext *ctx, JSValueConst val); /* return -1 for JS_EXCEPTION */ int JS_ToBool(JSContext *ctx, JSValueConst val); /* return -1 for JS_EXCEPTION */
int JS_ToInt32(JSContext *ctx, int32_t *pres, JSValueConst val); int JS_ToInt32(JSContext *ctx, int32_t *pres, JSValueConst val);
static inline int JS_ToUint32(JSContext *ctx, uint32_t *pres, JSValueConst val) static inline int JS_ToUint32(JSContext *ctx, uint32_t *pres, JSValueConst val)