txlyre 6 小時之前
父節點
當前提交
0ee0b72e63
共有 1 個文件被更改,包括 63 次插入1 次删除
  1. 63 1
      qirt.c

+ 63 - 1
qirt.c

@@ -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);