free strings

pull/1301/head
Alexander Medvednikov 2019-07-25 00:25:21 +02:00
parent d1b732cbcc
commit 3a8cdadcf5
2 changed files with 9 additions and 3 deletions

View File

@ -1018,6 +1018,9 @@ fn (p mut Parser) close_scope() {
if v.typ.starts_with('array_') { if v.typ.starts_with('array_') {
p.genln('v_array_free($v.name); // close_scope free') p.genln('v_array_free($v.name); // close_scope free')
} }
else if v.typ == 'string' {
p.genln('v_string_free($v.name); // close_scope free')
}
else { else {
p.genln('free($v.name); // close_scope free') p.genln('free($v.name); // close_scope free')
} }
@ -1839,6 +1842,7 @@ fn (p mut Parser) index_expr(typ string, fn_ph int) string {
p.gen(']/*r$typ $v.is_mut*/') p.gen(']/*r$typ $v.is_mut*/')
} }
} }
// TODO move this from index_expr()
// TODO if p.tok in ... // TODO if p.tok in ...
// if p.tok in [.assign, .plus_assign, .minus_assign] // if p.tok in [.assign, .plus_assign, .minus_assign]
if p.tok == .assign || p.tok == .plus_assign || p.tok == .minus_assign || if p.tok == .assign || p.tok == .plus_assign || p.tok == .minus_assign ||
@ -2335,6 +2339,7 @@ fn (p mut Parser) string_expr() {
return return
} }
// tmp := p.get_tmp() // tmp := p.get_tmp()
p.is_alloc = true // $ interpolation means there's allocation
mut args := '"' mut args := '"'
mut format := '"' mut format := '"'
p.fgen('\'') p.fgen('\'')

View File

@ -4,7 +4,6 @@
module builtin module builtin
// V strings are not null-terminated.
struct string { struct string {
mut: mut:
hash_cache int hash_cache int
@ -25,7 +24,8 @@ fn C.strlen(s byteptr) int
fn todo() { } fn todo() { }
// Converts a C string to a V string // Converts a C string to a V string.
// String data is reused, not copied.
pub fn tos(s byteptr, len int) string { pub fn tos(s byteptr, len int) string {
// This should never happen. // This should never happen.
if isnil(s) { if isnil(s) {
@ -48,6 +48,7 @@ pub fn tos_clone(s byteptr) string {
} }
// Same as `tos`, but calculates the length. Called by `string(bytes)` casts. // Same as `tos`, but calculates the length. Called by `string(bytes)` casts.
// Used only internally.
fn tos2(s byteptr) string { fn tos2(s byteptr) string {
if isnil(s) { if isnil(s) {
panic('tos2: nil string') panic('tos2: nil string')
@ -730,7 +731,7 @@ pub fn (c byte) is_letter() bool {
} }
pub fn (s string) free() { pub fn (s string) free() {
C.free(s.str) free(s.str)
} }
/* /*