|
|
@@ -2855,6 +2855,68 @@ qi_value_t *qi_mul(qi_state_t *state, qi_value_t *a, qi_value_t *b) {
|
|
|
qi_buffer_append_str(buffer, a->value.string);
|
|
|
|
|
|
return qi_make_string(state, qi_buffer_read(buffer));
|
|
|
+ } else if ((a->type == QI_LIST || a->type == QI_TUPLE) && b->type == QI_NUMBER) {
|
|
|
+ qi_size_t n = (qi_size_t)fabs(b->value.number);
|
|
|
+
|
|
|
+ if (a->type == QI_TUPLE && n == 1)
|
|
|
+ return a;
|
|
|
+
|
|
|
+ if (a->type == QI_LIST)
|
|
|
+ qi_mutex_lock(a->mutex);
|
|
|
+
|
|
|
+ qi_size_t l = a->value.list->length;
|
|
|
+ qi_list_t *r = NULL;
|
|
|
+
|
|
|
+ if (l < 1 || n < 1) {
|
|
|
+ if (a->type == QI_TUPLE)
|
|
|
+ return state->empty_tuple;
|
|
|
+
|
|
|
+ goto empty;
|
|
|
+ }
|
|
|
+
|
|
|
+ qi_size_t rl = l * n;
|
|
|
+
|
|
|
+ r = qi_list_make_n(rl);
|
|
|
+
|
|
|
+ for (qi_size_t i = 0, j = 0; i < rl; i++) {
|
|
|
+ r->data[i] = a->value.list->data[j];
|
|
|
+
|
|
|
+ j++;
|
|
|
+
|
|
|
+ if (j >= l)
|
|
|
+ j = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+empty:
|
|
|
+ if (a->type == QI_LIST)
|
|
|
+ qi_mutex_unlock(a->mutex);
|
|
|
+
|
|
|
+ return a->type == QI_LIST? qi_make_list(state, r): qi_make_tuple(state, r);
|
|
|
+ } else if (a->type == QI_BYTES && b->type == QI_NUMBER) {
|
|
|
+ qi_size_t n = (qi_size_t)fabs(b->value.number);
|
|
|
+
|
|
|
+ if (n == 1)
|
|
|
+ return a;
|
|
|
+ else if (n < 1)
|
|
|
+ return state->empty_bytes;
|
|
|
+
|
|
|
+ qi_size_t l = a->value.bytes->size;
|
|
|
+ if (l < 1)
|
|
|
+ return state->empty_bytes;
|
|
|
+
|
|
|
+ qi_size_t rl = l * n;
|
|
|
+ unsigned char *r = qi_malloc_atomic(rl);
|
|
|
+
|
|
|
+ for (qi_size_t i = 0, j = 0; i < rl; i++) {
|
|
|
+ r[i] = a->value.bytes->data[j];
|
|
|
+
|
|
|
+ j++;
|
|
|
+
|
|
|
+ if (j >= l)
|
|
|
+ j = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ return qi_make_bytes(state, r, rl);
|
|
|
}
|
|
|
|
|
|
leave:
|
|
|
@@ -3812,7 +3874,7 @@ qi_value_t *qi_builtin_fread(qi_state_t *state, qi_size_t pargc,
|
|
|
} else
|
|
|
size = (qi_size_t)(b->value.number);
|
|
|
|
|
|
- unsigned char *data = qi_malloc(size);
|
|
|
+ unsigned char *data = qi_malloc_atomic(size);
|
|
|
|
|
|
qi_size_t count = fread(data, sizeof(unsigned char), size, a->value.file.fd);
|
|
|
|