Branch data Line data Source code
1 : : // This file is a part of Julia. License is MIT: https://julialang.org/license 2 : : 3 : : #include <stdlib.h> 4 : : #include <string.h> 5 : : #include <stdarg.h> 6 : : #include "julia.h" 7 : : #include "julia_internal.h" 8 : : #include "julia_assert.h" 9 : : 10 : 34 : JL_DLLEXPORT jl_svec_t *(ijl_svec)(size_t n, ...) 11 : : { 12 : : va_list args; 13 [ - + ]: 34 : if (n == 0) return jl_emptysvec; 14 : 34 : va_start(args, n); 15 : 34 : jl_svec_t *jv = jl_alloc_svec_uninit(n); 16 [ + + ]: 226 : for (size_t i = 0; i < n; i++) 17 : 192 : jl_svecset(jv, i, va_arg(args, jl_value_t*)); 18 : 34 : va_end(args); 19 : 34 : return jv; 20 : : } 21 : : 22 : 37 : jl_svec_t *(jl_perm_symsvec)(size_t n, ...) 23 : : { 24 [ - + ]: 37 : if (n == 0) return jl_emptysvec; 25 : 37 : jl_svec_t *jv = (jl_svec_t*)jl_gc_permobj((n + 1) * sizeof(void*), jl_simplevector_type); 26 : 37 : jl_svec_set_len_unsafe(jv, n); 27 : : va_list args; 28 : 37 : va_start(args, n); 29 [ + + ]: 233 : for (size_t i = 0; i < n; i++) 30 : 196 : jl_svecset(jv, i, jl_symbol(va_arg(args, const char*))); 31 : 37 : va_end(args); 32 : 37 : return jv; 33 : : } 34 : : 35 : 7 : JL_DLLEXPORT jl_svec_t *jl_svec1(void *a) 36 : : { 37 : 7 : jl_task_t *ct = jl_current_task; 38 : 7 : jl_svec_t *v = (jl_svec_t*)jl_gc_alloc(ct->ptls, sizeof(void*) * 2, 39 : : jl_simplevector_type); 40 : 7 : jl_svec_set_len_unsafe(v, 1); 41 : 7 : jl_svec_data(v)[0] = (jl_value_t*)a; 42 : 7 : return v; 43 : : } 44 : : 45 : 6416 : JL_DLLEXPORT jl_svec_t *jl_svec2(void *a, void *b) 46 : : { 47 : 6416 : jl_task_t *ct = jl_current_task; 48 : 6416 : jl_svec_t *v = (jl_svec_t*)jl_gc_alloc(ct->ptls, sizeof(void*) * 3, 49 : : jl_simplevector_type); 50 : 6416 : jl_svec_set_len_unsafe(v, 2); 51 : 6416 : jl_svec_data(v)[0] = (jl_value_t*)a; 52 : 6416 : jl_svec_data(v)[1] = (jl_value_t*)b; 53 : 6416 : return v; 54 : : } 55 : : 56 : 84843600 : JL_DLLEXPORT jl_svec_t *jl_alloc_svec_uninit(size_t n) 57 : : { 58 : 84843600 : jl_task_t *ct = jl_current_task; 59 [ + + ]: 84843600 : if (n == 0) return jl_emptysvec; 60 : 84738800 : jl_svec_t *jv = (jl_svec_t*)jl_gc_alloc(ct->ptls, (n + 1) * sizeof(void*), 61 : : jl_simplevector_type); 62 : 84738800 : jl_svec_set_len_unsafe(jv, n); 63 : 84738800 : return jv; 64 : : } 65 : : 66 : 316199000 : JL_DLLEXPORT jl_svec_t *jl_alloc_svec(size_t n) 67 : : { 68 [ + + ]: 316199000 : if (n == 0) return jl_emptysvec; 69 : 65099800 : jl_svec_t *jv = jl_alloc_svec_uninit(n); 70 : 65099800 : memset(jl_assume_aligned(jl_svec_data(jv), sizeof(void*)), 0, n * sizeof(void*)); 71 : 65099800 : return jv; 72 : : } 73 : : 74 : 269632 : JL_DLLEXPORT jl_svec_t *jl_svec_copy(jl_svec_t *a) 75 : : { 76 : 269632 : size_t n = jl_svec_len(a); 77 : 269632 : jl_svec_t *c = jl_alloc_svec_uninit(n); 78 : 269632 : memmove_refs((void**)jl_svec_data(c), (void**)jl_svec_data(a), n); 79 : 269632 : return c; 80 : : } 81 : : 82 : 6463 : JL_DLLEXPORT jl_svec_t *jl_svec_fill(size_t n, jl_value_t *x) 83 : : { 84 [ + + ]: 6463 : if (n == 0) return jl_emptysvec; 85 : 5181 : jl_svec_t *v = jl_alloc_svec_uninit(n); 86 [ + + ]: 14760 : for (size_t i = 0; i < n; i++) 87 : 9579 : jl_svec_data(v)[i] = x; 88 : 5181 : return v; 89 : : } 90 : : 91 : 0 : JL_DLLEXPORT size_t (jl_svec_len)(jl_svec_t *t) JL_NOTSAFEPOINT 92 : : { 93 : 0 : return jl_svec_len(t); 94 : : } 95 : : 96 : 0 : JL_DLLEXPORT int8_t jl_svec_isassigned(jl_svec_t *t JL_PROPAGATES_ROOT, ssize_t i) JL_NOTSAFEPOINT 97 : : { 98 : 0 : return jl_svecref(t, (size_t)i) != NULL; 99 : : } 100 : : 101 : 15263 : JL_DLLEXPORT jl_value_t *jl_svec_ref(jl_svec_t *t JL_PROPAGATES_ROOT, ssize_t i) 102 : : { 103 : 15263 : jl_value_t *v = jl_svecref(t, (size_t)i); 104 [ - + ]: 15263 : if (__unlikely(v == NULL)) 105 : 0 : jl_throw(jl_undefref_exception); 106 : 15263 : return v; 107 : : }