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; }
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; }