Index: config/gen/platform/generic/exec.c =================================================================== --- config/gen/platform/generic/exec.c (revision 40322) +++ config/gen/platform/generic/exec.c (working copy) @@ -55,11 +55,11 @@ } else { /* child */ - char *cmd = Parrot_str_to_cstring(interp, command); - int status = execlp("sh", "sh", "-c", cmd, (void *)NULL); + char * const cmd = Parrot_str_to_cstring(interp, command); + int status = execlp("sh", "sh", "-c", cmd, (void *)NULL); /* if we get here, something's horribly wrong, but free anyway... */ - mem_sys_free(cmd); + Parrot_str_free_cstring(cmd); if (status) exit(status); @@ -97,8 +97,7 @@ if (child) { /* parent */ int status; - pid_t returnstat; - returnstat = waitpid(child, &status, 0); + pid_t returnstat = waitpid(child, &status, 0); UNUSED(returnstat); return status; } @@ -106,17 +105,16 @@ /* child. Be horribly profligate with memory, since we're about to be something else */ int status, i; - char **argv; STRING *s; - char *cmd; + char *cmd; + char **argv = (char **)mem_sys_allocate((len+1)*sizeof (char *)); - argv = (char **)mem_sys_allocate((len+1)*sizeof (char *)); for (i = 0; i < len; ++i) { s = VTABLE_get_string_keyed_int(interp, cmdargs, i); argv[i] = Parrot_str_to_cstring(interp, s); } + cmd = argv[0]; - argv[i] = NULL; status = execvp(cmd, argv); /* if we get here, something's horribly wrong... */ @@ -140,8 +138,8 @@ { /* Be horribly profligate with memory, since we're about to be something else */ - char *cmd = Parrot_str_to_cstring(interp, command); - int status = execlp("sh", "sh", "-c", cmd, (void *)NULL); + char * const cmd = Parrot_str_to_cstring(interp, command); + int status = execlp("sh", "sh", "-c", cmd, (void *)NULL); /* if we get here, something's horribly wrong... */ if (status) Index: config/gen/platform/win32/exec.c =================================================================== --- config/gen/platform/win32/exec.c (revision 40322) +++ config/gen/platform/win32/exec.c (working copy) @@ -41,10 +41,10 @@ DWORD status = 0; STARTUPINFO si; PROCESS_INFORMATION pi; - int free_it = 0; - char* cmd = (char *)mem_sys_allocate(command->strlen + 4); - char* shell = Parrot_getenv("ComSpec", &free_it); - char* cmdin = Parrot_str_to_cstring(interp, command); + int free_it = 0; + char* cmd = (char *)mem_sys_allocate(command->strlen + 4); + char* shell = Parrot_getenv("ComSpec", &free_it); + char* const cmdin = Parrot_str_to_cstring(interp, command); strcpy(cmd, "/c "); strcat(cmd, cmdin); @@ -95,11 +95,10 @@ DWORD status = 0; STARTUPINFO si; PROCESS_INFORMATION pi; - int pmclen; + int pmclen, i; int cmdlinelen = 1000; int cmdlinepos = 0; - char *cmdline = (char *)mem_sys_allocate(cmdlinelen); - int i; + char *cmdline = (char *)mem_sys_allocate(cmdlinelen); /* Ensure there's something in the PMC array. */ pmclen = VTABLE_elements(interp, cmdargs); @@ -109,8 +108,8 @@ /* Now build command line. */ for (i = 0; i < pmclen; i++) { - STRING *s = VTABLE_get_string_keyed_int(interp, cmdargs, i); - char *cs = Parrot_str_to_cstring(interp, s); + STRING * s = VTABLE_get_string_keyed_int(interp, cmdargs, i); + char * const cs = Parrot_str_to_cstring(interp, s); if (cmdlinepos + (int)s->strlen + 3 > cmdlinelen) { cmdlinelen += s->strlen + 4; cmdline = (char *)mem_sys_realloc(cmdline, cmdlinelen); @@ -119,6 +118,7 @@ strcpy(cmdline + cmdlinepos + 1, cs); strcpy(cmdline + cmdlinepos + 1 + s->strlen, "\" "); cmdlinepos += s->strlen + 3; + Parrot_str_free_cstring(cs); } /* Start the child process. */ @@ -162,8 +162,8 @@ Parrot_Exec_OS_Command(PARROT_INTERP, STRING *command) { int status; - char *in = Parrot_str_to_cstring(interp, command); - char *cmd = NULL; + char * const in = Parrot_str_to_cstring(interp, command); + char * cmd = NULL; const char **argv = (const char **)mem_sys_allocate_zeroed(2 * sizeof (int)); /* Grab string, extract command and parameters. */ @@ -223,6 +223,8 @@ curPos ++; } + Parrot_str_free_cstring(in); + /* If we still have a seek char, then the input was improper. */ if (seekChar) Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_NOSPAWN, Index: src/debug.c =================================================================== --- src/debug.c (revision 40322) +++ src/debug.c (working copy) @@ -1256,7 +1256,7 @@ tmp_stdin, readline, "S->S", prompt, & s); { - char * aux = Parrot_str_to_cstring(interpdeb, s); + char * const aux = Parrot_str_to_cstring(interpdeb, s); strcpy(c, aux); Parrot_str_free_cstring(aux); } Index: src/dynext.c =================================================================== --- src/dynext.c (revision 40322) +++ src/dynext.c (working copy) @@ -232,8 +232,8 @@ { ASSERT_ARGS(dlopen_string) - char *pathstr = Parrot_str_to_cstring(interp, path); - void *handle = Parrot_dlopen(pathstr); + char * const pathstr = Parrot_str_to_cstring(interp, path); + void * handle = Parrot_dlopen(pathstr); Parrot_str_free_cstring(pathstr); return handle; } Index: src/interp/inter_misc.c =================================================================== --- src/interp/inter_misc.c (revision 40322) +++ src/interp/inter_misc.c (working copy) @@ -346,9 +346,9 @@ else { /* Need to strip back to what follows the final / or \. */ - STRING *fullname = VTABLE_get_string(interp, exe_name); - char *fullname_c = Parrot_str_to_cstring(interp, fullname); - int pos = strlen(fullname_c) - 1; + STRING * fullname = VTABLE_get_string(interp, exe_name); + char * const fullname_c = Parrot_str_to_cstring(interp, fullname); + int pos = strlen(fullname_c) - 1; while (pos > 0 && fullname_c[pos] != '/' @@ -359,7 +359,7 @@ pos++; basename = Parrot_str_new(interp, fullname_c + pos, 0); - mem_sys_free(fullname_c); + Parrot_str_free_cstring(fullname_c); return basename; } Index: src/io/socket_unix.c =================================================================== --- src/io/socket_unix.c (revision 40322) +++ src/io/socket_unix.c (working copy) @@ -105,7 +105,7 @@ PMC * const sockaddr = pmc_new(interp, enum_class_Sockaddr); get_sockaddr_in(interp, sockaddr, s, port); - free(s); + Parrot_str_free_cstring(s); return sockaddr; } Index: src/io/socket_win32.c =================================================================== --- src/io/socket_win32.c (revision 40322) +++ src/io/socket_win32.c (working copy) @@ -444,12 +444,11 @@ { ASSERT_ARGS(Parrot_io_sockaddr_in) PMC * sockaddr; - char * s; + char * const s = Parrot_str_to_cstring(interp, addr); - s = Parrot_str_to_cstring(interp, addr); sockaddr = pmc_new(interp, enum_class_Sockaddr); get_sockaddr_in(interp, sockaddr, s, port); - free(s); + Parrot_str_free_cstring(s); return sockaddr; } Index: src/io/unix.c =================================================================== --- src/io/unix.c (revision 40322) +++ src/io/unix.c (working copy) @@ -756,7 +756,7 @@ } # else - UNUSED(l); + UNUSED(filehandle); UNUSED(command); UNUSED(flags); Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_UNIMPLEMENTED, Index: src/io/win32.c =================================================================== --- src/io/win32.c (revision 40322) +++ src/io/win32.c (working copy) @@ -693,8 +693,7 @@ NULL, NULL, TRUE, 0, NULL, NULL, &start, &procinfo) == 0) goto fail; - Parrot_str_free_cstring(cmd); - cmd = NULL; + if (f_read) { Parrot_io_set_os_handle(interp, io, hread); CloseHandle(hwrite); @@ -703,6 +702,8 @@ Parrot_io_set_os_handle(interp, io, hwrite); CloseHandle(hread); } + + Parrot_str_free_cstring(cmd); CloseHandle(procinfo.hThread); VTABLE_set_integer_keyed_int(interp, io, 0, (INTVAL)procinfo.hProcess); return io; Index: src/pmc/codestring.pmc =================================================================== --- src/pmc/codestring.pmc (revision 40322) +++ src/pmc/codestring.pmc (working copy) @@ -286,9 +286,9 @@ METHOD charname_to_ord(STRING *name) { #if PARROT_HAS_ICU - UChar32 codepoint; - UErrorCode err = U_ZERO_ERROR; - char *cstr = Parrot_str_to_cstring(INTERP, name); + UChar32 codepoint; + UErrorCode err = U_ZERO_ERROR; + char * const cstr = Parrot_str_to_cstring(INTERP, name); codepoint = u_charFromName(U_EXTENDED_CHAR_NAME, cstr, &err); Parrot_str_free_cstring(cstr); if (U_SUCCESS(err)) { Index: src/pmc/env.pmc =================================================================== --- src/pmc/env.pmc (revision 40322) +++ src/pmc/env.pmc (working copy) @@ -340,7 +340,7 @@ =head1 SEE ALS0 PDD - -L +L Environment in Perl 6 - L Index: src/pmc/os.pmc =================================================================== --- src/pmc/os.pmc (revision 40322) +++ src/pmc/os.pmc (working copy) @@ -476,11 +476,11 @@ */ METHOD readdir(STRING *path) { #ifndef _MSC_VER + char * const cpath = Parrot_str_to_cstring(interp, path); + DIR *dir = opendir(cpath); struct dirent *dirent; PMC *array; - char *cpath = Parrot_str_to_cstring(interp, path); STRING *retval; - DIR *dir = opendir(cpath); Parrot_str_free_cstring(cpath); Index: src/pmc/string.pmc =================================================================== --- src/pmc/string.pmc (revision 40322) +++ src/pmc/string.pmc (working copy) @@ -241,8 +241,8 @@ VTABLE void set_string_native(STRING *value) { /* Only allow constant PMCs to embed constant strings */ if (PObj_constant_TEST(SELF) && !PObj_constant_TEST(value)) { - char *copy = Parrot_str_to_cstring(INTERP, value); - value = Parrot_str_new_init(INTERP, copy, strlen(copy), + char * const copy = Parrot_str_to_cstring(INTERP, value); + value = Parrot_str_new_init(INTERP, copy, strlen(copy), PARROT_DEFAULT_ENCODING, PARROT_DEFAULT_CHARSET, PObj_constant_FLAG); Parrot_str_free_cstring(copy); }