|
| 1 | +From 8f4fa37cfbb34fdd314d9af831408993ba6f4d5a Mon Sep 17 00:00:00 2001 |
| 2 | +From: landerlyoung < [email protected]> |
| 3 | +Date: Fri, 9 Feb 2024 03:49:37 +0800 |
| 4 | +Subject: [PATCH] Add new APIs for ScriptX based on QuickJs version |
| 5 | + "2024-01-13" Changes: 1. add JS_StrictEqual 2. add JS_NewWeakRef 3. add |
| 6 | + JS_GetWeakRef |
| 7 | + |
| 8 | +--- |
| 9 | + quickjs.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ |
| 10 | + quickjs.h | 5 +++++ |
| 11 | + 2 files changed, 51 insertions(+) |
| 12 | + |
| 13 | +diff --git a/quickjs.c b/quickjs.c |
| 14 | +index 7958f81..b24873a 100644 |
| 15 | +--- a/quickjs.c |
| 16 | ++++ b/quickjs.c |
| 17 | +@@ -1130,6 +1130,10 @@ typedef enum JSStrictEqModeEnum { |
| 18 | + static BOOL js_strict_eq2(JSContext *ctx, JSValue op1, JSValue op2, |
| 19 | + JSStrictEqModeEnum eq_mode); |
| 20 | + static BOOL js_strict_eq(JSContext *ctx, JSValue op1, JSValue op2); |
| 21 | ++int JS_StrictEqual(JSContext *ctx, JSValueConst op1, JSValueConst op2) |
| 22 | ++{ |
| 23 | ++ return js_strict_eq(ctx, JS_DupValue(ctx, op1), JS_DupValue(ctx, op2)); |
| 24 | ++} |
| 25 | + static BOOL js_same_value(JSContext *ctx, JSValueConst op1, JSValueConst op2); |
| 26 | + static BOOL js_same_value_zero(JSContext *ctx, JSValueConst op1, JSValueConst op2); |
| 27 | + static JSValue JS_ToObject(JSContext *ctx, JSValueConst val); |
| 28 | +@@ -55566,3 +55570,45 @@ void JS_AddIntrinsicTypedArrays(JSContext *ctx) |
| 29 | + JS_AddIntrinsicAtomics(ctx); |
| 30 | + #endif |
| 31 | + } |
| 32 | ++ |
| 33 | ++ |
| 34 | ++/************* WeakRef ***********/ |
| 35 | ++JSValue JS_NewWeakRef(JSContext* ctx, JSValueConst v) |
| 36 | ++{ |
| 37 | ++ if (JS_IsObject(v)) { |
| 38 | ++ JSValue map = js_map_constructor(ctx, JS_UNDEFINED, 0, NULL, MAGIC_SET | MAGIC_WEAK); |
| 39 | ++ if (JS_IsException(map)) return JS_EXCEPTION; |
| 40 | ++ // check |
| 41 | ++ JSValue ret = js_map_set(ctx, map, 1, &v, MAGIC_SET | MAGIC_WEAK); |
| 42 | ++ if (JS_IsException(ret)) return JS_EXCEPTION; |
| 43 | ++ JS_FreeValue(ctx, ret); |
| 44 | ++ return map; |
| 45 | ++ } else { |
| 46 | ++ return JS_DupValue(ctx, v); |
| 47 | ++ } |
| 48 | ++} |
| 49 | ++ |
| 50 | ++static JSValue js_map_get_first_key(JSContext *ctx, JSValueConst this_val) |
| 51 | ++{ |
| 52 | ++ JSMapState *s = JS_GetOpaque2(ctx, this_val, JS_CLASS_WEAKSET); |
| 53 | ++ JSMapRecord *mr; |
| 54 | ++ JSValueConst key = JS_UNDEFINED; |
| 55 | ++ struct list_head *el; |
| 56 | ++ |
| 57 | ++ if (!s) return JS_EXCEPTION; |
| 58 | ++ el = s->records.next; |
| 59 | ++ if (el != &(s->records)) { |
| 60 | ++ mr = list_entry(el, JSMapRecord, link); |
| 61 | ++ key = mr->key; |
| 62 | ++ } |
| 63 | ++ return JS_DupValue(ctx, key); |
| 64 | ++} |
| 65 | ++ |
| 66 | ++JSValue JS_GetWeakRef(JSContext* ctx, JSValueConst w) |
| 67 | ++{ |
| 68 | ++ if (JS_IsObject(w)) { |
| 69 | ++ return js_map_get_first_key(ctx, w); |
| 70 | ++ } else { |
| 71 | ++ return JS_DupValue(ctx, w); |
| 72 | ++ } |
| 73 | ++} |
| 74 | +diff --git a/quickjs.h b/quickjs.h |
| 75 | +index 56bac64..0908325 100644 |
| 76 | +--- a/quickjs.h |
| 77 | ++++ b/quickjs.h |
| 78 | +@@ -681,6 +681,11 @@ static inline JSValue JS_DupValueRT(JSRuntime *rt, JSValueConst v) |
| 79 | + return (JSValue)v; |
| 80 | + } |
| 81 | + |
| 82 | ++#define QUICK_JS_HAS_SCRIPTX_PATCH |
| 83 | ++JSValue JS_NewWeakRef(JSContext* ctx, JSValueConst v); |
| 84 | ++JSValue JS_GetWeakRef(JSContext* ctx, JSValueConst w); |
| 85 | ++int JS_StrictEqual(JSContext *ctx, JSValueConst op1, JSValueConst op2); |
| 86 | ++ |
| 87 | + int JS_ToBool(JSContext *ctx, JSValueConst val); /* return -1 for JS_EXCEPTION */ |
| 88 | + int JS_ToInt32(JSContext *ctx, int32_t *pres, JSValueConst val); |
| 89 | + static inline int JS_ToUint32(JSContext *ctx, uint32_t *pres, JSValueConst val) |
| 90 | +-- |
| 91 | +2.42.1 |
| 92 | + |
0 commit comments