home *** CD-ROM | disk | FTP | other *** search
- /*********************************************************************
- Project : Perl -
- File : reentrant.c - Prepare everything for another Perl run
- Author : Matthias Neeracher
- Started : 08Apr93 Language : MPW C
- Modified : 08Apr93 MN
- Last : 08Apr93
- *********************************************************************/
-
- #include <Types.h>
- #include <Resources.h>
- #include <Memory.h>
- #include <SysEqu.h>
-
- #include "EXTERN.h"
- #include "icemalloc.h" /* Thanks, Tim ! */
- #include "perl.h"
-
- extern void A5Init(Ptr myA5);
- extern long A5Size(void);
-
- void reenter()
- {
- long ** ranges;
- Handle tempGlob;
- Ptr tempA5;
- long * range;
- long size;
- long from;
-
- /* Release all memory allocated on the previous Perl run */
- free_pool_memory(_default_mem_pool->id);
-
- if (!(ranges = (long **) Get1Resource('IRng', 128)))
- return;
- if (!(tempGlob = NewHandle(size = A5Size() - 32)))
- return;
-
- HLock(tempGlob);
- BlockMove(*(Ptr *) CurrentA5 - size, *tempGlob, size);
- A5Init(*(Ptr *) CurrentA5);
- tempA5 = *tempGlob + size;
- from = size;
- for (range = *ranges; *range; range += 2) {
- BlockMove(tempA5 - from, *(Ptr *) CurrentA5 - from, from - range[0]);
- from = range[1];
- }
- BlockMove(tempA5 - from, *(Ptr *) CurrentA5 - from, from);
-
- DisposeHandle(tempGlob);
- ReleaseResource((Handle) ranges);
-
- curcmd = &compiling;
- }
-
-