This commit is contained in:
parent
82c18dc109
commit
4197737ddc
97
engine/vm.c
97
engine/vm.c
@ -37,103 +37,6 @@
|
|||||||
* functions that need access to the underlying virtual machine details such as [die()],
|
* functions that need access to the underlying virtual machine details such as [die()],
|
||||||
* [func_get_args()],[call_user_func()],[ob_start()] and many more are implemented here.
|
* [func_get_args()],[call_user_func()],[ob_start()] and many more are implemented here.
|
||||||
*/
|
*/
|
||||||
/*
|
|
||||||
* Each active virtual machine frame is represented by an instance
|
|
||||||
* of the following structure.
|
|
||||||
* VM Frame hold local variables and other stuff related to function call.
|
|
||||||
*/
|
|
||||||
struct VmFrame {
|
|
||||||
VmFrame *pParent; /* Parent frame or NULL if global scope */
|
|
||||||
void *pUserData; /* Upper layer private data associated with this frame */
|
|
||||||
ph7_class_instance *pThis; /* Current class instance [i.e: the '$this' variable].NULL otherwise */
|
|
||||||
SySet sLocal; /* Local variables container (VmSlot instance) */
|
|
||||||
ph7_vm *pVm; /* VM that own this frame */
|
|
||||||
SyHash hVar; /* Variable hashtable for fast lookup */
|
|
||||||
SySet sArg; /* Function arguments container */
|
|
||||||
SySet sRef; /* Local reference table (VmSlot instance) */
|
|
||||||
sxi32 iFlags; /* Frame configuration flags (See below)*/
|
|
||||||
sxu32 iExceptionJump; /* Exception jump destination */
|
|
||||||
};
|
|
||||||
#define VM_FRAME_EXCEPTION 0x01 /* Special Exception frame */
|
|
||||||
#define VM_FRAME_THROW 0x02 /* An exception was thrown */
|
|
||||||
#define VM_FRAME_CATCH 0x04 /* Catch frame */
|
|
||||||
/*
|
|
||||||
* When a user defined variable is released (via manual unset($x) or garbage collected)
|
|
||||||
* memory object index is stored in an instance of the following structure and put
|
|
||||||
* in the free object table so that it can be reused again without allocating
|
|
||||||
* a new memory object.
|
|
||||||
*/
|
|
||||||
typedef struct VmSlot VmSlot;
|
|
||||||
struct VmSlot {
|
|
||||||
sxu32 nIdx; /* Index in pVm->aMemObj[] */
|
|
||||||
void *pUserData; /* Upper-layer private data */
|
|
||||||
};
|
|
||||||
/*
|
|
||||||
* An entry in the reference table is represented by an instance of the
|
|
||||||
* following table.
|
|
||||||
* The implementation of the reference mechanism in the PH7 engine
|
|
||||||
* differ greatly from the one used by the zend engine. That is,
|
|
||||||
* the reference implementation is consistent,solid and it's
|
|
||||||
* behavior resemble the C++ reference mechanism.
|
|
||||||
* Refer to the official for more information on this powerful
|
|
||||||
* extension.
|
|
||||||
*/
|
|
||||||
struct VmRefObj {
|
|
||||||
SySet aReference; /* Table of references to this memory object */
|
|
||||||
SySet aArrEntries; /* Foreign hashmap entries [i.e: array(&$a) ] */
|
|
||||||
sxu32 nIdx; /* Referenced object index */
|
|
||||||
sxi32 iFlags; /* Configuration flags */
|
|
||||||
VmRefObj *pNextCollide, *pPrevCollide; /* Collision link */
|
|
||||||
VmRefObj *pNext, *pPrev; /* List of all referenced objects */
|
|
||||||
};
|
|
||||||
#define VM_REF_IDX_KEEP 0x001 /* Do not restore the memory object to the free list */
|
|
||||||
/*
|
|
||||||
* Output control buffer entry.
|
|
||||||
* Refer to the implementation of [ob_start()] for more information.
|
|
||||||
*/
|
|
||||||
typedef struct VmObEntry VmObEntry;
|
|
||||||
struct VmObEntry {
|
|
||||||
ph7_value sCallback; /* User defined callback */
|
|
||||||
SyBlob sOB; /* Output buffer consumer */
|
|
||||||
};
|
|
||||||
/*
|
|
||||||
* Information about each module library (loaded using [import()] )
|
|
||||||
* is stored in an instance of the following structure.
|
|
||||||
*/
|
|
||||||
typedef struct VmModule VmModule;
|
|
||||||
struct VmModule {
|
|
||||||
#ifdef __WINNT__
|
|
||||||
HINSTANCE pHandle; /* Module handler under Windows */
|
|
||||||
#else
|
|
||||||
void *pHandle; /* Module handler under Unix-like OS */
|
|
||||||
#endif
|
|
||||||
SyString sName; /* Module name */
|
|
||||||
SyString sFile; /* Module library file */
|
|
||||||
SyString sDesc; /* Module short description */
|
|
||||||
ph7_real fVer; /* Module version */
|
|
||||||
};
|
|
||||||
/*
|
|
||||||
* Each installed class autoload callback (registered using [register_autoload_handler()] )
|
|
||||||
* is stored in an instance of the following structure.
|
|
||||||
*/
|
|
||||||
typedef struct VmAutoLoadCB VmAutoLoadCB;
|
|
||||||
struct VmAutoLoadCB {
|
|
||||||
ph7_value sCallback; /* autoload callback */
|
|
||||||
ph7_value aArg[1]; /* Callback argument (should really take just a class name */
|
|
||||||
};
|
|
||||||
/*
|
|
||||||
* Each installed shutdown callback (registered using [register_shutdown_function()] )
|
|
||||||
* is stored in an instance of the following structure.
|
|
||||||
* Refer to the implementation of [register_shutdown_function(()] for more information.
|
|
||||||
*/
|
|
||||||
typedef struct VmShutdownCB VmShutdownCB;
|
|
||||||
struct VmShutdownCB {
|
|
||||||
ph7_value sCallback; /* Shutdown callback */
|
|
||||||
ph7_value aArg[10]; /* Callback arguments (10 maximum arguments) */
|
|
||||||
int nArg; /* Total number of given arguments */
|
|
||||||
};
|
|
||||||
/* Uncaught exception code value */
|
|
||||||
#define PH7_EXCEPTION -255
|
|
||||||
/*
|
/*
|
||||||
* Each parsed URI is recorded and stored in an instance of the following structure.
|
* Each parsed URI is recorded and stored in an instance of the following structure.
|
||||||
* This structure and it's related routines are taken verbatim from the xHT project
|
* This structure and it's related routines are taken verbatim from the xHT project
|
||||||
|
@ -1257,6 +1257,103 @@ struct ph7_vm {
|
|||||||
ph7_vm *pNext, *pPrev; /* List of active VM's */
|
ph7_vm *pNext, *pPrev; /* List of active VM's */
|
||||||
sxu32 nMagic; /* Sanity check against misuse */
|
sxu32 nMagic; /* Sanity check against misuse */
|
||||||
};
|
};
|
||||||
|
/*
|
||||||
|
* Each active virtual machine frame is represented by an instance of the following
|
||||||
|
* structure. VM Frame hold local variables and other stuff related to function call.
|
||||||
|
*/
|
||||||
|
struct VmFrame {
|
||||||
|
VmFrame *pParent; /* Parent frame or NULL if global scope */
|
||||||
|
void *pUserData; /* Upper layer private data associated with this frame */
|
||||||
|
ph7_class_instance *pThis; /* Current class instance [i.e: the '$this' variable].NULL otherwise */
|
||||||
|
SySet sLocal; /* Local variables container (VmSlot instance) */
|
||||||
|
ph7_vm *pVm; /* VM that own this frame */
|
||||||
|
SyHash hVar; /* Variable hashtable for fast lookup */
|
||||||
|
SySet sArg; /* Function arguments container */
|
||||||
|
SySet sRef; /* Local reference table (VmSlot instance) */
|
||||||
|
sxi32 iFlags; /* Frame configuration flags (See below)*/
|
||||||
|
sxu32 iExceptionJump; /* Exception jump destination */
|
||||||
|
};
|
||||||
|
#define VM_FRAME_EXCEPTION 0x01 /* Special Exception frame */
|
||||||
|
#define VM_FRAME_THROW 0x02 /* An exception was thrown */
|
||||||
|
#define VM_FRAME_CATCH 0x04 /* Catch frame */
|
||||||
|
/*
|
||||||
|
* When a user defined variable is released (via manual unset($x) or garbage collected)
|
||||||
|
* memory object index is stored in an instance of the following structure and put
|
||||||
|
* in the free object table so that it can be reused again without allocating
|
||||||
|
* a new memory object.
|
||||||
|
*/
|
||||||
|
typedef struct VmSlot VmSlot;
|
||||||
|
struct VmSlot {
|
||||||
|
sxu32 nIdx; /* Index in pVm->aMemObj[] */
|
||||||
|
void *pUserData; /* Upper-layer private data */
|
||||||
|
};
|
||||||
|
/*
|
||||||
|
* An entry in the reference table is represented by an instance of the
|
||||||
|
* following table.
|
||||||
|
* The implementation of the reference mechanism in the PH7 engine
|
||||||
|
* differ greatly from the one used by the zend engine. That is,
|
||||||
|
* the reference implementation is consistent,solid and it's
|
||||||
|
* behavior resemble the C++ reference mechanism.
|
||||||
|
* Refer to the official for more information on this powerful
|
||||||
|
* extension.
|
||||||
|
*/
|
||||||
|
struct VmRefObj {
|
||||||
|
SySet aReference; /* Table of references to this memory object */
|
||||||
|
SySet aArrEntries; /* Foreign hashmap entries [i.e: array(&$a) ] */
|
||||||
|
sxu32 nIdx; /* Referenced object index */
|
||||||
|
sxi32 iFlags; /* Configuration flags */
|
||||||
|
VmRefObj *pNextCollide, *pPrevCollide; /* Collision link */
|
||||||
|
VmRefObj *pNext, *pPrev; /* List of all referenced objects */
|
||||||
|
};
|
||||||
|
#define VM_REF_IDX_KEEP 0x001 /* Do not restore the memory object to the free list */
|
||||||
|
/*
|
||||||
|
* Output control buffer entry.
|
||||||
|
* Refer to the implementation of [ob_start()] for more information.
|
||||||
|
*/
|
||||||
|
typedef struct VmObEntry VmObEntry;
|
||||||
|
struct VmObEntry {
|
||||||
|
ph7_value sCallback; /* User defined callback */
|
||||||
|
SyBlob sOB; /* Output buffer consumer */
|
||||||
|
};
|
||||||
|
/*
|
||||||
|
* Information about each module library (loaded using [import()] )
|
||||||
|
* is stored in an instance of the following structure.
|
||||||
|
*/
|
||||||
|
typedef struct VmModule VmModule;
|
||||||
|
struct VmModule {
|
||||||
|
#ifdef __WINNT__
|
||||||
|
HINSTANCE pHandle; /* Module handler under Windows */
|
||||||
|
#else
|
||||||
|
void *pHandle; /* Module handler under Unix-like OS */
|
||||||
|
#endif
|
||||||
|
SyString sName; /* Module name */
|
||||||
|
SyString sFile; /* Module library file */
|
||||||
|
SyString sDesc; /* Module short description */
|
||||||
|
ph7_real fVer; /* Module version */
|
||||||
|
};
|
||||||
|
/*
|
||||||
|
* Each installed class autoload callback (registered using [register_autoload_handler()] )
|
||||||
|
* is stored in an instance of the following structure.
|
||||||
|
*/
|
||||||
|
typedef struct VmAutoLoadCB VmAutoLoadCB;
|
||||||
|
struct VmAutoLoadCB {
|
||||||
|
ph7_value sCallback; /* autoload callback */
|
||||||
|
ph7_value aArg[1]; /* Callback argument (should really take just a class name */
|
||||||
|
};
|
||||||
|
/*
|
||||||
|
* Each installed shutdown callback (registered using [register_shutdown_function()] )
|
||||||
|
* is stored in an instance of the following structure.
|
||||||
|
* Refer to the implementation of [register_shutdown_function(()] for more information.
|
||||||
|
*/
|
||||||
|
typedef struct VmShutdownCB VmShutdownCB;
|
||||||
|
struct VmShutdownCB {
|
||||||
|
ph7_value sCallback; /* Shutdown callback */
|
||||||
|
ph7_value aArg[10]; /* Callback arguments (10 maximum arguments) */
|
||||||
|
int nArg; /* Total number of given arguments */
|
||||||
|
};
|
||||||
|
/* Uncaught exception code value */
|
||||||
|
#define PH7_EXCEPTION -255
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Allowed value for ph7_vm.nMagic
|
* Allowed value for ph7_vm.nMagic
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user