mirror of
https://github.com/vlang/v.git
synced 2025-09-10 16:00:31 -04:00
checker: -warn-about-allocs; nil interface allocation fix; parser: tmpl @else [cond]
This commit is contained in:
parent
09eaae5f7a
commit
2d5c457901
@ -3449,6 +3449,10 @@ fn (mut c Checker) cast_expr(mut node ast.CastExpr) ast.Type {
|
|||||||
c.error('cannot cast `string` to `enum`', node.pos)
|
c.error('cannot cast `string` to `enum`', node.pos)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if c.pref.warn_about_allocs && to_sym.info is ast.Interface {
|
||||||
|
c.warn_alloc('cast to interface', node.pos)
|
||||||
|
}
|
||||||
node.typname = c.table.sym(node.typ).name
|
node.typname = c.table.sym(node.typ).name
|
||||||
return node.typ
|
return node.typ
|
||||||
}
|
}
|
||||||
|
@ -32,6 +32,12 @@ fn (mut c Checker) warn(s string, pos token.Pos) {
|
|||||||
c.warn_or_error(s, pos, allow_warnings)
|
c.warn_or_error(s, pos, allow_warnings)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn (mut c Checker) warn_alloc(s string, pos token.Pos) {
|
||||||
|
if !c.is_builtin_mod && c.mod !in ['strings', 'math', 'math.bits', 'builtin'] {
|
||||||
|
c.warn('allocation (${s})', pos)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn (mut c Checker) error(message string, pos token.Pos) {
|
fn (mut c Checker) error(message string, pos token.Pos) {
|
||||||
if (c.pref.translated || c.file.is_translated) && message.starts_with('mismatched types') {
|
if (c.pref.translated || c.file.is_translated) && message.starts_with('mismatched types') {
|
||||||
// TODO: move this
|
// TODO: move this
|
||||||
@ -178,6 +184,8 @@ fn (mut c Checker) trace[T](fbase string, x &T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn (mut c Checker) deprecate(kind string, name string, attrs []ast.Attr, pos token.Pos) {
|
fn (mut c Checker) deprecate(kind string, name string, attrs []ast.Attr, pos token.Pos) {
|
||||||
|
// println('deprecate kind=${kind} name=${name} attrs=$attrs')
|
||||||
|
// print_backtrace()
|
||||||
mut deprecation_message := ''
|
mut deprecation_message := ''
|
||||||
now := time.now()
|
now := time.now()
|
||||||
mut after_time := now
|
mut after_time := now
|
||||||
@ -205,6 +213,8 @@ fn (mut c Checker) deprecate(kind string, name string, attrs []ast.Attr, pos tok
|
|||||||
} else if after_time == now {
|
} else if after_time == now {
|
||||||
c.warn(semicolonize('${start_message} has been deprecated', deprecation_message),
|
c.warn(semicolonize('${start_message} has been deprecated', deprecation_message),
|
||||||
pos)
|
pos)
|
||||||
|
// c.warn(semicolonize('${start_message} has been deprecated!11 m=${deprecation_message}',
|
||||||
|
// deprecation_message), pos)
|
||||||
} else {
|
} else {
|
||||||
c.note(semicolonize('${start_message} will be deprecated after ${after_time.ymmdd()}, and will become an error after ${error_time.ymmdd()}',
|
c.note(semicolonize('${start_message} will be deprecated after ${after_time.ymmdd()}, and will become an error after ${error_time.ymmdd()}',
|
||||||
deprecation_message), pos)
|
deprecation_message), pos)
|
||||||
|
@ -850,6 +850,9 @@ fn (mut c Checker) infix_expr(mut node ast.InfixExpr) ast.Type {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if node.op == .plus && c.pref.warn_about_allocs {
|
||||||
|
c.warn_alloc('string concatenation', node.pos)
|
||||||
|
}
|
||||||
/*
|
/*
|
||||||
if (node.left is ast.InfixExpr && node.left.op == .inc) ||
|
if (node.left is ast.InfixExpr && node.left.op == .inc) ||
|
||||||
(node.right is ast.InfixExpr && node.right.op == .inc) {
|
(node.right is ast.InfixExpr && node.right.op == .inc) {
|
||||||
|
@ -2564,6 +2564,13 @@ fn (mut g Gen) expr_with_cast(expr ast.Expr, got_type_raw ast.Type, expected_typ
|
|||||||
if exp_sym.info.is_generic {
|
if exp_sym.info.is_generic {
|
||||||
fname = g.generic_fn_name(exp_sym.info.concrete_types, fname)
|
fname = g.generic_fn_name(exp_sym.info.concrete_types, fname)
|
||||||
}
|
}
|
||||||
|
// Do not allocate for `Interface(unsafe{nil})` casts
|
||||||
|
is_nil_cast := expr is ast.UnsafeExpr && expr.expr is ast.Nil
|
||||||
|
if is_nil_cast {
|
||||||
|
g.write('/*nili*/')
|
||||||
|
g.write('((void*)0)')
|
||||||
|
return
|
||||||
|
}
|
||||||
g.call_cfn_for_casting_expr(fname, expr, expected_is_ptr, exp_styp, got_is_ptr,
|
g.call_cfn_for_casting_expr(fname, expr, expected_is_ptr, exp_styp, got_is_ptr,
|
||||||
false, got_styp)
|
false, got_styp)
|
||||||
}
|
}
|
||||||
|
@ -245,7 +245,9 @@ fn vweb_tmpl_${fn_name}() string {
|
|||||||
// Remove new line byte
|
// Remove new line byte
|
||||||
source.go_back(1)
|
source.go_back(1)
|
||||||
source.writeln(parser.tmpl_str_end)
|
source.writeln(parser.tmpl_str_end)
|
||||||
source.writeln(' } else { ')
|
pos := line.index('@else') or { continue }
|
||||||
|
source.writeln('}' + line[pos + 1..] + '{')
|
||||||
|
// source.writeln(' } else { ')
|
||||||
source.writeln(tmpl_str_start)
|
source.writeln(tmpl_str_start)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
@ -234,6 +234,7 @@ pub mut:
|
|||||||
// wasm settings:
|
// wasm settings:
|
||||||
wasm_stack_top int = 1024 + (16 * 1024) // stack size for webassembly backend
|
wasm_stack_top int = 1024 + (16 * 1024) // stack size for webassembly backend
|
||||||
wasm_validate bool // validate webassembly code, by calling `wasm-validate`
|
wasm_validate bool // validate webassembly code, by calling `wasm-validate`
|
||||||
|
warn_about_allocs bool // -warn-about-allocs warngs about every single allocation, e.g. 'hi $name'. Mostly for low level development where manual memory management is used.
|
||||||
// temp
|
// temp
|
||||||
// use_64_int bool
|
// use_64_int bool
|
||||||
}
|
}
|
||||||
@ -504,6 +505,9 @@ pub fn parse_args_and_show_errors(known_external_commands []string, args []strin
|
|||||||
'-sourcemap' {
|
'-sourcemap' {
|
||||||
res.sourcemap = true
|
res.sourcemap = true
|
||||||
}
|
}
|
||||||
|
'-warn-about-allocs' {
|
||||||
|
res.warn_about_allocs = true
|
||||||
|
}
|
||||||
'-sourcemap-src-included' {
|
'-sourcemap-src-included' {
|
||||||
res.sourcemap_src_included = true
|
res.sourcemap_src_included = true
|
||||||
}
|
}
|
||||||
|
6
vlib/v/slow_tests/valgrind/nil_interface.v
Normal file
6
vlib/v/slow_tests/valgrind/nil_interface.v
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
interface Resource {}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
mut resource := &Resource(unsafe { nil })
|
||||||
|
_ = resource
|
||||||
|
}
|
63
vlib/veb/oauth/oauth.v
Normal file
63
vlib/veb/oauth/oauth.v
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
module oauth
|
||||||
|
|
||||||
|
import json
|
||||||
|
import net.http
|
||||||
|
|
||||||
|
pub enum TokenPostType {
|
||||||
|
form
|
||||||
|
json
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct Context {
|
||||||
|
token_url string
|
||||||
|
client_id string
|
||||||
|
client_secret string
|
||||||
|
token_post_type TokenPostType = .form
|
||||||
|
redirect_uri string
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct Request {
|
||||||
|
pub:
|
||||||
|
client_id string
|
||||||
|
client_secret string
|
||||||
|
code string
|
||||||
|
state string
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn (ctx &Context) get_token(code string) string {
|
||||||
|
oauth_request := Request{
|
||||||
|
client_id: ctx.client_id
|
||||||
|
client_secret: ctx.client_secret
|
||||||
|
code: code
|
||||||
|
// state: csrf
|
||||||
|
}
|
||||||
|
|
||||||
|
js := json.encode(oauth_request)
|
||||||
|
if ctx.token_post_type == .json {
|
||||||
|
resp := http.post_json(ctx.token_url, js) or {
|
||||||
|
// app.info(err.msg())
|
||||||
|
|
||||||
|
// return app.redirect_to_index()
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
println('OAUTH RESPONSE ${resp}')
|
||||||
|
return resp.body
|
||||||
|
} else {
|
||||||
|
resp := http.post_form(ctx.token_url, {
|
||||||
|
'client_id': ctx.client_id
|
||||||
|
'client_secret': ctx.client_secret
|
||||||
|
'code': code
|
||||||
|
'grant_type': 'authorization_code'
|
||||||
|
//'scope': bot
|
||||||
|
'redirect_uri': ctx.redirect_uri
|
||||||
|
}) or {
|
||||||
|
// app.info(err.msg())
|
||||||
|
|
||||||
|
// return app.redirect_to_index()
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
println('OAUTH RESPONSE ${resp}')
|
||||||
|
return resp.body
|
||||||
|
}
|
||||||
|
return ''
|
||||||
|
}
|
@ -1,3 +1,4 @@
|
|||||||
|
//@[deprecated: '`x.vweb` is now `veb`. The module is no longer experimental.']
|
||||||
module vweb
|
module vweb
|
||||||
|
|
||||||
import io
|
import io
|
||||||
|
Loading…
x
Reference in New Issue
Block a user