diff options
Diffstat (limited to 'contrib/perl5/makedef.pl')
-rw-r--r-- | contrib/perl5/makedef.pl | 895 |
1 files changed, 0 insertions, 895 deletions
diff --git a/contrib/perl5/makedef.pl b/contrib/perl5/makedef.pl deleted file mode 100644 index e983967..0000000 --- a/contrib/perl5/makedef.pl +++ /dev/null @@ -1,895 +0,0 @@ -# -# Create the export list for perl. -# -# Needed by WIN32 and OS/2 for creating perl.dll -# and by AIX for creating libperl.a when -Dusershrplib is in effect. -# -# reads global.sym, pp.sym, perlvars.h, intrpvar.h, thrdvar.h, config.h -# On OS/2 reads miniperl.map as well - -my $PLATFORM; -my $CCTYPE; - -my %bincompat5005 = - ( - Perl_call_atexit => "perl_atexit", - Perl_eval_sv => "perl_eval_sv", - Perl_eval_pv => "perl_eval_pv", - Perl_call_argv => "perl_call_argv", - Perl_call_method => "perl_call_method", - Perl_call_pv => "perl_call_pv", - Perl_call_sv => "perl_call_sv", - Perl_get_av => "perl_get_av", - Perl_get_cv => "perl_get_cv", - Perl_get_hv => "perl_get_hv", - Perl_get_sv => "perl_get_sv", - Perl_init_i18nl10n => "perl_init_i18nl10n", - Perl_init_i18nl14n => "perl_init_i18nl14n", - Perl_new_collate => "perl_new_collate", - Perl_new_ctype => "perl_new_ctype", - Perl_new_numeric => "perl_new_numeric", - Perl_require_pv => "perl_require_pv", - Perl_safesyscalloc => "Perl_safecalloc", - Perl_safesysfree => "Perl_safefree", - Perl_safesysmalloc => "Perl_safemalloc", - Perl_safesysrealloc => "Perl_saferealloc", - Perl_set_numeric_local => "perl_set_numeric_local", - Perl_set_numeric_standard => "perl_set_numeric_standard", - Perl_malloc => "malloc", - Perl_mfree => "free", - Perl_realloc => "realloc", - Perl_calloc => "calloc", - ); - -my $bincompat5005 = join("|", keys %bincompat5005); - -while (@ARGV) { - my $flag = shift; - $define{$1} = 1 if ($flag =~ /^-D(\w+)$/); - $define{$1} = $2 if ($flag =~ /^-D(\w+)=(.+)$/); - $CCTYPE = $1 if ($flag =~ /^CCTYPE=(\w+)$/); - $PLATFORM = $1 if ($flag =~ /^PLATFORM=(\w+)$/); -} - -my @PLATFORM = qw(aix win32 os2 MacOS); -my %PLATFORM; -@PLATFORM{@PLATFORM} = (); - -defined $PLATFORM || die "PLATFORM undefined, must be one of: @PLATFORM\n"; -exists $PLATFORM{$PLATFORM} || die "PLATFORM must be one of: @PLATFORM\n"; - -my $config_sh = "config.sh"; -my $config_h = "config.h"; -my $thrdvar_h = "thrdvar.h"; -my $intrpvar_h = "intrpvar.h"; -my $perlvars_h = "perlvars.h"; -my $global_sym = "global.sym"; -my $pp_sym = "pp.sym"; -my $globvar_sym = "globvar.sym"; -my $perlio_sym = "perlio.sym"; - -if ($PLATFORM eq 'aix') { - # Nothing for now. -} -elsif ($PLATFORM eq 'win32') { - $CCTYPE = "MSVC" unless defined $CCTYPE; - foreach ($thrdvar_h, $intrpvar_h, $perlvars_h, $global_sym, $pp_sym, $globvar_sym) { - s!^!..\\!; - } -} -elsif ($PLATFORM eq 'MacOS') { - foreach ($thrdvar_h, $intrpvar_h, $perlvars_h, $global_sym, - $pp_sym, $globvar_sym, $perlio_sym) { - s!^!::!; - } -} - -unless ($PLATFORM eq 'win32' || $PLATFORM eq 'MacOS') { - open(CFG,$config_sh) || die "Cannot open $config_sh: $!\n"; - while (<CFG>) { - if (/^(?:ccflags|optimize)='(.+)'$/) { - $_ = $1; - $define{$1} = 1 while /-D(\w+)/g; - } - if ($PLATFORM eq 'os2') { - $CONFIG_ARGS = $1 if /^(?:config_args)='(.+)'$/; - $ARCHNAME = $1 if /^(?:archname)='(.+)'$/; - } - } - close(CFG); -} - -open(CFG,$config_h) || die "Cannot open $config_h: $!\n"; -while (<CFG>) { - $define{$1} = 1 if /^\s*#\s*define\s+(MYMALLOC)\b/; - $define{$1} = 1 if /^\s*#\s*define\s+(USE_5005THREADS)\b/; - $define{$1} = 1 if /^\s*#\s*define\s+(USE_ITHREADS)\b/; - $define{$1} = 1 if /^\s*#\s*define\s+(USE_PERLIO)\b/; - $define{$1} = 1 if /^\s*#\s*define\s+(USE_SFIO)\b/; - $define{$1} = 1 if /^\s*#\s*define\s+(MULTIPLICITY)\b/; - $define{$1} = 1 if /^\s*#\s*define\s+(PERL_IMPLICIT_SYS)\b/; - $define{$1} = 1 if /^\s*#\s*define\s+(PERL_BINCOMPAT_5005)\b/; -} -close(CFG); - -# perl.h logic duplication begins - -if ($define{USE_ITHREADS}) { - if (!$define{MULTIPLICITY} && !$define{PERL_OBJECT}) { - $define{MULTIPLICITY} = 1; - } -} - -$define{PERL_IMPLICIT_CONTEXT} ||= - $define{USE_ITHREADS} || - $define{USE_5005THREADS} || - $define{MULTIPLICITY} ; - -if ($define{PERL_CAPI}) { - delete $define{PERL_OBJECT}; - $define{MULTIPLICITY} = 1; - $define{PERL_IMPLICIT_CONTEXT} = 1; - $define{PERL_IMPLICIT_SYS} = 1; -} - -if ($define{PERL_OBJECT}) { - $define{PERL_IMPLICIT_CONTEXT} = 1; - $define{PERL_IMPLICIT_SYS} = 1; -} - -# perl.h logic duplication ends - -if ($PLATFORM eq 'win32') { - warn join(' ',keys %define)."\n"; - print "LIBRARY Perl56\n"; - print "DESCRIPTION 'Perl interpreter'\n"; - print "EXPORTS\n"; - if ($define{PERL_IMPLICIT_SYS}) { - output_symbol("perl_get_host_info"); - output_symbol("perl_alloc_override"); - } -} -elsif ($PLATFORM eq 'os2') { - ($v = $]) =~ s/(\d\.\d\d\d)(\d\d)$/$1_$2/; - $v .= '-thread' if $ARCHNAME =~ /-thread/; - #$sum = 0; - #for (split //, $v) { - # $sum = ($sum * 33) + ord; - # $sum &= 0xffffff; - #} - #$sum += $sum >> 5; - #$sum &= 0xffff; - #$sum = printf '%X', $sum; - ($dll = $define{PERL_DLL}) =~ s/\.dll$//i; - # print STDERR "'$dll' <= '$define{PERL_DLL}'\n"; - print <<"---EOP---"; -LIBRARY '$dll' INITINSTANCE TERMINSTANCE -DESCRIPTION '\@#perl5-porters\@perl.org:$v#\@ Perl interpreter' -STACKSIZE 32768 -CODE LOADONCALL -DATA LOADONCALL NONSHARED MULTIPLE -EXPORTS ----EOP--- -} -elsif ($PLATFORM eq 'aix') { - print "#!\n"; -} - -my %skip; -my %export; - -sub skip_symbols { - my $list = shift; - foreach my $symbol (@$list) { - $skip{$symbol} = 1; - } -} - -sub emit_symbols { - my $list = shift; - foreach my $symbol (@$list) { - my $skipsym = $symbol; - # XXX hack - if ($define{PERL_OBJECT} || $define{MULTIPLICITY}) { - $skipsym =~ s/^Perl_[GIT](\w+)_ptr$/PL_$1/; - } - emit_symbol($symbol) unless exists $skip{$skipsym}; - } -} - -if ($PLATFORM eq 'win32') { - skip_symbols [qw( - PL_statusvalue_vms - PL_archpat_auto - PL_cryptseen - PL_DBcv - PL_generation - PL_lastgotoprobe - PL_linestart - PL_modcount - PL_pending_ident - PL_sortcxix - PL_sublex_info - PL_timesbuf - main - Perl_ErrorNo - Perl_GetVars - Perl_do_exec3 - Perl_do_ipcctl - Perl_do_ipcget - Perl_do_msgrcv - Perl_do_msgsnd - Perl_do_semop - Perl_do_shmio - Perl_dump_fds - Perl_init_thread_intern - Perl_my_bzero - Perl_my_htonl - Perl_my_ntohl - Perl_my_swap - Perl_my_chsize - Perl_same_dirent - Perl_setenv_getix - Perl_unlnk - Perl_watch - Perl_safexcalloc - Perl_safexmalloc - Perl_safexfree - Perl_safexrealloc - Perl_my_memcmp - Perl_my_memset - PL_cshlen - PL_cshname - PL_opsave - Perl_do_exec - Perl_getenv_len - Perl_my_pclose - Perl_my_popen - )]; -} -elsif ($PLATFORM eq 'aix') { - skip_symbols([qw( - Perl_dump_fds - Perl_ErrorNo - Perl_GetVars - Perl_my_bcopy - Perl_my_bzero - Perl_my_chsize - Perl_my_htonl - Perl_my_memcmp - Perl_my_memset - Perl_my_ntohl - Perl_my_swap - Perl_safexcalloc - Perl_safexfree - Perl_safexmalloc - Perl_safexrealloc - Perl_same_dirent - Perl_unlnk - Perl_sys_intern_clear - Perl_sys_intern_dup - Perl_sys_intern_init - PL_cryptseen - PL_opsave - PL_statusvalue_vms - PL_sys_intern - )]); -} -elsif ($PLATFORM eq 'os2') { - emit_symbols([qw( - ctermid - get_sysinfo - Perl_OS2_init - OS2_Perl_data - dlopen - dlsym - dlerror - dlclose - my_tmpfile - my_tmpnam - my_flock - my_rmdir - my_mkdir - malloc_mutex - threads_mutex - nthreads - nthreads_cond - os2_cond_wait - os2_stat - pthread_join - pthread_create - pthread_detach - XS_Cwd_change_drive - XS_Cwd_current_drive - XS_Cwd_extLibpath - XS_Cwd_extLibpath_set - XS_Cwd_sys_abspath - XS_Cwd_sys_chdir - XS_Cwd_sys_cwd - XS_Cwd_sys_is_absolute - XS_Cwd_sys_is_relative - XS_Cwd_sys_is_rooted - XS_DynaLoader_mod2fname - XS_File__Copy_syscopy - Perl_Register_MQ - Perl_Deregister_MQ - Perl_Serve_Messages - Perl_Process_Messages - init_PMWIN_entries - PMWIN_entries - Perl_hab_GET - )]); -} -elsif ($PLATFORM eq 'MacOS') { - skip_symbols [qw( - Perl_GetVars - PL_cryptseen - PL_cshlen - PL_cshname - PL_statusvalue_vms - PL_sys_intern - PL_opsave - PL_timesbuf - Perl_dump_fds - Perl_my_bcopy - Perl_my_bzero - Perl_my_chsize - Perl_my_htonl - Perl_my_memcmp - Perl_my_memset - Perl_my_ntohl - Perl_my_swap - Perl_safexcalloc - Perl_safexfree - Perl_safexmalloc - Perl_safexrealloc - Perl_unlnk - Perl_sys_intern_clear - Perl_sys_intern_init - )]; -} - - -unless ($define{'DEBUGGING'}) { - skip_symbols [qw( - Perl_deb_growlevel - Perl_debop - Perl_debprofdump - Perl_debstack - Perl_debstackptrs - Perl_runops_debug - Perl_sv_peek - PL_block_type - PL_watchaddr - PL_watchok - )]; -} - -if ($define{'PERL_IMPLICIT_SYS'}) { - skip_symbols [qw( - Perl_getenv_len - Perl_my_popen - Perl_my_pclose - )]; -} -else { - skip_symbols [qw( - PL_Mem - PL_MemShared - PL_MemParse - PL_Env - PL_StdIO - PL_LIO - PL_Dir - PL_Sock - PL_Proc - )]; -} - -unless ($define{'PERL_FLEXIBLE_EXCEPTIONS'}) { - skip_symbols [qw( - PL_protect - Perl_default_protect - Perl_vdefault_protect - )]; -} - -if ($define{'MYMALLOC'}) { - emit_symbols [qw( - Perl_dump_mstats - Perl_get_mstats - Perl_malloc - Perl_mfree - Perl_realloc - Perl_calloc - Perl_strdup - Perl_putenv - )]; - if ($define{'USE_5005THREADS'} || $define{'USE_ITHREADS'}) { - emit_symbols [qw( - PL_malloc_mutex - )]; - } - else { - skip_symbols [qw( - PL_malloc_mutex - )]; - } -} -else { - skip_symbols [qw( - PL_malloc_mutex - Perl_dump_mstats - Perl_get_mstats - Perl_malloc - Perl_mfree - Perl_realloc - Perl_calloc - Perl_malloced_size - )]; -} - -unless ($define{'USE_5005THREADS'} || $define{'USE_ITHREADS'}) { - skip_symbols [qw( - PL_thr_key - )]; -} - -unless ($define{'USE_5005THREADS'}) { - skip_symbols [qw( - PL_sv_mutex - PL_strtab_mutex - PL_svref_mutex - PL_cred_mutex - PL_eval_mutex - PL_fdpid_mutex - PL_sv_lock_mutex - PL_eval_cond - PL_eval_owner - PL_threads_mutex - PL_nthreads - PL_nthreads_cond - PL_threadnum - PL_threadsv_names - PL_thrsv - PL_vtbl_mutex - Perl_condpair_magic - Perl_new_struct_thread - Perl_per_thread_magicals - Perl_thread_create - Perl_find_threadsv - Perl_unlock_condpair - Perl_magic_mutexfree - Perl_sv_lock - )]; -} - -unless ($define{'USE_ITHREADS'}) { - skip_symbols [qw( - PL_ptr_table - PL_op_mutex - Perl_dirp_dup - Perl_cx_dup - Perl_si_dup - Perl_any_dup - Perl_ss_dup - Perl_fp_dup - Perl_gp_dup - Perl_he_dup - Perl_mg_dup - Perl_re_dup - Perl_sv_dup - Perl_sys_intern_dup - Perl_ptr_table_fetch - Perl_ptr_table_new - Perl_ptr_table_split - Perl_ptr_table_store - Perl_ptr_table_clear - Perl_ptr_table_free - perl_clone - perl_clone_using - )]; -} - -unless ($define{'PERL_IMPLICIT_CONTEXT'}) { - skip_symbols [qw( - Perl_croak_nocontext - Perl_die_nocontext - Perl_deb_nocontext - Perl_form_nocontext - Perl_load_module_nocontext - Perl_mess_nocontext - Perl_warn_nocontext - Perl_warner_nocontext - Perl_newSVpvf_nocontext - Perl_sv_catpvf_nocontext - Perl_sv_setpvf_nocontext - Perl_sv_catpvf_mg_nocontext - Perl_sv_setpvf_mg_nocontext - )]; -} - -unless ($define{'PERL_IMPLICIT_SYS'}) { - skip_symbols [qw( - perl_alloc_using - perl_clone_using - )]; -} - -unless ($define{'FAKE_THREADS'}) { - skip_symbols [qw(PL_curthr)]; -} - -sub readvar { - my $file = shift; - my $proc = shift || sub { "PL_$_[2]" }; - open(VARS,$file) || die "Cannot open $file: $!\n"; - my @syms; - while (<VARS>) { - # All symbols have a Perl_ prefix because that's what embed.h - # sticks in front of them. - push(@syms, &$proc($1,$2,$3)) if (/\bPERLVAR(A?I?C?)\(([IGT])(\w+)/); - } - close(VARS); - return \@syms; -} - -if ($define{'USE_5005THREADS'}) { - my $thrd = readvar($thrdvar_h); - skip_symbols $thrd; -} - -if ($define{'PERL_GLOBAL_STRUCT'}) { - my $global = readvar($perlvars_h); - skip_symbols $global; - emit_symbol('Perl_GetVars'); - emit_symbols [qw(PL_Vars PL_VarsPtr)] unless $CCTYPE eq 'GCC'; -} - -# functions from *.sym files - -my @syms = ($global_sym, $globvar_sym); # $pp_sym is not part of the API - -if ($define{'USE_PERLIO'}) { - push @syms, $perlio_sym; - if ($define{'USE_SFIO'}) { - # SFIO defines most of the PerlIO routines as macros - skip_symbols [qw( - PerlIO_canset_cnt - PerlIO_clearerr - PerlIO_close - PerlIO_eof - PerlIO_error - PerlIO_exportFILE - PerlIO_fast_gets - PerlIO_fdopen - PerlIO_fileno - PerlIO_findFILE - PerlIO_flush - PerlIO_get_base - PerlIO_get_bufsiz - PerlIO_get_cnt - PerlIO_get_ptr - PerlIO_getc - PerlIO_getname - PerlIO_has_base - PerlIO_has_cntptr - PerlIO_importFILE - PerlIO_open - PerlIO_printf - PerlIO_putc - PerlIO_puts - PerlIO_read - PerlIO_releaseFILE - PerlIO_reopen - PerlIO_rewind - PerlIO_seek - PerlIO_set_cnt - PerlIO_set_ptrcnt - PerlIO_setlinebuf - PerlIO_sprintf - PerlIO_stderr - PerlIO_stdin - PerlIO_stdout - PerlIO_stdoutf - PerlIO_tell - PerlIO_ungetc - PerlIO_vprintf - PerlIO_write - )]; - } -} - -for my $syms (@syms) { - open (GLOBAL, "<$syms") || die "failed to open $syms: $!\n"; - while (<GLOBAL>) { - next if (!/^[A-Za-z]/); - # Functions have a Perl_ prefix - # Variables have a PL_ prefix - chomp($_); - my $symbol = ($syms =~ /var\.sym$/i ? "PL_" : ""); - $symbol .= $_; - emit_symbol($symbol) unless exists $skip{$symbol}; - } - close(GLOBAL); -} - -# variables - -if ($define{'PERL_OBJECT'} || $define{'MULTIPLICITY'}) { - for my $f ($perlvars_h, $intrpvar_h, $thrdvar_h) { - my $glob = readvar($f, sub { "Perl_" . $_[1] . $_[2] . "_ptr" }); - emit_symbols $glob; - } - # XXX AIX seems to want the perlvars.h symbols, for some reason - if ($PLATFORM eq 'aix') { - my $glob = readvar($perlvars_h); - emit_symbols $glob; - } -} -else { - unless ($define{'PERL_GLOBAL_STRUCT'}) { - my $glob = readvar($perlvars_h); - emit_symbols $glob; - } - unless ($define{'MULTIPLICITY'}) { - my $glob = readvar($intrpvar_h); - emit_symbols $glob; - } - unless ($define{'MULTIPLICITY'} || $define{'USE_5005THREADS'}) { - my $glob = readvar($thrdvar_h); - emit_symbols $glob; - } -} - -sub try_symbol { - my $symbol = shift; - - return if $symbol !~ /^[A-Za-z]/; - return if $symbol =~ /^\#/; - $symbol =~s/\r//g; - chomp($symbol); - return if exists $skip{$symbol}; - emit_symbol($symbol); -} - -while (<DATA>) { - try_symbol($_); -} - -if ($PLATFORM eq 'win32') { - foreach my $symbol (qw( - boot_DynaLoader - Perl_init_os_extras - Perl_thread_create - Perl_win32_init - RunPerl - win32_errno - win32_environ - win32_stdin - win32_stdout - win32_stderr - win32_ferror - win32_feof - win32_strerror - win32_fprintf - win32_printf - win32_vfprintf - win32_vprintf - win32_fread - win32_fwrite - win32_fopen - win32_fdopen - win32_freopen - win32_fclose - win32_fputs - win32_fputc - win32_ungetc - win32_getc - win32_fileno - win32_clearerr - win32_fflush - win32_ftell - win32_fseek - win32_fgetpos - win32_fsetpos - win32_rewind - win32_tmpfile - win32_abort - win32_fstat - win32_stat - win32_pipe - win32_popen - win32_pclose - win32_rename - win32_setmode - win32_lseek - win32_tell - win32_dup - win32_dup2 - win32_open - win32_close - win32_eof - win32_read - win32_write - win32_spawnvp - win32_mkdir - win32_rmdir - win32_chdir - win32_flock - win32_execv - win32_execvp - win32_htons - win32_ntohs - win32_htonl - win32_ntohl - win32_inet_addr - win32_inet_ntoa - win32_socket - win32_bind - win32_listen - win32_accept - win32_connect - win32_send - win32_sendto - win32_recv - win32_recvfrom - win32_shutdown - win32_closesocket - win32_ioctlsocket - win32_setsockopt - win32_getsockopt - win32_getpeername - win32_getsockname - win32_gethostname - win32_gethostbyname - win32_gethostbyaddr - win32_getprotobyname - win32_getprotobynumber - win32_getservbyname - win32_getservbyport - win32_select - win32_endhostent - win32_endnetent - win32_endprotoent - win32_endservent - win32_getnetent - win32_getnetbyname - win32_getnetbyaddr - win32_getprotoent - win32_getservent - win32_sethostent - win32_setnetent - win32_setprotoent - win32_setservent - win32_getenv - win32_putenv - win32_perror - win32_setbuf - win32_setvbuf - win32_flushall - win32_fcloseall - win32_fgets - win32_gets - win32_fgetc - win32_putc - win32_puts - win32_getchar - win32_putchar - win32_malloc - win32_calloc - win32_realloc - win32_free - win32_sleep - win32_times - win32_access - win32_alarm - win32_chmod - win32_open_osfhandle - win32_get_osfhandle - win32_ioctl - win32_link - win32_unlink - win32_utime - win32_uname - win32_wait - win32_waitpid - win32_kill - win32_str_os_error - win32_opendir - win32_readdir - win32_telldir - win32_seekdir - win32_rewinddir - win32_closedir - win32_longpath - win32_os_id - win32_getpid - win32_crypt - win32_dynaload - )) - { - try_symbol($symbol); - } -} -elsif ($PLATFORM eq 'os2') { - open MAP, 'miniperl.map' or die 'Cannot read miniperl.map'; - /^\s*[\da-f:]+\s+(\w+)/i and $mapped{$1}++ foreach <MAP>; - close MAP or die 'Cannot close miniperl.map'; - - @missing = grep { !exists $mapped{$_} and !exists $bincompat5005{$_} } - keys %export; - delete $export{$_} foreach @missing; -} -elsif ($PLATFORM eq 'MacOS') { - open MACSYMS, 'macperl.sym' or die 'Cannot read macperl.sym'; - - while (<MACSYMS>) { - try_symbol($_); - } - - close MACSYMS; -} - -# Now all symbols should be defined because -# next we are going to output them. - -foreach my $symbol (sort keys %export) { - output_symbol($symbol); -} - -sub emit_symbol { - my $symbol = shift; - chomp($symbol); - $export{$symbol} = 1; -} - -sub output_symbol { - my $symbol = shift; - $symbol = $bincompat5005{$symbol} - if $define{PERL_BINCOMPAT_5005} and $symbol =~ /^($bincompat5005)$/; - if ($PLATFORM eq 'win32') { - $symbol = "_$symbol" if $CCTYPE eq 'BORLAND'; - print "\t$symbol\n"; -# XXX: binary compatibility between compilers is an exercise -# in frustration :-( -# if ($CCTYPE eq "BORLAND") { -# # workaround Borland quirk by exporting both the straight -# # name and a name with leading underscore. Note the -# # alias *must* come after the symbol itself, if both -# # are to be exported. (Linker bug?) -# print "\t_$symbol\n"; -# print "\t$symbol = _$symbol\n"; -# } -# elsif ($CCTYPE eq 'GCC') { -# # Symbols have leading _ whole process is $%@"% slow -# # so skip aliases for now -# nprint "\t$symbol\n"; -# } -# else { -# # for binary coexistence, export both the symbol and -# # alias with leading underscore -# print "\t$symbol\n"; -# print "\t_$symbol = $symbol\n"; -# } - } - elsif ($PLATFORM eq 'os2') { - print qq( "$symbol"\n); - } - elsif ($PLATFORM eq 'aix' || $PLATFORM eq 'MacOS') { - print "$symbol\n"; - } -} - -1; -__DATA__ -# extra globals not included above. -perl_alloc -perl_alloc_using -perl_clone -perl_clone_using -perl_construct -perl_destruct -perl_free -perl_parse -perl_run |