|
@@ -1,15 +1,15 @@
|
|
|
-#include "__var.h"
|
|
|
-#include "core_init.h"
|
|
|
-#include "tool.h"
|
|
|
+#include "__var.hpp"
|
|
|
+#include "core_init.hpp"
|
|
|
+#include "tool.hpp"
|
|
|
|
|
|
|
|
|
/* VarNode 创建与释放 */
|
|
|
-static af_VarNode *makeVarNode(af_Object *obj, char *id);
|
|
|
+static af_VarNode *makeVarNode(af_Object *obj, const char *id);
|
|
|
static af_VarNode *freeVarNode(af_VarNode *vn);
|
|
|
static void freeAllVarNode(af_VarNode *vn);
|
|
|
|
|
|
/* VarNode 相关操作 */
|
|
|
-static af_VarNode *findVarNode_(af_Var *var, char *id);
|
|
|
+static af_VarNode *findVarNode_(af_Var *var, const char *id);
|
|
|
|
|
|
/* VarCup 创建与释放 */
|
|
|
static af_VarCup *makeVarCup(af_Var *var);
|
|
@@ -17,41 +17,41 @@ static af_VarCup *freeVarCup(af_VarCup *vp);
|
|
|
static void freeAllVarCup(af_VarCup *vp);
|
|
|
|
|
|
/* VarSpace 寻值函数 */
|
|
|
-static af_Var *findVarFromVarSpaceByIndex(time33_t index, char *name, af_VarSpace *vs);
|
|
|
+static af_Var *findVarFromVarSpaceByIndex(time33_t index, const char *name, af_VarSpace *vs);
|
|
|
|
|
|
/* 变量权限函数 */
|
|
|
static bool checkVarReadPermissions(af_Var *var, af_Object *visitor, af_VarSpace *vs);
|
|
|
static bool checkVarWritePermissions(af_Var *var, af_Object *visitor, af_VarSpace *vs);
|
|
|
|
|
|
-static af_VarNode *makeVarNode(af_Object *obj, char *id) {
|
|
|
- af_VarNode *vn = calloc(1, sizeof(af_VarNode));
|
|
|
- if (id != NULL)
|
|
|
+static af_VarNode *makeVarNode(af_Object *obj, const char *id) {
|
|
|
+ auto vn = calloc(1, af_VarNode);
|
|
|
+ if (id != nullptr)
|
|
|
vn->id = strCopy(id);
|
|
|
vn->obj = obj;
|
|
|
return vn;
|
|
|
}
|
|
|
|
|
|
static af_VarNode *freeVarNode(af_VarNode *vn) {
|
|
|
- af_VarNode *next = vn->next;
|
|
|
+ auto next = vn->next;
|
|
|
free(vn->id);
|
|
|
free(vn);
|
|
|
return next;
|
|
|
}
|
|
|
|
|
|
static void freeAllVarNode(af_VarNode *vn) {
|
|
|
- while (vn != NULL)
|
|
|
+ while (vn != nullptr)
|
|
|
vn = freeVarNode(vn);
|
|
|
}
|
|
|
|
|
|
-af_Var *makeVar(char *name, char p_self, char p_posterity, char p_external, af_Object *obj, af_Environment *env){
|
|
|
- af_VarNode *vn = makeVarNode(obj, NULL);
|
|
|
- af_Var *var = calloc(1, sizeof(af_Var));
|
|
|
+af_Var *makeVar(const char *name, char p_self, char p_posterity, char p_external, af_Object *obj, af_Environment *env){
|
|
|
+ auto vn = makeVarNode(obj, nullptr);
|
|
|
+ auto var = calloc(1, af_Var);
|
|
|
var->name = strCopy(name);
|
|
|
var->vn = vn;
|
|
|
var->permissions[0] = p_self;
|
|
|
var->permissions[1] = p_posterity;
|
|
|
var->permissions[2] = p_external;
|
|
|
- pthread_rwlock_init(&var->lock, NULL);
|
|
|
+ pthread_rwlock_init(&var->lock, nullptr);
|
|
|
gc_addVar(var, env->base);
|
|
|
return var;
|
|
|
}
|
|
@@ -71,23 +71,23 @@ void freeVar(af_Var *var, af_Environment *env){
|
|
|
* @param id
|
|
|
* @return
|
|
|
*/
|
|
|
-static af_VarNode *findVarNode_(af_Var *var, char *id) {
|
|
|
- af_VarNode *vn = var->vn->next;
|
|
|
+static af_VarNode *findVarNode_(af_Var *var, const char *id) {
|
|
|
+ auto vn = var->vn->next;
|
|
|
|
|
|
- if (id == NULL)
|
|
|
+ if (id == nullptr)
|
|
|
return var->vn;
|
|
|
|
|
|
- for (NULL; vn != NULL; vn = vn->next) {
|
|
|
+ for(NULL; vn != nullptr; vn = vn->next) {
|
|
|
if (EQ_STR(vn->id, id))
|
|
|
return vn;
|
|
|
}
|
|
|
- return NULL;
|
|
|
+ return nullptr;
|
|
|
}
|
|
|
|
|
|
-void addVarNode(af_Var *var, af_Object *obj, char *id) {
|
|
|
- af_VarNode *vn = makeVarNode(obj, id);
|
|
|
+void addVarNode(af_Var *var, af_Object *obj, const char *id) {
|
|
|
+ auto vn = makeVarNode(obj, id);
|
|
|
pthread_rwlock_wrlock(&var->lock);
|
|
|
- vn->next = var->vn->next; // 第一个 vn 必须为 id=NULL
|
|
|
+ vn->next = var->vn->next; // 第一个 vn 必须为 id=nullptr
|
|
|
var->vn->next = vn;
|
|
|
pthread_rwlock_unlock(&var->lock);
|
|
|
}
|
|
@@ -100,11 +100,11 @@ void addVarNode(af_Var *var, af_Object *obj, char *id) {
|
|
|
* @param id
|
|
|
* @return
|
|
|
*/
|
|
|
-af_Object *findVarNode(af_Var *var, char *id, af_Environment *env){
|
|
|
+af_Object *findVarNode(af_Var *var, const char *id, af_Environment *env){
|
|
|
pthread_rwlock_rdlock(&var->lock);
|
|
|
af_VarNode *vn = findVarNode_(var, id);
|
|
|
- af_Object *obj = NULL;
|
|
|
- if (vn != NULL) {
|
|
|
+ af_Object *obj = nullptr;
|
|
|
+ if (vn != nullptr) {
|
|
|
obj = vn->obj;
|
|
|
gc_addObjectReference(obj, env);
|
|
|
}
|
|
@@ -113,7 +113,7 @@ af_Object *findVarNode(af_Var *var, char *id, af_Environment *env){
|
|
|
}
|
|
|
|
|
|
static af_VarCup *makeVarCup(af_Var *var) {
|
|
|
- af_VarCup *vp = calloc(1, sizeof(af_VarCup));
|
|
|
+ auto vp = calloc(1, af_VarCup);
|
|
|
vp->var = var;
|
|
|
return vp;
|
|
|
}
|
|
@@ -125,19 +125,19 @@ static af_VarCup *freeVarCup(af_VarCup *vp) {
|
|
|
}
|
|
|
|
|
|
static void freeAllVarCup(af_VarCup *vp) {
|
|
|
- while (vp != NULL)
|
|
|
+ while (vp != nullptr)
|
|
|
vp = freeVarCup(vp);
|
|
|
}
|
|
|
|
|
|
af_VarSpace *makeVarSpace(af_Object *belong, char p_self, char p_posterity, char p_external, af_Environment *env){
|
|
|
- assertFatalErrorLog(getCoreStatus(env) == core_creat || belong != NULL, aFunCoreLogger, 1, "makeVarSpace error");
|
|
|
- af_VarSpace *vs = calloc(1, sizeof(af_VarSpace));
|
|
|
+ assertFatalErrorLog(getCoreStatus(env) == core_creat || belong != nullptr, aFunCoreLogger, 1, "makeVarSpace error");
|
|
|
+ auto vs = calloc(1, af_VarSpace);
|
|
|
vs->belong = belong;
|
|
|
vs->permissions[0] = p_self;
|
|
|
vs->permissions[1] = p_posterity;
|
|
|
vs->permissions[2] = p_external;
|
|
|
|
|
|
- pthread_rwlock_init(&vs->lock, NULL);
|
|
|
+ pthread_rwlock_init(&vs->lock, nullptr);
|
|
|
gc_addVarSpace(vs, env->base);
|
|
|
return vs;
|
|
|
}
|
|
@@ -151,15 +151,15 @@ void freeVarSpace(af_VarSpace *vs, af_Environment *env) {
|
|
|
}
|
|
|
|
|
|
af_VarList *makeVarSpaceList(af_VarSpace *vs) {
|
|
|
- af_VarList *vsl = calloc(1, sizeof(af_VarList));
|
|
|
+ auto vsl = calloc(1, af_VarList);
|
|
|
vsl->vs = vs;
|
|
|
return vsl;
|
|
|
}
|
|
|
|
|
|
af_VarList *copyVarSpaceList(af_VarList *vsl) {
|
|
|
- af_VarList *base = NULL;
|
|
|
+ af_VarList *base = nullptr;
|
|
|
af_VarList **pvsl = &base;
|
|
|
- for (NULL; vsl != NULL; vsl = vsl->next, pvsl = &((*pvsl)->next))
|
|
|
+ for(NULL; vsl != nullptr; vsl = vsl->next, pvsl = &((*pvsl)->next))
|
|
|
*pvsl = makeVarSpaceList(vsl->vs);
|
|
|
return base;
|
|
|
}
|
|
@@ -171,19 +171,19 @@ static af_VarList *freeVarSpaceList(af_VarList *vsl){
|
|
|
}
|
|
|
|
|
|
void freeAllVarSpaceList(af_VarList *vsl){
|
|
|
- while (vsl != NULL)
|
|
|
+ while (vsl != nullptr)
|
|
|
vsl = freeVarSpaceList(vsl);
|
|
|
}
|
|
|
|
|
|
af_VarSpace *getVarSpaceFromList(af_VarList *vsl) {
|
|
|
- if (vsl != NULL)
|
|
|
+ if (vsl != nullptr)
|
|
|
return vsl->vs;
|
|
|
- return NULL;
|
|
|
+ return nullptr;
|
|
|
}
|
|
|
|
|
|
bool freeVarSpaceListCount(size_t count, af_VarList *vsl) {
|
|
|
for (size_t i = count; i > 0; i--) {
|
|
|
- if (vsl == NULL) // 发生了错误
|
|
|
+ if (vsl == nullptr) // 发生了错误
|
|
|
return false;
|
|
|
vsl = freeVarSpaceList(vsl);
|
|
|
}
|
|
@@ -199,23 +199,23 @@ bool freeVarSpaceListCount(size_t count, af_VarList *vsl) {
|
|
|
static bool checkVarSpaceDefinePermissions(af_Object *visitor, af_VarSpace *vs){
|
|
|
char p = vs->permissions[2]; // 默认外部权限
|
|
|
|
|
|
- af_ObjectData *belong_data = NULL;
|
|
|
- if (vs->belong != NULL) {
|
|
|
+ af_ObjectData *belong_data = nullptr;
|
|
|
+ if (vs->belong != nullptr) {
|
|
|
pthread_rwlock_rdlock(&vs->belong->lock);
|
|
|
belong_data = vs->belong->data;
|
|
|
pthread_rwlock_unlock(&vs->belong->lock);
|
|
|
}
|
|
|
|
|
|
- af_ObjectData *visitor_data = NULL;
|
|
|
- if (visitor != NULL) {
|
|
|
+ af_ObjectData *visitor_data;
|
|
|
+ if (visitor != nullptr) {
|
|
|
pthread_rwlock_rdlock(&visitor->lock);
|
|
|
visitor_data = visitor->data;
|
|
|
pthread_rwlock_unlock(&visitor->lock);
|
|
|
}
|
|
|
|
|
|
- if (vs->belong == NULL || (visitor != NULL && belong_data == visitor_data)) // (无权限设定或ObjectData匹配) 应用自身权限
|
|
|
+ if (vs->belong == nullptr || (visitor != nullptr && belong_data == visitor_data)) // (无权限设定或ObjectData匹配) 应用自身权限
|
|
|
p = vs->permissions[0];
|
|
|
- else if (visitor != NULL && checkPosterity(vs->belong, visitor)) // 应用后代权限
|
|
|
+ else if (visitor != nullptr && checkPosterity(vs->belong, visitor)) // 应用后代权限
|
|
|
p = vs->permissions[1];
|
|
|
|
|
|
return p == 2 || p == 3;
|
|
@@ -242,7 +242,7 @@ bool addVarToVarSpace(af_Var *var, af_Object *visitor, af_VarSpace *vs, af_Envir
|
|
|
if (!checkVarSpaceDefinePermissions(visitor, vs))
|
|
|
goto RETURN_FALSE;
|
|
|
|
|
|
- for (NULL; *pCup != NULL; pCup = &((*pCup)->next)) {
|
|
|
+ for(NULL; *pCup != nullptr; pCup = &((*pCup)->next)) {
|
|
|
pthread_rwlock_wrlock(&(*pCup)->var->lock);
|
|
|
bool res = EQ_STR((*pCup)->var->name, var->name);
|
|
|
pthread_rwlock_unlock(&(*pCup)->var->lock);
|
|
@@ -270,7 +270,7 @@ RETURN_FALSE:
|
|
|
* 调用 addVarToVarSpace
|
|
|
* 注意: 必须保证 VarSpace被 gc 引用
|
|
|
*/
|
|
|
-bool makeVarToVarSpace(char *name, char p_self, char p_posterity, char p_external, af_Object *obj, af_VarSpace *vs,
|
|
|
+bool makeVarToVarSpace(const char *name, char p_self, char p_posterity, char p_external, af_Object *obj, af_VarSpace *vs,
|
|
|
af_Object *visitor, af_Environment *env){
|
|
|
af_Var *var = makeVar(name, p_self, p_posterity, p_external, obj, env);
|
|
|
if (addVarToVarSpace(var, visitor, vs, env))
|
|
@@ -286,7 +286,7 @@ bool makeVarToVarSpace(char *name, char p_self, char p_posterity, char p_externa
|
|
|
* 调用 addVarToVarSpace
|
|
|
*/
|
|
|
bool addVarToVarSpaceList(af_Var *var, af_Object *visitor, af_VarList *vsl, af_Environment *env){
|
|
|
- for (NULL; vsl != NULL; vsl = vsl->next) {
|
|
|
+ for(NULL; vsl != nullptr; vsl = vsl->next) {
|
|
|
if (!vsl->vs->is_protect)
|
|
|
return addVarToVarSpace(var, visitor, vsl->vs, env);
|
|
|
}
|
|
@@ -299,7 +299,7 @@ bool addVarToVarSpaceList(af_Var *var, af_Object *visitor, af_VarList *vsl, af_E
|
|
|
* 调用 addVarToVarSpaceList -> addVarToVarSpace
|
|
|
* 注意: 必须保证 VarSpace被 gc 引用
|
|
|
*/
|
|
|
-bool makeVarToVarSpaceList(char *name, char p_self, char p_posterity, char p_external, af_Object *obj,
|
|
|
+bool makeVarToVarSpaceList(const char *name, char p_self, char p_posterity, char p_external, af_Object *obj,
|
|
|
af_VarList *vsl, af_Object *visitor, af_Environment *env){
|
|
|
af_Var *var = makeVar(name, p_self, p_posterity, p_external, obj, env);
|
|
|
if (addVarToVarSpaceList(var, visitor, vsl, env))
|
|
@@ -314,7 +314,9 @@ bool makeVarToVarSpaceList(char *name, char p_self, char p_posterity, char p_ext
|
|
|
* 否则返回true
|
|
|
* 调用 addVarToVarSpace
|
|
|
*/
|
|
|
-bool makeVarToProtectVarSpace(char *name, char p_self, char p_posterity, char p_external, af_Object *obj, af_Environment *env){
|
|
|
+bool makeVarToProtectVarSpace(const char *name,
|
|
|
+ char p_self, char p_posterity, char p_external,
|
|
|
+ af_Object *obj, af_Environment *env){
|
|
|
pthread_rwlock_wrlock(&env->protect->lock);
|
|
|
bool is_protect = env->protect->is_protect;
|
|
|
env->protect->is_protect = false;
|
|
@@ -344,7 +346,7 @@ bool addVarToProtectVarSpace(af_Var *var, af_Environment *env) {
|
|
|
env->protect->is_protect = false;
|
|
|
pthread_rwlock_unlock(&env->protect->lock);
|
|
|
|
|
|
- bool re = addVarToVarSpace(var, NULL, env->protect, env);
|
|
|
+ bool re = addVarToVarSpace(var, nullptr, env->protect, env);
|
|
|
|
|
|
pthread_rwlock_wrlock(&env->protect->lock);
|
|
|
env->protect->is_protect = is_protect;
|
|
@@ -363,23 +365,23 @@ bool addVarToProtectVarSpace(af_Var *var, af_Environment *env) {
|
|
|
static bool checkVarSpaceDelPermissions(af_Object *visitor, af_VarSpace *vs) {
|
|
|
char p = vs->permissions[2]; // 默认外部权限
|
|
|
|
|
|
- af_ObjectData *belong_data = NULL;
|
|
|
- if (vs->belong != NULL) {
|
|
|
+ af_ObjectData *belong_data = nullptr;
|
|
|
+ if (vs->belong != nullptr) {
|
|
|
pthread_rwlock_rdlock(&vs->belong->lock);
|
|
|
belong_data = vs->belong->data;
|
|
|
pthread_rwlock_unlock(&vs->belong->lock);
|
|
|
}
|
|
|
|
|
|
- af_ObjectData *visitor_data = NULL;
|
|
|
- if (visitor != NULL) {
|
|
|
+ af_ObjectData *visitor_data;
|
|
|
+ if (visitor != nullptr) {
|
|
|
pthread_rwlock_rdlock(&visitor->lock);
|
|
|
visitor_data = visitor->data;
|
|
|
pthread_rwlock_unlock(&visitor->lock);
|
|
|
}
|
|
|
|
|
|
- if (vs->belong == NULL || (visitor != NULL && belong_data == visitor_data)) // (无权限设定或ObjectData匹配) 应用自身权限
|
|
|
+ if (vs->belong == nullptr || (visitor != nullptr && belong_data == visitor_data)) // (无权限设定或ObjectData匹配) 应用自身权限
|
|
|
p = vs->permissions[0];
|
|
|
- else if (visitor != NULL && checkPosterity(vs->belong, visitor)) // 应用后代权限
|
|
|
+ else if (visitor != nullptr && checkPosterity(vs->belong, visitor)) // 应用后代权限
|
|
|
p = vs->permissions[1];
|
|
|
|
|
|
return p == 1 || p == 3;
|
|
@@ -391,7 +393,7 @@ static bool checkVarSpaceDelPermissions(af_Object *visitor, af_VarSpace *vs) {
|
|
|
* 若空间被保护, 权限错误或已存在同名Var则返回false不作修改
|
|
|
* 否则返回true
|
|
|
*/
|
|
|
-bool delVarFromVarSpace(char *name, af_Object *visitor, af_VarSpace *vs) {
|
|
|
+bool delVarFromVarSpace(const char *name, af_Object *visitor, af_VarSpace *vs) {
|
|
|
time33_t index = time33(name) % VAR_HASHTABLE_SIZE;
|
|
|
|
|
|
pthread_rwlock_wrlock(&vs->lock);
|
|
@@ -403,7 +405,7 @@ bool delVarFromVarSpace(char *name, af_Object *visitor, af_VarSpace *vs) {
|
|
|
if (!checkVarSpaceDelPermissions(visitor, vs))
|
|
|
goto RETRUN_FALSE;
|
|
|
|
|
|
- for (NULL; *pCup != NULL; pCup = &((*pCup)->next)) {
|
|
|
+ for(NULL; *pCup != nullptr; pCup = &((*pCup)->next)) {
|
|
|
pthread_rwlock_wrlock(&(*pCup)->var->lock);
|
|
|
|
|
|
if (EQ_STR((*pCup)->var->name, name)) {
|
|
@@ -428,7 +430,7 @@ RETRUN_FALSE:
|
|
|
* 否则返回true
|
|
|
* 调用delVarFromVarSpace
|
|
|
*/
|
|
|
-bool delVarFromVarList(char *name, af_Object *visitor, af_VarList *vsl) {
|
|
|
+bool delVarFromVarList(const char *name, af_Object *visitor, af_VarList *vsl) {
|
|
|
return delVarFromVarSpace(name, visitor, vsl->vs);
|
|
|
}
|
|
|
|
|
@@ -437,9 +439,9 @@ bool delVarFromVarList(char *name, af_Object *visitor, af_VarList *vsl) {
|
|
|
* 目标: 根据指定的index, 在VarSpace中搜索var
|
|
|
* 权限检查交给 findVarFromVarSpace 和 findVarFromVarList
|
|
|
*/
|
|
|
-static af_Var *findVarFromVarSpaceByIndex(time33_t index, char *name, af_VarSpace *vs) {
|
|
|
+static af_Var *findVarFromVarSpaceByIndex(time33_t index, const char *name, af_VarSpace *vs) {
|
|
|
pthread_rwlock_rdlock(&vs->lock);
|
|
|
- for (af_VarCup *cup = vs->var[index]; cup != NULL; cup = cup->next) {
|
|
|
+ for (af_VarCup *cup = vs->var[index]; cup != nullptr; cup = cup->next) {
|
|
|
pthread_rwlock_wrlock(&cup->var->lock);
|
|
|
|
|
|
if (EQ_STR(cup->var->name, name)) {
|
|
@@ -452,7 +454,7 @@ static af_Var *findVarFromVarSpaceByIndex(time33_t index, char *name, af_VarSpac
|
|
|
pthread_rwlock_unlock(&cup->var->lock);
|
|
|
}
|
|
|
pthread_rwlock_unlock(&vs->lock);
|
|
|
- return NULL;
|
|
|
+ return nullptr;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -469,23 +471,23 @@ static bool checkVarReadPermissions(af_Var *var, af_Object *visitor, af_VarSpace
|
|
|
pthread_rwlock_rdlock(&vs->lock);
|
|
|
pthread_rwlock_rdlock(&var->lock);
|
|
|
|
|
|
- af_ObjectData *belong_data = NULL;
|
|
|
- if (vs->belong != NULL) {
|
|
|
+ af_ObjectData *belong_data = nullptr;
|
|
|
+ if (vs->belong != nullptr) {
|
|
|
pthread_rwlock_rdlock(&vs->belong->lock);
|
|
|
belong_data = vs->belong->data;
|
|
|
pthread_rwlock_unlock(&vs->belong->lock);
|
|
|
}
|
|
|
|
|
|
- af_ObjectData *visitor_data = NULL;
|
|
|
- if (visitor != NULL) {
|
|
|
+ af_ObjectData *visitor_data;
|
|
|
+ if (visitor != nullptr) {
|
|
|
pthread_rwlock_rdlock(&visitor->lock);
|
|
|
visitor_data = visitor->data;
|
|
|
pthread_rwlock_unlock(&visitor->lock);
|
|
|
}
|
|
|
|
|
|
- if (vs->belong == NULL || (visitor != NULL && belong_data == visitor_data)) // (无权限设定或ObjectData匹配) 应用自身权限
|
|
|
+ if (vs->belong == nullptr || (visitor != nullptr && belong_data == visitor_data)) // (无权限设定或ObjectData匹配) 应用自身权限
|
|
|
p = var->permissions[0];
|
|
|
- else if (visitor != NULL && checkPosterity(vs->belong, visitor)) // 应用后代权限
|
|
|
+ else if (visitor != nullptr && checkPosterity(vs->belong, visitor)) // 应用后代权限
|
|
|
p = var->permissions[1];
|
|
|
|
|
|
pthread_rwlock_unlock(&vs->lock);
|
|
@@ -498,14 +500,14 @@ static bool checkVarReadPermissions(af_Var *var, af_Object *visitor, af_VarSpace
|
|
|
* 目标: 在VarSpace中搜索var
|
|
|
* 调用: findVarFromVarSpaceByIndex
|
|
|
*/
|
|
|
-af_Var *findVarFromVarSpace(char *name, af_Object *visitor, af_VarSpace *vs){
|
|
|
+af_Var *findVarFromVarSpace(const char *name, af_Object *visitor, af_VarSpace *vs){
|
|
|
af_Var *var = findVarFromVarSpaceByIndex(time33(name) % VAR_HASHTABLE_SIZE, name, vs);
|
|
|
- if (var == NULL)
|
|
|
- return NULL;
|
|
|
+ if (var == nullptr)
|
|
|
+ return nullptr;
|
|
|
|
|
|
if (checkVarReadPermissions(var, visitor, vs))
|
|
|
return var;
|
|
|
- return NULL;
|
|
|
+ return nullptr;
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -513,20 +515,19 @@ af_Var *findVarFromVarSpace(char *name, af_Object *visitor, af_VarSpace *vs){
|
|
|
* 目标: 在VarSpaceListNode中搜索var
|
|
|
* 调用: findVarFromVarSpaceByIndex
|
|
|
*/
|
|
|
-af_Var *findVarFromVarList(char *name, af_Object *visitor, af_VarList *vsl) {
|
|
|
+af_Var *findVarFromVarList(const char *name, af_Object *visitor, af_VarList *vsl) {
|
|
|
time33_t index = time33(name) % VAR_HASHTABLE_SIZE;
|
|
|
- af_Var *var = NULL;
|
|
|
|
|
|
- for (NULL; vsl != NULL; vsl = vsl->next) {
|
|
|
- var = findVarFromVarSpaceByIndex(index, name, vsl->vs);
|
|
|
- if (var != NULL) {
|
|
|
+ for(NULL; vsl != nullptr; vsl = vsl->next) {
|
|
|
+ af_Var *var = findVarFromVarSpaceByIndex(index, name, vsl->vs);
|
|
|
+ if (var != nullptr) {
|
|
|
if (checkVarReadPermissions(var, visitor, vsl->vs))
|
|
|
return var;
|
|
|
- return NULL;
|
|
|
+ return nullptr;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- return NULL;
|
|
|
+ return nullptr;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -540,24 +541,24 @@ af_Var *findVarFromVarList(char *name, af_Object *visitor, af_VarList *vsl) {
|
|
|
static bool checkVarWritePermissions(af_Var *var, af_Object *visitor, af_VarSpace *vs){
|
|
|
char p = var->permissions[2]; // 默认外部权限
|
|
|
|
|
|
- af_ObjectData *belong_data = NULL;
|
|
|
- if (vs->belong != NULL) {
|
|
|
+ af_ObjectData *belong_data = nullptr;
|
|
|
+ if (vs->belong != nullptr) {
|
|
|
pthread_rwlock_rdlock(&vs->belong->lock);
|
|
|
belong_data = vs->belong->data;
|
|
|
pthread_rwlock_unlock(&vs->belong->lock);
|
|
|
}
|
|
|
|
|
|
- af_ObjectData *visitor_data = NULL;
|
|
|
- if (visitor != NULL) {
|
|
|
+ af_ObjectData *visitor_data;
|
|
|
+ if (visitor != nullptr) {
|
|
|
pthread_rwlock_rdlock(&visitor->lock);
|
|
|
visitor_data = visitor->data;
|
|
|
pthread_rwlock_unlock(&visitor->lock);
|
|
|
}
|
|
|
|
|
|
pthread_rwlock_rdlock(&vs->lock);
|
|
|
- if (vs->belong == NULL || (visitor != NULL && belong_data == visitor_data)) // (无权限设定或ObjectData匹配) 应用自身权限
|
|
|
+ if (vs->belong == nullptr || (visitor != nullptr && belong_data == visitor_data)) // (无权限设定或ObjectData匹配) 应用自身权限
|
|
|
p = var->permissions[0];
|
|
|
- else if (visitor != NULL && checkPosterity(vs->belong, visitor)) // 应用后代权限
|
|
|
+ else if (visitor != nullptr && checkPosterity(vs->belong, visitor)) // 应用后代权限
|
|
|
p = var->permissions[1];
|
|
|
pthread_rwlock_unlock(&vs->lock);
|
|
|
|
|
@@ -569,9 +570,9 @@ static bool checkVarWritePermissions(af_Var *var, af_Object *visitor, af_VarSpac
|
|
|
* 目标: 在VarSpace中搜索var并修改其值
|
|
|
* 调用: findVarFromVarSpaceByIndex
|
|
|
*/
|
|
|
-bool setVarToVarSpace(char *name, af_Object *obj, af_Object *visitor, af_VarSpace *vs){
|
|
|
+bool setVarToVarSpace(const char *name, af_Object *obj, af_Object *visitor, af_VarSpace *vs){
|
|
|
af_Var *var = findVarFromVarSpaceByIndex(time33(name) % VAR_HASHTABLE_SIZE, name, vs);
|
|
|
- if (var == NULL)
|
|
|
+ if (var == nullptr)
|
|
|
return false;
|
|
|
|
|
|
pthread_rwlock_wrlock(&vs->lock);
|
|
@@ -593,13 +594,13 @@ bool setVarToVarSpace(char *name, af_Object *obj, af_Object *visitor, af_VarSpac
|
|
|
* 目标: 在VarSpaceListNode中搜索var并修改其值
|
|
|
* 调用: findVarFromVarSpaceByIndex
|
|
|
*/
|
|
|
-bool setVarToVarList(char *name, af_Object *obj, af_Object *visitor, af_VarList *vsl) {
|
|
|
+bool setVarToVarList(const char *name, af_Object *obj, af_Object *visitor, af_VarList *vsl) {
|
|
|
time33_t index = time33(name) % VAR_HASHTABLE_SIZE;
|
|
|
- af_Var *var = NULL;
|
|
|
+ af_Var *var;
|
|
|
|
|
|
- for (NULL; vsl != NULL; vsl = vsl->next) {
|
|
|
+ for(NULL; vsl != nullptr; vsl = vsl->next) {
|
|
|
var = findVarFromVarSpaceByIndex(index, name, vsl->vs);
|
|
|
- if (var != NULL) {
|
|
|
+ if (var != nullptr) {
|
|
|
pthread_rwlock_wrlock(&vsl->vs->lock);
|
|
|
if (checkVarWritePermissions(var, visitor, vsl->vs)) {
|
|
|
pthread_rwlock_unlock(&vsl->vs->lock);
|
|
@@ -627,9 +628,9 @@ bool setVarToVarList(char *name, af_Object *obj, af_Object *visitor, af_VarList
|
|
|
*/
|
|
|
af_VarList *pushNewVarList(af_Object *belong, af_VarList *base, af_Environment *env){
|
|
|
af_VarSpace *vs = makeVarSpace(belong, 3, 2, 0, env);
|
|
|
- af_VarList *new = makeVarSpaceList(vs);
|
|
|
- new->next = base;
|
|
|
- return new;
|
|
|
+ af_VarList *new_vs = makeVarSpaceList(vs);
|
|
|
+ new_vs->next = base;
|
|
|
+ return new_vs;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -640,29 +641,29 @@ af_VarList *pushNewVarList(af_Object *belong, af_VarList *base, af_Environment *
|
|
|
* @return
|
|
|
*/
|
|
|
af_VarList *pushProtectVarList(af_VarList *base, af_Environment *env){
|
|
|
- af_VarList *new = makeVarSpaceList(getProtectVarSpace(env));
|
|
|
- new->next = base;
|
|
|
- return new;
|
|
|
+ af_VarList *new_vsl = makeVarSpaceList(getProtectVarSpace(env));
|
|
|
+ new_vsl->next = base;
|
|
|
+ return new_vsl;
|
|
|
}
|
|
|
|
|
|
af_VarList *pushVarList(af_VarSpace *vs, af_VarList *base){
|
|
|
- af_VarList *new = makeVarSpaceList(vs);
|
|
|
- new->next = base;
|
|
|
- return new;
|
|
|
+ af_VarList *new_vsl = makeVarSpaceList(vs);
|
|
|
+ new_vsl->next = base;
|
|
|
+ return new_vsl;
|
|
|
}
|
|
|
|
|
|
void setVarPermissions(af_Var *var, af_Object *visitor, af_VarSpace *vs, char p_self, char p_posterity, char p_external) {
|
|
|
pthread_rwlock_rdlock(&vs->lock);
|
|
|
|
|
|
- af_ObjectData *belong_data = NULL;
|
|
|
- if (vs->belong != NULL) {
|
|
|
+ af_ObjectData *belong_data = nullptr;
|
|
|
+ if (vs->belong != nullptr) {
|
|
|
pthread_rwlock_rdlock(&vs->belong->lock);
|
|
|
belong_data = vs->belong->data;
|
|
|
pthread_rwlock_unlock(&vs->belong->lock);
|
|
|
}
|
|
|
|
|
|
- af_ObjectData *visitor_data = NULL;
|
|
|
- if (visitor != NULL) {
|
|
|
+ af_ObjectData *visitor_data = nullptr;
|
|
|
+ if (visitor != nullptr) {
|
|
|
pthread_rwlock_rdlock(&visitor->lock);
|
|
|
visitor_data = visitor->data;
|
|
|
pthread_rwlock_unlock(&visitor->lock);
|
|
@@ -670,7 +671,7 @@ void setVarPermissions(af_Var *var, af_Object *visitor, af_VarSpace *vs, char p_
|
|
|
|
|
|
pthread_rwlock_unlock(&vs->lock);
|
|
|
|
|
|
- if (belong_data != NULL && belong_data != visitor_data)
|
|
|
+ if (belong_data != nullptr && belong_data != visitor_data)
|
|
|
return;
|
|
|
|
|
|
pthread_rwlock_wrlock(&var->lock);
|
|
@@ -683,15 +684,15 @@ void setVarPermissions(af_Var *var, af_Object *visitor, af_VarSpace *vs, char p_
|
|
|
void setVarSpacePermissions(af_Object *visitor, af_VarSpace *vs, char p_self, char p_posterity, char p_external) {
|
|
|
pthread_rwlock_rdlock(&vs->lock);
|
|
|
|
|
|
- af_ObjectData *belong_data = NULL;
|
|
|
- if (vs->belong != NULL) {
|
|
|
+ af_ObjectData *belong_data = nullptr;
|
|
|
+ if (vs->belong != nullptr) {
|
|
|
pthread_rwlock_rdlock(&vs->belong->lock);
|
|
|
belong_data = vs->belong->data;
|
|
|
pthread_rwlock_unlock(&vs->belong->lock);
|
|
|
}
|
|
|
|
|
|
- af_ObjectData *visitor_data = NULL;
|
|
|
- if (visitor != NULL) {
|
|
|
+ af_ObjectData *visitor_data = nullptr;
|
|
|
+ if (visitor != nullptr) {
|
|
|
pthread_rwlock_rdlock(&visitor->lock);
|
|
|
visitor_data = visitor->data;
|
|
|
pthread_rwlock_unlock(&visitor->lock);
|
|
@@ -699,7 +700,7 @@ void setVarSpacePermissions(af_Object *visitor, af_VarSpace *vs, char p_self, ch
|
|
|
|
|
|
pthread_rwlock_unlock(&vs->lock);
|
|
|
|
|
|
- if (belong_data != NULL && belong_data != visitor_data)
|
|
|
+ if (belong_data != nullptr && belong_data != visitor_data)
|
|
|
return;
|
|
|
|
|
|
vs->permissions[0] = p_self;
|
|
@@ -718,21 +719,21 @@ bool setVarSpaceProtect(af_Object *visitor, af_VarSpace *vs, bool protect) {
|
|
|
pthread_rwlock_wrlock(&vs->lock);
|
|
|
bool re = vs->is_protect;
|
|
|
|
|
|
- af_ObjectData *belong_data = NULL;
|
|
|
- if (vs->belong != NULL) {
|
|
|
+ af_ObjectData *belong_data = nullptr;
|
|
|
+ if (vs->belong != nullptr) {
|
|
|
pthread_rwlock_rdlock(&vs->belong->lock);
|
|
|
belong_data = vs->belong->data;
|
|
|
pthread_rwlock_unlock(&vs->belong->lock);
|
|
|
}
|
|
|
|
|
|
- af_ObjectData *visitor_data = NULL;
|
|
|
- if (visitor != NULL) {
|
|
|
+ af_ObjectData *visitor_data = nullptr;
|
|
|
+ if (visitor != nullptr) {
|
|
|
pthread_rwlock_rdlock(&visitor->lock);
|
|
|
visitor_data = visitor->data;
|
|
|
pthread_rwlock_unlock(&visitor->lock);
|
|
|
}
|
|
|
|
|
|
- if (belong_data != NULL && belong_data != visitor_data) {
|
|
|
+ if (belong_data != nullptr && belong_data != visitor_data) {
|
|
|
pthread_rwlock_unlock(&vs->lock);
|
|
|
return re;
|
|
|
}
|