Skip to content
Snippets Groups Projects
Select Git revision
  • 71be1ddeb128e6068d2f1df605ec9c8c10f67091
  • master default protected
  • schneider/ir
  • rahix/user-space-ctx
  • schneider/iaq-python
  • schneider/ble-mini-demo
  • schneider/ble-ecg-stream-visu
  • schneider/mp-exception-print
  • schneider/sleep-display
  • schneider/deepsleep4
  • schneider/deepsleep2
  • schneider/deepsleep
  • schneider/ble-central
  • rahix/bluetooth-app-favorite
  • schneider/v1.17-changelog
  • schneider/ancs
  • schneider/png
  • schneider/freertos-list-debug
  • schneider/212-reset-hardware-when-entering-repl
  • schneider/bonding-fail-if-full
  • schneider/ble-fixes-2020-3
  • v1.18
  • v1.17
  • v1.16
  • v1.15
  • v1.14
  • v1.13
  • v1.12
  • v1.11
  • v1.10
  • v1.9
  • v1.8
  • v1.7
  • v1.6
  • v1.5
  • v1.4
  • v1.3
  • v1.2
  • v1.1
  • v1.0
  • release-1
41 results

group__RPU__SYSRAM6.js

Blame
  • objslice.c 2.94 KiB
    #include <stdlib.h>
    #include <stdint.h>
    #include <string.h>
    #include <assert.h>
    
    #include "nlr.h"
    #include "misc.h"
    #include "mpconfig.h"
    #include "qstr.h"
    #include "obj.h"
    #include "runtime0.h"
    
    /******************************************************************************/
    /* ellipsis object, a singleton                                               */
    
    typedef struct _mp_obj_ellipsis_t {
        mp_obj_base_t base;
    } mp_obj_ellipsis_t;
    
    void ellipsis_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in, mp_print_kind_t kind) {
        print(env, "Ellipsis");
    }
    
    const mp_obj_type_t ellipsis_type = {
        { &mp_const_type },
        "ellipsis",
        .print = ellipsis_print,
    };
    
    static const mp_obj_ellipsis_t ellipsis_obj = {{&ellipsis_type}};
    const mp_obj_t mp_const_ellipsis = (mp_obj_t)&ellipsis_obj;
    
    /******************************************************************************/
    /* slice object                                                               */
    
    #if MICROPY_ENABLE_SLICE
    
    // TODO: This implements only variant of slice with 2 integer args only.
    // CPython supports 3rd arg (step), plus args can be arbitrary Python objects.
    typedef struct _mp_obj_slice_t {
        mp_obj_base_t base;
        machine_int_t start;
        machine_int_t stop;
    } mp_obj_slice_t;
    
    void slice_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t o_in, mp_print_kind_t kind) {
        mp_obj_slice_t *o = o_in;
        print(env, "slice(" INT_FMT ", " INT_FMT ")", o->start, o->stop);
    }
    
    const mp_obj_type_t slice_type = {
        { &mp_const_type },
        "slice",
        .print = slice_print,
    };
    
    // TODO: Make sure to handle "empty" values, which are signified by None in CPython
    mp_obj_t mp_obj_new_slice(mp_obj_t ostart, mp_obj_t ostop, mp_obj_t ostep) {
        assert(ostep == NULL);
        machine_int_t start = 0, stop = 0;
        if (ostart != mp_const_none) {
            start = mp_obj_get_int(ostart);
        }
        if (ostop != mp_const_none) {
            stop = mp_obj_get_int(ostop);
            if (stop == 0) {
                // [x:0] is a special case - in our slice object, stop = 0 means
                // "end of sequence". Fortunately, [x:0] is an empty seqence for
                // any x (including negative). [x:x] is also always empty sequence.
                // but x also can be 0. But note that b""[x:x] is b"" for any x (i.e.
                // no IndexError, at least in Python 3.3.3). So, we just use -1's to
                // signify that. -1 is catchy "special" number in case someone will
                // try to print [x:0] slice ever.
                start = stop = -1;
            }
        }
        mp_obj_slice_t *o = m_new(mp_obj_slice_t, 1);
        o->base.type = &slice_type;
        o->start = start;
        o->stop = stop;
        return (mp_obj_t)o;
    }
    
    void mp_obj_slice_get(mp_obj_t self_in, machine_int_t *start, machine_int_t *stop, machine_int_t *step) {
        assert(MP_OBJ_IS_TYPE(self_in, &slice_type));
        mp_obj_slice_t *self = self_in;
        *start = self->start;
        *stop = self->stop;
        *step = 1;
    }
    
    #endif