Browse Source

* Added reporting of constant and param script data.
* Fixed an incorrect check in menu script command.

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@10842 54d463be-8e91-2dee-dedb-b68131a5f0ec

FlavioJS 18 năm trước cách đây
mục cha
commit
bde6a0ca4b
2 tập tin đã thay đổi với 253 bổ sung150 xóa
  1. 3 0
      Changelog-Trunk.txt
  2. 250 150
      src/map/script.c

+ 3 - 0
Changelog-Trunk.txt

@@ -3,6 +3,9 @@ Date	Added
 AS OF SVN REV. 5091, WE ARE NOW USING TRUNK.  ALL UNTESTED BUGFIXES/FEATURES GO INTO TRUNK.
 IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
 
+2007/07/03
+	* Added reporting of constant and param script data.
+	* Fixed an incorrect check in menu script command. [FlavioJS]
 2007/07/02
 	* Undid the change from r10298, frozen status again modifies def/mdef
 2007/07/01

+ 250 - 150
src/map/script.c

@@ -51,9 +51,10 @@
 #endif
 #include <time.h>
 #include <setjmp.h>
+#include <errno.h>
 
 ///////////////////////////////////////////////////////////////////////////////
-//## TODO possible enhancements:
+//## TODO possible enhancements: [FlavioJS]
 // - 'callfunc' supporting labels in the current npc "::LabelName"
 // - 'callfunc' supporting labels in other npcs "NpcName::LabelName"
 // - 'function FuncName;' function declarations reverting to global functions 
@@ -83,7 +84,7 @@
 
 #define script_getnum(st,val) conv_num(st, script_getdata(st,val))
 #define script_getstr(st,val) conv_str(st, script_getdata(st,val))
-#define script_getref(st,val) ( data_varref(script_getdata(st,val)) )
+#define script_getref(st,val) ( script_getdata(st,val)->ref )
 
 // Note: "top" functions/defines use indexes relative to the top of the stack
 //       -1 is the index of the data at the top
@@ -110,18 +111,30 @@
 /// Returns if the script data is an internal script function label
 #define data_isfunclabel(data) ( (data)->type == C_USERFUNC_POS )
 
-/// Returns the unique id of the variable (id and index)
-#define data_varuid(data) ( (data)->u.num )
-/// Returns the id of the variable
-#define data_varid(data) ( (int32)(data_varuid(data) & 0x00ffffff) )
-/// Returns the array index of the variable
-#define data_varindex(data) ( (int32)(((uint32)(data_varuid(data) & 0xff000000)) >> 24) )
-/// Returns the name of the variable
-#define data_varname(data) ( str_buf + str_data[data_varid(data)].str )
-/// Returns the reference of the variable (linked list of variables, can be NULL)
-#define data_varref(data) ( (data)->ref )
-
-#define variable_uid(id,idx) ( (int32)((((uint32)(id)) & 0x00ffffff) | (((uint32)(idx)) << 24)) )
+/// Returns if this is a reference to a constant
+#define reference_toconstant(data) ( str_data[reference_getid(data)].type == C_INT )
+/// Returns if this a reference to a param
+#define reference_toparam(data) ( str_data[reference_getid(data)].type == C_PARAM )
+/// Returns if this a reference to a variable
+//##TODO confirm it's C_NAME [FlavioJS]
+#define reference_tovariable(data) ( str_data[reference_getid(data)].type == C_NAME )
+/// Returns the unique id of the reference (id and index)
+#define reference_getuid(data) ( (data)->u.num )
+/// Returns the id of the reference
+#define reference_getid(data) ( (int32)(reference_getuid(data) & 0x00ffffff) )
+/// Returns the array index of the reference
+#define reference_getindex(data) ( (int32)(((uint32)(reference_getuid(data) & 0xff000000)) >> 24) )
+/// Returns the name of the reference
+#define reference_getname(data) ( str_buf + str_data[reference_getid(data)].str )
+/// Returns the linked list of uid-value pairs of the reference (can be NULL)
+#define reference_getref(data) ( (data)->ref )
+/// Returns the value of the constant
+#define reference_getconstant(data) ( str_data[reference_getid(data)].val )
+/// Returns the type of param
+#define reference_getparamtype(data) ( str_data[reference_getid(data)].val )
+
+/// Composes the uid of a reference from the id and the index
+#define reference_uid(id,idx) ( (int32)((((uint32)(id)) & 0x00ffffff) | (((uint32)(idx)) << 24)) )
 
 #define FETCH(n, t) \
 		if( script_hasdata(st,n) ) \
@@ -424,22 +437,35 @@ static void script_reportdata(struct script_data* data)
 	switch( data->type )
 	{
 	case C_NOP:// no value
-		ShowDebug("Data: no value (nil)\n");
+		ShowDebug("Data: nothing (nil)\n");
 		break;
 	case C_INT:// number
-		ShowDebug("Data: number=%d\n", data->u.num);
+		ShowDebug("Data: number value=%d\n", data->u.num);
 		break;
 	case C_STR:
 	case C_CONSTSTR:// string
-		ShowDebug("Data: string=%s\n", data->u.str);
+		ShowDebug("Data: string value=\"%s\"\n", data->u.str);
 		break;
-	case C_NAME:// variable
-		{
-			char* name = data_varname(data);
+	case C_NAME:// reference
+		if( reference_tovariable(data) )
+		{// variable
+			char* name = reference_getname(data);
 			if( not_array_variable(*name) )
-				ShowDebug("Data: variable=%s\n", name);
+				ShowDebug("Data: variable name='%s'\n", name);
 			else
-				ShowDebug("Data: variable=%s index=%u\n", name, data_varindex(data));
+				ShowDebug("Data: variable name='%s' index=%d\n", name, reference_getindex(data));
+		}
+		else if( reference_toconstant(data) )
+		{// constant
+			ShowDebug("Data: constant name='%s' value=%d\n", reference_getname(data), reference_getconstant(data));
+		}
+		else if( reference_toparam(data) )
+		{// param
+			ShowDebug("Data: param name='%s' type=%d\n", reference_getname(data), reference_getparamtype(data));
+		}
+		else
+		{// ???
+			ShowDebug("Data: reference name='%s' type=%s\n", reference_getname(data), script_op2name(data->type));
 		}
 		break;
 	case C_POS:// label
@@ -2056,7 +2082,7 @@ struct script_code* parse_script(const char *src,const char *file,int line,int o
 }
 
 //
-// 実行系
+// Script state
 //
 enum {RUN = 0,STOP,END,RERUNLINE,GOTO,RETFUNC};
 
@@ -2072,96 +2098,136 @@ TBL_PC *script_rid2sd(struct script_state *st)
 	return sd;
 }
 
-
-/*==========================================
- * Retrieves the value of a script variable
- *------------------------------------------*/
+/// Retrieves the value of a script data
 int get_val(struct script_state* st, struct script_data* data)
 {
+	char* name;
+	char prefix;
+	char postfix;
 	TBL_PC* sd = NULL;
-	char *name, prefix, postfix;
-	
-	if(!data_isreference(data)) return 0;
 
-	name = str_buf + str_data[data->u.num&0x00ffffff].str;
-	prefix = name[0]; postfix = name[strlen(name)-1];
+	if( !data_isreference(data) )
+		return 0;// not a variable
+
+	name = reference_getname(data);
+	prefix = name[0];
+	postfix = name[strlen(name) - 1];
 
-	if(not_server_variable(prefix)) {
+	//##TODO use reference_tovariable(data) when it's confirmed that it works [FlavioJS]
+	if( !reference_toconstant(data) && !reference_toparam(data) && not_server_variable(prefix) )
+	{
 		sd = script_rid2sd(st);
-		if (!sd) { // needs player attached
-			// throw error, load some meaningful default values and return
-			ShowError("get_val error, cannot access player variable '%s'\n", name);
-			if (postfix == '$') { data->type = C_CONSTSTR; data->u.str = ""; } else { data->type = C_INT; data->u.num = 0; }
+		if( sd == NULL )
+		{// needs player attached
+			if( postfix == '$' )
+			{// string variable
+				ShowError("script:get_val: cannot access player variable '%s', defaulting to \"\"\n", name);
+				data->type = C_CONSTSTR;
+				data->u.str = "";
+			}
+			else
+			{// integer variable
+				ShowError("script:get_val: cannot access player variable '%s', defaulting to 0\n", name);
+				data->type = C_INT;
+				data->u.num = 0;
+			}
 			return 0;
-		}			
+		}
 	}
 
-	if(postfix == '$') { // string variable
+	if( postfix == '$' )
+	{// string variable
 
 		data->type = C_CONSTSTR;
 
-		switch (prefix) {
+		switch( prefix )
+		{
 		case '@':
-			data->u.str = pc_readregstr(sd, data->u.num); break;
+			data->u.str = pc_readregstr(sd, data->u.num);
+			break;
 		case '$':
-			data->u.str = (char *)idb_get(mapregstr_db,data->u.num); break;
+			data->u.str = (char *)idb_get(mapregstr_db, data->u.num);
+			break;
 		case '#':
-			data->u.str = (name[1] == '#') ? pc_readaccountreg2str(sd, name) : pc_readaccountregstr(sd, name); break;
-		case '.': {
-			struct linkdb_node** n;
-			n = (data->ref) ? data->ref : (name[1] == '@') ? st->stack->var_function : &st->script->script_vars;
-			data->u.str = linkdb_search(n, (void*)data->u.num);
+			if( name[1] == '#' )
+				data->u.str = pc_readaccountreg2str(sd, name);// global
+			else
+				data->u.str = pc_readaccountregstr(sd, name);// local
+			break;
+		case '.':
+			{
+				struct linkdb_node** n =
+					data->ref      ? data->ref:
+					name[1] == '@' ? st->stack->var_function:// instance/scope variable
+					                 &st->script->script_vars;// npc variable
+				data->u.str = linkdb_search(n, (void*)reference_getuid(data));
 			}
 			break;
 		default:
-			data->u.str = pc_readglobalreg_str(sd, name); break;
+			data->u.str = pc_readglobalreg_str(sd, name);
+			break;
 		}
 
 		if( data->u.str == NULL )
 			data->u.str = "";
 
-	} else { // integer variable
+	}
+	else
+	{// integer variable
 
 		data->type = C_INT;
 
-		if(str_data[data->u.num&0x00ffffff].type == C_INT) {
-			data->u.num = str_data[data->u.num&0x00ffffff].val;
-		} else if(str_data[data->u.num&0x00ffffff].type == C_PARAM) {
-			data->u.num = pc_readparam(sd, str_data[data->u.num&0x00ffffff].val);
+		if( reference_toconstant(data) )
+		{
+			data->u.num = reference_getconstant(data);
+		}
+		else if( reference_toparam(data) )
+		{
+			data->u.num = pc_readparam(sd, reference_getparamtype(data));
 		}
 		else
-		switch (prefix) {
+		switch( prefix )
+		{
 		case '@':
-			data->u.num = pc_readreg(sd, data->u.num); break;
+			data->u.num = pc_readreg(sd, data->u.num);
+			break;
 		case '$':
-			data->u.num = (int)idb_get(mapreg_db, data->u.num); break;
+			data->u.num = (int)idb_get(mapreg_db, data->u.num);
+			break;
 		case '#':
-			data->u.num = (name[1] == '#') ? pc_readaccountreg2(sd, name) : pc_readaccountreg(sd, name); break;
-		case '.': {
-			struct linkdb_node** n;
-			n = (data->ref) ? data->ref : (name[1] == '@') ? st->stack->var_function : &st->script->script_vars;
-			data->u.num = (int)linkdb_search(n, (void*)data->u.num);
+			if( name[1] == '#' )
+				data->u.str = pc_readaccountreg2str(sd, name);// global
+			else
+				data->u.str = pc_readaccountregstr(sd, name);// local
+			break;
+		case '.':
+			{
+				struct linkdb_node** n =
+					data->ref      ? data->ref:
+					name[1] == '@' ? st->stack->var_function:// instance/scope variable
+					                 &st->script->script_vars;// npc variable
+				data->u.num = (int)linkdb_search(n, (void*)reference_getuid(data));
 			}
 			break;
 		default:
-			data->u.num = pc_readglobalreg(sd, name); break;
+			data->u.num = pc_readglobalreg(sd, name);
+			break;
 		}
 
 	}
 
 	return 0;
 }
-/*==========================================
- * Retrieves the value of a script variable
- *------------------------------------------*/
-void* get_val2(struct script_state* st, int num, struct linkdb_node** ref)
+
+/// Retrieves the value of a reference identified by uid (variable, constant, param)
+void* get_val2(struct script_state* st, int uid, struct linkdb_node** ref)
 {
-	struct script_data dat;
-	dat.type = C_NAME;
-	dat.u.num = num;
-	dat.ref = ref;
-	get_val(st, &dat);
-	return (dat.type == C_INT) ? (void*)dat.u.num : (void*)dat.u.str;
+	struct script_data data;
+	data.type = C_NAME;
+	data.u.num = uid;
+	data.ref = ref;
+	get_val(st, &data);
+	return (data.type == C_INT ? (void*)data.u.num : (void*)data.u.str);
 }
 
 /*==========================================
@@ -2235,43 +2301,88 @@ int set_var(TBL_PC* sd, char* name, void* val)
     return set_reg(NULL, sd, add_str(name), name, val, NULL);
 }
 
-/*==========================================
- * 文字列への変換
- *------------------------------------------*/
-const char* conv_str(struct script_state *st,struct script_data *data)
+/// Converts the data to a string
+const char* conv_str(struct script_state* st, struct script_data* data)
 {
-	get_val(st,data);
-	if(data_isint(data)){
-		char *buf;
-		CREATE(buf,char,ITEM_NAME_LENGTH);
-		snprintf(buf,ITEM_NAME_LENGTH, "%d",data->u.num);
-		buf[ITEM_NAME_LENGTH-1]=0;
-		data->type=C_STR;
-		data->u.str=buf;
-	} else if(data_islabel(data)) {
-		// Protect from crashes by passing labels to string-expected args [jA2200]
+	char* p;
+
+	get_val(st, data);
+	if( data_isstring(data) )
+	{// nothing to convert
+	}
+	else if( data_isint(data) )
+	{// int -> string
+		CREATE(p, char, ITEM_NAME_LENGTH);
+		snprintf(p, ITEM_NAME_LENGTH, "%d", data->u.num);
+		p[ITEM_NAME_LENGTH-1] = '\0';
+		data->type = C_STR;
+		data->u.str = p;
+	}
+	else if( data_isreference(data) )
+	{// reference -> string
+		//##TODO when does this happen (check get_val) [FlavioJS]
 		data->type = C_CONSTSTR;
-		data->u.str = "** SCRIPT ERROR **";
-	} else if(data_isreference(data)){
-		data->type=C_CONSTSTR;
-		data->u.str=str_buf+str_data[data->u.num].str;
+		data->u.str = reference_getname(data);
+	}
+	else
+	{// unsupported data type
+		ShowError("script:conv_str: cannot convert to string, defaulting to \"\"\n");
+		script_reportdata(data);
+		script_reportsrc(st);
+		data->type = C_CONSTSTR;
+		data->u.str = "";
 	}
 	return data->u.str;
 }
 
-/*==========================================
- * 数値へ変換
- *------------------------------------------*/
-int conv_num(struct script_state *st,struct script_data *data)
+/// Converts the data to an int
+int conv_num(struct script_state* st, struct script_data* data)
 {
-	char *p;
-	get_val(st,data);
-	if(data_isstring(data)){
-		p=data->u.str;
-		data->u.num = atoi(p);
-		if(data->type==C_STR)
+	char* p;
+	long num;
+
+	get_val(st, data);
+	if( data_isint(data) )
+	{// nothing to convert
+	}
+	else if( data_isstring(data) )
+	{// string -> int
+		// the result does not overflow or underflow, it is capped instead
+		// ex: 999999999999 is capped to INT_MAX (2147483647)
+		p = data->u.str;
+		errno = 0;
+		num = strtol(data->u.str, NULL, 10);// change radix to 0 to support octal numbers "o377" and hex numbers "0xFF"
+		if( errno == ERANGE
+#if LONG_MAX > INT_MAX
+			|| num < INT_MIN || num > INT_MAX
+#endif
+			)
+		{
+			if( num <= INT_MIN )
+			{
+				num = INT_MIN;
+				ShowError("script:conv_num: underflow detected, capping to %ld\n", num);
+			}
+			else//if( num >= INT_MAX )
+			{
+				num = INT_MAX;
+				ShowError("script:conv_num: overflow detected, capping to %ld\n", num);
+			}
+			script_reportdata(data);
+			script_reportsrc(st);
+		}
+		if( data->type == C_STR )
 			aFree(p);
-		data->type=C_INT;
+		data->type = C_INT;
+		data->u.num = (int)num;
+	}
+	else
+	{// unsupported data type
+		ShowError("script:conv_num: cannot convert to number, defaulting to 0\n");
+		script_reportdata(data);
+		script_reportsrc(st);
+		data->type = C_INT;
+		data->u.num = 0;
 	}
 	return data->u.num;
 }
@@ -4307,7 +4418,6 @@ struct script_function buildin_func[] = {
 
 /// Appends a message to the npc dialog.
 /// If a dialog doesn't exist yet, one is created.
-/// TODO does the client support dialogs with different oid's at the same time?
 ///
 /// mes "<message>";
 BUILDIN_FUNC(mes)
@@ -4448,17 +4558,7 @@ BUILDIN_FUNC(menu)
 		for( i = 2, sd->npc_menu = 0; i < script_lastdata(st); i += 2 )
 		{
 			// menu options
-			data = script_getdata(st, i);
-			get_val(st, data);
-			if( data_isstring(data) && data_isint(data) )
-			{// not a string (or compatible)
-				StringBuf_Destroy(&buf);
-				ShowError("script:menu: argument #%d (from 1) is not a string or compatible.\n", (i - 1));
-				script_reportdata(data);
-				st->state = END;
-				return 1;
-			}
-			text = conv_str(st, data);// convert to string
+			text = script_getstr(st, i);
 
 			// target label
 			data = script_getdata(st, i+1);
@@ -4811,7 +4911,7 @@ BUILDIN_FUNC(return)
 		data = script_getdatatop(st, -1);
 		if( data_isreference(data) )
 		{
-			char* name = data_varname(data);
+			char* name = reference_getname(data);
 			if( name[0] == '.' && name[1] == '@' )
 			{// temporary script variable, convert to value
 				get_val(st, data);
@@ -5330,7 +5430,7 @@ static int32 getarraysize(struct script_state* st, int32 id, int32 idx, int isst
 	{
 		for( ; idx < 128; ++idx )
 		{
-			char* str = (char*)get_val2(st, variable_uid(id, idx), ref);
+			char* str = (char*)get_val2(st, reference_uid(id, idx), ref);
 			if( str && *str )
 				ret = idx + 1;
 		}
@@ -5339,7 +5439,7 @@ static int32 getarraysize(struct script_state* st, int32 id, int32 idx, int isst
 	{
 		for( ; idx < 128; ++idx )
 		{
-			int32 num = (int32)get_val2(st, variable_uid(id, idx), ref);
+			int32 num = (int32)get_val2(st, reference_uid(id, idx), ref);
 			if( num )
 				ret = idx + 1;
 		}
@@ -5370,9 +5470,9 @@ BUILDIN_FUNC(setarray)
 		return 1;// not a variable
 	}
 
-	id = data_varid(data);
-	start = data_varindex(data);
-	name = data_varname(data);
+	id = reference_getid(data);
+	start = reference_getindex(data);
+	name = reference_getname(data);
 	if( not_array_variable(*name) )
 	{
 		ShowError("script:setarray: illegal scope\n");
@@ -5397,7 +5497,7 @@ BUILDIN_FUNC(setarray)
 		for( i = 3; start < end; ++start, ++i )
 		{
 			void* v = (void*)script_getstr(st,i);
-			set_reg(st, sd, variable_uid(id, start), name, v, data_varref(data));
+			set_reg(st, sd, reference_uid(id, start), name, v, reference_getref(data));
 		}
 	}
 	else
@@ -5405,7 +5505,7 @@ BUILDIN_FUNC(setarray)
 		for( i = 3; start < end; ++start, ++i )
 		{
 			void* v = (void*)script_getnum(st,i);
-			set_reg(st, sd, variable_uid(id, start), name, v, data_varref(data));
+			set_reg(st, sd, reference_uid(id, start), name, v, reference_getref(data));
 		}
 	}
 	return 0;
@@ -5434,9 +5534,9 @@ BUILDIN_FUNC(cleararray)
 		return 1;// not a variable
 	}
 
-	id = data_varid(data);
-	start = data_varindex(data);
-	name = data_varname(data);
+	id = reference_getid(data);
+	start = reference_getindex(data);
+	name = reference_getname(data);
 	if( not_array_variable(*name) )
 	{
 		ShowError("script:cleararray: illegal scope\n");
@@ -5462,7 +5562,7 @@ BUILDIN_FUNC(cleararray)
 		end = 127;
 
 	for( ; start < end; ++start )
-		set_reg(st, sd, variable_uid(id, start), name, v, script_getref(st,2));
+		set_reg(st, sd, reference_uid(id, start), name, v, script_getref(st,2));
 	return 0;
 }
 
@@ -5496,12 +5596,12 @@ BUILDIN_FUNC(copyarray)
 		return 1;// not a variable
 	}
 
-	id1 = data_varid(data1);
-	id2 = data_varid(data2);
-	idx1 = data_varindex(data1);
-	idx2 = data_varindex(data2);
-	name1 = data_varname(data1);
-	name2 = data_varname(data2);
+	id1 = reference_getid(data1);
+	id2 = reference_getid(data2);
+	idx1 = reference_getindex(data1);
+	idx2 = reference_getindex(data2);
+	name1 = reference_getname(data1);
+	name2 = reference_getname(data2);
 	if( not_array_variable(*name1) || not_array_variable(*name2) )
 	{
 		ShowError("script:copyarray: illegal scope\n");
@@ -5537,8 +5637,8 @@ BUILDIN_FUNC(copyarray)
 	{// destination might be overlapping the source - copy in reverse order
 		for( i = count - 1; i >= 0; --i )
 		{
-			v = get_val2(st, variable_uid(id2, idx2 + i), data_varref(data2));
-			set_reg(st, sd, variable_uid(id1, idx1 + i), name1, v, data_varref(data1));
+			v = get_val2(st, reference_uid(id2, idx2 + i), reference_getref(data2));
+			set_reg(st, sd, reference_uid(id1, idx1 + i), name1, v, reference_getref(data1));
 		}
 	}
 	else
@@ -5546,10 +5646,10 @@ BUILDIN_FUNC(copyarray)
 		for( i = 0; i < count; ++i )
 		{
 			if( id2 + i < 128 )
-				v = get_val2(st, variable_uid(id2, idx2 + i), data_varref(data2));
+				v = get_val2(st, reference_uid(id2, idx2 + i), reference_getref(data2));
 			else// out of range - assume ""/0
 				v = (void*)(is_string_variable(name1) ? "" : 0);
-			set_reg(st, sd, variable_uid(id1, idx1 + i), name1, v, data_varref(data1));
+			set_reg(st, sd, reference_uid(id1, idx1 + i), name1, v, reference_getref(data1));
 		}
 	}
 	return 0;
@@ -5575,7 +5675,7 @@ BUILDIN_FUNC(getarraysize)
 		return 1;// not a variable
 	}
 
-	name = data_varname(data);
+	name = reference_getname(data);
 	if( not_array_variable(*name) )
 	{
 		ShowError("script:getarraysize: illegal scope\n");
@@ -5585,7 +5685,7 @@ BUILDIN_FUNC(getarraysize)
 		return 1;// not supported
 	}
 
-	script_pushint(st, getarraysize(st, data_varid(data), data_varindex(data), is_string_variable(name), data_varref(data)));
+	script_pushint(st, getarraysize(st, reference_getid(data), reference_getindex(data), is_string_variable(name), reference_getref(data)));
 	return 0;
 }
 
@@ -5612,9 +5712,9 @@ BUILDIN_FUNC(deletearray)
 		return 1;// not a variable
 	}
 
-	id = data_varid(data);
-	start = data_varindex(data);
-	name = data_varname(data);
+	id = reference_getid(data);
+	start = reference_getindex(data);
+	name = reference_getname(data);
 	if( not_array_variable(*name) )
 	{
 		ShowError("script:deletearray: illegal scope\n");
@@ -5630,7 +5730,7 @@ BUILDIN_FUNC(deletearray)
 			return 1;// no player attached
 	}
 
-	end = getarraysize(st, id, start, is_string_variable(name), data_varref(data));
+	end = getarraysize(st, id, start, is_string_variable(name), reference_getref(data));
 	if( start >= end )
 		return 0;// nothing to free
 
@@ -5645,8 +5745,8 @@ BUILDIN_FUNC(deletearray)
 		// move rest of the elements backward
 		for( ; start + count < end; ++start )
 		{
-			void* v = get_val2(st, variable_uid(id, start + count), data_varref(data));
-			set_reg(st, sd, variable_uid(id, start), name, v, data_varref(data));
+			void* v = get_val2(st, reference_uid(id, start + count), reference_getref(data));
+			set_reg(st, sd, reference_uid(id, start), name, v, reference_getref(data));
 		}
 	}
 
@@ -5654,12 +5754,12 @@ BUILDIN_FUNC(deletearray)
 	if( is_string_variable(name) )
 	{
 		for( ; start < end; ++start )
-			set_reg(st, sd, variable_uid(id, start), name, (void*)0, data_varref(data));
+			set_reg(st, sd, reference_uid(id, start), name, (void*)0, reference_getref(data));
 	}
 	else 
 	{
 		for( ; start < end; ++start )
-			set_reg(st, sd, variable_uid(id, start), name, (void *)"", data_varref(data));
+			set_reg(st, sd, reference_uid(id, start), name, (void *)"", reference_getref(data));
 	}
 	return 0;
 }
@@ -5685,8 +5785,8 @@ BUILDIN_FUNC(getelementofarray)
 		return 1;// not a variable
 	}
 
-	id = data_varid(data);
-	name = data_varname(data);
+	id = reference_getid(data);
+	name = reference_getname(data);
 	if( not_array_variable(*name) )
 	{
 		ShowError("script:getelementofarray: illegal scope\n");
@@ -5706,7 +5806,7 @@ BUILDIN_FUNC(getelementofarray)
 		return 1;// out of range
 	}
 
-	push_val2(st->stack, C_NAME, variable_uid(id, i), data_varref(data));
+	push_val2(st->stack, C_NAME, reference_uid(id, i), reference_getref(data));
 	return 0;
 }
 
@@ -13563,7 +13663,7 @@ BUILDIN_FUNC(getvariableofnpc)
 		return 1;
 	}
 
-	name = data_varname(data);
+	name = reference_getname(data);
 	if( *name != '.' || name[1] == '@' )
 	{// not a npc variable
 		ShowError("script:getvariableofnpc: invalid scope (not npc variable)\n");
@@ -13582,7 +13682,7 @@ BUILDIN_FUNC(getvariableofnpc)
 		return 1;
 	}
 
-	push_val2(st->stack, C_NAME, data_varuid(data), &nd->u.scr.script->script_vars );
+	push_val2(st->stack, C_NAME, reference_getuid(data), &nd->u.scr.script->script_vars );
 	return 0;
 }