[Scummvm-cvs-logs] SF.net SVN: scummvm: [25078] scummvm/trunk/backends/platform/PalmOS/Src/ native

chrilith at users.sourceforge.net chrilith at users.sourceforge.net
Sun Jan 14 12:02:25 CET 2007


Revision: 25078
          http://scummvm.svn.sourceforge.net/scummvm/?rev=25078&view=rev
Author:   chrilith
Date:     2007-01-14 03:02:24 -0800 (Sun, 14 Jan 2007)

Log Message:
-----------
Added static initializers to handle global objects allocation

Modified Paths:
--------------
    scummvm/trunk/backends/platform/PalmOS/Src/native/pnoARM.c
    scummvm/trunk/backends/platform/PalmOS/Src/native/zodiacARM.cpp
    scummvm/trunk/backends/platform/PalmOS/Src/native/zodiacStartup.cpp

Modified: scummvm/trunk/backends/platform/PalmOS/Src/native/pnoARM.c
===================================================================
--- scummvm/trunk/backends/platform/PalmOS/Src/native/pnoARM.c	2007-01-14 00:29:20 UTC (rev 25077)
+++ scummvm/trunk/backends/platform/PalmOS/Src/native/pnoARM.c	2007-01-14 11:02:24 UTC (rev 25078)
@@ -33,20 +33,26 @@
 // contrast to "PilotMain" for 68K applications.
 #define PNO_Main ARMlet_Main
 
-#ifdef COMPILE_ZODIAC
-	const void*      twEmulState;
-	Call68KFuncType* twCall68KFunc;
-#endif
+/* Prepare static initializers */
+extern long __sinit__[];
+extern void __ARMlet_Startup__();
 
+/* simple function pointer	*/
+typedef void (*StaticInitializer)(void);
+
 unsigned long PNO_Main(const void *emulStateP, void *userData68KP, Call68KFuncType *call68KFuncP) {
-#ifdef COMPILE_ZODIAC
-    twEmulState = emulStateP;
-    twCall68KFunc = call68KFuncP;
-#else
 	global.emulStateP = (EmulStateType *)emulStateP;
 	global.call68KFuncP = call68KFuncP;
-#endif
 
+	// handle static initializers
+	if (__sinit__) {
+		long base = (long)__ARMlet_Startup__;
+		long s, *p;
+
+		for (p = __sinit__; p && (s = *p) != 0; p++)
+			((StaticInitializer)(s + base))();
+	}
+
 	return PilotMain(sysAppLaunchCmdNormalLaunch, userData68KP, 0);
 }
 

Modified: scummvm/trunk/backends/platform/PalmOS/Src/native/zodiacARM.cpp
===================================================================
--- scummvm/trunk/backends/platform/PalmOS/Src/native/zodiacARM.cpp	2007-01-14 00:29:20 UTC (rev 25077)
+++ scummvm/trunk/backends/platform/PalmOS/Src/native/zodiacARM.cpp	2007-01-14 11:02:24 UTC (rev 25078)
@@ -48,6 +48,8 @@
 GlobalsDataPtr gVars = &g_vars;
 UInt32 g_stackSize;
 
+extern "C" void __destroy_global_chain(void);
+
 static void palm_main(int argc, char **argvP)  {
 #ifdef COMPILE_OS5
 	if (gVars->advancedMode)
@@ -143,5 +145,8 @@
 		free(g_newStack);
 	}
 
+	// Destroy all constructed global objects
+	__destroy_global_chain();
+
 	return 0;
 }

Modified: scummvm/trunk/backends/platform/PalmOS/Src/native/zodiacStartup.cpp
===================================================================
--- scummvm/trunk/backends/platform/PalmOS/Src/native/zodiacStartup.cpp	2007-01-14 00:29:20 UTC (rev 25077)
+++ scummvm/trunk/backends/platform/PalmOS/Src/native/zodiacStartup.cpp	2007-01-14 11:02:24 UTC (rev 25078)
@@ -56,6 +56,7 @@
  * mark the start and end of the various data sections.
  */
 extern long __DataStart__[];
+extern long __sinit__[];
 extern long __RODataStart__[];
 extern long __BSSStart__[];
 extern long __BSSEnd__[];
@@ -64,6 +65,9 @@
 extern long __DataRelocStart__[];
 extern long __DataRelocEnd__[];
 
+/*	simple function pointer	*/
+typedef void (*StaticInitializer)(void);
+
 /*
  * This function performs relocation for Tapwave Native Application.
  */
@@ -73,6 +77,14 @@
     long base = (long) __ARMlet_Startup__;
     long *cur, *end;
 
+	// handle static initializers
+	if (__sinit__) {
+		long s, *p;
+
+		for (p = __sinit__; p && (s = *p) != 0; p++)
+			((StaticInitializer)(s + base))();
+	}
+
     // handle code-to-data relocation
     cur = __CodeRelocStart__;
     end = __CodeRelocEnd__;


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list