Skip to content

Commit 9da2fc4

Browse files
committed
JS_NewCClosure test & JS_SetOpaque -> JS_SetOpaqueInternal api fix
1 parent e8888c5 commit 9da2fc4

File tree

2 files changed

+52
-1
lines changed

2 files changed

+52
-1
lines changed

api-test.c

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,20 @@ static JSValue cfuncdata_callback(JSContext *ctx, JSValueConst this_val,
2525
return JS_ThrowTypeError(ctx, "from cfuncdata");
2626
}
2727

28+
static JSValue cclosure_callback(JSContext *ctx, JSValueConst this_val,
29+
int argc, JSValueConst *argv,
30+
int magic, void *func_data)
31+
{
32+
return JS_ThrowTypeError(ctx, "from cclosure");
33+
}
34+
35+
static bool closure_finalized = false;
36+
static void cclosure_opaque_finalize(void* opaque)
37+
{
38+
if ((intptr_t)opaque == 12)
39+
closure_finalized = true;
40+
}
41+
2842
static void cfunctions(void)
2943
{
3044
uint32_t length;
@@ -37,9 +51,13 @@ static void cfunctions(void)
3751
JSValue cfuncdata =
3852
JS_NewCFunctionData2(ctx, cfuncdata_callback, "cfuncdata",
3953
/*length*/1337, /*magic*/0, /*data_len*/0, NULL);
54+
JSValue cclosure =
55+
JS_NewCClosure(ctx, cclosure_callback, "cclosure", cclosure_opaque_finalize,
56+
/*length*/0xC0DE, /*magic*/11, /*opaque*/(void*)12);
4057
JSValue global = JS_GetGlobalObject(ctx);
4158
JS_SetPropertyStr(ctx, global, "cfunc", cfunc);
4259
JS_SetPropertyStr(ctx, global, "cfuncdata", cfuncdata);
60+
JS_SetPropertyStr(ctx, global, "cclosure", cclosure);
4361
JS_FreeValue(ctx, global);
4462

4563
ret = eval(ctx, "cfunc.name");
@@ -70,6 +88,20 @@ static void cfunctions(void)
7088
assert(0 == JS_ToUint32(ctx, &length, ret));
7189
assert(length == 1337);
7290

91+
ret = eval(ctx, "cclosure.name");
92+
assert(!JS_IsException(ret));
93+
assert(JS_IsString(ret));
94+
s = JS_ToCString(ctx, ret);
95+
JS_FreeValue(ctx, ret);
96+
assert(s);
97+
assert(!strcmp(s, "cclosure"));
98+
JS_FreeCString(ctx, s);
99+
ret = eval(ctx, "cclosure.length");
100+
assert(!JS_IsException(ret));
101+
assert(JS_IsNumber(ret));
102+
assert(0 == JS_ToUint32(ctx, &length, ret));
103+
assert(length == 0xC0DE);
104+
73105
ret = eval(ctx, "cfunc()");
74106
assert(JS_IsException(ret));
75107
ret = JS_GetException(ctx);
@@ -104,8 +136,27 @@ static void cfunctions(void)
104136
assert(!strcmp(s, "TypeError: from cfuncdata"));
105137
JS_FreeCString(ctx, s);
106138

139+
ret = eval(ctx, "cclosure()");
140+
assert(JS_IsException(ret));
141+
ret = JS_GetException(ctx);
142+
assert(JS_IsError(ret));
143+
stack = JS_GetPropertyStr(ctx, ret, "stack");
144+
assert(JS_IsString(stack));
145+
s = JS_ToCString(ctx, stack);
146+
JS_FreeValue(ctx, stack);
147+
assert(s);
148+
assert(!strcmp(s, " at cclosure (native)\n at <eval> (<input>:1:1)\n"));
149+
JS_FreeCString(ctx, s);
150+
s = JS_ToCString(ctx, ret);
151+
JS_FreeValue(ctx, ret);
152+
assert(s);
153+
assert(!strcmp(s, "TypeError: from cclosure"));
154+
JS_FreeCString(ctx, s);
155+
107156
JS_FreeContext(ctx);
108157
JS_FreeRuntime(rt);
158+
159+
assert(closure_finalized);
109160
}
110161

111162
#define MAX_TIME 10

quickjs.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5636,7 +5636,7 @@ JSValue JS_NewCClosure(JSContext* ctx, JSCClosure* func, const char* name,
56365636
s->magic = magic;
56375637
s->opaque = opaque;
56385638
s->opaque_finalize = opaque_finalize;
5639-
JS_SetOpaque(func_obj, s);
5639+
JS_SetOpaqueInternal(func_obj, s);
56405640
name_atom = JS_ATOM_empty_string;
56415641
if (name && *name) {
56425642
name_atom = JS_NewAtom(ctx, name);

0 commit comments

Comments
 (0)