Skip to content

Commit

Permalink
Review memory allocation code and fix memory leakage.
Browse files Browse the repository at this point in the history
 - issue #525
  • Loading branch information
communix committed Oct 23, 2022
1 parent 4b90b13 commit 8f4356d
Show file tree
Hide file tree
Showing 13 changed files with 57 additions and 10 deletions.
12 changes: 11 additions & 1 deletion src/global.c
Original file line number Diff line number Diff line change
Expand Up @@ -257,10 +257,13 @@ JERRYXX_FUN(pulse_read_fn) {
} else {
trigger_buf[i] = 0;
}
jerry_release_value(item);
}
}
}
jerry_release_value(trigger_interval);
}
jerry_release_value(trigger);
}

// triggering
Expand All @@ -276,7 +279,7 @@ JERRYXX_FUN(pulse_read_fn) {
count = pulse_read(pin, state, buf, count, timeout);

// free trigger buffer
if (trigger_len > 0) {
if (trigger_buf) {
free(trigger_buf);
}

Expand Down Expand Up @@ -316,6 +319,7 @@ JERRYXX_FUN(pulse_write_fn) {
} else {
buf[i] = 0; // write 0 for non-number item.
}
jerry_release_value(item);
}
pulse_write(pin, value, buf, length);
} else {
Expand Down Expand Up @@ -431,6 +435,7 @@ static void irq_cb(uint8_t pin) {
jerry_release_value(ret_val);
jerry_release_value(this_val);
}
jerry_release_value(cb);
}

JERRYXX_FUN(attach_interrupt_fn) {
Expand Down Expand Up @@ -981,6 +986,7 @@ JERRYXX_FUN(textencoder_encode_fn) {
jerry_char_t buf[sz + 1];
jerry_size_t len = jerry_string_to_char_buffer(encoding, buf, sz);
buf[len] = '\0';
jerry_release_value(encoding);
if (strcmp((char *)buf, "ascii") == 0) {
jerry_size_t len = jerryxx_get_ascii_string_size(input);
jerry_value_t array = jerry_create_typedarray(JERRY_TYPEDARRAY_UINT8, len);
Expand Down Expand Up @@ -1021,6 +1027,7 @@ static void register_global_text_encoder() {

jerry_value_t global = jerry_get_global_object();
jerryxx_set_property(global, MSTR_TEXT_ENCODER, textencoder_ctor);
jerry_release_value(textencoder_ctor);
jerry_release_value(global);
}

Expand Down Expand Up @@ -1057,6 +1064,7 @@ JERRYXX_FUN(textdecoder_decode_fn) {
jerry_size_t sz = jerry_get_string_size(encoding);
jerry_char_t buf[sz + 1];
jerry_size_t len = jerry_string_to_char_buffer(encoding, buf, sz);
jerry_release_value(encoding);
buf[len] = '\0';
if (strcmp((char *)buf, "ascii") == 0) {
// return String.fromCharCode.apply(null, input);
Expand Down Expand Up @@ -1105,6 +1113,7 @@ static void register_global_text_decoder() {

jerry_value_t global = jerry_get_global_object();
jerryxx_set_property(global, MSTR_TEXT_DECODER, textdecoder_ctor);
jerry_release_value(textdecoder_ctor);
jerry_release_value(global);
}

Expand Down Expand Up @@ -1271,6 +1280,7 @@ static void register_global_system_error() {
jerryxx_inherit(global_error, system_error_ctor);
// global.SystemError = SystemError
jerryxx_set_property(global, MSTR_SYSTEM_ERROR, system_error_ctor);
jerry_release_value(system_error_ctor);
jerry_release_value(global_error);
jerry_release_value(global);
}
Expand Down
2 changes: 1 addition & 1 deletion src/jerryxx.c
Original file line number Diff line number Diff line change
Expand Up @@ -255,8 +255,8 @@ jerry_value_t jerryxx_call_method(jerry_value_t obj, char *name,
jerry_value_t *args, int args_count) {
jerry_value_t method = jerryxx_get_property(obj, name);
jerry_value_t ret = jerry_call_function(method, obj, args, args_count);
return ret;
jerry_release_value(method);
return ret;
}

void jerryxx_inherit(jerry_value_t super_ctor, jerry_value_t sub_ctor) {
Expand Down
1 change: 1 addition & 0 deletions src/modules/flash/module_flash.c
Original file line number Diff line number Diff line change
Expand Up @@ -178,5 +178,6 @@ jerry_value_t module_flash_init() {
/* flash module exports */
jerry_value_t exports = jerry_create_object();
jerryxx_set_property(exports, MSTR_FLASH_FLASH, flash_ctor);
jerry_release_value(flash_ctor);
return exports;
}
1 change: 1 addition & 0 deletions src/modules/graphics/module_graphics.c
Original file line number Diff line number Diff line change
Expand Up @@ -699,6 +699,7 @@ JERRYXX_FUN(buffered_gc_ctor_fn) {
gc_handle->buffer = jerry_get_arraybuffer_pointer(buf);
gc_handle->buffer_size = size;
jerry_release_value(buf);
jerry_release_value(buffer);
return jerry_create_undefined();
}

Expand Down
17 changes: 12 additions & 5 deletions src/modules/i2c/module_i2c.c
Original file line number Diff line number Diff line change
Expand Up @@ -101,12 +101,13 @@ JERRYXX_FUN(i2c_write_fn) {
jerry_value_t bus_value =
jerryxx_get_property(JERRYXX_GET_THIS, MSTR_I2C_BUS);
if (!jerry_value_is_number(bus_value)) {
jerry_release_value(bus_value);
return jerry_create_error(
JERRY_ERROR_REFERENCE,
(const jerry_char_t *)"I2C bus is not initialized.");
}
uint8_t bus = (uint8_t)jerry_get_number_value(bus_value);

jerry_release_value(bus_value);
// check the mode (determine slave mode or master mode)
km_i2c_mode_t i2cmode = jerryxx_get_property(JERRYXX_GET_THIS, MSTR_I2C_MODE);

Expand Down Expand Up @@ -187,12 +188,13 @@ JERRYXX_FUN(i2c_read_fn) {
jerry_value_t bus_value =
jerryxx_get_property(JERRYXX_GET_THIS, MSTR_I2C_BUS);
if (!jerry_value_is_number(bus_value)) {
jerry_release_value(bus_value);
return jerry_create_error(
JERRY_ERROR_REFERENCE,
(const jerry_char_t *)"I2C bus is not initialized.");
}
uint8_t bus = (uint8_t)jerry_get_number_value(bus_value);

jerry_release_value(bus_value);
// check the mode (determine slave mode or master mode)
km_i2c_mode_t i2cmode = jerryxx_get_property(JERRYXX_GET_THIS, MSTR_I2C_MODE);

Expand Down Expand Up @@ -222,6 +224,7 @@ JERRYXX_FUN(i2c_read_fn) {
jerry_create_arraybuffer_external(length, buf, buffer_free_cb);
jerry_value_t array = jerry_create_typedarray_for_arraybuffer(
JERRY_TYPEDARRAY_UINT8, array_buffer);
free(buf);
jerry_release_value(array_buffer);
return array;
}
Expand Down Expand Up @@ -249,12 +252,13 @@ JERRYXX_FUN(i2c_memwrite_fn) {
jerry_value_t bus_value =
jerryxx_get_property(JERRYXX_GET_THIS, MSTR_I2C_BUS);
if (!jerry_value_is_number(bus_value)) {
jerry_release_value(bus_value);
return jerry_create_error(
JERRY_ERROR_REFERENCE,
(const jerry_char_t *)"I2C bus is not initialized.");
}
uint8_t bus = (uint8_t)jerry_get_number_value(bus_value);

jerry_release_value(bus_value);
// check the mode (determine slave mode or master mode)
km_i2c_mode_t i2cmode = jerryxx_get_property(JERRYXX_GET_THIS, MSTR_I2C_MODE);
if (i2cmode == KM_I2C_SLAVE)
Expand Down Expand Up @@ -322,12 +326,13 @@ JERRYXX_FUN(i2c_memread_fn) {
jerry_value_t bus_value =
jerryxx_get_property(JERRYXX_GET_THIS, MSTR_I2C_BUS);
if (!jerry_value_is_number(bus_value)) {
jerry_release_value(bus_value);
return jerry_create_error(
JERRY_ERROR_REFERENCE,
(const jerry_char_t *)"I2C bus is not initialized.");
}
uint8_t bus = (uint8_t)jerry_get_number_value(bus_value);

jerry_release_value(bus_value);
// check the mode (determine slave mode or master mode)
km_i2c_mode_t i2cmode = jerryxx_get_property(JERRYXX_GET_THIS, MSTR_I2C_MODE);
if (i2cmode == KM_I2C_SLAVE)
Expand All @@ -348,6 +353,7 @@ JERRYXX_FUN(i2c_memread_fn) {
jerry_value_t array = jerry_create_typedarray_for_arraybuffer(
JERRY_TYPEDARRAY_UINT8, array_buffer);
jerry_release_value(array_buffer);
free(buf);
return array;
}
}
Expand All @@ -360,12 +366,13 @@ JERRYXX_FUN(i2c_close_fn) {
jerry_value_t bus_value =
jerryxx_get_property(JERRYXX_GET_THIS, MSTR_I2C_BUS);
if (!jerry_value_is_number(bus_value)) {
jerry_release_value(bus_value);
return jerry_create_error(
JERRY_ERROR_REFERENCE,
(const jerry_char_t *)"I2C bus is not initialized.");
}
uint8_t bus = (uint8_t)jerry_get_number_value(bus_value);

jerry_release_value(bus_value);
// close the bus
int ret = km_i2c_close(bus);
if (ret < 0) {
Expand Down
11 changes: 10 additions & 1 deletion src/modules/pwm/module_pwm.c
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ JERRYXX_FUN(pwm_set_inversion_fn) {
jerry_value_t pin_value =
jerryxx_get_property(JERRYXX_GET_THIS, MSTR_PWM_PIN);
if (!jerry_value_is_number(pin_value)) {
jerry_release_value(pin_value);
return jerry_create_error(JERRY_ERROR_REFERENCE,
(const jerry_char_t *)"PWM pin is not setup.");
}
Expand All @@ -77,6 +78,7 @@ JERRYXX_FUN(pwm_get_inversion_fn) {
jerry_value_t pin_value =
jerryxx_get_property(JERRYXX_GET_THIS, MSTR_PWM_INV_PIN);
if (!jerry_value_is_number(pin_value)) {
jerry_release_value(pin_value);
return jerry_create_error(JERRY_ERROR_REFERENCE,
(const jerry_char_t *)"PWM inversion pin error.");
}
Expand All @@ -92,6 +94,7 @@ JERRYXX_FUN(pwm_start_fn) {
jerry_value_t pin_value =
jerryxx_get_property(JERRYXX_GET_THIS, MSTR_PWM_PIN);
if (!jerry_value_is_number(pin_value)) {
jerry_release_value(pin_value);
return jerry_create_error(JERRY_ERROR_REFERENCE,
(const jerry_char_t *)"PWM pin is not setup.");
}
Expand All @@ -109,6 +112,7 @@ JERRYXX_FUN(pwm_stop_fn) {
jerry_value_t pin_value =
jerryxx_get_property(JERRYXX_GET_THIS, MSTR_PWM_PIN);
if (!jerry_value_is_number(pin_value)) {
jerry_release_value(pin_value);
return jerry_create_error(JERRY_ERROR_REFERENCE,
(const jerry_char_t *)"PWM pin is not setup.");
}
Expand All @@ -126,6 +130,7 @@ JERRYXX_FUN(pwm_get_frequency_fn) {
jerry_value_t pin_value =
jerryxx_get_property(JERRYXX_GET_THIS, MSTR_PWM_PIN);
if (!jerry_value_is_number(pin_value)) {
jerry_release_value(pin_value);
return jerry_create_error(JERRY_ERROR_REFERENCE,
(const jerry_char_t *)"PWM pin is not setup.");
}
Expand All @@ -146,6 +151,7 @@ JERRYXX_FUN(pwm_set_frequency_fn) {
jerry_value_t pin_value =
jerryxx_get_property(JERRYXX_GET_THIS, MSTR_PWM_PIN);
if (!jerry_value_is_number(pin_value)) {
jerry_release_value(pin_value);
return jerry_create_error(JERRY_ERROR_REFERENCE,
(const jerry_char_t *)"PWM pin is not setup.");
}
Expand All @@ -163,6 +169,7 @@ JERRYXX_FUN(pwm_get_duty_fn) {
jerry_value_t pin_value =
jerryxx_get_property(JERRYXX_GET_THIS, MSTR_PWM_PIN);
if (!jerry_value_is_number(pin_value)) {
jerry_release_value(pin_value);
return jerry_create_error(JERRY_ERROR_REFERENCE,
(const jerry_char_t *)"PWM pin is not setup.");
}
Expand All @@ -187,6 +194,7 @@ JERRYXX_FUN(pwm_set_duty_fn) {
jerry_value_t pin_value =
jerryxx_get_property(JERRYXX_GET_THIS, MSTR_PWM_PIN);
if (!jerry_value_is_number(pin_value)) {
jerry_release_value(pin_value);
return jerry_create_error(JERRY_ERROR_REFERENCE,
(const jerry_char_t *)"PWM pin is not setup.");
}
Expand All @@ -204,6 +212,7 @@ JERRYXX_FUN(pwm_close_fn) {
jerry_value_t pin_value =
jerryxx_get_property(JERRYXX_GET_THIS, MSTR_PWM_PIN);
if (!jerry_value_is_number(pin_value)) {
jerry_release_value(pin_value);
return jerry_create_error(JERRY_ERROR_REFERENCE,
(const jerry_char_t *)"PWM pin is not setup.");
}
Expand All @@ -222,7 +231,6 @@ jerry_value_t module_pwm_init() {
jerry_value_t pwm_ctor = jerry_create_external_function(pwm_ctor_fn);
jerry_value_t prototype = jerry_create_object();
jerryxx_set_property(pwm_ctor, "prototype", prototype);
jerry_release_value(prototype);
jerryxx_set_property_function(prototype, MSTR_PWM_START, pwm_start_fn);
jerryxx_set_property_function(prototype, MSTR_PWM_STOP, pwm_stop_fn);
jerryxx_set_property_function(prototype, MSTR_PWM_GET_FREQUENCY,
Expand All @@ -236,6 +244,7 @@ jerry_value_t module_pwm_init() {
jerryxx_set_property_function(prototype, MSTR_PWM_GET_INVERSION,
pwm_get_inversion_fn);
jerryxx_set_property_function(prototype, MSTR_PWM_CLOSE, pwm_close_fn);
jerry_release_value(prototype);

/* pwm module exports */
jerry_value_t exports = jerry_create_object();
Expand Down
2 changes: 2 additions & 0 deletions src/modules/rp2/module_rp2.c
Original file line number Diff line number Diff line change
Expand Up @@ -426,6 +426,8 @@ JERRYXX_FUN(dormant_fn) {
}
_pins[i] = (uint8_t)jerry_get_number_value(pin);
_events[i] = (uint8_t)jerry_get_number_value(event);
jerry_release_value(pin);
jerry_release_value(event);
}

// Hibernate system for dormant
Expand Down
1 change: 1 addition & 0 deletions src/modules/sdcard/module_sdcard.c
Original file line number Diff line number Diff line change
Expand Up @@ -542,5 +542,6 @@ jerry_value_t module_sdcard_init() {
/* sdcard module exports */
jerry_value_t exports = jerry_create_object();
jerryxx_set_property(exports, MSTR_SDCARD_SDCARD, sdcard_ctor);
jerry_release_value(sdcard_ctor);
return exports;
}
9 changes: 8 additions & 1 deletion src/modules/spi/module_spi.c
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ JERRYXX_FUN(spi_transfer_fn) {
jerry_value_t bus_value =
jerryxx_get_property(JERRYXX_GET_THIS, MSTR_SPI_BUS);
if (!jerry_value_is_number(bus_value)) {
jerry_release_value(bus_value);
return jerry_create_error(
JERRY_ERROR_REFERENCE,
(const jerry_char_t *)"SPI bus is not initialized.");
Expand All @@ -120,6 +121,7 @@ JERRYXX_FUN(spi_transfer_fn) {
uint8_t *tx_buf = jerry_get_arraybuffer_pointer(array_buffer);
uint8_t *rx_buf = malloc(len);
int ret = km_spi_sendrecv(bus, tx_buf, rx_buf, len, timeout);
jerry_release_value(array_buffer);
if (ret < 0) {
free(rx_buf);
return jerry_create_error_from_value(create_system_error(ret), true);
Expand All @@ -129,9 +131,9 @@ JERRYXX_FUN(spi_transfer_fn) {
jerry_value_t array = jerry_create_typedarray_for_arraybuffer(
JERRY_TYPEDARRAY_UINT8, buffer);
jerry_release_value(buffer);
free(rx_buf);
return array;
}
jerry_release_value(array_buffer);
} else if (jerry_value_is_string(data)) { /* for string */
jerry_size_t len = jerryxx_get_ascii_string_size(data);
uint8_t tx_buf[len];
Expand All @@ -147,6 +149,7 @@ JERRYXX_FUN(spi_transfer_fn) {
jerry_value_t array = jerry_create_typedarray_for_arraybuffer(
JERRY_TYPEDARRAY_UINT8, buffer);
jerry_release_value(buffer);
free(rx_buf);
return array;
}
} else {
Expand All @@ -171,6 +174,7 @@ JERRYXX_FUN(spi_send_fn) {
jerry_value_t bus_value =
jerryxx_get_property(JERRYXX_GET_THIS, MSTR_SPI_BUS);
if (!jerry_value_is_number(bus_value)) {
jerry_release_value(bus_value);
return jerry_create_error(
JERRY_ERROR_REFERENCE,
(const jerry_char_t *)"SPI bus is not initialized.");
Expand Down Expand Up @@ -226,6 +230,7 @@ JERRYXX_FUN(spi_recv_fn) {
jerry_value_t bus_value =
jerryxx_get_property(JERRYXX_GET_THIS, MSTR_SPI_BUS);
if (!jerry_value_is_number(bus_value)) {
jerry_release_value(bus_value);
return jerry_create_error(
JERRY_ERROR_REFERENCE,
(const jerry_char_t *)"SPI bus is not initialized.");
Expand All @@ -247,6 +252,7 @@ JERRYXX_FUN(spi_recv_fn) {
jerry_value_t array = jerry_create_typedarray_for_arraybuffer(
JERRY_TYPEDARRAY_UINT8, array_buffer);
jerry_release_value(array_buffer);
free(buf);
return array;
}
}
Expand All @@ -259,6 +265,7 @@ JERRYXX_FUN(spi_close_fn) {
jerry_value_t bus_value =
jerryxx_get_property(JERRYXX_GET_THIS, MSTR_SPI_BUS);
if (!jerry_value_is_number(bus_value)) {
jerry_release_value(bus_value);
return jerry_create_error(
JERRY_ERROR_REFERENCE,
(const jerry_char_t *)"SPI bus is not initialized.");
Expand Down
2 changes: 2 additions & 0 deletions src/modules/stream/module_stream.c
Original file line number Diff line number Diff line change
Expand Up @@ -100,13 +100,15 @@ jerry_value_t module_stream_init() {
jerryxx_set_property(stdin_ctor, MSTR_PROTOTYPE, stdin_prototype);
jerryxx_set_property_function(stdin_prototype, MSTR_STREAM_READ,
stdin_read_fn);
jerry_release_value(stdin_prototype);

/* StdOutNative class */
jerry_value_t stdout_ctor = jerry_create_external_function(stdout_ctor_fn);
jerry_value_t stdout_prototype = jerry_create_object();
jerryxx_set_property(stdout_ctor, MSTR_PROTOTYPE, stdout_prototype);
jerryxx_set_property_function(stdout_prototype, MSTR_STREAM_WRITE,
stdout_write_fn);
jerry_release_value(stdout_prototype);

/* stream module exports */
jerry_value_t exports = jerry_create_object();
Expand Down
2 changes: 2 additions & 0 deletions src/modules/uart/module_uart.c
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,7 @@ JERRYXX_FUN(uart_write_fn) {
jerry_value_t port_value =
jerryxx_get_property(JERRYXX_GET_THIS, MSTR_UART_PORT);
if (!jerry_value_is_number(port_value)) {
jerry_release_value(port_value);
return jerry_create_error(
JERRY_ERROR_REFERENCE,
(const jerry_char_t *)"UART port is not initialized.");
Expand Down Expand Up @@ -196,6 +197,7 @@ JERRYXX_FUN(uart_close_fn) {
jerry_value_t port_value =
jerryxx_get_property(JERRYXX_GET_THIS, MSTR_UART_PORT);
if (!jerry_value_is_number(port_value)) {
jerry_release_value(port_value);
return jerry_create_error(
JERRY_ERROR_REFERENCE,
(const jerry_char_t *)"UART port is not initialized.");
Expand Down
Loading

0 comments on commit 8f4356d

Please sign in to comment.