From 124183ce94ef9941a077ff7e2a84738dfd7f8dcb Mon Sep 17 00:00:00 2001 From: Ting-Wei Lan Date: Wed, 20 Feb 2019 16:32:14 +0800 Subject: core: vm: sqlvm: check if a number is a valid address This commit implements isAddress function to allow a number literal to be considered as an address literal. Since Solidity only allows '0x' to be written in lower case, we remove the handling of upper case '0X' to keep the behavior in sync with Solidity. In addition to isAddress implementation, this commit also removes 'String' methods from AST nodes to prevent them from implementing the builtin 'Stringer' interface. Therefore, our AST printer is now able to print struct fields of value nodes instead of only one string. --- core/vm/sqlvm/ast/ast.go | 22 ---------------------- core/vm/sqlvm/ast/printer.go | 6 +++++- 2 files changed, 5 insertions(+), 23 deletions(-) (limited to 'core/vm/sqlvm/ast') diff --git a/core/vm/sqlvm/ast/ast.go b/core/vm/sqlvm/ast/ast.go index ffd4a1011..ca0f60aa7 100644 --- a/core/vm/sqlvm/ast/ast.go +++ b/core/vm/sqlvm/ast/ast.go @@ -1,8 +1,6 @@ package ast import ( - "strconv" - "github.com/dexon-foundation/dexon/core/vm/sqlvm/errors" "github.com/shopspring/decimal" ) @@ -142,11 +140,6 @@ func (n BoolValueNode) Value() interface{} { return n.V } -// String is used for printing AST. -func (n BoolValueNode) String() string { - return strconv.FormatBool(n.V) -} - // IntegerValueNode is an integer constant. type IntegerValueNode struct { TaggedExprNodeBase @@ -171,11 +164,6 @@ func (n IntegerValueNode) Value() interface{} { return n.V } -// String is used for printing AST. -func (n IntegerValueNode) String() string { - return n.V.String() -} - // DecimalValueNode is a number constant. type DecimalValueNode struct { TaggedExprNodeBase @@ -199,11 +187,6 @@ func (n DecimalValueNode) Value() interface{} { return n.V } -// String is used for printing AST. -func (n DecimalValueNode) String() string { - return n.V.String() -} - // BytesValueNode is a dynamic or fixed bytes constant. type BytesValueNode struct { TaggedExprNodeBase @@ -227,11 +210,6 @@ func (n BytesValueNode) Value() interface{} { return n.V } -// String is used for printing AST. -func (n BytesValueNode) String() string { - return string(n.V) -} - // AnyValueNode is '*' used in SELECT and function call. type AnyValueNode struct { UntaggedExprNodeBase diff --git a/core/vm/sqlvm/ast/printer.go b/core/vm/sqlvm/ast/printer.go index a3dd1ba07..56cfd07b9 100644 --- a/core/vm/sqlvm/ast/printer.go +++ b/core/vm/sqlvm/ast/printer.go @@ -73,7 +73,11 @@ func printAST(w io.Writer, n interface{}, depth int, base string, detail bool) { } if stringer, ok := n.(fmt.Stringer); ok { s := stringer.String() - fmt.Fprintf(w, "%s%s: %s\n", indent, name, formatString(s)) + fmt.Fprintf(w, "%s%s\n", indent, formatString(s)) + return + } + if s, ok := n.(string); ok { + fmt.Fprintf(w, "%s%s\n", indent, formatString(s)) return } if bs, ok := n.([]byte); ok { -- cgit v1.2.3