carray 3.0.1 → 3.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +824 -0
- data/README.md +5 -6
- data/carray.gemspec +1 -1
- data/ext/ca_axis_dispatch.c +258 -4
- data/ext/ca_axis_group.c +368 -184
- data/ext/ca_binop_dispatch.c +54 -32
- data/ext/ca_binop_dispatch.h +1 -0
- data/ext/ca_categorical_iterator.c +90 -41
- data/ext/ca_compare.c +8 -2
- data/ext/ca_for_buffer.h +21 -68
- data/ext/ca_group_iter.c +27 -11
- data/ext/ca_kernel_iterator.c +960 -245
- data/ext/ca_kernel_iterator.h +352 -181
- data/ext/ca_monop_dispatch.c +4 -4
- data/ext/ca_monop_dispatch.h +4 -0
- data/ext/ca_obj_array.c +194 -42
- data/ext/ca_obj_bincmp.c +152 -121
- data/ext/ca_obj_binop.c +107 -210
- data/ext/ca_obj_bitarray.c +37 -24
- data/ext/ca_obj_bitfield.c +95 -62
- data/ext/ca_obj_block.c +5 -4
- data/ext/ca_obj_byte_swap.c +40 -40
- data/ext/ca_obj_const_string.c +180 -50
- data/ext/ca_obj_face.c +428 -62
- data/ext/ca_obj_face.h +107 -47
- data/ext/ca_obj_fake.c +21 -50
- data/ext/ca_obj_farray.c +1 -0
- data/ext/ca_obj_field.c +16 -3
- data/ext/ca_obj_fixlen_string.c +39 -26
- data/ext/ca_obj_grid.c +181 -124
- data/ext/ca_obj_meld.c +235 -55
- data/ext/ca_obj_moncmp.c +61 -61
- data/ext/ca_obj_monop.c +125 -107
- data/ext/ca_obj_object.c +551 -233
- data/ext/ca_obj_record.c +51 -16
- data/ext/ca_obj_reduce.c +5 -8
- data/ext/ca_obj_refer.c +117 -33
- data/ext/ca_obj_remap.c +57 -17
- data/ext/ca_obj_repeat.c +21 -5
- data/ext/ca_obj_roll.c +115 -11
- data/ext/ca_obj_select.c +88 -75
- data/ext/ca_obj_select_axis.c +58 -60
- data/ext/ca_obj_shift.c +22 -102
- data/ext/ca_obj_stack.c +223 -123
- data/ext/ca_obj_stride.c +267 -35
- data/ext/ca_obj_string.c +25 -22
- data/ext/ca_obj_tile.c +32 -16
- data/ext/ca_obj_time.c +23 -25
- data/ext/ca_obj_timedelta.c +21 -23
- data/ext/ca_obj_transpose.c +12 -3
- data/ext/ca_obj_triop.c +110 -117
- data/ext/ca_obj_window.c +157 -29
- data/ext/ca_op_ipower.c +25 -13
- data/ext/ca_op_powi.h +57 -30
- data/ext/ca_pow5_table.h +656 -0
- data/ext/ca_rng_normal.h +42 -0
- data/ext/ca_rng_xoshiro256pp.h +105 -0
- data/ext/ca_sort_kernels.h +70 -0
- data/ext/ca_sweep_engine.c +385 -198
- data/ext/ca_sweep_engine.h +31 -23
- data/ext/ca_triop_dispatch.c +4 -1
- data/ext/ca_triop_dispatch.h +5 -2
- data/ext/caframe_csv_reader.c +463 -0
- data/ext/carray.h +90 -28
- data/ext/carray_access.c +487 -231
- data/ext/carray_address_basis.c +731 -0
- data/ext/carray_attribute.c +45 -3
- data/ext/carray_bincount.c +32 -2
- data/ext/carray_broadcast.c +49 -17
- data/ext/carray_call_cfunc.c +667 -511
- data/ext/carray_cast.c +1556 -247
- data/ext/carray_cast_func.rb +34 -21
- data/ext/carray_conversion.c +197 -73
- data/ext/carray_copy.c +84 -38
- data/ext/carray_core.c +591 -119
- data/ext/carray_count.c +148 -96
- data/ext/carray_element.c +18 -27
- data/ext/carray_factorize.c +604 -291
- data/ext/carray_generate.c +76 -40
- data/ext/carray_histogram.c +152 -94
- data/ext/carray_hold.c +2 -1
- data/ext/carray_index_classifier.c +63 -96
- data/ext/carray_internal.h +400 -1
- data/ext/carray_lazy.c +834 -79
- data/ext/carray_loop.c +88 -66
- data/ext/carray_mask.c +705 -324
- data/ext/carray_math_kernel.h +1 -0
- data/ext/carray_median_percentile.c +263 -63
- data/ext/carray_memory_view.c +254 -248
- data/ext/carray_operator.c +1093 -363
- data/ext/carray_order.c +133 -69
- data/ext/carray_partition.c +102 -56
- data/ext/carray_random.c +582 -204
- data/ext/carray_scatter.c +308 -65
- data/ext/carray_segment.c +257 -0
- data/ext/carray_slab.c +183 -70
- data/ext/carray_sort.c +235 -240
- data/ext/carray_sort_kernel.c +8 -1
- data/ext/carray_struct.c +99 -21
- data/ext/carray_test.c +167 -64
- data/ext/carray_time_text.c +1182 -0
- data/ext/carray_utils.c +363 -98
- data/ext/extconf.rb +27 -2
- data/ext/mk_call_cfunc.rb +103 -118
- data/ext/mk_pow5_table.rb +35 -0
- data/ext/mkkernel.rb +1349 -851
- data/ext/ruby_carray.c +17 -2
- data/ext/version.h +4 -4
- data/ext/version.rb +4 -2
- data/lib/carray/attribute.rb +39 -0
- data/lib/carray/autoload_carray.rb +24 -3
- data/lib/carray/autoload_method_extension.rb +18 -0
- data/lib/carray/axis_group.rb +245 -20
- data/lib/carray/basics.rb +95 -25
- data/lib/carray/bincount_nd.rb +6 -0
- data/lib/carray/block_iterator.rb +200 -54
- data/lib/carray/boolean_reduce.rb +21 -29
- data/lib/carray/categorical.rb +244 -59
- data/lib/carray/categorical_iterator.rb +391 -757
- data/lib/carray/complex.rb +36 -29
- data/lib/carray/conditional.rb +94 -7
- data/lib/carray/const_string.rb +177 -27
- data/lib/carray/construct.rb +40 -0
- data/lib/carray/data_type_extension.rb +3 -0
- data/lib/carray/data_type_limits.rb +91 -0
- data/lib/carray/fixlen_string.rb +1 -1
- data/lib/carray/frame/concat.rb +157 -6
- data/lib/carray/frame/convert.rb +13 -7
- data/lib/carray/frame/csv_parser.rb +590 -76
- data/lib/carray/frame/describe.rb +79 -0
- data/lib/carray/frame/frame.rb +205 -35
- data/lib/carray/frame/group.rb +199 -40
- data/lib/carray/frame/io.rb +452 -60
- data/lib/carray/frame/join.rb +134 -46
- data/lib/carray/frame/records.rb +54 -19
- data/lib/carray/frame/reshape.rb +448 -0
- data/lib/carray/frame/sort.rb +26 -2
- data/lib/carray/frame/verbs.rb +726 -56
- data/lib/carray/frame.rb +2 -0
- data/lib/carray/fuse_source.rb +111 -2
- data/lib/carray/fusion.rb +229 -38
- data/lib/carray/inspect.rb +71 -20
- data/lib/carray/iterator.rb +157 -2
- data/lib/carray/lazy.rb +54 -67
- data/lib/carray/mask_gap_fill.rb +66 -50
- data/lib/carray/math.rb +32 -19
- data/lib/carray/meld_reduce.rb +40 -7
- data/lib/carray/methods/align_addr.rb +8 -4
- data/lib/carray/methods/bincount.rb +2 -2
- data/lib/carray/methods/bit_string.rb +14 -3
- data/lib/carray/methods/composition.rb +16 -10
- data/lib/carray/methods/discovery_along.rb +74 -0
- data/lib/carray/methods/factorize.rb +50 -0
- data/lib/carray/methods/gather_nd.rb +13 -2
- data/lib/carray/methods/insert_block.rb +9 -14
- data/lib/carray/methods/is_in.rb +130 -6
- data/lib/carray/methods/join.rb +1 -1
- data/lib/carray/methods/locate_addr.rb +235 -21
- data/lib/carray/methods/mask_duplicates.rb +35 -1
- data/lib/carray/methods/mode.rb +18 -1
- data/lib/carray/methods/nunique.rb +22 -1
- data/lib/carray/methods/repeat.rb +91 -0
- data/lib/carray/methods/resize.rb +21 -23
- data/lib/carray/methods/snap.rb +34 -12
- data/lib/carray/methods/unique.rb +52 -3
- data/lib/carray/record_order.rb +208 -0
- data/lib/carray/rng.rb +86 -0
- data/lib/carray/runtime.rb +14 -11
- data/lib/carray/segment_iterator.rb +990 -0
- data/lib/carray/serialize.rb +197 -27
- data/lib/carray/slab_iterator.rb +109 -40
- data/lib/carray/stack.rb +10 -4
- data/lib/carray/string_operation_extension.rb +9 -4
- data/lib/carray/struct.rb +142 -51
- data/lib/carray/struct_builder.rb +110 -14
- data/lib/carray/table.rb +2 -2
- data/lib/carray/time.rb +535 -105
- data/lib/carray/window_iterator.rb +259 -82
- data/lib/carray.rb +4 -2
- data/yard-stubs/ca_obj_array.rb +4 -4
- data/yard-stubs/ca_obj_bitarray.rb +7 -0
- data/yard-stubs/ca_obj_bitfield.rb +23 -12
- data/yard-stubs/ca_obj_block.rb +2 -7
- data/yard-stubs/ca_obj_fake.rb +1 -1
- data/yard-stubs/ca_obj_field.rb +1 -1
- data/yard-stubs/ca_obj_refer.rb +3 -3
- data/yard-stubs/ca_obj_roll.rb +0 -1
- data/yard-stubs/ca_obj_stride.rb +10 -7
- data/yard-stubs/ca_obj_transpose.rb +1 -1
- data/yard-stubs/ca_obj_window.rb +11 -4
- data/yard-stubs/carray_access.rb +6 -5
- data/yard-stubs/carray_broadcast.rb +2 -2
- data/yard-stubs/carray_cast.rb +78 -43
- data/yard-stubs/carray_conversion.rb +13 -1
- data/yard-stubs/carray_copy.rb +8 -3
- data/yard-stubs/carray_core.rb +3 -83
- data/yard-stubs/carray_count.rb +16 -2
- data/yard-stubs/carray_lazy.rb +210 -1
- data/yard-stubs/carray_loop.rb +4 -1
- data/yard-stubs/carray_mask.rb +34 -10
- data/yard-stubs/carray_math.rb +1499 -4
- data/yard-stubs/carray_median_percentile.rb +26 -8
- data/yard-stubs/carray_order.rb +43 -82
- data/yard-stubs/carray_scatter.rb +10 -3
- data/yard-stubs/carray_segment.rb +72 -0
- data/yard-stubs/carray_slab.rb +11 -8
- data/yard-stubs/carray_sort.rb +50 -8
- data/yard-stubs/carray_test.rb +10 -0
- data/yard-stubs/carray_utils.rb +0 -26
- metadata +19 -19
- data/ext/ca_for_each_element.h +0 -239
- data/ext/carray_build_flags.h +0 -3
- data/ext/carray_config.h +0 -28
- data/ext/carray_kernels_bincmp.c +0 -4446
- data/ext/carray_kernels_binop.c +0 -11001
- data/ext/carray_kernels_init.c +0 -1131
- data/ext/carray_kernels_map.c +0 -3467
- data/ext/carray_kernels_moncmp.c +0 -2097
- data/ext/carray_kernels_monop.c +0 -18313
- data/ext/carray_kernels_reduce_aggregate.c +0 -25837
- data/ext/carray_kernels_reduce_boolean.c +0 -330
- data/ext/carray_kernels_reduce_cumulative.c +0 -14593
- data/ext/carray_kernels_reduce_extreme.c +0 -16948
- data/ext/carray_kernels_reduce_variance.c +0 -3910
- data/ext/carray_kernels_scan.c +0 -3693
- data/ext/carray_kernels_search.c +0 -32138
- data/ext/carray_kernels_sort.c +0 -10626
- data/ext/carray_kernels_triop.c +0 -1392
data/ext/carray_copy.c
CHANGED
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
#include "carray.h"
|
|
12
12
|
#include "ca_obj_face.h" /* CA_FACE_LIFT_IF_FACE */
|
|
13
13
|
#include "carray_internal.h" /* ca_gc_hold_push / ca_gc_hold_pop_to */
|
|
14
|
+
#include "ca_sweep_engine.h" /* ca_sweep_same_shape / ca_sweep_refuse_shapes */
|
|
14
15
|
#include <stdarg.h>
|
|
15
16
|
|
|
16
17
|
/* ------------------------------------------------------------------- */
|
|
@@ -19,15 +20,48 @@
|
|
|
19
20
|
* and bytes as `ca`, copies the element payload, and reproduces the
|
|
20
21
|
* mask state. Always copies even when `ca` is an entity; for view
|
|
21
22
|
* sources the data path goes through `ca_copy_data`, otherwise a flat
|
|
22
|
-
* memcpy of `ca_length(ca)` bytes.
|
|
23
|
+
* memcpy of `ca_length(ca)` bytes. If reading the source raises, the
|
|
24
|
+
* copy is freed before the raise propagates.
|
|
23
25
|
*
|
|
24
26
|
* Backs `CArray#copy` and is also reachable as a C-level utility from
|
|
25
27
|
* other ext files that need an owned snapshot. */
|
|
28
|
+
void
|
|
29
|
+
ca_fill_or_free (CArray *co, VALUE (*fill)(VALUE), VALUE arg)
|
|
30
|
+
{
|
|
31
|
+
int tag = 0;
|
|
32
|
+
rb_protect(fill, arg, &tag);
|
|
33
|
+
if ( tag ) {
|
|
34
|
+
ca_free(co);
|
|
35
|
+
rb_jump_tag(tag);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
static VALUE
|
|
40
|
+
ca_copy_fill (VALUE arg)
|
|
41
|
+
{
|
|
42
|
+
CArray **pair = (CArray **) arg;
|
|
43
|
+
CArray *ca = pair[0], *co = pair[1];
|
|
44
|
+
|
|
45
|
+
if ( ca_is_attached(ca) ) {
|
|
46
|
+
memcpy(co->ptr, ca->ptr, ca_length(ca));
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
ca_copy_data(ca, co->ptr);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
ca_update_mask(ca);
|
|
53
|
+
if ( ca->mask ) {
|
|
54
|
+
ca_copy_mask(co, ca);
|
|
55
|
+
}
|
|
56
|
+
return Qnil;
|
|
57
|
+
}
|
|
58
|
+
|
|
26
59
|
CArray *
|
|
27
60
|
ca_copy (void *ap)
|
|
28
61
|
{
|
|
29
62
|
CArray *ca = (CArray *) ap;
|
|
30
63
|
CArray *co;
|
|
64
|
+
CArray *pair[2];
|
|
31
65
|
|
|
32
66
|
if ( ca_is_scalar(ca) ) {
|
|
33
67
|
co = (CArray *) cscalar_new(ca->data_type, ca->bytes, 0);
|
|
@@ -36,16 +70,26 @@ ca_copy (void *ap)
|
|
|
36
70
|
co = carray_new(ca->data_type, ca->ndim, ca->dim, ca->bytes, 0);
|
|
37
71
|
}
|
|
38
72
|
|
|
39
|
-
|
|
40
|
-
|
|
73
|
+
pair[0] = ca;
|
|
74
|
+
pair[1] = co;
|
|
75
|
+
|
|
76
|
+
/* Object cells read from a view that computes them exist only in
|
|
77
|
+
co->ptr, and copying the mask afterwards can build it -- a lazy
|
|
78
|
+
expression's mask is computed from its operands -- which allocates.
|
|
79
|
+
Hold them until the copy is complete. carray_new has filled the
|
|
80
|
+
cells with valid VALUEs. */
|
|
81
|
+
if ( ca_is_object_type(co) ) {
|
|
82
|
+
int tag = 0;
|
|
83
|
+
int guard = ca_gc_hold_push(co->ptr, co->elements);
|
|
84
|
+
rb_protect(ca_copy_fill, (VALUE) pair, &tag);
|
|
85
|
+
ca_gc_hold_pop_to(guard);
|
|
86
|
+
if ( tag ) {
|
|
87
|
+
ca_free(co);
|
|
88
|
+
rb_jump_tag(tag);
|
|
89
|
+
}
|
|
41
90
|
}
|
|
42
91
|
else {
|
|
43
|
-
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
ca_update_mask(ca);
|
|
47
|
-
if ( ca->mask ) {
|
|
48
|
-
ca_copy_mask(co, ca);
|
|
92
|
+
ca_fill_or_free(co, ca_copy_fill, (VALUE) pair);
|
|
49
93
|
}
|
|
50
94
|
|
|
51
95
|
return co;
|
|
@@ -53,7 +97,7 @@ ca_copy (void *ap)
|
|
|
53
97
|
|
|
54
98
|
/* Ruby entry for `CArray#copy`. Wraps `ca_copy` and, when `self` is a
|
|
55
99
|
* Face (e.g. CARecord), lifts the wrapped result so the derived class
|
|
56
|
-
* identity is preserved on the copy. */
|
|
100
|
+
* identity is preserved on the copy. The copy keeps self's attributes. */
|
|
57
101
|
VALUE
|
|
58
102
|
rb_ca_copy (VALUE self)
|
|
59
103
|
{
|
|
@@ -71,6 +115,7 @@ rb_ca_copy (VALUE self)
|
|
|
71
115
|
obj = ca_wrap_struct(co);
|
|
72
116
|
ca_gc_hold_pop_to(guard);
|
|
73
117
|
CA_FACE_LIFT_IF_FACE(obj, self, ca);
|
|
118
|
+
rb_ca_inherit_attr(obj, self);
|
|
74
119
|
return obj;
|
|
75
120
|
}
|
|
76
121
|
|
|
@@ -128,7 +173,7 @@ rb_ca_to_ca (int argc, VALUE *argv, VALUE self)
|
|
|
128
173
|
CArray *ca;
|
|
129
174
|
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
|
130
175
|
if ( ca_is_readonly(ca) ) {
|
|
131
|
-
rb_raise(rb_eRuntimeError, "can
|
|
176
|
+
rb_raise(rb_eRuntimeError, "can not modify read-only array");
|
|
132
177
|
}
|
|
133
178
|
}
|
|
134
179
|
return self;
|
|
@@ -194,9 +239,8 @@ ca_template_safe2 (void *ap, int8_t data_type, ca_size_t bytes)
|
|
|
194
239
|
* The arity dispatch matches `CArray.new` (ca_obj_array.c) so the two
|
|
195
240
|
* factories behave the same for block-driven initialisation. */
|
|
196
241
|
static VALUE
|
|
197
|
-
|
|
242
|
+
rb_ca_template_kw (int argc, VALUE *argv, VALUE ropt, VALUE self)
|
|
198
243
|
{
|
|
199
|
-
volatile VALUE ropt = rb_pop_options(&argc, &argv);
|
|
200
244
|
volatile VALUE obj, rtype, rbytes = Qnil;
|
|
201
245
|
CArray *ca, *co;
|
|
202
246
|
int8_t data_type;
|
|
@@ -230,10 +274,7 @@ rb_ca_template_method (int argc, VALUE *argv, VALUE self)
|
|
|
230
274
|
if ( co->ndim > 0 ) {
|
|
231
275
|
ca_size_t idx[CA_RANK_MAX];
|
|
232
276
|
volatile VALUE ridx = rb_ary_new2(co->ndim);
|
|
233
|
-
ca_attach(co);
|
|
234
277
|
rb_ca_index_walk(obj, co, 0, idx, ridx, CA_LOOP_STORE);
|
|
235
|
-
ca_sync(co);
|
|
236
|
-
ca_detach(co);
|
|
237
278
|
}
|
|
238
279
|
else {
|
|
239
280
|
volatile VALUE rval = rb_yield_values2(0, NULL);
|
|
@@ -257,6 +298,13 @@ rb_ca_template_method (int argc, VALUE *argv, VALUE self)
|
|
|
257
298
|
return obj;
|
|
258
299
|
}
|
|
259
300
|
|
|
301
|
+
static VALUE
|
|
302
|
+
rb_ca_template_method (int argc, VALUE *argv, VALUE self)
|
|
303
|
+
{
|
|
304
|
+
volatile VALUE ropt = rb_pop_options(&argc, &argv);
|
|
305
|
+
return rb_ca_template_kw(argc, argv, ropt, self);
|
|
306
|
+
}
|
|
307
|
+
|
|
260
308
|
VALUE
|
|
261
309
|
rb_ca_template (VALUE self)
|
|
262
310
|
{
|
|
@@ -266,22 +314,21 @@ rb_ca_template (VALUE self)
|
|
|
266
314
|
VALUE
|
|
267
315
|
rb_ca_template_with_type (VALUE self, VALUE rtype, VALUE rbytes)
|
|
268
316
|
{
|
|
269
|
-
VALUE ropt = rb_hash_new();
|
|
270
|
-
VALUE args[2] = { rtype, ropt };
|
|
317
|
+
volatile VALUE ropt = rb_hash_new();
|
|
271
318
|
rb_set_options(ropt, "bytes", rbytes);
|
|
272
|
-
return
|
|
319
|
+
return rb_ca_template_kw(1, &rtype, ropt, self);
|
|
273
320
|
}
|
|
274
321
|
|
|
275
|
-
/*
|
|
276
|
-
*
|
|
277
|
-
* size the output of vectorised scalar
|
|
278
|
-
*
|
|
322
|
+
/* Returns `template` of the first non-scalar among `n` variadic CArray
|
|
323
|
+
* arguments (of the first argument when all are scalars). Used by
|
|
324
|
+
* `carray_call_cfunc.c` to size the output of vectorised scalar
|
|
325
|
+
* C-function calls: a scalar pairs with any array, two arrays only when
|
|
326
|
+
* their shapes agree. */
|
|
279
327
|
VALUE
|
|
280
328
|
rb_ca_template_n (int n, ...)
|
|
281
329
|
{
|
|
282
|
-
volatile VALUE varg, obj;
|
|
283
|
-
CArray *ca;
|
|
284
|
-
ca_size_t elements = -1;
|
|
330
|
+
volatile VALUE varg, obj = Qnil;
|
|
331
|
+
CArray *ca, *donor = NULL;
|
|
285
332
|
va_list vargs;
|
|
286
333
|
int i;
|
|
287
334
|
|
|
@@ -289,24 +336,23 @@ rb_ca_template_n (int n, ...)
|
|
|
289
336
|
for (i=0; i<n; i++) {
|
|
290
337
|
varg = va_arg(vargs, VALUE);
|
|
291
338
|
if ( ! rb_obj_is_carray(varg) ) {
|
|
339
|
+
va_end(vargs);
|
|
292
340
|
rb_raise(rb_eRuntimeError, "[BUG] not-carray object given to rb_ca_template_n");
|
|
293
341
|
}
|
|
294
342
|
TypedData_Get_Struct(varg, CArray, &carray_data_type, ca);
|
|
295
343
|
if ( i == 0 ) {
|
|
296
344
|
obj = varg;
|
|
297
|
-
elements = ca->elements;
|
|
298
345
|
}
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
}
|
|
346
|
+
if ( ca_is_scalar(ca) ) {
|
|
347
|
+
continue;
|
|
348
|
+
}
|
|
349
|
+
if ( ! donor ) {
|
|
350
|
+
donor = ca;
|
|
351
|
+
obj = varg;
|
|
352
|
+
}
|
|
353
|
+
else if ( ! ca_sweep_same_shape(donor, ca) ) {
|
|
354
|
+
va_end(vargs);
|
|
355
|
+
ca_sweep_refuse_shapes(donor, ca);
|
|
310
356
|
}
|
|
311
357
|
}
|
|
312
358
|
va_end(vargs);
|