mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 11:49:12 +00:00 
			
		
		
		
	Added support for loading pyc code from a resource.
This commit is contained in:
		
							parent
							
								
									9c96a923fb
								
							
						
					
					
						commit
						74162f311f
					
				
					 2 changed files with 118 additions and 0 deletions
				
			
		| 
						 | 
					@ -52,6 +52,9 @@ int PyMac_Idle(void);				/* Idle routine */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
char *PyMac_GetPythonDir();					/* Return the name of the python dir */
 | 
					char *PyMac_GetPythonDir();					/* Return the name of the python dir */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int PyMac_FindResourceModule(char *, char *); /* Test for 'PYC ' resource in a file */
 | 
				
			||||||
 | 
					PyObject * PyMac_LoadResourceModule(char *, char *); /* Load 'PYC ' resource from file */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int PyMac_GetOSType(PyObject *, OSType *);	/* argument parser for OSType */
 | 
					int PyMac_GetOSType(PyObject *, OSType *);	/* argument parser for OSType */
 | 
				
			||||||
PyObject *PyMac_BuildOSType(OSType);		/* Convert OSType to PyObject */
 | 
					PyObject *PyMac_BuildOSType(OSType);		/* Convert OSType to PyObject */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -25,6 +25,8 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 | 
				
			||||||
#include "Python.h"
 | 
					#include "Python.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "macglue.h"
 | 
					#include "macglue.h"
 | 
				
			||||||
 | 
					#include "marshal.h"
 | 
				
			||||||
 | 
					#include "import.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <OSUtils.h> /* for Set(Current)A5 */
 | 
					#include <OSUtils.h> /* for Set(Current)A5 */
 | 
				
			||||||
#include <Files.h>
 | 
					#include <Files.h>
 | 
				
			||||||
| 
						 | 
					@ -43,6 +45,7 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <signal.h>
 | 
					#include <signal.h>
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define NOPYTHON_ALERT 128
 | 
					#define NOPYTHON_ALERT 128
 | 
				
			||||||
#define YES_ITEM 1
 | 
					#define YES_ITEM 1
 | 
				
			||||||
| 
						 | 
					@ -478,6 +481,118 @@ PyMac_GetPythonDir()
 | 
				
			||||||
	return name;
 | 
						return name;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					** Returns true if the argument has a resource fork, and it contains
 | 
				
			||||||
 | 
					** a 'PYC ' resource of the correct name
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					int
 | 
				
			||||||
 | 
					PyMac_FindResourceModule(module, filename)
 | 
				
			||||||
 | 
					char *module;
 | 
				
			||||||
 | 
					char *filename;
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						FSSpec fss;
 | 
				
			||||||
 | 
						FInfo finfo;
 | 
				
			||||||
 | 
						short oldrh, filerh;
 | 
				
			||||||
 | 
						int ok;
 | 
				
			||||||
 | 
						Handle h;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						if ( FSMakeFSSpec(0, 0, Pstring(filename), &fss) != noErr )
 | 
				
			||||||
 | 
							return 0;			/* It doesn't exist */
 | 
				
			||||||
 | 
						if ( FSpGetFInfo(&fss, &finfo) != noErr )
 | 
				
			||||||
 | 
							return 0;			/* shouldn't happen, I guess */
 | 
				
			||||||
 | 
						if ( finfo.fdType != 'rsrc' || finfo.fdCreator != 'PYTH' )
 | 
				
			||||||
 | 
							return 0;			/* Not the right type */
 | 
				
			||||||
 | 
						oldrh = CurResFile();
 | 
				
			||||||
 | 
						filerh = FSpOpenResFile(&fss, fsRdPerm);
 | 
				
			||||||
 | 
						if ( filerh == -1 )
 | 
				
			||||||
 | 
							return 0;			/* Again, shouldn't happen */
 | 
				
			||||||
 | 
						UseResFile(filerh);
 | 
				
			||||||
 | 
						SetResLoad(0);
 | 
				
			||||||
 | 
						h = Get1NamedResource('PYC ', Pstring(module));
 | 
				
			||||||
 | 
						SetResLoad(1);
 | 
				
			||||||
 | 
						ok = (h != NULL);
 | 
				
			||||||
 | 
						CloseResFile(filerh);
 | 
				
			||||||
 | 
						UseResFile(oldrh);
 | 
				
			||||||
 | 
						return ok;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					** Load the specified module from a resource
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					PyObject *
 | 
				
			||||||
 | 
					PyMac_LoadResourceModule(module, filename)
 | 
				
			||||||
 | 
					char *module;
 | 
				
			||||||
 | 
					char *filename;
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						FSSpec fss;
 | 
				
			||||||
 | 
						FInfo finfo;
 | 
				
			||||||
 | 
						short oldrh, filerh;
 | 
				
			||||||
 | 
						int ok;
 | 
				
			||||||
 | 
						Handle h;
 | 
				
			||||||
 | 
						OSErr err;
 | 
				
			||||||
 | 
						PyObject *m, *co;
 | 
				
			||||||
 | 
						long num, size;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						if ( (err=FSMakeFSSpec(0, 0, Pstring(filename), &fss)) != noErr )
 | 
				
			||||||
 | 
							goto error;
 | 
				
			||||||
 | 
						if ( (err=FSpGetFInfo(&fss, &finfo)) != noErr )
 | 
				
			||||||
 | 
							goto error;
 | 
				
			||||||
 | 
						if ( finfo.fdType != 'rsrc' || finfo.fdCreator != 'PYTH' ) {
 | 
				
			||||||
 | 
							PyErr_SetString(PyExc_ImportError, "Incorrect typed file in sys.path");
 | 
				
			||||||
 | 
							return NULL;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						oldrh = CurResFile();
 | 
				
			||||||
 | 
						filerh = FSpOpenResFile(&fss, fsRdPerm);
 | 
				
			||||||
 | 
						if ( filerh == -1 ) {
 | 
				
			||||||
 | 
							err = ResError();
 | 
				
			||||||
 | 
							goto error;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						UseResFile(filerh);
 | 
				
			||||||
 | 
						h = Get1NamedResource('PYC ', Pstring(module));
 | 
				
			||||||
 | 
						if ( h == NULL ) {
 | 
				
			||||||
 | 
							err = ResError();
 | 
				
			||||||
 | 
							goto error;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						HLock(h);
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						** XXXX The next few lines are intimately tied to the format of pyc
 | 
				
			||||||
 | 
						** files. I'm not sure whether this code should be here or in import.c -- Jack
 | 
				
			||||||
 | 
						*/
 | 
				
			||||||
 | 
						size = GetHandleSize(h);
 | 
				
			||||||
 | 
						if ( size < 8 ) {
 | 
				
			||||||
 | 
							PyErr_SetString(PyExc_ImportError, "Resource too small");
 | 
				
			||||||
 | 
							m = NULL;
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							num = (*h)[0] & 0xff;
 | 
				
			||||||
 | 
							num = num | (((*h)[1] & 0xff) << 8);
 | 
				
			||||||
 | 
							num = num | (((*h)[2] & 0xff) << 16);
 | 
				
			||||||
 | 
							num = num | (((*h)[3] & 0xff) << 24);
 | 
				
			||||||
 | 
							if ( num != PyImport_GetMagicNumber() ) {
 | 
				
			||||||
 | 
								PyErr_SetString(PyExc_ImportError, "Bad MAGIC in resource");
 | 
				
			||||||
 | 
								co = NULL;
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								co = PyMarshal_ReadObjectFromString((*h)+8, size-8);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						HUnlock(h);
 | 
				
			||||||
 | 
						CloseResFile(filerh);
 | 
				
			||||||
 | 
						UseResFile(oldrh);
 | 
				
			||||||
 | 
						if ( co ) {
 | 
				
			||||||
 | 
							m = PyImport_ExecCodeModule(module, co);
 | 
				
			||||||
 | 
							Py_DECREF(co);
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							m = NULL;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return m;
 | 
				
			||||||
 | 
					error:
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							char buf[512];
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							sprintf(buf, "%s: %s", filename, macstrerror(err));
 | 
				
			||||||
 | 
							PyErr_SetString(PyExc_ImportError, buf);
 | 
				
			||||||
 | 
							return NULL;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Convert a 4-char string object argument to an OSType value */
 | 
					/* Convert a 4-char string object argument to an OSType value */
 | 
				
			||||||
int
 | 
					int
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue