From: Gurusamy Sarathy Date: Mon, 20 Apr 1998 20:51:50 +0000 (+0000) Subject: [asperl] add AS patch#16 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=3dfd1da1ac911ed5d5b4e3956b485ad9af14a10f;p=p5sagit%2Fp5-mst-13.2.git [asperl] add AS patch#16 p4raw-id: //depot/asperl@892 --- diff --git a/globals.c b/globals.c index 53750a6..e3ca27e 100644 --- a/globals.c +++ b/globals.c @@ -1401,10 +1401,22 @@ fprintf(PerlIO *stream, const char *format, ...) return PerlIO_vprintf(stream, format, arglist); } +#undef PERLVAR +#define PERLVAR(x, y) +#undef PERLVARI +#define PERLVARI(x, y, z) x = z; +#undef PERLVARIC +#define PERLVARIC(x, y, z) x = z; + CPerlObj::CPerlObj(IPerlMem* ipM, IPerlEnv* ipE, IPerlStdIO* ipStd, IPerlLIO* ipLIO, IPerlDir* ipD, IPerlSock* ipS, IPerlProc* ipP) { memset(((char*)this)+sizeof(void*), 0, sizeof(CPerlObj)-sizeof(void*)); + +#include "thrdvar.h" +#include "intrpvar.h" +#include "perlvars.h" + piMem = ipM; piENV = ipE; piStdIO = ipStd; @@ -1432,50 +1444,6 @@ CPerlObj::ErrorNo(void) void CPerlObj::Init(void) { - curcop = &compiling; - cxstack_ix = -1; - cxstack_max = 128; - chopset = " \n-"; -#ifdef USE_THREADS - threadsv_names = THREADSV_NAMES; - tmps_ix = -1; - tmps_floor = -1; -#endif - maxo = MAXO; - sh_path = SH_PATH; - runops = FUNC_NAME_TO_PTR(RUNOPS_DEFAULT); -#ifdef CSH - cshname = CSH; -#endif - rsfp = Nullfp; - expect = XSTATE; -#ifdef USE_LOCALE_COLLATE - collation_standard = TRUE; - collxfrm_mult = 2; -#endif -#ifdef USE_LOCALE_NUMERIC - numeric_standard = TRUE; - numeric_local = TRUE; -#endif /* !USE_LOCALE_NUMERIC */ - -/* constants (these are not literals to facilitate pointer comparisons) */ - Yes = "1"; - No = ""; - hexdigit = "0123456789abcdef0123456789ABCDEFx"; - patleave = "\\.^$@dDwWsSbB+*?|()-nrtfeaxc0123456789[{]}"; - splitstr = " "; - perl_destruct_level = 0; - maxsysfd = MAXSYSFD; - statname = Nullsv; - maxscream = -1; - op_mask = NULL; - dlmax = 128; - curcopdb = NULL; - copline = NOLINE; - laststatval = -1; - laststype = OP_STAT; - generation = 100; - #ifdef WIN32 New(2904, environ, 1, char*); *environ = NULL; diff --git a/ipdir.h b/ipdir.h index d5c2c2f..f0dadc4 100644 --- a/ipdir.h +++ b/ipdir.h @@ -5,6 +5,40 @@ */ + +/* + PerlXXX_YYY explained - DickH and DougL @ ActiveState.com + +XXX := functional group +YYY := stdlib/OS function name + +Continuing with the theme of PerlIO, all OS functionality was +encapsulated into one of several interfaces. + +PerlIO - stdio +PerlLIO - low level I/O +PerlMem - malloc, realloc, free +PerlDir - directory related +PerlEnv - process environment handling +PerlProc - process control +PerlSock - socket functions + + +The features of this are: +1. All OS dependant code is in the Perl Host and not the Perl Core. + (At least this is the holy grail goal of this work) +2. The Perl Host (see perl.h for description) can provide a new and + improved interface to OS functionality if required. +3. Developers can easily hook into the OS calls for instrumentation + or diagnostic purposes. + +What was changed to do this: +1. All calls to OS functions were replaced with PerlXXX_YYY + +*/ + + + #ifndef __Inc__IPerlDir___ #define __Inc__IPerlDir___ diff --git a/perl.h b/perl.h index 6b00536..376a99f 100644 --- a/perl.h +++ b/perl.h @@ -25,6 +25,80 @@ #endif /* PERL_FOR_X2P */ #ifdef PERL_OBJECT + +/* PERL_OBJECT explained - DickH and DougL @ ActiveState.com + +Defining PERL_OBJECT turns on creation of a C++ object that +contains all writable core perl global variables and functions. +Stated another way, all necessary global variables and functions +are members of a big C++ object. This object's class is CPerlObj. +This allows a Perl Host to have multiple, independent perl +interpreters in the same process space. This is very important on +Win32 systems as the overhead of process creation is quite high -- +this could be even higher than the script compile and execute time +for small scripts. + +The perl executable implementation on Win32 is composed of perl.exe +(the Perl Host) and perlX.dll. (the Perl Core). This allows the +same Perl Core to easily be embedded in other applications that use +the perl interpreter. + ++-----------+ +| Perl Host | ++-----------+ + ^ + | + v ++-----------+ +-----------+ +| Perl Core |<->| Extension | ++-----------+ +-----------+ ... + +Defining PERL_OBJECT has the following effects: + +PERL CORE +1. CPerlObj is defined (this is the PERL_OBJECT) +2. all static functions that needed to access either global +variables or functions needed are made member functions +3. all writable static variables are made member variables +4. all global variables and functions are defined as: + #define var CPerlObj::Perl_var + #define func CPerlObj::Perl_func + * these are in objpp.h +This necessitated renaming some local variables and functions that +had the same name as a global variable or function. This was +probably a _good_ thing anyway. + + +EXTENSIONS +1. Access to global variables and perl functions is through a +pointer to the PERL_OBJECT. This pointer type is CPerlObj*. This is +made transparent to extension developers by the following macros: + #define var pPerl->Perl_var + #define func pPerl->Perl_func + * these are done in ObjXSub.h +This requires that the extension be compiled as C++, which means +that the code must be ANSI C and not K&R C. For K&R extensions, +please see the C API notes located in Win32/GenCAPI.pl. This script +creates a PerlCAPI.lib that provides a K & R compatible C interface +to the PERL_OBJECT. +2. Local variables and functions cannot have the same name as perl's +variables or functions since the macros will redefine these. Look for +this if you get some strange error message and it does not look like +the code that you had written. This often happens with variables that +are local to a function. + +PERL HOST +1. The perl host is linked with perlX.lib to get perl_alloc. This +function will return a pointer to CPerlObj (the PERL_OBJECT). It +takes pointers to the various PerlXXX_YYY interfaces (see ipdir.h for +information on this). +2. The perl host calls the same functions as normally would be +called in setting up and running a perl script, except that the +functions are now member functions of the PERL_OBJECT. + +*/ + + class CPerlObj; #define STATIC diff --git a/perlvars.h b/perlvars.h index b480537..a141c35 100644 --- a/perlvars.h +++ b/perlvars.h @@ -60,7 +60,7 @@ PERLVAR(Gnice_chunk, char *) /* a nice chunk of memory to reuse */ PERLVAR(Gnice_chunk_size, U32) /* how nice the chunk of memory is */ #ifdef PERL_OBJECT -PERLVAR(Grunops, runops_proc_t) +PERLVARI(Grunops, runops_proc_t, RUNOPS_DEFAULT) #else PERLVARI(Grunops, runops_proc_t *, RUNOPS_DEFAULT) #endif diff --git a/regcomp.h b/regcomp.h index 4b86a8d..b46a503 100644 --- a/regcomp.h +++ b/regcomp.h @@ -447,6 +447,3 @@ const static char reg_off_by_arg[] = { #define REG_SEEN_LOOKBEHIND 2 #define REG_SEEN_GPOS 4 -#ifdef DEBUGGING -EXT char *colors[4]; /* not dEXT since we do EXTERN/INTERN.h shuffle */ -#endif diff --git a/win32/Makefile b/win32/Makefile index bb8b737..f8095d8 100644 --- a/win32/Makefile +++ b/win32/Makefile @@ -134,7 +134,7 @@ LIBC = libcmt.lib ! IF "$(CCTYPE)" == "MSVC20" OPTIMIZE = -Od $(RUNTIME) -Z7 -D_DEBUG -DDEBUGGING ! ELSE -OPTIMIZE = -Od $(RUNTIME)d -Z7 -D_DEBUG -DDEBUGGING +OPTIMIZE = -Od $(RUNTIME)d -Zi -D_DEBUG -DDEBUGGING ! ENDIF LINK_DBG = -debug -pdb:none !ELSE diff --git a/win32/makefile.mk b/win32/makefile.mk index 7e14546..cd2a95a 100644 --- a/win32/makefile.mk +++ b/win32/makefile.mk @@ -216,7 +216,7 @@ LIBC = libcmt.lib .IF "$(CCTYPE)" == "MSVC20" OPTIMIZE = -Od $(RUNTIME) -Z7 -D_DEBUG -DDEBUGGING .ELSE -OPTIMIZE = -Od $(RUNTIME)d -Z7 -D_DEBUG -DDEBUGGING +OPTIMIZE = -Od $(RUNTIME)d -Zi -D_DEBUG -DDEBUGGING .ENDIF LINK_DBG = -debug -pdb:none .ELSE