-
Notifications
You must be signed in to change notification settings - Fork 192
/
tag_methods.go
100 lines (92 loc) · 1.37 KB
/
tag_methods.go
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
package lua
type tm uint
const (
tmIndex tm = iota
tmNewIndex
tmGC
tmMode
tmLen
tmEq
tmAdd
tmSub
tmMul
tmDiv
tmMod
tmPow
tmUnaryMinus
tmLT
tmLE
tmConcat
tmCall
tmCount // number of tag methods
)
var eventNames = []string{
"__index",
"__newindex",
"__gc",
"__mode",
"__len",
"__eq",
"__add",
"__sub",
"__mul",
"__div",
"__mod",
"__pow",
"__unm",
"__lt",
"__le",
"__concat",
"__call",
}
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())
}