mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
all: unsafe nil
This commit is contained in:
parent
9b1a616b13
commit
5f78647137
@ -42,6 +42,7 @@ pub type Expr = AnonFn
|
|||||||
| LockExpr
|
| LockExpr
|
||||||
| MapInit
|
| MapInit
|
||||||
| MatchExpr
|
| MatchExpr
|
||||||
|
| Nil
|
||||||
| NodeError
|
| NodeError
|
||||||
| None
|
| None
|
||||||
| OffsetOf
|
| OffsetOf
|
||||||
@ -240,6 +241,11 @@ pub:
|
|||||||
pos token.Pos
|
pos token.Pos
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub struct Nil {
|
||||||
|
pub:
|
||||||
|
pos token.Pos
|
||||||
|
}
|
||||||
|
|
||||||
pub enum GenericKindField {
|
pub enum GenericKindField {
|
||||||
unknown
|
unknown
|
||||||
name
|
name
|
||||||
@ -1774,7 +1780,7 @@ pub fn (expr Expr) pos() token.Pos {
|
|||||||
EnumVal, DumpExpr, FloatLiteral, GoExpr, Ident, IfExpr, IntegerLiteral, IsRefType, Likely,
|
EnumVal, DumpExpr, FloatLiteral, GoExpr, Ident, IfExpr, IntegerLiteral, IsRefType, Likely,
|
||||||
LockExpr, MapInit, MatchExpr, None, OffsetOf, OrExpr, ParExpr, PostfixExpr, PrefixExpr,
|
LockExpr, MapInit, MatchExpr, None, OffsetOf, OrExpr, ParExpr, PostfixExpr, PrefixExpr,
|
||||||
RangeExpr, SelectExpr, SelectorExpr, SizeOf, SqlExpr, StringInterLiteral, StringLiteral,
|
RangeExpr, SelectExpr, SelectorExpr, SizeOf, SqlExpr, StringInterLiteral, StringLiteral,
|
||||||
StructInit, TypeNode, TypeOf, UnsafeExpr, ComptimeType {
|
StructInit, TypeNode, TypeOf, UnsafeExpr, ComptimeType, Nil {
|
||||||
return expr.pos
|
return expr.pos
|
||||||
}
|
}
|
||||||
IndexExpr {
|
IndexExpr {
|
||||||
|
@ -387,6 +387,9 @@ pub fn (x Expr) str() string {
|
|||||||
}
|
}
|
||||||
return 'map{ ${pairs.join(' ')} }'
|
return 'map{ ${pairs.join(' ')} }'
|
||||||
}
|
}
|
||||||
|
Nil {
|
||||||
|
return 'nil'
|
||||||
|
}
|
||||||
ParExpr {
|
ParExpr {
|
||||||
return '($x.expr)'
|
return '($x.expr)'
|
||||||
}
|
}
|
||||||
|
@ -442,13 +442,14 @@ pub const (
|
|||||||
int_literal_type_idx = 27
|
int_literal_type_idx = 27
|
||||||
thread_type_idx = 28
|
thread_type_idx = 28
|
||||||
error_type_idx = 29
|
error_type_idx = 29
|
||||||
|
nil_type_idx = 30
|
||||||
// u8_type_idx = 30
|
// u8_type_idx = 30
|
||||||
)
|
)
|
||||||
|
|
||||||
// Note: builtin_type_names must be in the same order as the idx consts above
|
// Note: builtin_type_names must be in the same order as the idx consts above
|
||||||
pub const builtin_type_names = ['void', 'voidptr', 'byteptr', 'charptr', 'i8', 'i16', 'int', 'i64',
|
pub const builtin_type_names = ['void', 'voidptr', 'byteptr', 'charptr', 'i8', 'i16', 'int', 'i64',
|
||||||
'isize', 'u8', 'u16', 'u32', 'u64', 'usize', 'f32', 'f64', 'char', 'bool', 'none', 'string',
|
'isize', 'u8', 'u16', 'u32', 'u64', 'usize', 'f32', 'f64', 'char', 'bool', 'none', 'string',
|
||||||
'rune', 'array', 'map', 'chan', 'any', 'float_literal', 'int_literal', 'thread', 'Error', 'u8']
|
'rune', 'array', 'map', 'chan', 'any', 'float_literal', 'int_literal', 'thread', 'Error', 'nil']
|
||||||
|
|
||||||
pub const builtin_type_names_matcher = build_builtin_type_names_matcher()
|
pub const builtin_type_names_matcher = build_builtin_type_names_matcher()
|
||||||
|
|
||||||
@ -509,6 +510,7 @@ pub const (
|
|||||||
byteptr_types = new_byteptr_types()
|
byteptr_types = new_byteptr_types()
|
||||||
voidptr_types = new_voidptr_types()
|
voidptr_types = new_voidptr_types()
|
||||||
cptr_types = merge_types(voidptr_types, byteptr_types, charptr_types)
|
cptr_types = merge_types(voidptr_types, byteptr_types, charptr_types)
|
||||||
|
nil_type = new_type(nil_type_idx)
|
||||||
)
|
)
|
||||||
|
|
||||||
fn new_charptr_types() []Type {
|
fn new_charptr_types() []Type {
|
||||||
@ -809,7 +811,7 @@ pub fn (mut t Table) register_builtin_type_symbols() {
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
t.register_sym(kind: .interface_, name: 'IError', cname: 'IError', mod: 'builtin')
|
t.register_sym(kind: .interface_, name: 'IError', cname: 'IError', mod: 'builtin')
|
||||||
t.register_sym(kind: .u8, name: 'zu8', cname: 'zu8', mod: 'builtin')
|
t.register_sym(kind: .voidptr, name: 'nil', cname: 'nil', mod: 'builtin')
|
||||||
}
|
}
|
||||||
|
|
||||||
[inline]
|
[inline]
|
||||||
|
@ -2213,6 +2213,12 @@ pub fn (mut c Checker) expr(node_ ast.Expr) ast.Type {
|
|||||||
ast.MatchExpr {
|
ast.MatchExpr {
|
||||||
return c.match_expr(mut node)
|
return c.match_expr(mut node)
|
||||||
}
|
}
|
||||||
|
ast.Nil {
|
||||||
|
if !c.inside_unsafe {
|
||||||
|
c.error('`nil` is only allowed in `unsafe` code', node.pos)
|
||||||
|
}
|
||||||
|
return ast.nil_type
|
||||||
|
}
|
||||||
ast.PostfixExpr {
|
ast.PostfixExpr {
|
||||||
return c.postfix_expr(mut node)
|
return c.postfix_expr(mut node)
|
||||||
}
|
}
|
||||||
|
@ -622,6 +622,9 @@ pub fn (mut f Fmt) expr(node_ ast.Expr) {
|
|||||||
ast.None {
|
ast.None {
|
||||||
f.write('none')
|
f.write('none')
|
||||||
}
|
}
|
||||||
|
ast.Nil {
|
||||||
|
f.write('nil')
|
||||||
|
}
|
||||||
ast.OffsetOf {
|
ast.OffsetOf {
|
||||||
f.offset_of(node)
|
f.offset_of(node)
|
||||||
}
|
}
|
||||||
|
@ -3020,6 +3020,9 @@ fn (mut g Gen) expr(node_ ast.Expr) {
|
|||||||
g.match_expr(node)
|
g.match_expr(node)
|
||||||
}
|
}
|
||||||
ast.NodeError {}
|
ast.NodeError {}
|
||||||
|
ast.Nil {
|
||||||
|
g.write('((void*)0)')
|
||||||
|
}
|
||||||
ast.None {
|
ast.None {
|
||||||
g.write('_const_none__')
|
g.write('_const_none__')
|
||||||
}
|
}
|
||||||
|
@ -353,6 +353,7 @@ fn (mut w Walker) expr(node_ ast.Expr) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
ast.None {}
|
ast.None {}
|
||||||
|
ast.Nil{}
|
||||||
ast.ParExpr {
|
ast.ParExpr {
|
||||||
w.expr(node.expr)
|
w.expr(node.expr)
|
||||||
}
|
}
|
||||||
|
@ -132,6 +132,10 @@ pub fn (mut p Parser) check_expr(precedence int) ?ast.Expr {
|
|||||||
.key_select {
|
.key_select {
|
||||||
node = p.select_expr()
|
node = p.select_expr()
|
||||||
}
|
}
|
||||||
|
.key_nil {
|
||||||
|
node = ast.Nil{pos:p.tok.pos()}
|
||||||
|
p.next()
|
||||||
|
}
|
||||||
.number {
|
.number {
|
||||||
node = p.parse_number_literal()
|
node = p.parse_number_literal()
|
||||||
}
|
}
|
||||||
|
@ -108,6 +108,7 @@ pub enum Kind {
|
|||||||
key_match
|
key_match
|
||||||
key_module
|
key_module
|
||||||
key_mut
|
key_mut
|
||||||
|
key_nil
|
||||||
key_shared
|
key_shared
|
||||||
key_lock
|
key_lock
|
||||||
key_rlock
|
key_rlock
|
||||||
@ -313,6 +314,7 @@ fn build_token_str() []string {
|
|||||||
s[Kind.key_match] = 'match'
|
s[Kind.key_match] = 'match'
|
||||||
s[Kind.key_select] = 'select'
|
s[Kind.key_select] = 'select'
|
||||||
s[Kind.key_none] = 'none'
|
s[Kind.key_none] = 'none'
|
||||||
|
s[Kind.key_nil] = 'nil'
|
||||||
s[Kind.key_offsetof] = '__offsetof'
|
s[Kind.key_offsetof] = '__offsetof'
|
||||||
s[Kind.key_is] = 'is'
|
s[Kind.key_is] = 'is'
|
||||||
// The following kinds are not for tokens returned by the V scanner.
|
// The following kinds are not for tokens returned by the V scanner.
|
||||||
@ -617,6 +619,7 @@ pub fn kind_to_string(k Kind) string {
|
|||||||
.key_unsafe { 'key_unsafe' }
|
.key_unsafe { 'key_unsafe' }
|
||||||
.keyword_end { 'keyword_end' }
|
.keyword_end { 'keyword_end' }
|
||||||
._end_ { '_end_' }
|
._end_ { '_end_' }
|
||||||
|
.key_nil { 'key_nil' }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user