summaryrefslogtreecommitdiffstats
path: root/builtin.c
diff options
context:
space:
mode:
authorNicolas Williams <nico@cryptonector.com>2014-06-07 21:43:30 -0500
committerNicolas Williams <nico@cryptonector.com>2014-06-07 21:43:30 -0500
commit6856ab8a69505e76939ae4926cb7f7eea7156eb6 (patch)
tree82d0ef79d91bdb9344ed7bc1519d239764a171c0 /builtin.c
parent8212750fe9ac4ca130432fed0be8976faaae453e (diff)
String * number should be commutative
Diffstat (limited to 'builtin.c')
-rw-r--r--builtin.c26
1 files changed, 18 insertions, 8 deletions
diff --git a/builtin.c b/builtin.c
index c54a47c7..83d28dec 100644
--- a/builtin.c
+++ b/builtin.c
@@ -156,23 +156,33 @@ static jv f_minus(jv input, jv a, jv b) {
}
static jv f_multiply(jv input, jv a, jv b) {
+ jv_kind ak = jv_get_kind(a);
+ jv_kind bk = jv_get_kind(b);
jv_free(input);
- if (jv_get_kind(a) == JV_KIND_NUMBER && jv_get_kind(b) == JV_KIND_NUMBER) {
+ if (ak == JV_KIND_NUMBER && bk == JV_KIND_NUMBER) {
return jv_number(jv_number_value(a) * jv_number_value(b));
- } else if (jv_get_kind(a) == JV_KIND_STRING && jv_get_kind(b) == JV_KIND_NUMBER) {
+ } else if ((ak == JV_KIND_STRING && bk == JV_KIND_NUMBER) ||
+ (ak == JV_KIND_NUMBER && bk == JV_KIND_STRING)) {
+ jv str = a;
+ jv num = b;
+ if (ak == JV_KIND_NUMBER) {
+ str = b;
+ num = a;
+ }
int n;
- size_t alen = jv_string_length_bytes(jv_copy(a));
- jv res = a;
+ size_t alen = jv_string_length_bytes(jv_copy(str));
+ jv res = str;
- for (n = jv_number_value(b) - 1; n > 0; n--)
- res = jv_string_append_buf(res, jv_string_value(a), alen);
+ for (n = jv_number_value(num) - 1; n > 0; n--)
+ res = jv_string_append_buf(res, jv_string_value(str), alen);
+ jv_free(num);
if (n < 0) {
- jv_free(a);
+ jv_free(str);
return jv_null();
}
return res;
- } else if (jv_get_kind(a) == JV_KIND_OBJECT && jv_get_kind(b) == JV_KIND_OBJECT) {
+ } else if (ak == JV_KIND_OBJECT && bk == JV_KIND_OBJECT) {
return jv_object_merge_recursive(a, b);
} else {
return type_error2(a, b, "cannot be multiplied");