forked from Shopify/go-lua
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtag_methods.go
More file actions
119 lines (110 loc) · 1.88 KB
/
tag_methods.go
File metadata and controls
119 lines (110 loc) · 1.88 KB
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
package lua
type tm uint
const (
tmIndex tm = iota
tmNewIndex
tmGC
tmMode
tmLen
tmEq
tmAdd
tmSub
tmMul
tmMod // Lua 5.3: MOD before POW
tmPow
tmDiv
tmIDiv // Lua 5.3: Integer division
tmBAnd // Lua 5.3: Bitwise AND
tmBOr // Lua 5.3: Bitwise OR
tmBXor // Lua 5.3: Bitwise XOR
tmShl // Lua 5.3: Shift left
tmShr // Lua 5.3: Shift right
tmUnaryMinus
tmBNot // Lua 5.3: Bitwise NOT
tmLT
tmLE
tmConcat
tmCall
tmClose // Lua 5.4: __close for to-be-closed variables
tmCount // number of tag methods
)
// tmFromC converts a C field value (used in MMBIN instructions) to a tm constant.
func tmFromC(c int) tm { return tm(c) }
var eventNames = []string{
"__index",
"__newindex",
"__gc",
"__mode",
"__len",
"__eq",
"__add",
"__sub",
"__mul",
"__mod",
"__pow",
"__div",
"__idiv",
"__band",
"__bor",
"__bxor",
"__shl",
"__shr",
"__unm",
"__bnot",
"__lt",
"__le",
"__concat",
"__call",
"__close",
}
var typeNames = []string{
"no value",
"nil",
"boolean",
"userdata",
"number",
"string",
"table",
"function",
"userdata",
"thread",
"proto", // these last two cases are used for tests only
"upval",
}
func (events *table) tagMethod(event tm, name string) value {
tm := events.atString(name)
//l.assert(event <= tmEq)
if tm == nil {
events.flags |= 1 << event
}
return tm
}
func (l *State) tagMethodByObject(o value, event tm) value {
var mt *table
switch o := o.(type) {
case *table:
mt = o.metaTable
case *userData:
mt = o.metaTable
default:
mt = l.global.metaTable(o)
}
if mt == nil {
return nil
}
return mt.atString(l.global.tagMethodNames[event])
}
func (l *State) callTagMethod(f, p1, p2 value) value {
l.push(f)
l.push(p1)
l.push(p2)
l.call(l.top-3, 1, l.callInfo.isLua())
return l.pop()
}
func (l *State) callTagMethodV(f, p1, p2, p3 value) {
l.push(f)
l.push(p1)
l.push(p2)
l.push(p3)
l.call(l.top-4, 0, l.callInfo.isLua())
}