diff --git a/examples/point.c b/examples/point.c index 0386230..557be11 100644 --- a/examples/point.c +++ b/examples/point.c @@ -123,10 +123,11 @@ static const JSCFunctionListEntry js_point_proto_funcs[] = { static int js_point_init(JSContext *ctx, JSModuleDef *m) { JSValue point_proto, point_class; + JSRuntime *rt = JS_GetRuntime(ctx); /* create the Point class */ - JS_NewClassID(&js_point_class_id); - JS_NewClass(JS_GetRuntime(ctx), js_point_class_id, &js_point_class); + JS_NewClassID(rt, &js_point_class_id); + JS_NewClass(rt, js_point_class_id, &js_point_class); point_proto = JS_NewObject(ctx); JS_SetPropertyFunctionList(ctx, point_proto, js_point_proto_funcs, countof(js_point_proto_funcs)); diff --git a/quickjs-libc.c b/quickjs-libc.c index 4df3704..ea76222 100644 --- a/quickjs-libc.c +++ b/quickjs-libc.c @@ -1516,12 +1516,13 @@ static const JSCFunctionListEntry js_std_file_proto_funcs[] = { static int js_std_init(JSContext *ctx, JSModuleDef *m) { JSValue proto; + JSRuntime *rt = JS_GetRuntime(ctx); /* FILE class */ /* the class ID is created once */ - JS_NewClassID(&js_std_file_class_id); + JS_NewClassID(rt, &js_std_file_class_id); /* the class is created once per runtime */ - JS_NewClass(JS_GetRuntime(ctx), js_std_file_class_id, &js_std_file_class); + JS_NewClass(rt, js_std_file_class_id, &js_std_file_class); proto = JS_NewObject(ctx); JS_SetPropertyFunctionList(ctx, proto, js_std_file_proto_funcs, countof(js_std_file_proto_funcs)); @@ -3658,20 +3659,20 @@ static const JSCFunctionListEntry js_os_funcs[] = { static int js_os_init(JSContext *ctx, JSModuleDef *m) { + JSRuntime *rt = JS_GetRuntime(ctx); os_poll_func = js_os_poll; /* OSTimer class */ - JS_NewClassID(&js_os_timer_class_id); - JS_NewClass(JS_GetRuntime(ctx), js_os_timer_class_id, &js_os_timer_class); + JS_NewClassID(rt, &js_os_timer_class_id); + JS_NewClass(rt, js_os_timer_class_id, &js_os_timer_class); #ifdef USE_WORKER { - JSRuntime *rt = JS_GetRuntime(ctx); JSThreadState *ts = JS_GetRuntimeOpaque(rt); JSValue proto, obj; /* Worker class */ - JS_NewClassID(&js_worker_class_id); - JS_NewClass(JS_GetRuntime(ctx), js_worker_class_id, &js_worker_class); + JS_NewClassID(rt, &js_worker_class_id); + JS_NewClass(rt, js_worker_class_id, &js_worker_class); proto = JS_NewObject(ctx); JS_SetPropertyFunctionList(ctx, proto, js_worker_proto_funcs, countof(js_worker_proto_funcs)); diff --git a/quickjs.c b/quickjs.c index 910708e..c2a8d12 100644 --- a/quickjs.c +++ b/quickjs.c @@ -228,6 +228,7 @@ struct JSRuntime { JSAtomStruct **atom_array; int atom_free_index; /* 0 = none */ + JSClassID js_class_id_alloc; /* counter for user defined classes */ int class_count; /* size of class_array */ JSClass *class_array; @@ -1149,7 +1150,6 @@ static const JSClassExoticMethods js_arguments_exotic_methods; static const JSClassExoticMethods js_string_exotic_methods; static const JSClassExoticMethods js_proxy_exotic_methods; static const JSClassExoticMethods js_module_ns_exotic_methods; -static JSClassID js_class_id_alloc = JS_CLASS_INIT_COUNT; static int compare_u32(uint32_t a, uint32_t b) { @@ -1483,6 +1483,8 @@ JSRuntime *JS_NewRuntime2(const JSMallocFunctions *mf, void *opaque) if (init_shape_hash(rt)) goto fail; + rt->js_class_id_alloc = JS_CLASS_INIT_COUNT; + rt->stack_size = JS_DEFAULT_STACK_SIZE; JS_UpdateStackTop(rt); @@ -3181,13 +3183,11 @@ static inline BOOL JS_IsEmptyString(JSValueConst v) /* JSClass support */ /* a new class ID is allocated if *pclass_id != 0 */ -JSClassID JS_NewClassID(JSClassID *pclass_id) +JSClassID JS_NewClassID(JSRuntime *rt, JSClassID *pclass_id) { - JSClassID class_id; - /* XXX: make it thread safe */ - class_id = *pclass_id; + JSClassID class_id = *pclass_id; if (class_id == 0) { - class_id = js_class_id_alloc++; + class_id = rt->js_class_id_alloc++; *pclass_id = class_id; } return class_id; diff --git a/quickjs.h b/quickjs.h index aad0f18..a3bf90d 100644 --- a/quickjs.h +++ b/quickjs.h @@ -484,7 +484,7 @@ typedef struct JSClassDef { JSClassExoticMethods *exotic; } JSClassDef; -JSClassID JS_NewClassID(JSClassID *pclass_id); +JSClassID JS_NewClassID(JSRuntime *rt, JSClassID *pclass_id); int JS_NewClass(JSRuntime *rt, JSClassID class_id, const JSClassDef *class_def); int JS_IsRegisteredClass(JSRuntime *rt, JSClassID class_id);