MRI-Binding: Don't memcpy script data before deflating
I think the reason this was originally done was some issue with ruby's GC where it would wrongfully sweep the script array variable on the C stack. This change should speed up startup a little.
This commit is contained in:
		
							parent
							
								
									d8e22a8b3c
								
							
						
					
					
						commit
						7f4e58fd6e
					
				
					 1 changed files with 11 additions and 35 deletions
				
			
		| 
						 | 
				
			
			@ -186,15 +186,6 @@ static void runCustomScript(const char *filename)
 | 
			
		|||
 | 
			
		||||
VALUE kernelLoadDataInt(const char *filename);
 | 
			
		||||
 | 
			
		||||
struct Script
 | 
			
		||||
{
 | 
			
		||||
	std::string name;
 | 
			
		||||
	std::string encData;
 | 
			
		||||
	uint32_t unknown;
 | 
			
		||||
 | 
			
		||||
	std::string decData;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void runRMXPScripts()
 | 
			
		||||
{
 | 
			
		||||
	const std::string &scriptPack = shState->rtData().config.game.scripts;
 | 
			
		||||
| 
						 | 
				
			
			@ -224,30 +215,15 @@ static void runRMXPScripts()
 | 
			
		|||
	std::string decodeBuffer;
 | 
			
		||||
	decodeBuffer.resize(0x1000);
 | 
			
		||||
 | 
			
		||||
	std::vector<Script> encScripts(scriptCount);
 | 
			
		||||
 | 
			
		||||
	for (size_t i = 0; i < scriptCount; ++i)
 | 
			
		||||
	{
 | 
			
		||||
		VALUE script = rb_ary_entry(scriptArray, i);
 | 
			
		||||
 | 
			
		||||
		if (rb_type(script) != RUBY_T_ARRAY)
 | 
			
		||||
		{
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		VALUE scriptUnknown = rb_ary_entry(script, 0);
 | 
			
		||||
		VALUE scriptName    = rb_ary_entry(script, 1);
 | 
			
		||||
		VALUE scriptString  = rb_ary_entry(script, 2);
 | 
			
		||||
 | 
			
		||||
		Script &sc = encScripts[i];
 | 
			
		||||
		sc.name = RSTRING_PTR(scriptName);
 | 
			
		||||
		sc.encData = std::string(RSTRING_PTR(scriptString), RSTRING_LEN(scriptString));
 | 
			
		||||
		sc.unknown = FIX2UINT(scriptUnknown);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for (size_t i = 0; i < scriptCount; ++i)
 | 
			
		||||
	{
 | 
			
		||||
		Script &sc = encScripts[i];
 | 
			
		||||
		VALUE scriptName   = rb_ary_entry(script, 1);
 | 
			
		||||
		VALUE scriptString = rb_ary_entry(script, 2);
 | 
			
		||||
 | 
			
		||||
		int result = Z_OK;
 | 
			
		||||
		ulong bufferLen;
 | 
			
		||||
| 
						 | 
				
			
			@ -257,12 +233,12 @@ static void runRMXPScripts()
 | 
			
		|||
			unsigned char *bufferPtr =
 | 
			
		||||
			        reinterpret_cast<unsigned char*>(const_cast<char*>(decodeBuffer.c_str()));
 | 
			
		||||
			const unsigned char *sourcePtr =
 | 
			
		||||
			        reinterpret_cast<const unsigned char*>(sc.encData.c_str());
 | 
			
		||||
			        reinterpret_cast<const unsigned char*>(RSTRING_PTR(scriptString));
 | 
			
		||||
 | 
			
		||||
			bufferLen = decodeBuffer.length();
 | 
			
		||||
 | 
			
		||||
			result = uncompress(bufferPtr, &bufferLen,
 | 
			
		||||
			                    sourcePtr, sc.encData.length());
 | 
			
		||||
			                    sourcePtr, RSTRING_LEN(scriptString));
 | 
			
		||||
 | 
			
		||||
			bufferPtr[bufferLen] = '\0';
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -277,7 +253,7 @@ static void runRMXPScripts()
 | 
			
		|||
			static char buffer[256];
 | 
			
		||||
			/* FIXME: '%zu' apparently gcc only? */
 | 
			
		||||
			snprintf(buffer, sizeof(buffer), "Error decoding script %zu: '%s'",
 | 
			
		||||
			         i, sc.name.c_str());
 | 
			
		||||
			         i, RSTRING_PTR(scriptName));
 | 
			
		||||
 | 
			
		||||
			showMsg(buffer);
 | 
			
		||||
			break;
 | 
			
		||||
| 
						 | 
				
			
			@ -285,17 +261,17 @@ static void runRMXPScripts()
 | 
			
		|||
 | 
			
		||||
		/* Store encoding header + the decoded script
 | 
			
		||||
		 * in 'sc.decData' */
 | 
			
		||||
		sc.decData = "#encoding:utf-8\n";
 | 
			
		||||
		size_t hdSize = sc.decData.size();
 | 
			
		||||
		sc.decData.resize(hdSize + bufferLen);
 | 
			
		||||
		memcpy(&sc.decData[hdSize], decodeBuffer.c_str(), bufferLen);
 | 
			
		||||
		std::string decData = "#encoding:utf-8\n";
 | 
			
		||||
		size_t hdSize = decData.size();
 | 
			
		||||
		decData.resize(hdSize + bufferLen);
 | 
			
		||||
		memcpy(&decData[hdSize], decodeBuffer.c_str(), bufferLen);
 | 
			
		||||
 | 
			
		||||
		ruby_script(sc.name.c_str());
 | 
			
		||||
		ruby_script(RSTRING_PTR(scriptName));
 | 
			
		||||
 | 
			
		||||
		rb_gc_start();
 | 
			
		||||
 | 
			
		||||
		/* Execute code */
 | 
			
		||||
		rb_eval_string_protect(sc.decData.c_str(), 0);
 | 
			
		||||
		rb_eval_string_protect(decData.c_str(), 0);
 | 
			
		||||
 | 
			
		||||
		VALUE exc = rb_gv_get("$!");
 | 
			
		||||
		if (rb_type(exc) != RUBY_T_NIL)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue