[Python-checkins] r69540 - in python/branches/py3k: Lib/test/test_osx_env.py Modules/getpath.c Modules/main.c

ronald.oussoren python-checkins at python.org
Thu Feb 12 16:55:38 CET 2009


Author: ronald.oussoren
Date: Thu Feb 12 16:55:38 2009
New Revision: 69540
Log:
This fixes issue5143 and includes a test.
Issue5143 notes that getpath.c and main.c pass a 'char*' where
a 'wchar_t*' is expected on OSX.
Added:
 python/branches/py3k/Lib/test/test_osx_env.py (contents, props changed)
Modified:
 python/branches/py3k/Modules/getpath.c
 python/branches/py3k/Modules/main.c
Added: python/branches/py3k/Lib/test/test_osx_env.py
==============================================================================
--- (empty file)
+++ python/branches/py3k/Lib/test/test_osx_env.py	Thu Feb 12 16:55:38 2009
@@ -0,0 +1,34 @@
+"""
+Test suite for OS X interpreter environment variables.
+"""
+
+from test.support import EnvironmentVarGuard, run_unittest
+import subprocess
+import sys
+import unittest
+
+class OSXEnvironmentVariableTestCase(unittest.TestCase):
+ def _check_sys(self, ev, cond, sv, val = '/some/path/to/python'):
+ with EnvironmentVarGuard() as evg:
+ subpc = [str(sys.executable), '-c',
+ 'import sys; sys.exit(2 if "%s" %s %s else 3)' % (val, cond, sv)]
+ # ensure environment variable does not exist
+ evg.unset(ev)
+ # test that test on sys.xxx normally fails
+ rc = subprocess.call(subpc)
+ self.assertEqual(rc, 3, "expected %s not %s %s" % (ev, cond, sv))
+ # set environ variable
+ evg.set(ev, val)
+ # test that sys.xxx has been influenced by the environ value
+ rc = subprocess.call(subpc)
+ self.assertEqual(rc, 2, "expected %s %s %s" % (ev, cond, sv))
+
+ def test_pythonexecutable_sets_sys_executable(self):
+ self._check_sys('PYTHONEXECUTABLE', '==', 'sys.executable')
+
+def test_main():
+ if sys.platform == 'darwin':
+ run_unittest(OSXEnvironmentVariableTestCase)
+
+if __name__ == "__main__":
+ test_main()
Modified: python/branches/py3k/Modules/getpath.c
==============================================================================
--- python/branches/py3k/Modules/getpath.c	(original)
+++ python/branches/py3k/Modules/getpath.c	Thu Feb 12 16:55:38 2009
@@ -457,6 +457,7 @@
 #else
 unsigned long nsexeclength = MAXPATHLEN;
 #endif
+	char execpath[MAXPATHLEN+1];
 #endif
 
 if (_path) {
@@ -486,8 +487,13 @@
 * will fail if a relative path was used. but in that case,
 * absolutize() should help us out below
 */
- else if(0 == _NSGetExecutablePath(progpath, &nsexeclength) && progpath[0] == SEP)
- ;
+	else if(0 == _NSGetExecutablePath(execpath, &nsexeclength) && execpath[0] == SEP) {
+		size_t r = mbstowcs(progpath, execpath, MAXPATHLEN+1);
+		if (r == (size_t)-1 || r > MAXPATHLEN) {
+			/* Could not convert execpath, or it's too long. */
+			progpath[0] = '0円';
+		}
+	}
 #endif /* __APPLE__ */
 	else if (path) {
 		while (1) {
Modified: python/branches/py3k/Modules/main.c
==============================================================================
--- python/branches/py3k/Modules/main.c	(original)
+++ python/branches/py3k/Modules/main.c	Thu Feb 12 16:55:38 2009
@@ -487,10 +487,23 @@
 	 so the actual executable path is passed in an environment variable.
 	 See Lib/plat-mac/bundlebuiler.py for details about the bootstrap
 	 script. */
-	if ((p = Py_GETENV("PYTHONEXECUTABLE")) && *p != '0円')
-		Py_SetProgramName(p);
-	else
+	if ((p = Py_GETENV("PYTHONEXECUTABLE")) && *p != '0円') {
+		wchar_t* buffer;
+		size_t len = strlen(p);
+		size_t r;
+
+		buffer = malloc(len * sizeof(wchar_t));
+		if (buffer == NULL) {
+			Py_FatalError(
+			 "not enough memory to copy PYTHONEXECUTABLE");
+		}
+
+		r = mbstowcs(buffer, p, len);
+		Py_SetProgramName(buffer);
+		/* buffer is now handed off - do not free */
+	} else {
 		Py_SetProgramName(argv[0]);
+	}
 #else
 	Py_SetProgramName(argv[0]);
 #endif


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /