blob: d3de7d6b298a4cbfd288c9ebf22bd29e8585cab5 (
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
|
#ifndef __LUA_BIND_REFTABLE_H__
#define __LUA_BIND_REFTABLE_H__
#include "LuaBindConfig.h"
namespace LuaBind
{
class State;
class VM;
// ref table 管理,对strong ref table和weak ref table两个table的代理。
// 保存在global_State.l_registry,所以是虚拟机下的所有协程共享的
class RefTable
{
public:
enum
{
WEAK_KEY = 1,
WEAK_VALUE = 1 << 1
};
RefTable(LuaBind::VM* vm);
~RefTable();
inline operator bool() { return mVM; };
void Init(cc8* name, cc8* mode = nullptr);
bool IsKeyWeak();
bool IsValueWeak();
// 对stack[idx]的实体在此ref table中增加一个引用,并返回refID
int Ref(State& state, int idx);
void UnRef(int refID);
// 将此 ref table 放在栈顶
void PushRefTable(State& state);
// 将 reftable[refID] 放在栈顶
void PushRef(State& state, int refID);
// 清空 ref table,表还留在LUA_REGISTRYINDEX[mName]
void Clear();
private:
friend class VM;
friend class State;
VM* mVM; // 所属的虚拟机
cc8* mName; // ref table的名称
int mMode; // ref table的类型
};
}
#endif
|