示例#1
0
lily_tie *lily_get_bytestring_literal(lily_symtab *symtab,
        const char *want_string, int len)
{
    lily_tie *lit, *ret;
    ret = NULL;

    for (lit = symtab->literals;lit;lit = lit->next) {
        if (lit->type->cls->id == SYM_CLASS_BYTESTRING) {
            if (lit->value.string->size == len &&
                memcmp(lit->value.string->string, want_string,
                        len) == 0) {
                ret = lit;
                break;
            }
        }
    }

    if (ret == NULL) {
        lily_class *cls = symtab->bytestring_class;

        ret = make_new_literal(symtab, cls);
        ret->value.string = lily_new_raw_string_sized(want_string, len);
        ret->flags |= VAL_IS_BYTESTRING;
    }

    return ret;
}
示例#2
0
lily_literal *lily_get_bytestring_literal(lily_symtab *symtab,
        const char *want_string, int len)
{
    lily_literal *iter = first_lit_of(symtab->literals, VAL_IS_BYTESTRING);

    while (iter) {
        if (iter->value.string->size == len &&
            memcmp(iter->value.string->string, want_string, len) == 0)
            return iter;

        int next = iter->next_index;

        if (next == 0)
            break;
        else
            iter = (lily_literal *)lily_vs_nth(symtab->literals, next);
    }

    if (iter)
        iter->next_index = lily_vs_pos(symtab->literals);

    lily_literal *v = (lily_literal *)lily_new_empty_value();
    v->flags = VAL_IS_BYTESTRING;
    v->reg_spot = lily_vs_pos(symtab->literals);
    v->value.string = lily_new_raw_string_sized(want_string, len);
    /* Manual ref, because the string isn't being moved/assigned anywhere. */
    v->value.string->refcount++;
    v->next_index = 0;

    lily_vs_push(symtab->literals, (lily_value *)v);
    return (lily_literal *)v;
}