Beispiel #1
0
/**
 * key同士を比較
 */
static int mapentry_cmp(Value *vret, Value *v, RefNode *node)
{
    Value v1 = v[0];
    Value v2 = v[1];
    Value vr;

    Value_push("vv", Value_ref(v1)->v[INDEX_ENTRY_KEY], Value_ref(v2)->v[INDEX_ENTRY_KEY]);
    if (!call_member_func(fs->symbol_stock[T_CMP], 1, TRUE)) {
        return FALSE;
    }

    vr = fg->stk_top[-1];
    if (Value_isint(vr) && Value_integral(vr) == 0) {
        Value_pop();
        // keyが同じなら、valueを比較
        Value_push("vv", Value_ref(v1)->v[INDEX_ENTRY_VAL], Value_ref(v2)->v[INDEX_ENTRY_VAL]);
        if (!call_member_func(fs->symbol_stock[T_CMP], 1, TRUE)) {
            return FALSE;
        }
    }
    *vret = fg->stk_top[-1];
    fg->stk_top--;

    return TRUE;
}
Beispiel #2
0
/**
 * 0 : 要素数
 * 4 : 要素(key, value, key, value, ...)
 */
static int map_marshal_write(Value *vret, Value *v, RefNode *node)
{
    Value dumper = v[1];
    Value w = Value_ref(dumper)->v[INDEX_MARSHALDUMPER_SRC];

    RefMap *rm = Value_vp(*v);
    int is_map = FUNC_INT(node);
    int i;

    rm->lock_count++;
    if (!stream_write_uint32(w, rm->count)) {
        goto ERROR_END;
    }
    for (i = 0; i < rm->entry_num; i++) {
        HashValueEntry *ep = rm->entry[i];
        for (; ep != NULL; ep = ep->next) {
            Value_push("vv", dumper, ep->key);
            if (!call_member_func(fs->str_write, 1, TRUE)) {
                goto ERROR_END;
            }
            Value_pop();

            if (is_map) {
                Value_push("vv", dumper, ep->val);
                if (!call_member_func(fs->str_write, 1, TRUE)) {
                    goto ERROR_END;
                }
                Value_pop();
            }
        }
    }
    rm->lock_count--;
    return TRUE;

ERROR_END:
    rm->lock_count--;
    return FALSE;
}
Beispiel #3
0
int textio_flush(Value *vret, Value *v, RefNode *node)
{
    Ref *ref = Value_ref(*v);
    Value stream = ref->v[INDEX_TEXTIO_STREAM];
    RefNode *s_type = Value_type(stream);

    if (s_type != fs->cls_bytesio) {
        Value_push("v", stream);
        if (!call_member_func(intern("flush", -1), 0, TRUE)) {
            return FALSE;
        }
    }
    return TRUE;
}
Beispiel #4
0
static int map_marshal_read(Value *vret, Value *v, RefNode *node)
{
    Value dumper = v[1];
    Value r = Value_ref(dumper)->v[INDEX_MARSHALDUMPER_SRC];
    int is_map = FUNC_INT(node);
    RefMap *rm;
    uint32_t size;
    int i;

    if (!stream_read_uint32(r, &size)) {
        return FALSE;
    }
    if (size > 0xffffff) {
        throw_errorf(fs->mod_lang, "ValueError", "Invalid size number");
        return FALSE;
    }
    if (size * sizeof(HashValueEntry) > fs->max_alloc) {
        throw_error_select(THROW_MAX_ALLOC_OVER__INT, fs->max_alloc);
        return FALSE;
    }
    rm = refmap_new(size);
    if (!is_map) {
        rm->rh.type = fs->cls_set;
    }
    *vret = vp_Value(rm);

    for (i = 0; i < size; i++) {
        Value key;
        Value_push("v", dumper);
        if (!call_member_func(fs->str_read, 0, TRUE)) {
            return FALSE;
        }
        fg->stk_top--;
        key = *fg->stk_top;
        if (is_map) {
            Value val;
            HashValueEntry *ve;

            Value_push("v", dumper);
            if (!call_member_func(fs->str_read, 0, TRUE)) {
                return FALSE;
            }
            fg->stk_top--;
            val = *fg->stk_top;

            ve = refmap_add(rm, key, TRUE, FALSE);
            if (ve == NULL) {
                unref(key);
                unref(val);
                return FALSE;
            }
            ve->val = val;
        } else {
            // Set
            if (refmap_add(rm, key, TRUE, FALSE) == NULL) {
                unref(key);
                return FALSE;
            }
        }
        unref(key);
    }

    return TRUE;
}
Beispiel #5
0
static int textio_print_sub(Value v_textio, StrBuf *sb, Value v, Ref *r_loc)
{
    RefNode *v_type = Value_type(v);
    int result = TRUE;
    Value vb;
    RefTextIO *tio;

    if (v_textio != VALUE_NULL) {
        Ref *ref = Value_ref(v_textio);
        vb = ref->v[INDEX_TEXTIO_STREAM];
        tio = Value_vp(ref->v[INDEX_TEXTIO_TEXTIO]);
    } else {
        vb = VALUE_NULL;
        tio = NULL;
    }

    // よく使う型
    if (Value_isint(v)) {
        char c_buf[32];
        sprintf(c_buf, "%d", Value_integral(v));
        if (!stream_write_sub_s(vb, sb, c_buf, -1, tio)) {
            result = FALSE;
        }
    } else if (v_type == fs->cls_int) {
        RefInt *mp = Value_vp(v);
        char *c_buf = malloc(BigInt_str_bufsize(&mp->bi, 10));
        BigInt_str(&mp->bi, 10, c_buf, FALSE);
        if (!stream_write_sub_s(vb, sb, c_buf, -1, tio)) {
            result = FALSE;
        }
        free(c_buf);
    } else if (v_type == fs->cls_str) {
        RefStr *rs = Value_vp(v);
        if (!stream_write_sub_s(vb, sb, rs->c, rs->size, tio)) {
            result = FALSE;
        }
    } else if (v_type == fv->cls_strio) {
        RefBytesIO *mb = Value_bytesio(v);
        if (!stream_write_sub_s(vb, sb, mb->buf.p, mb->buf.size, tio)) {
            result = FALSE;
        }
    } else if (v_type == fs->cls_module) {
        RefNode *nd = Value_vp(v);
        RefStr *rs = nd->name;
        if (!stream_write_sub_s(vb, sb, "Module(", 7, tio)) {
            return FALSE;
        }
        if (!stream_write_sub_s(vb, sb, rs->c, rs->size, tio)) {
            return FALSE;
        }
        if (!stream_write_sub_s(vb, sb, ")", 1, tio)) {
            return FALSE;
        }
    } else if (v_type != fs->cls_null) {
        Value vret;
        fs->Value_push("v", v);
        if (!call_member_func(fs->str_tostr, 0, TRUE)) {
            return FALSE;
        }
        vret = fg->stk_top[-1];
        if (Value_type(vret) == fs->cls_str) {
            RefStr *rs = Value_vp(vret);
            if (!stream_write_sub_s(vb, sb, rs->c, rs->size, tio)) {
                return FALSE;
            }
        } else {
        }
        Value_pop();
    }
    return result;
}