Skip to content

Commit 9c4cbe2

Browse files
committed
py: Make tuple and list use mp_int_t/mp_uint_t.
Part of code cleanup, to resolve issue adafruit#50.
1 parent 93965e7 commit 9c4cbe2

File tree

10 files changed

+52
-52
lines changed

10 files changed

+52
-52
lines changed

py/builtinimport.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ STATIC mp_import_stat_t stat_dir_or_file(vstr_t *path) {
7070

7171
STATIC mp_import_stat_t find_file(const char *file_str, uint file_len, vstr_t *dest) {
7272
// extract the list of paths
73-
uint path_num = 0;
73+
mp_uint_t path_num = 0;
7474
mp_obj_t *path_items;
7575
#if MICROPY_PY_SYS
7676
mp_obj_list_get(mp_sys_path, &path_num, &path_items);

py/obj.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,7 @@ void mp_obj_get_complex(mp_obj_t arg, mp_float_t *real, mp_float_t *imag) {
308308
#endif
309309
#endif
310310

311-
void mp_obj_get_array(mp_obj_t o, uint *len, mp_obj_t **items) {
311+
void mp_obj_get_array(mp_obj_t o, mp_uint_t *len, mp_obj_t **items) {
312312
if (MP_OBJ_IS_TYPE(o, &mp_type_tuple)) {
313313
mp_obj_tuple_get(o, len, items);
314314
} else if (MP_OBJ_IS_TYPE(o, &mp_type_list)) {
@@ -318,9 +318,9 @@ void mp_obj_get_array(mp_obj_t o, uint *len, mp_obj_t **items) {
318318
}
319319
}
320320

321-
void mp_obj_get_array_fixed_n(mp_obj_t o, uint len, mp_obj_t **items) {
321+
void mp_obj_get_array_fixed_n(mp_obj_t o, mp_uint_t len, mp_obj_t **items) {
322322
if (MP_OBJ_IS_TYPE(o, &mp_type_tuple) || MP_OBJ_IS_TYPE(o, &mp_type_list)) {
323-
uint seq_len;
323+
mp_uint_t seq_len;
324324
if (MP_OBJ_IS_TYPE(o, &mp_type_tuple)) {
325325
mp_obj_tuple_get(o, &seq_len, items);
326326
} else {
@@ -335,7 +335,7 @@ void mp_obj_get_array_fixed_n(mp_obj_t o, uint len, mp_obj_t **items) {
335335
}
336336

337337
// is_slice determines whether the index is a slice index
338-
uint mp_get_index(const mp_obj_type_t *type, mp_uint_t len, mp_obj_t index, bool is_slice) {
338+
mp_uint_t mp_get_index(const mp_obj_type_t *type, mp_uint_t len, mp_obj_t index, bool is_slice) {
339339
mp_int_t i;
340340
if (MP_OBJ_IS_SMALL_INT(index)) {
341341
i = MP_OBJ_SMALL_INT_VALUE(index);

py/obj.h

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -384,8 +384,8 @@ mp_obj_t mp_obj_new_fun_viper(mp_uint_t n_args, void *fun_data, mp_uint_t type_s
384384
mp_obj_t mp_obj_new_fun_asm(mp_uint_t n_args, void *fun_data);
385385
mp_obj_t mp_obj_new_gen_wrap(mp_obj_t fun);
386386
mp_obj_t mp_obj_new_closure(mp_obj_t fun, uint n_closed, const mp_obj_t *closed);
387-
mp_obj_t mp_obj_new_tuple(uint n, const mp_obj_t *items);
388-
mp_obj_t mp_obj_new_list(uint n, mp_obj_t *items);
387+
mp_obj_t mp_obj_new_tuple(mp_uint_t n, const mp_obj_t *items);
388+
mp_obj_t mp_obj_new_list(mp_uint_t n, mp_obj_t *items);
389389
mp_obj_t mp_obj_new_dict(mp_uint_t n_args);
390390
mp_obj_t mp_obj_new_set(mp_uint_t n_args, mp_obj_t *items);
391391
mp_obj_t mp_obj_new_slice(mp_obj_t start, mp_obj_t stop, mp_obj_t step);
@@ -425,9 +425,9 @@ mp_float_t mp_obj_get_float(mp_obj_t self_in);
425425
void mp_obj_get_complex(mp_obj_t self_in, mp_float_t *real, mp_float_t *imag);
426426
#endif
427427
//qstr mp_obj_get_qstr(mp_obj_t arg);
428-
void mp_obj_get_array(mp_obj_t o, uint *len, mp_obj_t **items);
429-
void mp_obj_get_array_fixed_n(mp_obj_t o, uint len, mp_obj_t **items);
430-
uint mp_get_index(const mp_obj_type_t *type, mp_uint_t len, mp_obj_t index, bool is_slice);
428+
void mp_obj_get_array(mp_obj_t o, mp_uint_t *len, mp_obj_t **items);
429+
void mp_obj_get_array_fixed_n(mp_obj_t o, mp_uint_t len, mp_obj_t **items);
430+
mp_uint_t mp_get_index(const mp_obj_type_t *type, mp_uint_t len, mp_obj_t index, bool is_slice);
431431
mp_obj_t mp_obj_len(mp_obj_t o_in);
432432
mp_obj_t mp_obj_len_maybe(mp_obj_t o_in); /* may return MP_OBJ_NULL */
433433
mp_obj_t mp_obj_subscr(mp_obj_t base, mp_obj_t index, mp_obj_t val);
@@ -490,16 +490,16 @@ mp_obj_t mp_obj_complex_binary_op(mp_uint_t op, mp_float_t lhs_real, mp_float_t
490490
#endif
491491

492492
// tuple
493-
void mp_obj_tuple_get(mp_obj_t self_in, uint *len, mp_obj_t **items);
493+
void mp_obj_tuple_get(mp_obj_t self_in, mp_uint_t *len, mp_obj_t **items);
494494
void mp_obj_tuple_del(mp_obj_t self_in);
495495
mp_int_t mp_obj_tuple_hash(mp_obj_t self_in);
496496

497497
// list
498498
struct _mp_obj_list_t;
499-
void mp_obj_list_init(struct _mp_obj_list_t *o, uint n);
499+
void mp_obj_list_init(struct _mp_obj_list_t *o, mp_uint_t n);
500500
mp_obj_t mp_obj_list_append(mp_obj_t self_in, mp_obj_t arg);
501-
void mp_obj_list_get(mp_obj_t self_in, uint *len, mp_obj_t **items);
502-
void mp_obj_list_set_len(mp_obj_t self_in, uint len);
501+
void mp_obj_list_get(mp_obj_t self_in, mp_uint_t *len, mp_obj_t **items);
502+
void mp_obj_list_set_len(mp_obj_t self_in, mp_uint_t len);
503503
void mp_obj_list_store(mp_obj_t self_in, mp_obj_t index, mp_obj_t value);
504504
mp_obj_t mp_obj_list_sort(mp_uint_t n_args, const mp_obj_t *args, mp_map_t *kwargs);
505505

py/objexcept.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -464,7 +464,7 @@ void mp_obj_exception_get_traceback(mp_obj_t self_in, mp_uint_t *n, mp_uint_t **
464464
*n = 0;
465465
*values = NULL;
466466
} else {
467-
uint n2;
467+
mp_uint_t n2;
468468
mp_obj_list_get(self->traceback, &n2, (mp_obj_t**)values);
469469
*n = n2;
470470
}

py/objlist.c

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@
3636
#include "runtime.h"
3737
#include "objlist.h"
3838

39-
STATIC mp_obj_t mp_obj_new_list_iterator(mp_obj_list_t *list, int cur);
40-
STATIC mp_obj_list_t *list_new(uint n);
39+
STATIC mp_obj_t mp_obj_new_list_iterator(mp_obj_list_t *list, mp_uint_t cur);
40+
STATIC mp_obj_list_t *list_new(mp_uint_t n);
4141
STATIC mp_obj_t list_extend(mp_obj_t self_in, mp_obj_t arg_in);
4242
STATIC mp_obj_t list_pop(mp_uint_t n_args, const mp_obj_t *args);
4343

@@ -50,7 +50,7 @@ STATIC mp_obj_t list_pop(mp_uint_t n_args, const mp_obj_t *args);
5050
STATIC void list_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t o_in, mp_print_kind_t kind) {
5151
mp_obj_list_t *o = o_in;
5252
print(env, "[");
53-
for (int i = 0; i < o->len; i++) {
53+
for (mp_uint_t i = 0; i < o->len; i++) {
5454
if (i > 0) {
5555
print(env, ", ");
5656
}
@@ -188,7 +188,7 @@ STATIC mp_obj_t list_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) {
188188
return res;
189189
}
190190
#endif
191-
uint index_val = mp_get_index(self->base.type, self->len, index, false);
191+
mp_uint_t index_val = mp_get_index(self->base.type, self->len, index, false);
192192
return self->items[index_val];
193193
} else {
194194
#if MICROPY_PY_BUILTINS_SLICE
@@ -271,7 +271,7 @@ STATIC mp_obj_t list_pop(mp_uint_t n_args, const mp_obj_t *args) {
271271
if (self->len == 0) {
272272
nlr_raise(mp_obj_new_exception_msg(&mp_type_IndexError, "pop from empty list"));
273273
}
274-
uint index = mp_get_index(self->base.type, self->len, n_args == 1 ? MP_OBJ_NEW_SMALL_INT(-1) : args[1], false);
274+
mp_uint_t index = mp_get_index(self->base.type, self->len, n_args == 1 ? MP_OBJ_NEW_SMALL_INT(-1) : args[1], false);
275275
mp_obj_t ret = self->items[index];
276276
self->len -= 1;
277277
memmove(self->items + index, self->items + index + 1, (self->len - index) * sizeof(mp_obj_t));
@@ -286,7 +286,7 @@ STATIC mp_obj_t list_pop(mp_uint_t n_args, const mp_obj_t *args) {
286286

287287
// TODO make this conform to CPython's definition of sort
288288
STATIC void mp_quicksort(mp_obj_t *head, mp_obj_t *tail, mp_obj_t key_fn, bool reversed) {
289-
int op = reversed ? MP_BINARY_OP_MORE : MP_BINARY_OP_LESS;
289+
mp_uint_t op = reversed ? MP_BINARY_OP_MORE : MP_BINARY_OP_LESS;
290290
while (head < tail) {
291291
mp_obj_t *h = head - 1;
292292
mp_obj_t *t = tail;
@@ -442,37 +442,37 @@ const mp_obj_type_t mp_type_list = {
442442
.locals_dict = (mp_obj_t)&list_locals_dict,
443443
};
444444

445-
void mp_obj_list_init(mp_obj_list_t *o, uint n) {
445+
void mp_obj_list_init(mp_obj_list_t *o, mp_uint_t n) {
446446
o->base.type = &mp_type_list;
447447
o->alloc = n < LIST_MIN_ALLOC ? LIST_MIN_ALLOC : n;
448448
o->len = n;
449449
o->items = m_new(mp_obj_t, o->alloc);
450450
mp_seq_clear(o->items, n, o->alloc, sizeof(*o->items));
451451
}
452452

453-
STATIC mp_obj_list_t *list_new(uint n) {
453+
STATIC mp_obj_list_t *list_new(mp_uint_t n) {
454454
mp_obj_list_t *o = m_new_obj(mp_obj_list_t);
455455
mp_obj_list_init(o, n);
456456
return o;
457457
}
458458

459-
mp_obj_t mp_obj_new_list(uint n, mp_obj_t *items) {
459+
mp_obj_t mp_obj_new_list(mp_uint_t n, mp_obj_t *items) {
460460
mp_obj_list_t *o = list_new(n);
461461
if (items != NULL) {
462-
for (int i = 0; i < n; i++) {
462+
for (mp_uint_t i = 0; i < n; i++) {
463463
o->items[i] = items[i];
464464
}
465465
}
466466
return o;
467467
}
468468

469-
void mp_obj_list_get(mp_obj_t self_in, uint *len, mp_obj_t **items) {
469+
void mp_obj_list_get(mp_obj_t self_in, mp_uint_t *len, mp_obj_t **items) {
470470
mp_obj_list_t *self = self_in;
471471
*len = self->len;
472472
*items = self->items;
473473
}
474474

475-
void mp_obj_list_set_len(mp_obj_t self_in, uint len) {
475+
void mp_obj_list_set_len(mp_obj_t self_in, mp_uint_t len) {
476476
// trust that the caller knows what it's doing
477477
// TODO realloc if len got much smaller than alloc
478478
mp_obj_list_t *self = self_in;
@@ -481,7 +481,7 @@ void mp_obj_list_set_len(mp_obj_t self_in, uint len) {
481481

482482
void mp_obj_list_store(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) {
483483
mp_obj_list_t *self = self_in;
484-
uint i = mp_get_index(self->base.type, self->len, index, false);
484+
mp_uint_t i = mp_get_index(self->base.type, self->len, index, false);
485485
self->items[i] = value;
486486
}
487487

@@ -512,7 +512,7 @@ STATIC const mp_obj_type_t mp_type_list_it = {
512512
.iternext = list_it_iternext,
513513
};
514514

515-
mp_obj_t mp_obj_new_list_iterator(mp_obj_list_t *list, int cur) {
515+
mp_obj_t mp_obj_new_list_iterator(mp_obj_list_t *list, mp_uint_t cur) {
516516
mp_obj_list_it_t *o = m_new_obj(mp_obj_list_it_t);
517517
o->base.type = &mp_type_list_it;
518518
o->list = list;

py/objstr.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,7 @@ mp_obj_t mp_obj_str_binary_op(mp_uint_t op, mp_obj_t lhs_in, mp_obj_t rhs_in) {
307307

308308
case MP_BINARY_OP_MODULO: {
309309
mp_obj_t *args;
310-
uint n_args;
310+
mp_uint_t n_args;
311311
mp_obj_t dict = MP_OBJ_NULL;
312312
if (MP_OBJ_IS_TYPE(rhs_in, &mp_type_tuple)) {
313313
// TODO: Support tuple subclasses?
@@ -394,7 +394,7 @@ STATIC mp_obj_t str_join(mp_obj_t self_in, mp_obj_t arg) {
394394
GET_STR_DATA_LEN(self_in, sep_str, sep_len);
395395

396396
// process args
397-
uint seq_len;
397+
mp_uint_t seq_len;
398398
mp_obj_t *seq_items;
399399
if (MP_OBJ_IS_TYPE(arg, &mp_type_tuple)) {
400400
mp_obj_tuple_get(arg, &seq_len, &seq_items);

py/objtuple.c

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -36,15 +36,15 @@
3636
#include "runtime.h"
3737
#include "objtuple.h"
3838

39-
STATIC mp_obj_t mp_obj_new_tuple_iterator(mp_obj_tuple_t *tuple, int cur);
39+
STATIC mp_obj_t mp_obj_new_tuple_iterator(mp_obj_tuple_t *tuple, mp_uint_t cur);
4040

4141
/******************************************************************************/
4242
/* tuple */
4343

4444
void mp_obj_tuple_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t o_in, mp_print_kind_t kind) {
4545
mp_obj_tuple_t *o = o_in;
4646
print(env, "(");
47-
for (int i = 0; i < o->len; i++) {
47+
for (mp_uint_t i = 0; i < o->len; i++) {
4848
if (i > 0) {
4949
print(env, ", ");
5050
}
@@ -73,8 +73,8 @@ STATIC mp_obj_t mp_obj_tuple_make_new(mp_obj_t type_in, mp_uint_t n_args, mp_uin
7373

7474
// TODO optimise for cases where we know the length of the iterator
7575

76-
uint alloc = 4;
77-
uint len = 0;
76+
mp_uint_t alloc = 4;
77+
mp_uint_t len = 0;
7878
mp_obj_t *items = m_new(mp_obj_t, alloc);
7979

8080
mp_obj_t iterable = mp_getiter(args[0]);
@@ -176,7 +176,7 @@ mp_obj_t mp_obj_tuple_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) {
176176
return res;
177177
}
178178
#endif
179-
uint index_value = mp_get_index(self->base.type, self->len, index, false);
179+
mp_uint_t index_value = mp_get_index(self->base.type, self->len, index, false);
180180
return self->items[index_value];
181181
} else {
182182
return MP_OBJ_NULL; // op not supported
@@ -223,22 +223,22 @@ const mp_obj_type_t mp_type_tuple = {
223223
// the zero-length tuple
224224
const mp_obj_tuple_t mp_const_empty_tuple_obj = {{&mp_type_tuple}, 0};
225225

226-
mp_obj_t mp_obj_new_tuple(uint n, const mp_obj_t *items) {
226+
mp_obj_t mp_obj_new_tuple(mp_uint_t n, const mp_obj_t *items) {
227227
if (n == 0) {
228228
return mp_const_empty_tuple;
229229
}
230230
mp_obj_tuple_t *o = m_new_obj_var(mp_obj_tuple_t, mp_obj_t, n);
231231
o->base.type = &mp_type_tuple;
232232
o->len = n;
233233
if (items) {
234-
for (int i = 0; i < n; i++) {
234+
for (mp_uint_t i = 0; i < n; i++) {
235235
o->items[i] = items[i];
236236
}
237237
}
238238
return o;
239239
}
240240

241-
void mp_obj_tuple_get(mp_obj_t self_in, uint *len, mp_obj_t **items) {
241+
void mp_obj_tuple_get(mp_obj_t self_in, mp_uint_t *len, mp_obj_t **items) {
242242
assert(MP_OBJ_IS_TYPE(self_in, &mp_type_tuple));
243243
mp_obj_tuple_t *self = self_in;
244244
if (len) {
@@ -260,7 +260,7 @@ mp_int_t mp_obj_tuple_hash(mp_obj_t self_in) {
260260
mp_obj_tuple_t *self = self_in;
261261
// start hash with pointer to empty tuple, to make it fairly unique
262262
mp_int_t hash = (mp_int_t)mp_const_empty_tuple;
263-
for (uint i = 0; i < self->len; i++) {
263+
for (mp_uint_t i = 0; i < self->len; i++) {
264264
hash += mp_obj_hash(self->items[i]);
265265
}
266266
return hash;
@@ -293,7 +293,7 @@ STATIC const mp_obj_type_t mp_type_tuple_it = {
293293
.iternext = tuple_it_iternext,
294294
};
295295

296-
STATIC mp_obj_t mp_obj_new_tuple_iterator(mp_obj_tuple_t *tuple, int cur) {
296+
STATIC mp_obj_t mp_obj_new_tuple_iterator(mp_obj_tuple_t *tuple, mp_uint_t cur) {
297297
mp_obj_tuple_it_t *o = m_new_obj(mp_obj_tuple_it_t);
298298
o->base.type = &mp_type_tuple_it;
299299
o->tuple = tuple;

py/objtype.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ STATIC mp_obj_t mp_obj_new_instance(mp_obj_t class, uint subobjs) {
6565
}
6666

6767
STATIC int instance_count_native_bases(const mp_obj_type_t *type, const mp_obj_type_t **last_native_base) {
68-
uint len;
68+
mp_uint_t len;
6969
mp_obj_t *items;
7070
mp_obj_tuple_get(type->bases_tuple, &len, &items);
7171

@@ -166,7 +166,7 @@ STATIC void mp_obj_class_lookup(struct class_lookup_data *lookup, const mp_obj_
166166
return;
167167
}
168168

169-
uint len;
169+
mp_uint_t len;
170170
mp_obj_t *items;
171171
mp_obj_tuple_get(type->bases_tuple, &len, &items);
172172
if (len == 0) {
@@ -755,7 +755,7 @@ mp_obj_t mp_obj_new_type(qstr name, mp_obj_t bases_tuple, mp_obj_t locals_dict)
755755
// TODO might need to make a copy of locals_dict; at least that's how CPython does it
756756

757757
// Basic validation of base classes
758-
uint len;
758+
mp_uint_t len;
759759
mp_obj_t *items;
760760
mp_obj_tuple_get(bases_tuple, &len, &items);
761761
for (uint i = 0; i < len; i++) {
@@ -842,7 +842,7 @@ STATIC void super_load_attr(mp_obj_t self_in, qstr attr, mp_obj_t *dest) {
842842
return;
843843
}
844844

845-
uint len;
845+
mp_uint_t len;
846846
mp_obj_t *items;
847847
mp_obj_tuple_get(type->bases_tuple, &len, &items);
848848
struct class_lookup_data lookup = {
@@ -901,7 +901,7 @@ bool mp_obj_is_subclass_fast(mp_const_obj_t object, mp_const_obj_t classinfo) {
901901
}
902902

903903
// get the base objects (they should be type objects)
904-
uint len;
904+
mp_uint_t len;
905905
mp_obj_t *items;
906906
mp_obj_tuple_get(self->bases_tuple, &len, &items);
907907
if (len == 0) {
@@ -921,7 +921,7 @@ bool mp_obj_is_subclass_fast(mp_const_obj_t object, mp_const_obj_t classinfo) {
921921
}
922922

923923
STATIC mp_obj_t mp_obj_is_subclass(mp_obj_t object, mp_obj_t classinfo) {
924-
uint len;
924+
mp_uint_t len;
925925
mp_obj_t *items;
926926
if (MP_OBJ_IS_TYPE(classinfo, &mp_type_type)) {
927927
len = 1;

py/runtime.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -593,7 +593,7 @@ mp_obj_t mp_call_method_n_kw_var(bool have_self, uint n_args_n_kw, const mp_obj_
593593
// optimise the case of a tuple and list
594594

595595
// get the items
596-
uint len;
596+
mp_uint_t len;
597597
mp_obj_t *items;
598598
mp_obj_get_array(pos_seq, &len, &items);
599599

@@ -689,7 +689,7 @@ mp_obj_t mp_call_method_n_kw_var(bool have_self, uint n_args_n_kw, const mp_obj_
689689

690690
// unpacked items are stored in reverse order into the array pointed to by items
691691
void mp_unpack_sequence(mp_obj_t seq_in, uint num, mp_obj_t *items) {
692-
uint seq_len;
692+
mp_uint_t seq_len;
693693
if (MP_OBJ_IS_TYPE(seq_in, &mp_type_tuple) || MP_OBJ_IS_TYPE(seq_in, &mp_type_list)) {
694694
mp_obj_t *seq_items;
695695
if (MP_OBJ_IS_TYPE(seq_in, &mp_type_tuple)) {
@@ -732,7 +732,7 @@ void mp_unpack_ex(mp_obj_t seq_in, uint num_in, mp_obj_t *items) {
732732
uint num_left = num_in & 0xff;
733733
uint num_right = (num_in >> 8) & 0xff;
734734
DEBUG_OP_printf("unpack ex %d %d\n", num_left, num_right);
735-
uint seq_len;
735+
mp_uint_t seq_len;
736736
if (MP_OBJ_IS_TYPE(seq_in, &mp_type_tuple) || MP_OBJ_IS_TYPE(seq_in, &mp_type_list)) {
737737
mp_obj_t *seq_items;
738738
if (MP_OBJ_IS_TYPE(seq_in, &mp_type_tuple)) {
@@ -773,7 +773,7 @@ void mp_unpack_ex(mp_obj_t seq_in, uint num_in, mp_obj_t *items) {
773773
while ((item = mp_iternext(iterable)) != MP_OBJ_STOP_ITERATION) {
774774
mp_obj_list_append(rest, item);
775775
}
776-
uint rest_len;
776+
mp_uint_t rest_len;
777777
mp_obj_t *rest_items;
778778
mp_obj_list_get(rest, &rest_len, &rest_items);
779779
if (rest_len < num_right) {

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy