Skip to content

Implement String.prototype.trim() #191

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Closed
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
Implement String.prototype.trim()
JerryScript-DCO-1.0-Signed-off-by: Laszlo Vidacs lvidacs.u-szeged@partner.samsung.com
  • Loading branch information
lvidacs committed Jun 23, 2015
commit a0a09eb0c73ed9ea9ae019db61ff0160cf69f1bf
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
* limitations under the License.
*/

#include <ctype.h>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AFAIK: we usually use the jrt-libc-include.h and not directly the ctype.h/other libc headers.

#include "ecma-alloc.h"
#include "ecma-builtins.h"
#include "ecma-conversion.h"
Expand Down Expand Up @@ -554,7 +555,62 @@ ecma_builtin_string_prototype_object_to_locale_upper_case (ecma_value_t this_arg
static ecma_completion_value_t
ecma_builtin_string_prototype_object_trim (ecma_value_t this_arg) /**< this argument */
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add tests for trim, please.

Like from here:

var orig = '   foo  ';
console.log(orig.trim());

var orig = 'foo    ';
console.log(orig.trim()); // 'foo'

{
ECMA_BUILTIN_CP_UNIMPLEMENTED (this_arg);
ecma_completion_value_t ret_value = ecma_make_empty_completion_value ();

/* 1 */
ECMA_TRY_CATCH (check_coercible_val,
ecma_op_check_object_coercible (this_arg),
ret_value);

/* 2 */
ECMA_TRY_CATCH (to_string_val,
ecma_op_to_string (this_arg),
ret_value);

ecma_string_t *original_string_p = ecma_get_string_from_value (to_string_val);
JERRY_ASSERT (ecma_string_get_length (original_string_p) >= 0);

/* 3 */
const uint32_t len = (uint32_t) ecma_string_get_length (original_string_p);

uint32_t prefix = 0, postfix = 0;
uint32_t new_len = 0;

while (prefix < len &&
ecma_is_completion_value_empty (ret_value) &&
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we really need to test the ret_value here?

isspace (ecma_string_get_char_at_pos (original_string_p, prefix)))
{
prefix++;
}

while (postfix < len &&
ecma_is_completion_value_empty (ret_value) &&
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we really need to test the ret_value here?

isspace (ecma_string_get_char_at_pos (original_string_p, len-postfix-1)))
{
postfix++;
}

new_len = len - prefix - postfix;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What happens if the whole string is filled only with white spaces?


MEM_DEFINE_LOCAL_ARRAY (new_str_buffer, new_len + 1, ecma_char_t);

for (uint32_t idx = 0; idx < new_len; ++idx)
{
new_str_buffer[idx] = ecma_string_get_char_at_pos (original_string_p, idx + prefix);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In this function there are 3 calls to the ecma_string_get_char_at_pos method and each of them are in a loop. Sadly the ecma_string_get_char_at_pos method is really expensive: It will copy out the string into a buffer and get the element at the given position. We should avoid calling this method to often, so I think a better solution would be that we convert the whole ecma_string_t into a zt string (just like in the _char_at_pos method) and work on it directly.

}

new_str_buffer[new_len] = '\0';
ecma_string_t *new_str_p = ecma_new_ecma_string ((ecma_char_t *) new_str_buffer);

/* 4 */
ret_value = ecma_make_normal_completion_value (ecma_make_string_value (new_str_p));

MEM_FINALIZE_LOCAL_ARRAY (new_str_buffer);

ECMA_FINALIZE (to_string_val);
ECMA_FINALIZE (check_coercible_val);

return ret_value;
} /* ecma_builtin_string_prototype_object_trim */

/**
Expand Down