diff options
Diffstat (limited to 'indra/lscript')
| -rw-r--r-- | indra/lscript/lscript_alloc.h | 4 | ||||
| -rw-r--r-- | indra/lscript/lscript_compile/lscript_tree.cpp | 2 | ||||
| -rw-r--r-- | indra/lscript/lscript_execute/lscript_execute.cpp | 120 | ||||
| -rw-r--r-- | indra/lscript/lscript_execute/lscript_readlso.cpp | 1 | ||||
| -rw-r--r-- | indra/lscript/lscript_library/lscript_library.cpp | 7 | 
5 files changed, 77 insertions, 57 deletions
diff --git a/indra/lscript/lscript_alloc.h b/indra/lscript/lscript_alloc.h index 2870364a9c..c9eca7cd81 100644 --- a/indra/lscript/lscript_alloc.h +++ b/indra/lscript/lscript_alloc.h @@ -267,7 +267,9 @@ inline LLScriptLibData *lsa_bubble_sort(LLScriptLibData *src, S32 stride, S32 as  	src->mListp = NULL; -	return sortarray[0]; +	temp = sortarray[0]; +	delete[] sortarray; +	return temp;  } diff --git a/indra/lscript/lscript_compile/lscript_tree.cpp b/indra/lscript/lscript_compile/lscript_tree.cpp index ae2a0c8afe..4f54bdd7b7 100644 --- a/indra/lscript/lscript_compile/lscript_tree.cpp +++ b/indra/lscript/lscript_compile/lscript_tree.cpp @@ -9916,6 +9916,8 @@ void LLScriptScript::recurse(FILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompilePass  			code->build(fp, bcfp);  			fclose(bcfp); +									    +			delete code;  		}  		break;  	case LSCP_EMIT_CIL_ASSEMBLY: diff --git a/indra/lscript/lscript_execute/lscript_execute.cpp b/indra/lscript/lscript_execute/lscript_execute.cpp index 9f123025ff..94dc9329b1 100644 --- a/indra/lscript/lscript_execute/lscript_execute.cpp +++ b/indra/lscript/lscript_execute/lscript_execute.cpp @@ -1,4 +1,4 @@ -/**  +/**   * @file lscript_execute.cpp   * @brief classes to execute bytecode   * @@ -55,7 +55,7 @@ LLScriptExecute::LLScriptExecute(FILE *fp)  LLScriptExecute::LLScriptExecute(U8 *buffer)  { -	mBuffer = buffer;  +	mBuffer = buffer;  	init();  } @@ -981,7 +981,7 @@ BOOL run_loadgsp(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id)  	S32 address = lscript_global_get(buffer, arg);  	if (address)  		lsa_decrease_ref_count(buffer, address); -	 +  	lscript_global_store(buffer, arg, value);  	return FALSE;  } @@ -999,7 +999,7 @@ BOOL run_loadglp(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id)  	S32 address = lscript_global_get(buffer, arg);  	if (address)  		lsa_decrease_ref_count(buffer, address); -	 +  	lscript_global_store(buffer, arg, value);  	return FALSE;  } @@ -1366,14 +1366,31 @@ void integer_integer_operation(U8 *buffer, LSCRIPTOpCodesEnum opcode)  		result = lside * rside;  		break;  	case LOPC_DIV: -		if (rside) -			result = lside / rside; +		if (rside){ +			if( ( rside == -1 ) || ( rside == 0xffffffff ) )//	division by -1 can have funny results: multiplication is OK: SL-31252 +			{ +				result = -1 * lside; +			} +			else +			{ +				result = lside / rside; +			} +		}  		else  			set_fault(buffer, LSRF_MATH);  		break;  	case LOPC_MOD:  		if (rside) -			result = lside % rside; +		{ +			if (rside == -1 || rside == 1 )	 // mod(1) = mod(-1) = 0: SL-31252 +			{ +				result = 0; +			} +			else +			{ +				result = lside % rside; +			} +		}  		else  			set_fault(buffer, LSRF_MATH);  		break; @@ -2925,14 +2942,14 @@ BOOL run_return(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id)  	return FALSE;  } -S32 axtoi(char *hexStg)  +S32 axtoi(char *hexStg)  {    S32 n = 0;         // position in string    S32 m = 0;         // position in digit[] to shift    S32 count;         // loop index    S32 intValue = 0;  // integer value of hex string    S32 digit[9];      // hold values to convert -  while (n < 8)  +  while (n < 8)    {       if (hexStg[n]=='\0')          break; @@ -2948,7 +2965,7 @@ S32 axtoi(char *hexStg)    count = n;    m = n - 1;    n = 0; -  while(n < count)  +  while(n < count)    {       // digit[n] is value of hex digit at position n       // (m << 2) is the number of positions to shift @@ -3120,7 +3137,7 @@ BOOL run_cast(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id)  							bytestream2char(arg, buffer, string);  							F32 dest = (F32)atof(arg); -							 +  							lscript_push(buffer, dest);  							delete [] arg;  						} @@ -3318,7 +3335,7 @@ BOOL run_cast(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id)  					delete list_root;  					char *tmp = strdup(dest.str().c_str());  					LLScriptLibData *string = new LLScriptLibData(tmp); -					free(tmp);  +					free(tmp);  					tmp = NULL;  					S32 destaddress = lsa_heap_add_data(buffer, string, get_max_heap_size(buffer), TRUE);  					lscript_push(buffer, destaddress); @@ -3373,7 +3390,7 @@ void lscript_stacktol_pop_variable(LLScriptLibData *data, U8 *buffer, char type)  		break;  	case LST_KEY:  		data->mType = LST_KEY; -		 +  		base_address = lscript_pop_int(buffer);  	// this bit of nastiness is to get around that code paths to local variables can result in lack of initialization  	// and function clean up of ref counts isn't based on scope (a mistake, I know) @@ -3597,48 +3614,53 @@ BOOL run_print(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id)  void lscript_run(char *filename, BOOL b_debug)  {  	LLTimer	timer; -	char *error; -	BOOL b_state; -	LLScriptExecute *execute = NULL;  	if (filename == NULL)  	{ -		llerrs << "filename is empty" << llendl; +		llerrs << "filename is NULL" << llendl;  		// Just reporting error is likely not enough. Need  		// to check how to abort or error out gracefully  		// from this function. XXXTBD  	} -	FILE* file = LLFile::fopen(filename, "r");  /* Flawfinder: ignore */ -	if (file) -	{ -		execute = new LLScriptExecute(file); -		fclose(file); -	} -	file = LLFile::fopen(filename, "r");  /* Flawfinder: ignore */ -	if (file) -	{ -		FILE* fp = LLFile::fopen("lscript.parse", "w");		/*Flawfinder: ignore*/ -		LLScriptLSOParse	*parse = new LLScriptLSOParse(file); -		parse->printData(fp); -		fclose(file); -		fclose(fp); -	} -	file = LLFile::fopen(filename, "r");	/*Flawfinder: ignore*/ -	if (file && execute) +	else  	{ -		timer.reset(); -		while (!execute->run(b_debug, LLUUID::null, &error, b_state)) -			; -		F32 time = timer.getElapsedTimeF32(); -		F32 ips = execute->mInstructionCount / time; -		llinfos << execute->mInstructionCount << " instructions in " << time << " seconds" << llendl; -		llinfos << ips/1000 << "K instructions per second" << llendl; -		printf("ip: 0x%X\n", get_register(execute->mBuffer, LREG_IP)); -		printf("sp: 0x%X\n", get_register(execute->mBuffer, LREG_SP)); -		printf("bp: 0x%X\n", get_register(execute->mBuffer, LREG_BP)); -		printf("hr: 0x%X\n", get_register(execute->mBuffer, LREG_HR)); -		printf("hp: 0x%X\n", get_register(execute->mBuffer, LREG_HP)); -		delete execute; -		fclose(file); +		char *error; +		BOOL b_state; +		LLScriptExecute *execute = NULL; + +		FILE* file = LLFile::fopen(filename, "r"); +		if (file) +		{ +			execute = new LLScriptExecute(file); +			// note: LLScriptExecute() closes file for us +		} +		file = LLFile::fopen(filename, "r"); +		if (file) +		{ +			FILE* fp = LLFile::fopen("lscript.parse", "w");		/*Flawfinder: ignore*/ +			LLScriptLSOParse *parse = new LLScriptLSOParse(file); +			parse->printData(fp); +			delete parse; +			fclose(file); +			fclose(fp); +		} +		file = LLFile::fopen(filename, "r"); +		if (file && execute) +		{ +			timer.reset(); +			while (!execute->run(b_debug, LLUUID::null, &error, b_state)) +				; +			F32 time = timer.getElapsedTimeF32(); +			F32 ips = execute->mInstructionCount / time; +			llinfos << execute->mInstructionCount << " instructions in " << time << " seconds" << llendl; +			llinfos << ips/1000 << "K instructions per second" << llendl; +			printf("ip: 0x%X\n", get_register(execute->mBuffer, LREG_IP)); +			printf("sp: 0x%X\n", get_register(execute->mBuffer, LREG_SP)); +			printf("bp: 0x%X\n", get_register(execute->mBuffer, LREG_BP)); +			printf("hr: 0x%X\n", get_register(execute->mBuffer, LREG_HR)); +			printf("hp: 0x%X\n", get_register(execute->mBuffer, LREG_HP)); +			delete execute; +			fclose(file); +		}  	}  } @@ -3659,7 +3681,7 @@ void lscript_pop_variable(LLScriptLibData *data, U8 *buffer, char type)  		break;  	case 'k':  		data->mType = LST_KEY; -		 +  		base_address = lscript_pop_int(buffer);  	// this bit of nastiness is to get around that code paths to local variables can result in lack of initialization  	// and function clean up of ref counts isn't based on scope (a mistake, I know) diff --git a/indra/lscript/lscript_execute/lscript_readlso.cpp b/indra/lscript/lscript_execute/lscript_readlso.cpp index e92c1d2312..669a9b6a06 100644 --- a/indra/lscript/lscript_execute/lscript_readlso.cpp +++ b/indra/lscript/lscript_execute/lscript_readlso.cpp @@ -22,7 +22,6 @@ LLScriptLSOParse::LLScriptLSOParse(FILE *fp)  	mRawData = new U8[filesize];  	fseek(fp, 0, SEEK_SET);  	fread(mRawData, 1, filesize, fp); -	fclose(fp);  	initOpCodePrinting();  } diff --git a/indra/lscript/lscript_library/lscript_library.cpp b/indra/lscript/lscript_library/lscript_library.cpp index 520f0d6266..fda6d0e3f3 100644 --- a/indra/lscript/lscript_library/lscript_library.cpp +++ b/indra/lscript/lscript_library/lscript_library.cpp @@ -381,7 +381,7 @@ void LLScriptLibrary::init()  	addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "llSetCameraParams",			 NULL, "l", "llSetCameraParams(list rules)\nSets multiple camera parameters at once.\nList format is [ rule1, data1, rule2, data2 . . . rulen, datan ]"));  	addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "llClearCameraParams",		 NULL, NULL, "llClearCameraParams()\nResets all camera parameters to default values and turns off scripted camera control.")); -	addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "llListStatistics", "f", "il", "integer llListStatistics(integer operation, list l)\nPerform statistical aggregate functions on list l using LIST_STAT_* operations.")); +	addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "llListStatistics", "f", "il", "float llListStatistics(integer operation, list l)\nPerform statistical aggregate functions on list l using LIST_STAT_* operations."));  	addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "llGetUnixTime", "i", NULL, "integer llGetUnixTime()\nGet the number of seconds elapsed since 00:00 hours, Jan 1, 1970 UTC from the system clock."));  	addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "llGetParcelFlags", "i", "v", "integer llGetParcelFlags(vector pos)\nGet the parcel flags (PARCEL_FLAG_*) for the parcel including the point pos."));  	addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "llGetRegionFlags", "i", NULL, "integer llGetRegionFlags()\nGet the region flags (REGION_FLAG_*) for the region the object is in.")); @@ -528,12 +528,7 @@ void LLScriptLibData::print_separator(std::ostream& ostr, BOOL b_prepend_sep, ch  	}  	//print(ostr, FALSE);  	{ -		BOOL b_prepend_comma = FALSE;  		char tmp[1024];	/* Flawfinder: ignore */ -		if (b_prepend_comma) -		{ -		        ostr << ", "; -		}  		switch (mType)  		{  		case LST_INTEGER:  | 
