mirror of
https://github.com/nspcc-dev/neo-go.git
synced 2024-11-29 13:41:47 +00:00
compiler: process nil
comparisons separately
This commit is contained in:
parent
e4af295080
commit
ae88c77a8a
1 changed files with 20 additions and 21 deletions
|
@ -702,6 +702,15 @@ func (c *codegen) Visit(node ast.Node) ast.Visitor {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if arg := c.getCompareWithNilArg(n); arg != nil {
|
||||||
|
ast.Walk(c, arg)
|
||||||
|
emit.Opcode(c.prog.BinWriter, opcode.ISNULL)
|
||||||
|
if n.Op == token.NEQ {
|
||||||
|
emit.Opcode(c.prog.BinWriter, opcode.NOT)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
switch n.Op {
|
switch n.Op {
|
||||||
case token.LAND:
|
case token.LAND:
|
||||||
end := c.newLabel()
|
end := c.newLabel()
|
||||||
|
@ -724,27 +733,8 @@ func (c *codegen) Visit(node ast.Node) ast.Visitor {
|
||||||
return nil
|
return nil
|
||||||
|
|
||||||
default:
|
default:
|
||||||
var checkForNull bool
|
ast.Walk(c, n.X)
|
||||||
|
ast.Walk(c, n.Y)
|
||||||
if isExprNil(n.X) {
|
|
||||||
checkForNull = true
|
|
||||||
} else {
|
|
||||||
ast.Walk(c, n.X)
|
|
||||||
}
|
|
||||||
if isExprNil(n.Y) {
|
|
||||||
checkForNull = true
|
|
||||||
} else {
|
|
||||||
ast.Walk(c, n.Y)
|
|
||||||
}
|
|
||||||
if checkForNull {
|
|
||||||
emit.Opcode(c.prog.BinWriter, opcode.ISNULL)
|
|
||||||
if n.Op == token.NEQ {
|
|
||||||
emit.Opcode(c.prog.BinWriter, opcode.NOT)
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
switch {
|
switch {
|
||||||
case n.Op == token.ADD:
|
case n.Op == token.ADD:
|
||||||
// VM has separate opcodes for number and string concatenation
|
// VM has separate opcodes for number and string concatenation
|
||||||
|
@ -1149,6 +1139,15 @@ func isFallthroughStmt(c ast.Node) bool {
|
||||||
return ok && s.Tok == token.FALLTHROUGH
|
return ok && s.Tok == token.FALLTHROUGH
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *codegen) getCompareWithNilArg(n *ast.BinaryExpr) ast.Expr {
|
||||||
|
if isExprNil(n.X) {
|
||||||
|
return n.Y
|
||||||
|
} else if isExprNil(n.Y) {
|
||||||
|
return n.X
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (c *codegen) pushStackLabel(name string, size int) {
|
func (c *codegen) pushStackLabel(name string, size int) {
|
||||||
c.labelList = append(c.labelList, labelWithStackSize{
|
c.labelList = append(c.labelList, labelWithStackSize{
|
||||||
name: name,
|
name: name,
|
||||||
|
|
Loading…
Reference in a new issue