Skip to content

Commit ab31653

Browse files
committed
Fix class ID creation and plug some leaks
1 parent d32c3f5 commit ab31653

File tree

1 file changed

+61
-30
lines changed

1 file changed

+61
-30
lines changed

src/js.c

+61-30
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ js_create_platform(uv_loop_t *loop, const js_platform_options_t *options, js_pla
211211
js_platform_t *platform = malloc(sizeof(js_platform_t));
212212

213213
platform->loop = loop;
214-
platform->options = options ? *options : (js_platform_options_t) {};
214+
platform->options = options ? *options : (js_platform_options_t){};
215215

216216
*result = platform;
217217

@@ -304,7 +304,7 @@ js__on_delegate_finalize(JSRuntime *runtime, JSValue value);
304304
static JSClassDef js_delegate_class = {
305305
.class_name = "Delegate",
306306
.finalizer = js__on_delegate_finalize,
307-
.exotic = &(JSClassExoticMethods) {
307+
.exotic = &(JSClassExoticMethods){
308308
.get_own_property = js__on_delegate_get_own_property,
309309
.get_own_property_names = js__on_delegate_get_own_property_names,
310310
.delete_property = js__on_delegate_delete_property,
@@ -405,7 +405,7 @@ js__on_uncaught_exception(JSContext *context, JSValue error) {
405405

406406
env->callbacks.uncaught_exception(
407407
env,
408-
&(js_value_t) {error},
408+
&(js_value_t){error},
409409
env->callbacks.uncaught_exception_data
410410
);
411411

@@ -431,8 +431,8 @@ js__on_unhandled_rejection(JSContext *context, JSValue promise, JSValue reason)
431431

432432
env->callbacks.unhandled_rejection(
433433
env,
434-
&(js_value_t) {reason},
435-
&(js_value_t) {promise},
434+
&(js_value_t){reason},
435+
&(js_value_t){promise},
436436
env->callbacks.unhandled_rejection_data
437437
);
438438

@@ -607,7 +607,7 @@ js_create_env(uv_loop_t *loop, js_platform_t *platform, const js_env_options_t *
607607
int err;
608608

609609
JSRuntime *runtime = JS_NewRuntime2(
610-
&(JSMallocFunctions) {
610+
&(JSMallocFunctions){
611611
.js_calloc = js__on_calloc,
612612
.js_malloc = js__on_malloc,
613613
.js_free = js__on_free,
@@ -619,7 +619,7 @@ js_create_env(uv_loop_t *loop, js_platform_t *platform, const js_env_options_t *
619619

620620
JS_SetSharedArrayBufferFunctions(
621621
runtime,
622-
&(JSSharedArrayBufferFunctions) {
622+
&(JSSharedArrayBufferFunctions){
623623
.sab_alloc = js__on_shared_malloc,
624624
.sab_free = js__on_shared_free,
625625
.sab_dup = js__on_shared_dup,
@@ -649,20 +649,6 @@ js_create_env(uv_loop_t *loop, js_platform_t *platform, const js_env_options_t *
649649

650650
js_env_t *env = malloc(sizeof(js_env_t));
651651

652-
JS_NewClassID(runtime, &env->classes.external);
653-
JS_NewClassID(runtime, &env->classes.finalizer);
654-
JS_NewClassID(runtime, &env->classes.type_tag);
655-
JS_NewClassID(runtime, &env->classes.function);
656-
JS_NewClassID(runtime, &env->classes.constructor);
657-
JS_NewClassID(runtime, &env->classes.delegate);
658-
659-
JS_NewClass(runtime, env->classes.external, &js_external_class);
660-
JS_NewClass(runtime, env->classes.finalizer, &js_finalizer_class);
661-
JS_NewClass(runtime, env->classes.type_tag, &js_type_tag_class);
662-
JS_NewClass(runtime, env->classes.function, &js_function_class);
663-
JS_NewClass(runtime, env->classes.constructor, &js_constructor_class);
664-
JS_NewClass(runtime, env->classes.delegate, &js_delegate_class);
665-
666652
env->loop = loop;
667653
env->active_handles = 2;
668654

@@ -681,6 +667,13 @@ js_create_env(uv_loop_t *loop, js_platform_t *platform, const js_env_options_t *
681667

682668
env->promise_rejections = NULL;
683669

670+
env->classes.external = 0;
671+
env->classes.finalizer = 0;
672+
env->classes.type_tag = 0;
673+
env->classes.function = 0;
674+
env->classes.constructor = 0;
675+
env->classes.delegate = 0;
676+
684677
env->callbacks.uncaught_exception = NULL;
685678
env->callbacks.uncaught_exception_data = NULL;
686679

@@ -693,6 +686,30 @@ js_create_env(uv_loop_t *loop, js_platform_t *platform, const js_env_options_t *
693686
JS_SetRuntimeOpaque(env->runtime, env);
694687
JS_SetContextOpaque(env->context, env);
695688

689+
JS_NewClassID(runtime, &env->classes.external);
690+
err = JS_NewClass(runtime, env->classes.external, &js_external_class);
691+
assert(err == 0);
692+
693+
JS_NewClassID(runtime, &env->classes.finalizer);
694+
err = JS_NewClass(runtime, env->classes.finalizer, &js_finalizer_class);
695+
assert(err == 0);
696+
697+
JS_NewClassID(runtime, &env->classes.type_tag);
698+
err = JS_NewClass(runtime, env->classes.type_tag, &js_type_tag_class);
699+
assert(err == 0);
700+
701+
JS_NewClassID(runtime, &env->classes.function);
702+
err = JS_NewClass(runtime, env->classes.function, &js_function_class);
703+
assert(err == 0);
704+
705+
JS_NewClassID(runtime, &env->classes.constructor);
706+
err = JS_NewClass(runtime, env->classes.constructor, &js_constructor_class);
707+
assert(err == 0);
708+
709+
JS_NewClassID(runtime, &env->classes.delegate);
710+
err = JS_NewClass(runtime, env->classes.delegate, &js_delegate_class);
711+
assert(err == 0);
712+
696713
err = uv_prepare_init(loop, &env->prepare);
697714
assert(err == 0);
698715

@@ -724,6 +741,16 @@ js__on_handle_close(uv_handle_t *handle) {
724741
js_env_t *env = (js_env_t *) handle->data;
725742

726743
if (--env->active_handles == 0) {
744+
js_module_evaluator_t *evaluator = env->evaluators;
745+
746+
while (evaluator) {
747+
js_module_evaluator_t *next = evaluator->next;
748+
749+
free(evaluator);
750+
751+
evaluator = next;
752+
}
753+
727754
free(env);
728755
}
729756
}
@@ -1154,7 +1181,7 @@ js_run_module(js_env_t *env, js_module_t *module, js_value_t **result) {
11541181
if (module->meta) {
11551182
JSValue meta = JS_GetImportMeta(env->context, module->definition);
11561183

1157-
module->meta(env, module, &(js_value_t) {meta}, module->meta_data);
1184+
module->meta(env, module, &(js_value_t){meta}, module->meta_data);
11581185

11591186
JS_FreeValue(env->context, meta);
11601187

@@ -1165,7 +1192,7 @@ js_run_module(js_env_t *env, js_module_t *module, js_value_t **result) {
11651192
err = js_create_promise(env, &deferred, result);
11661193
if (err < 0) return err;
11671194

1168-
js_reject_deferred(env, deferred, &(js_value_t) {error});
1195+
js_reject_deferred(env, deferred, &(js_value_t){error});
11691196

11701197
JS_FreeValue(env->context, error);
11711198

@@ -1190,7 +1217,7 @@ js_run_module(js_env_t *env, js_module_t *module, js_value_t **result) {
11901217
err = js_create_promise(env, &deferred, result);
11911218
if (err < 0) return err;
11921219

1193-
js_reject_deferred(env, deferred, &(js_value_t) {error});
1220+
js_reject_deferred(env, deferred, &(js_value_t){error});
11941221

11951222
JS_FreeValue(env->context, error);
11961223

@@ -1471,7 +1498,7 @@ js_define_class(js_env_t *env, const char *name, size_t len, js_function_cb cons
14711498
}
14721499
}
14731500

1474-
err = js_define_properties(env, &(js_value_t) {prototype}, instance_properties, instance_properties_len);
1501+
err = js_define_properties(env, &(js_value_t){prototype}, instance_properties, instance_properties_len);
14751502
assert(err == 0);
14761503

14771504
free(instance_properties);
@@ -1488,7 +1515,7 @@ js_define_class(js_env_t *env, const char *name, size_t len, js_function_cb cons
14881515
}
14891516
}
14901517

1491-
err = js_define_properties(env, &(js_value_t) {class}, static_properties, static_properties_len);
1518+
err = js_define_properties(env, &(js_value_t){class}, static_properties, static_properties_len);
14921519
assert(err == 0);
14931520

14941521
free(static_properties);
@@ -1673,7 +1700,7 @@ js__on_delegate_get_own_property(JSContext *context, JSPropertyDescriptor *descr
16731700
if (delegate->callbacks.has) {
16741701
JSValue property = JS_AtomToValue(env->context, name);
16751702

1676-
bool exists = delegate->callbacks.has(env, &(js_value_t) {property}, delegate->data);
1703+
bool exists = delegate->callbacks.has(env, &(js_value_t){property}, delegate->data);
16771704

16781705
JS_FreeValue(env->context, property);
16791706

@@ -1685,7 +1712,7 @@ js__on_delegate_get_own_property(JSContext *context, JSPropertyDescriptor *descr
16851712
if (delegate->callbacks.get) {
16861713
JSValue property = JS_AtomToValue(env->context, name);
16871714

1688-
js_value_t *result = delegate->callbacks.get(env, &(js_value_t) {property}, delegate->data);
1715+
js_value_t *result = delegate->callbacks.get(env, &(js_value_t){property}, delegate->data);
16891716

16901717
JS_FreeValue(env->context, property);
16911718

@@ -1754,7 +1781,7 @@ js__on_delegate_delete_property(JSContext *context, JSValueConst object, JSAtom
17541781
if (delegate->callbacks.delete_property) {
17551782
JSValue property = JS_AtomToValue(env->context, name);
17561783

1757-
bool success = delegate->callbacks.delete_property(env, &(js_value_t) {property}, delegate->data);
1784+
bool success = delegate->callbacks.delete_property(env, &(js_value_t){property}, delegate->data);
17581785

17591786
JS_FreeValue(env->context, property);
17601787

@@ -1775,7 +1802,7 @@ js__on_delegate_set_property(JSContext *context, JSValueConst object, JSAtom nam
17751802
if (delegate->callbacks.set) {
17761803
JSValue property = JS_AtomToValue(env->context, name);
17771804

1778-
bool success = delegate->callbacks.set(env, &(js_value_t) {property}, &(js_value_t) {value}, delegate->data);
1805+
bool success = delegate->callbacks.set(env, &(js_value_t){property}, &(js_value_t){value}, delegate->data);
17791806

17801807
JS_FreeValue(env->context, property);
17811808

@@ -2082,6 +2109,8 @@ js_create_string_utf16le(js_env_t *env, const utf16_t *str, size_t len, js_value
20822109

20832110
wrapper->value = JS_NewStringLen(env->context, (char *) utf8, utf8_len);
20842111

2112+
free(utf8);
2113+
20852114
*result = wrapper;
20862115

20872116
js__attach_to_handle_scope(env, env->scope, wrapper);
@@ -2105,6 +2134,8 @@ js_create_string_latin1(js_env_t *env, const latin1_t *str, size_t len, js_value
21052134

21062135
wrapper->value = JS_NewStringLen(env->context, (char *) utf8, utf8_len);
21072136

2137+
free(utf8);
2138+
21082139
*result = wrapper;
21092140

21102141
js__attach_to_handle_scope(env, env->scope, wrapper);

0 commit comments

Comments
 (0)