浏览代码

* Moved the reset of references to after the empty script checks in parse_script. (fixes bugreport:222 and bugreport:449)

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@11782 54d463be-8e91-2dee-dedb-b68131a5f0ec
FlavioJS 17 年之前
父节点
当前提交
69be534c6f
共有 2 个文件被更改,包括 17 次插入12 次删除
  1. 2 0
      Changelog-Trunk.txt
  2. 15 12
      src/map/script.c

+ 2 - 0
Changelog-Trunk.txt

@@ -4,6 +4,8 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK.  ALL UNTESTED BUGFIXES/FEATURES GO
 IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
 
 2007/11/22
+	* Moved the reset of references to after the empty script checks in 
+	  parse_script. (fixes bugreport:222 and bugreport:449)
 	* Renamed fakenpcname to setnpcdisplay, fixed and extended it. [FlavioJS]
 	- See doc/script_commands.txt for information on how to use it
 	* Modified mapserver login procedure to make clients from may 2007

+ 15 - 12
src/map/script.c

@@ -1876,8 +1876,8 @@ struct script_code* parse_script(const char *src,const char *file,int line,int o
 	if(first){
 		add_buildin_func();
 		read_constdb();
+		first=0;
 	}
-	first=0;
 
 	script_buf=(unsigned char *)aMalloc(SCRIPT_BLOCK_SIZE*sizeof(unsigned char));
 	script_pos=0;
@@ -1885,16 +1885,6 @@ struct script_code* parse_script(const char *src,const char *file,int line,int o
 	str_data[LABEL_NEXTLINE].type=C_NOP;
 	str_data[LABEL_NEXTLINE].backpatch=-1;
 	str_data[LABEL_NEXTLINE].label=-1;
-	for(i=LABEL_START;i<str_num;i++){
-		if(
-			str_data[i].type==C_POS || str_data[i].type==C_NAME ||
-			str_data[i].type==C_USERFUNC || str_data[i].type == C_USERFUNC_POS
-		){
-			str_data[i].type=C_NOP;
-			str_data[i].backpatch=-1;
-			str_data[i].label=-1;
-		}
-	}
 
 	// who called parse_script is responsible for clearing the database after using it, but just in case... lets clear it here
 	if( options&SCRIPT_USE_LABEL_DB )
@@ -1950,6 +1940,18 @@ struct script_code* parse_script(const char *src,const char *file,int line,int o
 		end = '}';
 	}
 
+	// clear references of labels, variables and internal functions
+	for(i=LABEL_START;i<str_num;i++){
+		if(
+			str_data[i].type==C_POS || str_data[i].type==C_NAME ||
+			str_data[i].type==C_USERFUNC || str_data[i].type == C_USERFUNC_POS
+		){
+			str_data[i].type=C_NOP;
+			str_data[i].backpatch=-1;
+			str_data[i].label=-1;
+		}
+	}
+
 	while( syntax.curly_count != 0 || *p != end )
 	{
 		if( *p == '\0' )
@@ -1979,10 +1981,11 @@ struct script_code* parse_script(const char *src,const char *file,int line,int o
 
 	add_scriptc(C_NOP);
 
+	// trim code to size
 	script_size = script_pos;
 	RECREATE(script_buf,unsigned char,script_pos);
 
-	// –¢‰ðŒˆ‚̃‰ƒxƒ‹‚ð‰ðŒˆ
+	// default unknown references to variables
 	for(i=LABEL_START;i<str_num;i++){
 		if(str_data[i].type==C_NOP){
 			int j,next;