aergoio/aergo

View on GitHub
cmd/brick/exec/debug.go

Summary

Maintainability
B
6 hrs
Test Coverage
//go:build Debug
// +build Debug

package exec

import (
    "fmt"
    "strconv"

    "github.com/aergoio/aergo/v2/cmd/brick/context"
    "github.com/aergoio/aergo/v2/contract"
    "github.com/aergoio/aergo/v2/types"
)

func init() {
    registerExec(&setb{})
    registerExec(&delb{})
    registerExec(&listb{})
    registerExec(&resetb{})
    registerExec(&setw{})
    registerExec(&delw{})
    registerExec(&listw{})
    registerExec(&resetw{})
}

// =====================================
//             Breakpoint
// =====================================

// =========== setb ==============
type setb struct{}

func (c *setb) Command() string {
    return "setb"
}

func (c *setb) Syntax() string {
    return fmt.Sprintf("%s %s", "<line>", context.ContractSymbol)
}

func (c *setb) Usage() string {
    return "setb <line> <contract_name>"
}

func (c *setb) Describe() string {
    return "set breakpoint"
}

func (c *setb) Validate(args string) error {

    _, _, err := c.parse(args)

    return err
}

func (c *setb) parse(args string) (uint64, string, error) {
    splitArgs := context.SplitSpaceAndAccent(args, false)
    if len(splitArgs) < 2 {
        return 0, "", fmt.Errorf("need 2 arguments. usage: %s", c.Usage())
    }

    line, err := strconv.ParseUint(splitArgs[0].Text, 10, 64)
    if err != nil {
        return 0, "", fmt.Errorf("fail to parse number %s: %s", splitArgs[1].Text, err.Error())
    }

    contractIDHex := contract.PlainStrToHexAddr(splitArgs[1].Text)

    return line, contractIDHex, nil
}

func (c *setb) Run(args string) (string, uint64, []*types.Event, error) {
    line, contractIDHex, _ := c.parse(args)

    err := contract.SetBreakPoint(contractIDHex, line)
    if err != nil {
        return "", 0, nil, err
    }
    addr, err := contract.HexAddrToBase58Addr(contractIDHex)
    if err != nil {
        return "", 0, nil, err
    }

    return "set breakpoint: " + fmt.Sprintf("%s:%d", addr, line), 0, nil, nil
}

// =========== delb ==============

type delb struct{}

func (c *delb) Command() string {
    return "delb"
}

func (c *delb) Syntax() string {
    return fmt.Sprintf("%s %s", "<line>", context.ContractSymbol)
}

func (c *delb) Usage() string {
    return "delb <line> <contract_name>"
}

func (c *delb) Describe() string {
    return "delete breakpoint"
}

func (c *delb) Validate(args string) error {

    _, _, err := c.parse(args)

    return err
}

func (c *delb) parse(args string) (uint64, string, error) {
    splitArgs := context.SplitSpaceAndAccent(args, false)
    if len(splitArgs) < 2 {
        return 0, "", fmt.Errorf("need 2 arguments. usage: %s", c.Usage())
    }

    line, err := strconv.ParseUint(splitArgs[0].Text, 10, 64)
    if err != nil {
        return 0, "", fmt.Errorf("fail to parse number %s: %s", splitArgs[1].Text, err.Error())
    }

    contractIDHex := contract.PlainStrToHexAddr(splitArgs[1].Text)

    return line, contractIDHex, nil
}

func (c *delb) Run(args string) (string, uint64, []*types.Event, error) {
    line, contractIDHex, _ := c.parse(args)

    err := contract.DelBreakPoint(contractIDHex, line)
    if err != nil {
        return "", 0, nil, err
    }
    addr, err := contract.HexAddrToBase58Addr(contractIDHex)
    if err != nil {
        return "", 0, nil, err
    }

    return "del breakpoint: " + fmt.Sprintf("%s:%d", addr, line), 0, nil, nil
}

// =========== listb ==============

type listb struct{}

func (c *listb) Command() string {
    return "listb"
}

func (c *listb) Syntax() string {
    return ""
}

func (c *listb) Usage() string {
    return "listb"
}

func (c *listb) Describe() string {
    return "list all breakpoints"
}

func (c *listb) Validate(args string) error {
    return nil
}

func (c *listb) Run(args string) (string, uint64, []*types.Event, error) {
    contract.PrintBreakPoints()

    return "list breakpoints", 0, nil, nil
}

// =========== resetb ==============

type resetb struct{}

func (c *resetb) Command() string {
    return "resetb"
}

func (c *resetb) Syntax() string {
    return ""
}

func (c *resetb) Usage() string {
    return "resetb"
}

func (c *resetb) Describe() string {
    return "reset all breakpoints"
}

func (c *resetb) Validate(args string) error {
    return nil
}

func (c *resetb) Run(args string) (string, uint64, []*types.Event, error) {
    contract.ResetBreakPoints()

    return "reset breakpoints", 0, nil, nil
}

// =====================================
//             Watchpoint
// =====================================

// =========== setw ==============
type setw struct{}

func (c *setw) Command() string {
    return "setw"
}

func (c *setw) Syntax() string {
    return fmt.Sprintf("%s", "<watch_expr>")
}

func (c *setw) Usage() string {
    return "setw `<watch_expr>`"
}

func (c *setw) Describe() string {
    return "set watchpoint"
}

func (c *setw) Validate(args string) error {

    _, err := c.parse(args)

    return err
}

func (c *setw) parse(args string) (string, error) {
    splitArgs := context.SplitSpaceAndAccent(args, false)
    if len(splitArgs) < 1 {
        return "", fmt.Errorf("need an arguments. usage: %s", c.Usage())
    }

    return splitArgs[0].Text, nil
}

func (c *setw) Run(args string) (string, uint64, []*types.Event, error) {
    watch_expr, _ := c.parse(args)

    err := contract.SetWatchPoint(watch_expr)
    if err != nil {
        return "", 0, nil, err
    }

    return "set watchpoint: " + watch_expr, 0, nil, nil
}

// =========== delw ==============

type delw struct{}

func (c *delw) Command() string {
    return "delw"
}

func (c *delw) Syntax() string {
    return fmt.Sprintf("%s", "<index>")
}

func (c *delw) Usage() string {
    return "delw <index>"
}

func (c *delw) Describe() string {
    return "delete watchpoint"
}

func (c *delw) Validate(args string) error {

    _, err := c.parse(args)

    return err
}

func (c *delw) parse(args string) (uint64, error) {
    splitArgs := context.SplitSpaceAndAccent(args, false)
    if len(splitArgs) < 1 {
        return 0, fmt.Errorf("need an arguments. usage: %s", c.Usage())
    }

    idx, err := strconv.ParseUint(splitArgs[0].Text, 10, 64)
    if err != nil {
        return 0, fmt.Errorf("fail to parse number %s: %s", splitArgs[0].Text, err.Error())
    }

    return idx, nil
}

func (c *delw) Run(args string) (string, uint64, []*types.Event, error) {
    idx, _ := c.parse(args)

    err := contract.DelWatchPoint(idx)
    if err != nil {
        return "", 0, nil, err
    }

    return "del watchpoint: " + fmt.Sprintf("%d", idx), 0, nil, nil
}

// =========== listw ==============

type listw struct{}

func (c *listw) Command() string {
    return "listw"
}

func (c *listw) Syntax() string {
    return ""
}

func (c *listw) Usage() string {
    return "listw"
}

func (c *listw) Describe() string {
    return "list all watchpoints"
}

func (c *listw) Validate(args string) error {
    return nil
}

func (c *listw) Run(args string) (string, uint64, []*types.Event, error) {
    watchpoints := contract.ListWatchPoints()
    i := 0
    for e := watchpoints.Front(); e != nil; e = e.Next() {
        i++
        fmt.Printf("%d: %s\n", i, e.Value)
    }

    return "list watchpoints", 0, nil, nil
}

// =========== resetb ==============

type resetw struct{}

func (c *resetw) Command() string {
    return "resetw"
}

func (c *resetw) Syntax() string {
    return ""
}

func (c *resetw) Usage() string {
    return "resetw"
}

func (c *resetw) Describe() string {
    return "reset all watchpoints"
}

func (c *resetw) Validate(args string) error {
    return nil
}

func (c *resetw) Run(args string) (string, uint64, []*types.Event, error) {
    contract.ResetWatchPoints()

    return "reset watchpoints", 0, nil, nil
}

// =====================================
//             interfaces
// =====================================

func resetContractInfoInterface() {
    contract.ResetContractInfo()
}

func updateContractInfoInterface(contractName string, defPath string) {
    contract.UpdateContractInfo(
        contract.PlainStrToHexAddr(contractName), defPath)
}