mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
all: more match updates
This commit is contained in:
parent
274ecb71fa
commit
d04554f0b7
@ -369,9 +369,9 @@ pub mut:
|
||||
}
|
||||
|
||||
pub fn (i &Ident) var_info() IdentVar {
|
||||
match i.info {
|
||||
match i.info as info {
|
||||
IdentVar {
|
||||
return it
|
||||
return info
|
||||
}
|
||||
else {
|
||||
// return IdentVar{}
|
||||
@ -826,7 +826,7 @@ pub struct SqlInsertExpr {
|
||||
[inline]
|
||||
pub fn (expr Expr) is_blank_ident() bool {
|
||||
match expr {
|
||||
Ident { return it.kind == .blank_ident }
|
||||
Ident { return expr.kind == .blank_ident }
|
||||
else { return false }
|
||||
}
|
||||
}
|
||||
@ -835,91 +835,91 @@ pub fn (expr Expr) position() token.Position {
|
||||
// all uncommented have to be implemented
|
||||
match mut expr {
|
||||
ArrayInit {
|
||||
return it.pos
|
||||
return expr.pos
|
||||
}
|
||||
AsCast {
|
||||
return it.pos
|
||||
return expr.pos
|
||||
}
|
||||
// ast.Ident { }
|
||||
CastExpr {
|
||||
return it.pos
|
||||
return expr.pos
|
||||
}
|
||||
Assoc {
|
||||
return it.pos
|
||||
return expr.pos
|
||||
}
|
||||
BoolLiteral {
|
||||
return it.pos
|
||||
return expr.pos
|
||||
}
|
||||
CallExpr {
|
||||
return it.pos
|
||||
return expr.pos
|
||||
}
|
||||
CharLiteral {
|
||||
return it.pos
|
||||
return expr.pos
|
||||
}
|
||||
EnumVal {
|
||||
return it.pos
|
||||
return expr.pos
|
||||
}
|
||||
FloatLiteral {
|
||||
return it.pos
|
||||
return expr.pos
|
||||
}
|
||||
Ident {
|
||||
return it.pos
|
||||
return expr.pos
|
||||
}
|
||||
IfExpr {
|
||||
return it.pos
|
||||
return expr.pos
|
||||
}
|
||||
// ast.IfGuardExpr { }
|
||||
IndexExpr {
|
||||
return it.pos
|
||||
return expr.pos
|
||||
}
|
||||
InfixExpr {
|
||||
left_pos := it.left.position()
|
||||
right_pos := it.right.position()
|
||||
left_pos := expr.left.position()
|
||||
right_pos := expr.right.position()
|
||||
if left_pos.pos == 0 || right_pos.pos == 0 {
|
||||
return it.pos
|
||||
return expr.pos
|
||||
}
|
||||
return token.Position{
|
||||
line_nr: it.pos.line_nr
|
||||
line_nr: expr.pos.line_nr
|
||||
pos: left_pos.pos
|
||||
len: right_pos.pos - left_pos.pos + right_pos.len
|
||||
}
|
||||
}
|
||||
IntegerLiteral {
|
||||
return it.pos
|
||||
return expr.pos
|
||||
}
|
||||
MapInit {
|
||||
return it.pos
|
||||
return expr.pos
|
||||
}
|
||||
MatchExpr {
|
||||
return it.pos
|
||||
return expr.pos
|
||||
}
|
||||
None {
|
||||
return it.pos
|
||||
return expr.pos
|
||||
}
|
||||
PostfixExpr {
|
||||
return it.pos
|
||||
return expr.pos
|
||||
}
|
||||
// ast.None { }
|
||||
PrefixExpr {
|
||||
return it.pos
|
||||
return expr.pos
|
||||
}
|
||||
// ast.ParExpr { }
|
||||
SelectorExpr {
|
||||
return it.pos
|
||||
return expr.pos
|
||||
}
|
||||
// ast.SizeOf { }
|
||||
StringLiteral {
|
||||
return it.pos
|
||||
return expr.pos
|
||||
}
|
||||
StringInterLiteral {
|
||||
return it.pos
|
||||
return expr.pos
|
||||
}
|
||||
// ast.Type { }
|
||||
StructInit {
|
||||
return it.pos
|
||||
return expr.pos
|
||||
}
|
||||
Likely {
|
||||
return it.pos
|
||||
return expr.pos
|
||||
}
|
||||
// ast.TypeOf { }
|
||||
else {
|
||||
@ -930,8 +930,8 @@ pub fn (expr Expr) position() token.Position {
|
||||
|
||||
pub fn (stmt Stmt) position() token.Position {
|
||||
match stmt {
|
||||
AssertStmt { return it.pos }
|
||||
AssignStmt { return it.pos }
|
||||
AssertStmt { return stmt.pos }
|
||||
AssignStmt { return stmt.pos }
|
||||
/*
|
||||
// Attr {
|
||||
// }
|
||||
@ -940,19 +940,19 @@ pub fn (stmt Stmt) position() token.Position {
|
||||
// BranchStmt {
|
||||
// }
|
||||
*/
|
||||
Comment { return it.pos }
|
||||
CompIf { return it.pos }
|
||||
ConstDecl { return it.pos }
|
||||
Comment { return stmt.pos }
|
||||
CompIf { return stmt.pos }
|
||||
ConstDecl { return stmt.pos }
|
||||
/*
|
||||
// DeferStmt {
|
||||
// }
|
||||
*/
|
||||
EnumDecl { return it.pos }
|
||||
ExprStmt { return it.pos }
|
||||
FnDecl { return it.pos }
|
||||
ForCStmt { return it.pos }
|
||||
ForInStmt { return it.pos }
|
||||
ForStmt { return it.pos }
|
||||
EnumDecl { return stmt.pos }
|
||||
ExprStmt { return stmt.pos }
|
||||
FnDecl { return stmt.pos }
|
||||
ForCStmt { return stmt.pos }
|
||||
ForInStmt { return stmt.pos }
|
||||
ForStmt { return stmt.pos }
|
||||
/*
|
||||
// GlobalDecl {
|
||||
// }
|
||||
@ -965,15 +965,15 @@ pub fn (stmt Stmt) position() token.Position {
|
||||
// HashStmt {
|
||||
// }
|
||||
*/
|
||||
Import { return it.pos }
|
||||
Import { return stmt.pos }
|
||||
/*
|
||||
// InterfaceDecl {
|
||||
// }
|
||||
// Module {
|
||||
// }
|
||||
*/
|
||||
Return { return it.pos }
|
||||
StructDecl { return it.pos }
|
||||
Return { return stmt.pos }
|
||||
StructDecl { return stmt.pos }
|
||||
/*
|
||||
// TypeDecl {
|
||||
// }
|
||||
|
@ -1012,6 +1012,12 @@ pub fn (mut f Fmt) match_expr(it ast.MatchExpr) {
|
||||
if it.cond is ast.Ident {
|
||||
ident := it.cond as ast.Ident
|
||||
f.it_name = ident.name
|
||||
} else if it.cond is ast.SelectorExpr {
|
||||
// `x.y as z`
|
||||
// if ident.name != it.var_name && it.var_name != '' {
|
||||
if it.var_name != '' {
|
||||
f.write(' as $it.var_name')
|
||||
}
|
||||
}
|
||||
f.writeln(' {')
|
||||
f.indent++
|
||||
|
@ -3676,77 +3676,72 @@ fn (g Gen) is_importing_os() bool {
|
||||
|
||||
fn (mut g Gen) go_stmt(node ast.GoStmt) {
|
||||
tmp := g.new_tmp_var()
|
||||
// x := node.call_expr as ast.CallEpxr // TODO
|
||||
match node.call_expr {
|
||||
ast.CallExpr {
|
||||
mut name := it.name // .replace('.', '__')
|
||||
if it.is_method {
|
||||
receiver_sym := g.table.get_type_symbol(it.receiver_type)
|
||||
name = receiver_sym.name + '_' + name
|
||||
}
|
||||
name = name.replace('.', '__')
|
||||
g.writeln('// go')
|
||||
wrapper_struct_name := 'thread_arg_' + name
|
||||
wrapper_fn_name := name + '_thread_wrapper'
|
||||
arg_tmp_var := 'arg_' + tmp
|
||||
g.writeln('$wrapper_struct_name *$arg_tmp_var = malloc(sizeof(thread_arg_$name));')
|
||||
if it.is_method {
|
||||
g.write('$arg_tmp_var->arg0 = ')
|
||||
g.expr(it.left)
|
||||
g.writeln(';')
|
||||
}
|
||||
for i, arg in it.args {
|
||||
g.write('$arg_tmp_var->arg${i+1} = ')
|
||||
g.expr(arg.expr)
|
||||
g.writeln(';')
|
||||
}
|
||||
if g.pref.os == .windows {
|
||||
g.writeln('CreateThread(0,0, (LPTHREAD_START_ROUTINE)$wrapper_fn_name, $arg_tmp_var, 0,0);')
|
||||
} else {
|
||||
g.writeln('pthread_t thread_$tmp;')
|
||||
g.writeln('pthread_create(&thread_$tmp, NULL, (void*)$wrapper_fn_name, $arg_tmp_var);')
|
||||
}
|
||||
g.writeln('// endgo\n')
|
||||
// Register the wrapper type and function
|
||||
if name in g.threaded_fns {
|
||||
return
|
||||
}
|
||||
g.type_definitions.writeln('\ntypedef struct $wrapper_struct_name {')
|
||||
if it.is_method {
|
||||
styp := g.typ(it.receiver_type)
|
||||
g.type_definitions.writeln('\t$styp arg0;')
|
||||
}
|
||||
if it.args.len == 0 {
|
||||
g.type_definitions.writeln('EMPTY_STRUCT_DECLARATION;')
|
||||
} else {
|
||||
for i, arg in it.args {
|
||||
styp := g.typ(arg.typ)
|
||||
g.type_definitions.writeln('\t$styp arg${i+1};')
|
||||
}
|
||||
}
|
||||
g.type_definitions.writeln('} $wrapper_struct_name;')
|
||||
g.type_definitions.writeln('void* ${wrapper_fn_name}($wrapper_struct_name *arg);')
|
||||
g.gowrappers.writeln('void* ${wrapper_fn_name}($wrapper_struct_name *arg) {')
|
||||
g.gowrappers.write('\t${name}(')
|
||||
if it.is_method {
|
||||
g.gowrappers.write('arg->arg0')
|
||||
if it.args.len > 0 {
|
||||
g.gowrappers.write(', ')
|
||||
}
|
||||
}
|
||||
for i in 0 .. it.args.len {
|
||||
g.gowrappers.write('arg->arg${i+1}')
|
||||
if i < it.args.len - 1 {
|
||||
g.gowrappers.write(', ')
|
||||
}
|
||||
}
|
||||
g.gowrappers.writeln(');')
|
||||
g.gowrappers.writeln('\treturn 0;')
|
||||
g.gowrappers.writeln('}')
|
||||
g.threaded_fns << name
|
||||
}
|
||||
else {}
|
||||
expr := node.call_expr as ast.CallExpr
|
||||
mut name := expr.name // .replace('.', '__')
|
||||
if expr.is_method {
|
||||
receiver_sym := g.table.get_type_symbol(expr.receiver_type)
|
||||
name = receiver_sym.name + '_' + name
|
||||
}
|
||||
name = name.replace('.', '__')
|
||||
g.writeln('// go')
|
||||
wrapper_struct_name := 'thread_arg_' + name
|
||||
wrapper_fn_name := name + '_thread_wrapper'
|
||||
arg_tmp_var := 'arg_' + tmp
|
||||
g.writeln('$wrapper_struct_name *$arg_tmp_var = malloc(sizeof(thread_arg_$name));')
|
||||
if expr.is_method {
|
||||
g.write('$arg_tmp_var->arg0 = ')
|
||||
g.expr(expr.left)
|
||||
g.writeln(';')
|
||||
}
|
||||
for i, arg in expr.args {
|
||||
g.write('$arg_tmp_var->arg${i+1} = ')
|
||||
g.expr(arg.expr)
|
||||
g.writeln(';')
|
||||
}
|
||||
if g.pref.os == .windows {
|
||||
g.writeln('CreateThread(0,0, (LPTHREAD_START_ROUTINE)$wrapper_fn_name, $arg_tmp_var, 0,0);')
|
||||
} else {
|
||||
g.writeln('pthread_t thread_$tmp;')
|
||||
g.writeln('pthread_create(&thread_$tmp, NULL, (void*)$wrapper_fn_name, $arg_tmp_var);')
|
||||
}
|
||||
g.writeln('// endgo\n')
|
||||
// Register the wrapper type and function
|
||||
if name in g.threaded_fns {
|
||||
return
|
||||
}
|
||||
g.type_definitions.writeln('\ntypedef struct $wrapper_struct_name {')
|
||||
if expr.is_method {
|
||||
styp := g.typ(expr.receiver_type)
|
||||
g.type_definitions.writeln('\t$styp arg0;')
|
||||
}
|
||||
if expr.args.len == 0 {
|
||||
g.type_definitions.writeln('EMPTY_STRUCT_DECLARATION;')
|
||||
} else {
|
||||
for i, arg in expr.args {
|
||||
styp := g.typ(arg.typ)
|
||||
g.type_definitions.writeln('\t$styp arg${i+1};')
|
||||
}
|
||||
}
|
||||
g.type_definitions.writeln('} $wrapper_struct_name;')
|
||||
g.type_definitions.writeln('void* ${wrapper_fn_name}($wrapper_struct_name *arg);')
|
||||
g.gowrappers.writeln('void* ${wrapper_fn_name}($wrapper_struct_name *arg) {')
|
||||
g.gowrappers.write('\t${name}(')
|
||||
if expr.is_method {
|
||||
g.gowrappers.write('arg->arg0')
|
||||
if expr.args.len > 0 {
|
||||
g.gowrappers.write(', ')
|
||||
}
|
||||
}
|
||||
for i in 0 .. expr.args.len {
|
||||
g.gowrappers.write('arg->arg${i+1}')
|
||||
if i < expr.args.len - 1 {
|
||||
g.gowrappers.write(', ')
|
||||
}
|
||||
}
|
||||
g.gowrappers.writeln(');')
|
||||
g.gowrappers.writeln('\treturn 0;')
|
||||
g.gowrappers.writeln('}')
|
||||
g.threaded_fns << name
|
||||
}
|
||||
|
||||
fn (mut g Gen) as_cast(node ast.AsCast) {
|
||||
|
@ -277,11 +277,11 @@ pub fn (mut g JsGen) typ(t table.Type) string {
|
||||
// TODO: Implement interfaces
|
||||
styp = 'interface'
|
||||
}
|
||||
}
|
||||
/* else {
|
||||
println('jsgen.typ: Unhandled type $t')
|
||||
styp = sym.name
|
||||
} */
|
||||
}
|
||||
if styp.starts_with('JS.') { return styp[3..] }
|
||||
return styp
|
||||
}
|
||||
@ -369,7 +369,7 @@ pub fn (mut g JsGen) write(s string) {
|
||||
pub fn (mut g JsGen) writeln(s string) {
|
||||
g.gen_indent()
|
||||
g.out.writeln(s)
|
||||
g.empty_line = true
|
||||
g.empty_line = true
|
||||
}
|
||||
|
||||
pub fn (mut g JsGen) new_tmp_var() string {
|
||||
@ -510,11 +510,6 @@ fn (mut g JsGen) stmt(node ast.Stmt) {
|
||||
ast.UnsafeStmt {
|
||||
g.stmts(it.stmts)
|
||||
}
|
||||
/*
|
||||
else {
|
||||
verror('jsgen.stmt(): bad node ${typeof(node)}')
|
||||
}
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
||||
@ -639,11 +634,6 @@ fn (mut g JsGen) expr(node ast.Expr) {
|
||||
ast.ComptimeCall {
|
||||
// TODO
|
||||
}
|
||||
/*
|
||||
else {
|
||||
println(term.red('jsgen.expr(): unhandled node "${typeof(node)}"'))
|
||||
}
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -463,9 +463,9 @@ pub fn (mut g Gen) gen_print_from_expr(expr ast.Expr, newline bool) {
|
||||
match expr {
|
||||
ast.StringLiteral {
|
||||
if newline {
|
||||
g.gen_print(it.val + '\n')
|
||||
g.gen_print(expr.val + '\n')
|
||||
} else {
|
||||
g.gen_print(it.val)
|
||||
g.gen_print(expr.val)
|
||||
}
|
||||
}
|
||||
else {}
|
||||
@ -559,11 +559,11 @@ pub fn (mut g Gen) call_fn(node ast.CallExpr) {
|
||||
match expr {
|
||||
ast.IntegerLiteral {
|
||||
// `foo(2)` => `mov edi,0x2`
|
||||
g.mov(fn_arg_registers[i], it.val.int())
|
||||
g.mov(fn_arg_registers[i], expr.val.int())
|
||||
}
|
||||
ast.Ident {
|
||||
// `foo(x)` => `mov edi,DWORD PTR [rbp-0x8]`
|
||||
var_offset := g.get_var_offset(it.name)
|
||||
var_offset := g.get_var_offset(expr.name)
|
||||
println('i=$i fn name= $name offset=$var_offset')
|
||||
println(int(fn_arg_registers[i]))
|
||||
g.mov_var_to_reg(fn_arg_registers[i], var_offset)
|
||||
@ -584,20 +584,20 @@ pub fn (mut g Gen) call_fn(node ast.CallExpr) {
|
||||
fn (mut g Gen) stmt(node ast.Stmt) {
|
||||
match node {
|
||||
ast.AssignStmt {
|
||||
g.assign_stmt(it)
|
||||
g.assign_stmt(node)
|
||||
}
|
||||
ast.ConstDecl {}
|
||||
ast.ExprStmt {
|
||||
g.expr(it.expr)
|
||||
g.expr(node.expr)
|
||||
}
|
||||
ast.FnDecl {
|
||||
g.fn_decl(it)
|
||||
g.fn_decl(node)
|
||||
}
|
||||
ast.ForStmt {
|
||||
g.for_stmt(it)
|
||||
g.for_stmt(node)
|
||||
}
|
||||
ast.HashStmt {
|
||||
words := it.val.split(' ')
|
||||
words := node.val.split(' ')
|
||||
for word in words {
|
||||
if word.len != 2 {
|
||||
verror('opcodes format: xx xx xx xx')
|
||||
@ -615,7 +615,7 @@ fn (mut g Gen) stmt(node ast.Stmt) {
|
||||
}
|
||||
ast.StructDecl {}
|
||||
ast.UnsafeStmt {
|
||||
g.stmts(it.stmts)
|
||||
g.stmts(node.stmts)
|
||||
}
|
||||
else {
|
||||
println('x64.stmt(): bad node: ' + typeof(node))
|
||||
@ -631,22 +631,22 @@ fn (mut g Gen) expr(node ast.Expr) {
|
||||
ast.ArrayInit {}
|
||||
ast.BoolLiteral {}
|
||||
ast.CallExpr {
|
||||
if it.name in ['println', 'print', 'eprintln', 'eprint'] {
|
||||
expr := it.args[0].expr
|
||||
g.gen_print_from_expr(expr, it.name in ['println', 'eprintln'])
|
||||
if node.name in ['println', 'print', 'eprintln', 'eprint'] {
|
||||
expr := node.args[0].expr
|
||||
g.gen_print_from_expr(expr, node.name in ['println', 'eprintln'])
|
||||
return
|
||||
}
|
||||
g.call_fn(it)
|
||||
g.call_fn(node)
|
||||
}
|
||||
ast.FloatLiteral {}
|
||||
ast.Ident {}
|
||||
ast.IfExpr {
|
||||
g.if_expr(it)
|
||||
g.if_expr(node)
|
||||
}
|
||||
ast.InfixExpr {}
|
||||
ast.IntegerLiteral {}
|
||||
ast.PostfixExpr {
|
||||
g.postfix_expr(it)
|
||||
g.postfix_expr(node)
|
||||
}
|
||||
ast.StringLiteral {}
|
||||
ast.StructInit {}
|
||||
@ -700,10 +700,10 @@ fn (mut g Gen) assign_stmt(node ast.AssignStmt) {
|
||||
// ident := left as ast.Ident
|
||||
match right {
|
||||
ast.IntegerLiteral {
|
||||
g.allocate_var(name, 4, it.val.int())
|
||||
g.allocate_var(name, 4, right.val.int())
|
||||
}
|
||||
ast.InfixExpr {
|
||||
g.infix_expr(it)
|
||||
g.infix_expr(right)
|
||||
g.allocate_var(name, 4, 0)
|
||||
// `mov DWORD PTR [rbp-0x8],eax`
|
||||
offset := g.get_var_offset(name)
|
||||
|
@ -793,6 +793,9 @@ pub fn (mut p Parser) parse_ident(language table.Language) ast.Ident {
|
||||
}
|
||||
}
|
||||
}
|
||||
if p.inside_match_body && name == 'it' {
|
||||
// p.warn('it')
|
||||
}
|
||||
if p.expr_mod.len > 0 {
|
||||
name = '${p.expr_mod}.$name'
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user