Index: ansi.c
===================================================================
RCS file: /cvs/public/parrot/config/gen/platform/ansi.c,v
retrieving revision 1.9
diff -b -u -r1.9 ansi.c
--- ansi.c	15 Aug 2003 11:56:22 -0000	1.9
+++ ansi.c	28 Dec 2003 22:30:53 -0000
@@ -131,6 +131,39 @@
     Parrot_warn(NULL, PARROT_WARNINGS_PLATFORM_FLAG, "Parrot_dlclose not implemented");
     return 0;
 }
+
+
+/*
+** mem_alloc_executable() 
+*/
+
+void *
+mem_alloc_executable(size_t size)
+{
+	return mem_sys_allocate_zeroed(size);
+}
+
+
+/*
+** mem_realloc_executable()
+*/
+
+void *
+mem_realloc_executable(void* memblock, size_t size)
+{
+	return mem_sys_realloc(memblock, size);
+}
+
+
+/*
+** mem_free_executable() 
+*/
+
+void
+mem_free_executable(void *addr)
+{
+	mem_sys_free(addr);
+}
 
 /*
  * Local variables:
Index: darwin.c
===================================================================
RCS file: /cvs/public/parrot/config/gen/platform/darwin.c,v
retrieving revision 1.16
diff -b -u -r1.16 darwin.c
--- darwin.c	17 Dec 2003 02:27:35 -0000	1.16
+++ darwin.c	28 Dec 2003 22:30:54 -0000
@@ -342,6 +342,39 @@
 }
 #endif
 
+
+/*
+** mem_alloc_executable() 
+*/
+
+void *
+mem_alloc_executable(size_t size)
+{
+	return mem_sys_allocate_zeroed(size);
+}
+
+
+/*
+** mem_realloc_executable()
+*/
+
+void *
+mem_realloc_executable(void* memblock, size_t size)
+{
+	return mem_sys_realloc(memblock, size);
+}
+
+
+/*
+** mem_free_executable() 
+*/
+
+void
+mem_free_executable(void *addr)
+{
+	mem_sys_free(addr);
+}
+
 
 /*
  * Local variables:
Index: generic.c
===================================================================
RCS file: /cvs/public/parrot/config/gen/platform/generic.c,v
retrieving revision 1.20
diff -b -u -r1.20 generic.c
--- generic.c	15 Aug 2003 11:56:22 -0000	1.20
+++ generic.c	28 Dec 2003 22:30:55 -0000
@@ -204,6 +204,57 @@
     free(p);
 }
 
+
+/*
+** mem_alloc_executable() 
+*/
+
+void *
+mem_alloc_executable(size_t size)
+{
+    void *ptr;
+#ifdef PARROT_HAS_HEADER_SYSMMAN
+    static int dev_zero = -1;
+    if (dev_zero == -1) {
+        dev_zero = open("/dev/zero", O_RDONLY);
+        if (dev_zero == -1)
+            PANIC("Error during open /dev/zero");
+    }
+    ptr = mmap(0, size, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE,
+               dev_zero, 0);
+    if (ptr == MAP_FAILED)
+        PANIC("Error during mmap");
+    return ptr;
+#else
+    ptr = calloc(1, size);
+    if (!ptr)
+        PANIC("Out of mem");
+    return ptr;
+#endif
+}
+
+
+/*
+** mem_realloc_executable()
+*/
+
+void *
+mem_realloc_executable(void* memblock, size_t size)
+{
+	return mem_sys_realloc(memblock, size);
+}
+
+
+/*
+** mem_free_executable() 
+*/
+
+void
+mem_free_executable(void *addr)
+{
+	mem_sys_free(addr);
+}
+
 
 /*
  * signal handling
Index: openbsd.c
===================================================================
RCS file: /cvs/public/parrot/config/gen/platform/openbsd.c,v
retrieving revision 1.1
diff -b -u -r1.1 openbsd.c
--- openbsd.c	1 Dec 2003 22:16:37 -0000	1.1
+++ openbsd.c	28 Dec 2003 22:30:56 -0000
@@ -204,6 +204,39 @@
     free(p);
 }
 
+
+/*
+** mem_alloc_executable() 
+*/
+
+void *
+mem_alloc_executable(size_t size)
+{
+	return mem_sys_allocate_zeroed(size);
+}
+
+
+/*
+** mem_realloc_executable()
+*/
+
+void *
+mem_realloc_executable(void* memblock, size_t size)
+{
+	return mem_sys_realloc(memblock, size);
+}
+
+
+/*
+** mem_free_executable() 
+*/
+
+void
+mem_free_executable(void *addr)
+{
+	mem_sys_free(addr);
+}
+
 
 /*
  * signal handling
Index: platform_interface.h
===================================================================
RCS file: /cvs/public/parrot/config/gen/platform/platform_interface.h,v
retrieving revision 1.9
diff -b -u -r1.9 platform_interface.h
--- platform_interface.h	15 Aug 2003 11:56:22 -0000	1.9
+++ platform_interface.h	28 Dec 2003 22:30:56 -0000
@@ -16,6 +16,9 @@
 void *Parrot_memalign(size_t align, size_t size);
 void *Parrot_memalign_if_possible(size_t align, size_t size);
 void Parrot_free_memalign(void *);
+void *mem_alloc_executable(size_t);
+void *mem_realloc_executable(void *, size_t);
+void mem_free_executable(void *);
 
 #if !defined(PARROT_HAS_MEMALIGN) && !defined(PARROT_HAS_POSIX_MEMALIGN)
 #  define Parrot_memalign_if_possible(a, s) malloc(a)
Index: win32.c
===================================================================
RCS file: /cvs/public/parrot/config/gen/platform/win32.c,v
retrieving revision 1.9
diff -b -u -r1.9 win32.c
--- win32.c	25 Nov 2003 16:23:06 -0000	1.9
+++ win32.c	28 Dec 2003 22:30:56 -0000
@@ -7,6 +7,12 @@
 #include <windows.h>
+#include <winbase.h>
 #include "parrot/parrot.h"
 
+
+/* for PANIC */
+#define interpreter NULL
+
+
 /*
 ** Parrot_intval_time()
 */
@@ -66,6 +71,10 @@
 }
 
 
+/*
+** Parrot_getenv()
+*/
+
 char *
 Parrot_getenv(const char *name, int *free_it)
 {
@@ -82,11 +91,19 @@
 
     return buffer;
 }
+
+
+/*
+** Parrot_unsetenv()
+*/
+
 void
 Parrot_unsetenv(const char *name)
 {
     SetEnvironmentVariable(name, NULL);
 }
+
+
 /*
 ** Parrot_dlopen()
 */
@@ -130,6 +147,68 @@
     return FreeLibrary(handle)? 0: 1;
 }
 
+
+/*
+** mem_alloc_executable() 
+*/
+
+void *
+mem_alloc_executable(size_t size)
+{
+	void *ptr = VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
+	if (!ptr)
+		PANIC("Out of mem");
+	return ptr;
+}
+
+
+/*
+** mem_realloc_executable()
+*/
+
+void *
+mem_realloc_executable(void* memblock, size_t size)
+{
+	MEMORY_BASIC_INFORMATION memInfo;
+	void *newBlock;
+	
+	/* Get size of current memory allocation. */
+	if (!(VirtualQuery(memblock, &memInfo, sizeof(MEMORY_BASIC_INFORMATION))))
+		PANIC("VirtualQuery failed");
+
+	/* Allocate new block of memory. */
+	newBlock = mem_alloc_executable(size);
+	if (!newBlock)
+		PANIC("Out of mem");
+	
+	/* Copy older block's data to new block's data, taking into account size of data. */
+	if (memInfo.RegionSize <= size)
+	{
+		CopyMemory(newBlock, memblock, memInfo.RegionSize);
+	}
+	else
+	{
+		CopyMemory(newBlock, memblock, size);
+	}
+	
+	/* Free older block and return pointer to the new one. */
+	mem_free_executable(memblock);
+	return newBlock;
+}
+
+
+/*
+** mem_free_executable() 
+*/
+
+void
+mem_free_executable(void *addr)
+{
+	/* We need to decommit, then release the pages. */
+	VirtualFree(addr, 1, MEM_DECOMMIT);
+	VirtualFree(addr, 0, MEM_RELEASE);
+}
+
 /*
  * Local variables:
  * c-indentation-style: bsd
