~lsof/pez

6b962b57336266785352637579e24317b4ce3c97 — lemon 7 months ago e712e8f
length -> len
2 files changed, 19 insertions(+), 12 deletions(-)

M pez.c
M test.pez
M pez.c => pez.c +10 -12
@@ 84,7 84,6 @@ typedef struct Proto {
    char name[];
} Proto;


typedef struct Upval Upval;
struct Upval {
    OBJHEADER;


@@ 212,7 211,6 @@ enum {
};

#define VOID ((Val){0})
#define _EMPTY ((Val){TAGEmpty})
#define _DELETED ((Val){TAGDeleted})
#define isvoid(v) ((v).r == 0)
#define _isdeleted(v) (((v).r & 0xFF) == TAGDeleted)


@@ 234,16 232,15 @@ enum {
#define box_cfn(x)  ((Val){(uint64_t)(intptr_t)(x) << 2 | TAGCFn})
#define truthy(x) (!isvoid(x) && ((x).r == TAGBool ? unbox_bool(x) : 1))

static Val length_sstr;
static Val len_sstr;

static int
typeof1(Val v)
{
    if (isvoid(v))
        return PEZ_TVoid;
    if (isobj(v)) {
    if (isobj(v))
        return objtag(v);
    }
    if (isnum(v))
        return PEZ_TNumber;
    if (isbool(v))


@@ 1378,7 1375,7 @@ apply(PezContext *cx, Val *ret, void *srcfn, int srcpc, Val recv, uint n)
            return runerr(cx, srcfn, srcpc, "array indexing takes one argument (got %d)", n), 0;
        }
        arg = args[0];
        if (arg.r == length_sstr.r) {
        if (arg.r == len_sstr.r) {
            *ret = box_num(inttofix(arr->len));
            return 1;
        }


@@ 1399,7 1396,7 @@ apply(PezContext *cx, Val *ret, void *srcfn, int srcpc, Val recv, uint n)
            return runerr(cx, srcfn, srcpc, "string indexing takes one argument (got %d)", n), 0;
        }
        arg = args[0];
        if (arg.r == length_sstr.r) {
        if (arg.r == len_sstr.r) {
            *ret = box_num(inttofix(len));
            return 1;
        }


@@ 1437,7 1434,7 @@ setapply(PezContext *cx, Val *ret, void *srcfn, int srcpc, Val recv, uint n, Val
            return runerr(cx, srcfn, srcpc, "array indexing takes one argument"), 0;
        }
        arg = args[0];
        if (arg.r == length_sstr.r) {
        if (arg.r == len_sstr.r) {
            return runerr(cx, srcfn, srcpc, "cannot mutate array length"), 0;
        }
        TRY(checkindex(cx, &idx, srcfn, srcpc, "array", arr->len, arg));


@@ 1497,8 1494,8 @@ exefn(PezContext *cx, Fn *fn, uint nargs)
            int n = code[ip++] + 1;
            Val *it = cx->stktop - n;
            assert(cx->stktop > cx->stack + n);
            for (int i = 0; i < n; ++i ) {
              TRY(push(cx, it[i]));
            for (int i = 0; i < n; ++i) {
                TRY(push(cx, it[i]));
            }
        }
        CASE(Odupbck) {


@@ 3454,7 3451,7 @@ setexpr(Comp *cm)
            break;
        case Olength:
            --code->len;
            TRY(compconst(cm, length_sstr));
            TRY(compconst(cm, len_sstr));
            argc = 1;
            opcode = Oapply;
            goto Oapply;


@@ 3729,6 3726,7 @@ forstmt(Comp *cm)
    resetlastops(cm);
    return compop(cm, Ovoid);
}

static bool
stmt(Comp *cm)
{


@@ 3907,7 3905,7 @@ pez_new(PezAllocFn *alloc, void *userdata, size_t stacksize)
    if (!cx->stack) goto Err;
    cx->stktop = cx->stack;
    cx->stkend = cx->stack + stacksize;
    if (!box_str(cx, &length_sstr, "length", 6)) assert(0);
    if (!box_str(cx, &len_sstr, "len", 3)) assert(0);
    if (!initcore(cx)) goto Err;

    cx->gcthresh = stacksize * sizeof(Val)*5/2 + 128;

M test.pez => test.pez +9 -0
@@ 42,3 42,12 @@ printf["4+1+3: %a\n", add[4,1,3]]
}

printf["test %a\n", gather[-1, (), 'x]]

@map: {[f, xs]
    @ys: array#filled[xs.len, ()]
    FOR [@i: 0][< xs.len][+ 1]
        ys[i] = f[xs[i]]
    ys
}

printf["%a\n", map["abcd", #[1,2,0]]]