String * number should be commutative
This commit is contained in:
1 parent
8212750fe9
commit
6856ab8a69
1 file changed
+18
-8
@@ -156,23 +156,33 @@ static jv f_minus(jv input, jv a, jv b) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static jv f_multiply(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);
|
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));
|
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;
|
int n;
|
||||||
size_t alen = jv_string_length_bytes(jv_copy(a));
|
size_t alen = jv_string_length_bytes(jv_copy(str));
|
||||||
jv res = a;
|
jv res = str;
|
||||||
|
|
||||||
for (n = jv_number_value(b) - 1; n > 0; n--)
|
for (n = jv_number_value(num) - 1; n > 0; n--)
|
||||||
res = jv_string_append_buf(res, jv_string_value(a), alen);
|
res = jv_string_append_buf(res, jv_string_value(str), alen);
|
||||||
|
|
||||||
|
jv_free(num);
|
||||||
if (n < 0) {
|
if (n < 0) {
|
||||||
jv_free(a);
|
jv_free(str);
|
||||||
return jv_null();
|
return jv_null();
|
||||||
}
|
}
|
||||||
return res;
|
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);
|
return jv_object_merge_recursive(a, b);
|
||||||
} else {
|
} else {
|
||||||
return type_error2(a, b, "cannot be multiplied");
|
return type_error2(a, b, "cannot be multiplied");
|
||||||
|
|||||||
Reference in new issue
Block a user