Implement Node.js errors

This commit is contained in:
Wilson Lin 2020-07-25 13:40:37 +10:00
parent 9627921cb2
commit 863ccb947b
1 changed files with 28 additions and 13 deletions

View File

@ -55,6 +55,17 @@ void js_copy_min_buf_finalizer(napi_env env, void* _finalize_data, void* finaliz
free(finalize_hint); free(finalize_hint);
} }
static inline void throw_js_ffi_error(napi_env env, ffi_error const* min_err) {
napi_value js_min_err_msg;
assert_ok(napi_create_string_utf8(env, (char const*) min_err->message, min_err->message_len, &js_min_err_msg));
napi_value js_min_err;
assert_ok(napi_create_error(env, NULL, js_min_err_msg, &js_min_err));
napi_value js_min_err_pos;
assert_ok(napi_create_int64(env, min_err->position, &js_min_err_pos));
assert_ok(napi_set_named_property(env, js_min_err, "position", js_min_err_pos));
assert_ok(napi_throw(env, js_min_err));
}
napi_value node_method_create_configuration(napi_env env, napi_callback_info info) { napi_value node_method_create_configuration(napi_env env, napi_callback_info info) {
napi_value undefined = get_undefined(env); napi_value undefined = get_undefined(env);
@ -110,6 +121,7 @@ napi_value node_method_minify_in_place(napi_env env, napi_callback_info info) {
assert_ok(napi_throw_error(env, NULL, "Failed to get callback info")); assert_ok(napi_throw_error(env, NULL, "Failed to get callback info"));
goto rollback; goto rollback;
} }
napi_value min_buf_rv = undefined;
napi_value buffer_arg = argv[0]; napi_value buffer_arg = argv[0];
napi_value js_cfg_arg = argv[1]; napi_value js_cfg_arg = argv[1];
@ -140,32 +152,33 @@ napi_value node_method_minify_in_place(napi_env env, napi_callback_info info) {
size_t min_len; size_t min_len;
min_err = ffi_in_place(buffer_data, buffer_len, cfg, &min_len); min_err = ffi_in_place(buffer_data, buffer_len, cfg, &min_len);
if (min_err != NULL) { if (min_err != NULL) {
// TODO throw_js_ffi_error(env, min_err);
assert_ok(napi_throw_error(env, NULL, "Failed to run minifier"));
goto rollback; goto rollback;
} }
// Create minified buffer with underlying source memory but minified length. // Create minified buffer with underlying source memory but minified length.
min_buf_meta = assert_malloc(sizeof(js_min_buf_metadata)); min_buf_meta = assert_malloc(sizeof(js_min_buf_metadata));
min_buf_meta->src_buf_ref = buffer_arg_ref; min_buf_meta->src_buf_ref = buffer_arg_ref;
napi_value min_buf; if (napi_create_external_buffer(env, min_len, buffer_data, js_min_buf_finalizer, min_buf_meta, &min_buf_rv) != napi_ok) {
if (napi_create_external_buffer(env, min_len, buffer_data, js_min_buf_finalizer, min_buf_meta, &min_buf) != napi_ok) {
assert_ok(napi_throw_error(env, NULL, "Failed to create minified buffer")); assert_ok(napi_throw_error(env, NULL, "Failed to create minified buffer"));
goto rollback; goto rollback;
} }
return min_buf; goto cleanup;
rollback: rollback:
if (buffer_arg_ref_set) { if (buffer_arg_ref_set) {
// Release source buffer. // Release source buffer.
assert_ok(napi_delete_reference(env, buffer_arg_ref)); assert_ok(napi_delete_reference(env, buffer_arg_ref));
} }
free(min_buf_meta);
cleanup:
if (min_err != NULL) { if (min_err != NULL) {
ffi_drop_ffi_error(min_err); ffi_drop_ffi_error(min_err);
} }
free(min_buf_meta);
return undefined; return min_buf_rv;
} }
napi_value node_method_minify(napi_env env, napi_callback_info info) { napi_value node_method_minify(napi_env env, napi_callback_info info) {
@ -184,6 +197,7 @@ napi_value node_method_minify(napi_env env, napi_callback_info info) {
assert_ok(napi_throw_error(env, NULL, "Failed to get callback info")); assert_ok(napi_throw_error(env, NULL, "Failed to get callback info"));
goto rollback; goto rollback;
} }
napi_value min_buf_rv = undefined;
napi_value src_arg = argv[0]; napi_value src_arg = argv[0];
napi_value js_cfg_arg = argv[1]; napi_value js_cfg_arg = argv[1];
@ -224,26 +238,27 @@ napi_value node_method_minify(napi_env env, napi_callback_info info) {
size_t min_len; size_t min_len;
min_err = ffi_in_place(src_data_copy, src_data_len, cfg, &min_len); min_err = ffi_in_place(src_data_copy, src_data_len, cfg, &min_len);
if (min_err != NULL) { if (min_err != NULL) {
// TODO throw_js_ffi_error(env, min_err);
assert_ok(napi_throw_error(env, NULL, "Failed to run minifier"));
goto rollback; goto rollback;
} }
// Create minified buffer with copied memory. // Create minified buffer with copied memory.
napi_value min_buf; if (napi_create_external_buffer(env, min_len, src_data_copy, js_copy_min_buf_finalizer, src_data_copy, &min_buf_rv) != napi_ok) {
if (napi_create_external_buffer(env, min_len, src_data_copy, js_copy_min_buf_finalizer, src_data_copy, &min_buf) != napi_ok) {
assert_ok(napi_throw_error(env, NULL, "Failed to create minified buffer")); assert_ok(napi_throw_error(env, NULL, "Failed to create minified buffer"));
goto rollback; goto rollback;
} }
return min_buf; goto cleanup;
rollback: rollback:
free(src_data_copy); free(src_data_copy);
cleanup:
if (min_err != NULL) { if (min_err != NULL) {
ffi_drop_ffi_error(min_err); ffi_drop_ffi_error(min_err);
} }
return undefined;
return min_buf_rv;
} }
static inline void define_method(napi_env env, napi_value exports, char const* name, napi_callback cb) { static inline void define_method(napi_env env, napi_value exports, char const* name, napi_callback cb) {