@@ -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+
2842static 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
0 commit comments