From 0138f46797641c585364b6d6d8c44eb1a4ba3a35 Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Sun, 28 Jun 2020 13:56:38 +0200 Subject: [PATCH] vweb: fix a leak --- vlib/strings/builder.c.v | 1 + vlib/v/gen/x64/gen.v | 12 ++++++++++++ vlib/v/gen/x64/tests/expressions.vv | 14 +++++++++++--- vlib/vweb/vweb.v | 4 +++- 4 files changed, 27 insertions(+), 4 deletions(-) diff --git a/vlib/strings/builder.c.v b/vlib/strings/builder.c.v index 9dbd08a795..34590d0ec2 100644 --- a/vlib/strings/builder.c.v +++ b/vlib/strings/builder.c.v @@ -115,6 +115,7 @@ pub fn (mut b Builder) str() string { b.buf << `\0` s := string(b.buf,b.len) bis := b.initial_size + //free(b.buf.data) b.buf = []byte{cap: bis} b.len = 0 return s diff --git a/vlib/v/gen/x64/gen.v b/vlib/v/gen/x64/gen.v index e4b0d7eb3a..35042edb9f 100644 --- a/vlib/v/gen/x64/gen.v +++ b/vlib/v/gen/x64/gen.v @@ -437,6 +437,17 @@ fn (mut g Gen) sub8_var(reg Register, var_offset int) { g.println('sub8 $reg,DWORD PTR[rbp-$var_offset.hex2()]') } +fn (mut g Gen) mul8_var(reg Register, var_offset int) { + g.write8(0x0f) + g.write8(0xaf) + match reg { + .eax, .rax { g.write8(0x45) } + else { verror('mul8_var') } + } + g.write8(0xff - var_offset + 1) + g.println('mul8 $reg,DWORD PTR[rbp-$var_offset.hex2()]') +} + fn (mut g Gen) leave() { g.write8(0xc9) g.println('leave') @@ -732,6 +743,7 @@ fn (mut g Gen) infix_expr(node ast.InfixExpr) { var_offset := g.get_var_offset(ident.name) match node.op { .plus { g.add8_var(.eax, var_offset) } + .mul { g.mul8_var(.eax, var_offset) } .minus { g.sub8_var(.eax, var_offset) } else {} } diff --git a/vlib/v/gen/x64/tests/expressions.vv b/vlib/v/gen/x64/tests/expressions.vv index f82c347017..0572287896 100644 --- a/vlib/v/gen/x64/tests/expressions.vv +++ b/vlib/v/gen/x64/tests/expressions.vv @@ -11,11 +11,19 @@ fn print_number(n int) { if n == 9 { println('9') } } +struct User { + age int +} + +fn print_user(u User) { + +} + fn test_add() { println('test_add()') x := 2 - y := 3 - z := x + y + y :=3 + z := x * y q := y - x print_number(x) print_number(y) @@ -26,5 +34,5 @@ fn test_add() { fn main() { println('start') test_add() - println('end') + println('end1l') } diff --git a/vlib/vweb/vweb.v b/vlib/vweb/vweb.v index a451025393..a42ab85cac 100644 --- a/vlib/vweb/vweb.v +++ b/vlib/vweb/vweb.v @@ -58,6 +58,7 @@ fn (mut ctx Context) send_response_to_client(mimetype string, res string) bool { if ctx.done { return false } ctx.done = true mut sb := strings.new_builder(1024) + defer { sb.free() } sb.write('HTTP/1.1 200 OK\r\nContent-Type: ') sb.write(mimetype) sb.write('\r\nContent-Length: ') sb.write(res.len.str()) sb.write(ctx.headers) @@ -65,7 +66,7 @@ fn (mut ctx Context) send_response_to_client(mimetype string, res string) bool { sb.write(headers_close) sb.write(res) ctx.conn.send_string(sb.str()) or { return false } - sb.free() + //sb.free() return true } @@ -304,6 +305,7 @@ fn handle_conn(conn net.Socket, mut app T) { return } app.vweb.send_response_to_client(mime_type, data) + data.free() return }