about summary refs log tree commit diff
path: root/pkg/lang/vm/mem/mem.go
blob: b590bcc6d9074d60c8e8ff09a6060dc45e472506 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #0000ff }
.highlight .c { color: #0F0 } /* Comment */
.highlight .err { color: #DDD } /* Error */
.highlight .esc { color: #DDD } /* Escape */
.highlight .g { color: #DDD } /* Generic */
.highlight .k { color: #F00 } /* Keyword */
.highlight .l { color: #DDD } /* Literal */
.highlight .n { color: #DDD } /* Name */
.highlight .o { color: #DDD } /* Operator */
.highlight .x { color: #DDD } /* Other */
.highlight .p { color: #DDD } /* Punctuation */
.highlight .ch { color: #0F0 } /* Comment.Hashbang */
.highlight .cm { color: #0F0 } /* Comment.Multiline */
.highlight .cp { color: #E5E5E5 } /* Comment.Preproc */
.highlight .cpf { color: #0F0 } /* Comment.PreprocFile */
.highlight .c1 { color: #0F0 } /* Comment.Single */
.highlight .cs { color: #0F0 } /* Comment.Special */
.highlight .gd { color: #DDD } /* Generic.Deleted */
.highlight .ge { color: #DDD } /* Generic.Emph */
.highlight .ges { color: #DDD } /* Generic.EmphStrong */
.highlight .gr { color: #DDD } /* Generic.Error */
.highlight .gh { color: #DDD } /* Generic.Heading */
.highlight .gi { color: #DDD } /* Generic.Inserted */
.highlight .go { color: #DDD } /* Generic.Output */
.highlight .gp { color: #DDD } /* Generic.Prompt */
.highlight .gs { color: #DDD } /* Generic.Strong */
.highlight .gu { color: #DDD } /* Generic.Subheading */
.highlight .gt { color: #DDD } /* Generic.Traceback */
.highlight .kc { color: #F00 } /* Keyword.Constant */
.highlight .kd { color: #F00 } /* Keyword.Declaration */
.highlight .kn { color: #F00 } /* Keyword.Namespace */
.highlight .kp { color: #F00 } /* Keyword.Pseudo */
.highlight .kr { color: #F00 } /* Keyword.Reserved */
.highlight .kt { color: #EE82EE } /* Keyword.Type */
.highlight .ld { color: #DDD } /* Literal.Date */
.highlight .m { color: #F0F } /* Literal.Number */
.highlight .s { color: #87CEEB } /* Literal.String */
.highlight .na { color: #DDD } /* Name.Attribute */
.highlight .nb { color: #DDD } /* Name.Builtin */
.highlight .nc { color: #DDD } /* Name.Class */
.highlight .no { color: #7FFFD4 } /* Name.Constant */
.highlight .nd { color: #DDD } /* Name.Decorator */
.highlight .ni { color: #DDD } /* Name.Entity */
.highlight .ne { color: #DDD } /* Name.Exception */
.highlight .nf { color: #FF0 } /* Name.Function */
.highlight .nl { color: #DDD } /* Name.Label */
.highlight .nn { color: #DDD } /* Name.Namespace */
.highlight .nx { color: #DDD } /* Name.Other */
.highlight .py { color: #DDD } /* Name.Property */
.highlight .nt { color: #DDD } /* Name.Tag */
.highlight .nv { color: #EEDD82 } /* Name.Variable */
.highlight .ow { color: #F00 } /* Operator.Word */
.highlight .pm { color: #DDD } /* Punctuation.Marker */
.highlight .w { color: #DDD } /* Text.Whitespace */
.highlight .mb { color: #F0F } /* Literal.Number.Bin */
.highlight .mf { color: #F0F } /* Literal.Number.Float */
.highlight .mh { color: #F0F } /* Literal.Number.Hex */
.highlight .mi { color: #F0F } /* Literal.Number.Integer */
.highlight .mo { color: #F0F } /* Literal.Number.Oct */
.highlight .sa { color: #87CEEB } /* Literal.String.Affix */
.highlight .sb { color: #87CEEB } /* Literal.String.Backtick */
.highlight .sc { color: #87CEEB } /* Literal.String.Char */
.highlight .dl { color: #87CEEB } /* Literal.String.Delimiter */
.highlight .sd { color: #87CEEB } /* Literal.String.Doc */
.highlight .s2 { color: #87CEEB } /* Literal.String.Double */
.highlight .se { color: #87CEEB } /* Literal.String.Escape */
.highlight .sh { color: #87CEEB } /* Literal.String.Heredoc */
.highlight .si { color: #87CEEB } /* Literal.String.Interpol */
.highlight .sx { color: #87CEEB } /* Literal.String.Other */
.highlight .sr { color: #87CEEB } /* Literal.String.Regex */
.highlight .s1 { color: #87CEEB } /* Literal.String.Single */
.highlight .ss { color: #87CEEB } /* Literal.String.Symbol */
.highlight .bp { color: #DDD } /* Name.Builtin.Pseudo */
.highlight .fm { color: #FF0 } /* Name.Function.Magic */
.highlight .vc { color: #EEDD82 } /* Name.Variable.Class */
.highlight .vg { color: #EEDD82 } /* Name.Variable.Global */
.highlight .vi { color: #EEDD82 } /* Name.Variable.Instance */
.highlight .vm { color: #EEDD82 } /* Name.Variable.Magic */
.highlight .il { color: #F0F } /* Literal.Number.Integer.Long */
package text

import "jinx/pkg/lang/vm/code"

var (
	opToString = map[code.Op]string{
		code.OpNop:          "nop",
		code.OpHalt:         "halt",
		code.OpPushInt:      "push_int",
		code.OpPushFloat:    "push_float",
		code.OpPushString:   "push_string",
		code.OpPushTrue:     "push_true",
		code.OpPushFalse:    "push_false",
		code.OpPushNull:     "push_null",
		code.OpPushArray:    "push_array",
		code.OpPushFunction: "push_function",
		code.OpPushObject:   "push_object",
		code.OpPushType:     "push_type",
		code.OpDrop:         "drop",
		code.OpAddGlobal:    "add_global",
		code.OpGetGlobal:    "get_global",
		code.OpSetGlobal:    "set_global",
		code.OpGetLocal:     "get_local",
		code.OpSetLocal:     "set_local",
		code.OpGetMember:    "get_member",
		code.OpSetMember:    "set_member",
		code.OpGetEnv:       "get_env",
		code.OpSetEnv:       "set_env",
		code.OpAddToEnv:     "add_to_env",
		code.OpAnchorType:   "anchor_type",
		code.OpSetArgCount:  "set_arg_count",
		code.OpAdd:          "add",
		code.OpSub:          "sub",
		code.OpMul:          "mul",
		code.OpDiv:          "div",
		code.OpMod:          "mod",
		code.OpEq:           "eq",
		code.OpGt:           "gt",
		code.OpLt:           "lt",
		code.OpLte:          "lte",
		code.OpGte:          "gte",
		code.OpIndex:        "index",
		code.OpCall:         "call",
		code.OpJmp:          "jmp",
		code.OpJt:           "jt",
		code.OpJf:           "jf",
		code.OpRet:          "ret",

		code.OpTempArrPush: "temp_arr_push",
		code.OpTempArrLen:  "temp_arr_len",
	}
	stringToOp = reverseMap(opToString)
)

func OpToString(op code.Op) string {
	str, ok := opToString[op]
	if !ok {
		return "unknown"
	}
	return str
}

func StringToOp(str string) (code.Op, error) {
	op, ok := stringToOp[str]
	if !ok {
		return 0, ErrUnknownOp{Op: str}
	}
	return op, nil
}

func reverseMap[K comparable, V comparable](m map[K]V) map[V]K {
	r := make(map[V]K)
	for k, v := range m {
		r[v] = k
	}
	return r
}