📄 ejs.h
字号:
* @overview EJ interpreter control structure. * @description EJ allocates one control structure per active interpreter. * The \ref ejsCreateInterp routine creates the Ejs structure and returns * a reference to be used in subsequent EJ API calls. * @stability Prototype. * @library libejs. * @see ejsCreateInterp, ejsDestroyInterp, ejsOpenService */struct Ejs { void *altHandle; /* Alternate callback handle */ bool castAlloc; /* True if castTemp is allocated */ char *castTemp; /* Temporary string for casting */ char *currentClass; /* Current class name */ EjsVar *currentObj; /* Ptr to current object */ EjsVar *thisObject; /* Ptr to current "this" */ EjsProperty *currentProperty; /* Ptr to current property */ EjsGC gc; /* Garbage collector control */ char *errorMsg; /* Error message */ char *fileName; /* File or script name */ int lineNumber; /* File line number */ int scriptStatus; /* Status to exit() */ int flags; /* Flags */ MprArray *frames; /* List of variable frames */ EjsVar *global; /* Global object */ EjsVar *objectClass; /* Object class */ int gotException; /* Exception thrown */ EjsInput *input; /* Input evaluation block */ int depth; /* Recursion depth */ EjsVar *local; /* Local object */ int maxDepth; /* Maximum depth for formatting */ void *primaryHandle; /* primary callback handle */ EjsProc *proc; /* Current method */ int recurseCount; /* Recursion counter */ EjsVar *result; /* Variable result */ int tid; /* Current token id */ char *token; /* Pointer to token string */ EjsVar tokenNumber; /* Parsed number */ EjsService *service; /* Service object */ void *userData; /* Method user data */ EjsSlab *slabs; /* Memory allocation slabs */ MprCtx slabAllocContext; /* Allocation context */ EjsInput *inputList; /* Free list of input structs */#if BLD_FEATURE_MULTITHREAD EjsLockFn lock; /* Lock method */ EjsUnlockFn unlock; /* Unlock method */ void *lockData; /* Lock data argument */#endif#define EJS_MAX_STACK (10 * 1024) char stack[EJS_MAX_STACK]; /* Local variable stack */ char *stkPtr; /* Local variable stack ptr */ void *inputMarker; /* Recurse protection */};typedef struct EjsModule{ int dummy;} EjsModule;/* * Method callback when using Alternate handles. GaCompat uses these and * passes the web server request structure via the altHandle. */typedef void *EjsHandle;typedef int (*EjsAltCMethod)(Ejs *ejs, EjsHandle altHandle, EjsVar *thisObj, int argc, EjsVar **argv);typedef int (*EjsAltStringCMethod)(Ejs *ejs, EjsHandle altHandle, EjsVar *thisObj, int argc, char **argv);/* * API Constants */#define EJS_USE_OWN_SLAB 1/******************************** Internal API ********************************//* * Ejs Lex */extern int ejsLexOpenScript(Ejs *ejs, const char *script);extern void ejsLexCloseScript(Ejs *ejs);extern int ejsInitInputState(EjsInput *ip);extern void ejsLexSaveInputState(Ejs *ejs, EjsInput* state);extern void ejsLexFreeInputState(Ejs *ejs, EjsInput* state);extern void ejsLexRestoreInputState(Ejs *ejs, EjsInput* state);extern int ejsLexGetToken(Ejs *ejs, int state);extern void ejsLexPutbackToken(Ejs *ejs, int tid, char *string);/* * Parsing */extern int ejsParse(Ejs *ejs, int state, int flags);extern int ejsGetFlags(Ejs *ejs);/* * Create variable scope blocks */extern int ejsOpenBlock(Ejs *ejs);extern int ejsSetBlock(Ejs *ejs, EjsVar *local);extern int ejsCloseBlock(Ejs *ejs, int vid);extern int ejsEvalBlock(Ejs *ejs, char *script, EjsVar *vp);extern void ejsSetFileName(Ejs *ejs, const char *fileName);/* * Class definitions */extern EjsVar *ejsCreateSimpleClass(Ejs *ejs, EjsVar *baseClass, const char *className);extern int ejsDefineObjectClass(Ejs *ejs);extern int ejsDefineArrayClass(Ejs *ejs);extern int ejsDefineBooleanClass(Ejs *ejs);extern int ejsDefineErrorClasses(Ejs *ejs);extern int ejsDefineFileClass(Ejs *ejs);extern int ejsDefineFileSystemClass(Ejs *ejs);extern int ejsDefineHTTPClass(Ejs *ejs);extern int ejsDefineFunctionClass(Ejs *ejs);extern int ejsDefineNumberClass(Ejs *ejs);extern int ejsDefineStringClass(Ejs *ejs);extern int ejsDefineDateClass(Ejs *ejs);extern int ejsDefineStandardClasses(Ejs *ejs);#if BLD_FEATURE_EJS_E4Xextern int ejsDefineXmlClasses(Ejs *ejs);extern EjsVar *ejsCreateXml(Ejs *ejs);#endif#if BLD_FEATURE_EJS_DBextern int ejsDefineDbClasses(Ejs *ejs);#endif/* * System class definitions */extern int ejsDefineSystemClasses(Ejs *ejs);extern int ejsDefineSystemClass(Ejs *ejs);extern int ejsDefineAppClass(Ejs *ejs);extern int ejsDefineDebugClass(Ejs *ejs);extern int ejsDefineLogClass(Ejs *ejs);extern int ejsDefineMemoryClass(Ejs *ejs);extern int ejsDefineGCClass(Ejs *ejs);extern int ejsDefineGlobalProperties(Ejs *ejs);extern int ejsTermSystemClasses(Ejs *ejs);extern void ejsTermHTTPClass(Ejs *ejs);extern int ejsCreateObjectModel(Ejs *ejs);/* * Class constructors */extern int ejsArrayConstructor(Ejs *ejs, EjsVar *thisObj, int argc, EjsVar **argv);extern int ejsXmlConstructor(Ejs *ejs, EjsVar *thisObj, int argc, EjsVar **argv);extern int ejsXmlListConstructor(Ejs *ejs, EjsVar *thisObj, int argc, EjsVar **argv);extern int ejsBooleanConstructor(Ejs *ejs, EjsVar *thisObj, int argc, EjsVar **agv);extern int ejsFunctionConstructor(Ejs *ejs, EjsVar *thisObj, int argc, EjsVar **agv);extern int ejsNumberConstructor(Ejs *ejs, EjsVar *thisObj, int argc, EjsVar **argv);extern int ejsStringConstructor(Ejs *ejs, EjsVar *thisObj, int argc, EjsVar **argv);extern int ejsDateConstructor(Ejs *ejs, EjsVar *thisObj, int argc, EjsVar **argv);/* * Garbage collection */extern void ejsGCInit(Ejs *ejs, int objInc, int propInc, int varInc, int strInc);extern int ejsIsTimeForGC(Ejs *ep, int timeTillNextEvent);extern bool ejsSetGCDebugLevel(Ejs *ep, int debugLevel);extern void ejsSweepAll(Ejs *ep);extern EjsObj *ejsAllocObj(EJS_LOC_DEC(ejs, loc));extern EjsProperty *ejsAllocProperty(EJS_LOC_DEC(ejs, loc));extern EjsVar *ejsAllocVar(EJS_LOC_DEC(ejs, loc));extern void ejsFree(Ejs *ejs, void *ptr, int slabIndex);extern int ejsCollectGarbage(Ejs *ejs, int slabIndex);extern int ejsIncrementalCollectGarbage(Ejs *ejs);#if BLD_DEBUGextern void ejsDumpObjects(Ejs *ejs);#endif#if BLD_FEATURE_ALLOC_STATSextern void ejsPrintAllocReport(Ejs *ejs, bool printLeakReport);#endifextern void ejsCleanInterp(Ejs *ejs, bool doStats);extern void ejsSetInternalMethods(Ejs *ejs, EjsVar *op);extern void ejsSetPrimaryHandle(Ejs *ep, void *primaryHandle);extern void ejsSetAlternateHandle(Ejs *ep, void *alternateHandle);extern void *ejsGetUserData(Ejs *ejs);/* * Could possibly make these routines public */extern int ejsSetGCMaxMemory(Ejs *ep, uint maxMemory);extern uint ejsGetUsedMemory(Ejs *ejs);extern uint ejsGetAllocatedMemory(Ejs *ejs);extern uint ejsGetAvailableMemory(Ejs *ejs);extern char *ejsFormatStack(Ejs* ep);;/********************************* Prototypes *********************************/#if BLD_FEATURE_MULTITHREADextern int ejsSetServiceLocks(EjsService *sp, EjsLockFn lock, EjsUnlockFn unlock, void *data);#endif/* * Ejs service and interpreter management */extern EjsService *ejsOpenService(MprCtx ctx);extern void ejsCloseService(EjsService *sp, bool doStats);extern Ejs *ejsCreateInterp(EjsService *sp, void *primaryHandle, void *altHandle, EjsVar *global, bool useOwnSlab);extern void ejsDestroyInterp(Ejs *ejs, bool doStats);extern Ejs *ejsGetMasterInterp(EjsService *sp);extern EjsVar *ejsGetGlobalClass(Ejs *ejs);/* * Module support */extern EjsModule *ejsCreateModule(const char *name, const char *version, int (*start)(EjsModule*), int (*stop)(EjsModule*));/* * Native Objects */void ejsSetNativeData(EjsVar *obj, void *data);void ejsSetNativeHelpers(Ejs *ejs, EjsVar *nativeClass, int (*createInstance)(Ejs *ejs, EjsVar *thisObj, int argc, EjsVar **argv), void (*disposeInstance)(Ejs *ejs, EjsVar *thisObj), bool (*hasProperty)(Ejs *ejs, EjsVar *thisObj, const char *prop), int (*deleteProperty)(Ejs *ejs, EjsVar *thisObj, const char *prop), int (*getProperty)(Ejs *ejs, EjsVar *thisObj, const char *prop, EjsVar *dest), int (*setProperty)(Ejs *ejs, EjsVar *thisObj, const char *prop, EjsVar *value), int (*doOperator)(Ejs *ejs, EjsVar *thisObj, EjsOp *op, EjsVar *result, EjsVar *lhs, EjsVar *rhs, int *code) );/* * Evaluation methods */extern int ejsEvalFile(Ejs *ejs, const char *path, EjsVar *result);extern int ejsEvalScript(Ejs *ejs, const char *script, EjsVar *result);extern int ejsRunMethod(Ejs *ejs, EjsVar *obj, const char *methodName, MprArray *args);extern int ejsRunMethodCmd(Ejs *ejs, EjsVar *obj, const char *methodName, const char *cmdFmt, ...);extern EjsVar *ejsGetReturnValue(Ejs *ejs);extern EjsVar *ejsGetLocalObj(Ejs *ejs);extern EjsVar *ejsGetGlobalObj(Ejs *ejs);/* * Define a class in the specified interpreter. If used with the default * interpeter, then the class is defined for all interpreters. */extern EjsVar *ejsDefineClass(Ejs *ejs, const char *className, const char *extends, EjsCMethod constructor);extern EjsVar *ejsGetClass(Ejs *ejs, EjsVar *parentClass, const char *className);extern const char *ejsGetClassName(EjsVar *obj);extern const char *ejsGetBaseClassName(EjsVar *obj);extern bool ejsIsSubClass(EjsVar *target, EjsVar *baseClass);extern EjsVar *ejsGetBaseClass(EjsVar *obj);extern void ejsSetBaseClass(EjsVar *obj, EjsVar *baseClass);#define ejsCreateSimpleObj(ejs, className) \ ejsCreateSimpleObjInternal(EJS_LOC_ARGS(ejs), className)extern EjsVar *ejsCreateSimpleObjInternal(EJS_LOC_DEC(ejs, loc), const char *className);#define ejsCreateSimpleObjUsingClass(ejs, baseClass) \ ejsCreateSimpleObjUsingClassInt(EJS_LOC_ARGS(ejs), \ baseClass)extern EjsVar *ejsCreateSimpleObjUsingClassInt(EJS_LOC_DEC(ejs, loc), EjsVar *baseClass);/* * This will create an object and call all required constructors */extern EjsVar *ejsCreateObj(Ejs *ejs, EjsVar *obj, const char *className, const char *constructorArgs);#define ejsCreateObjUsingArgv(ejs, obj, className, args) \ ejsCreateObjUsingArgvInternal(EJS_LOC_ARGS(ejs), obj, \ className, args)extern EjsVar *ejsCreateObjUsingArgvInternal(EJS_LOC_DEC(ejs, loc), EjsVar *obj, const char *className, MprArray *args);#define ejsCreateArray(ejs, size) \ ejsCreateArrayInternal(EJS_LOC_ARGS(ejs), size)extern EjsVar *ejsCreateArrayInternal(EJS_LOC_DEC(ejs, loc), int size);/* * Array methods. MOB -- need other array methods *//* MOB -- spell out element */extern EjsVar *ejsAddArrayElt(Ejs *ejs, EjsVar *op, EjsVar *element, EjsCopyDepth copyDepth);/* * Required: Array methods * array = obj.getMethods(); array = obj.getProperties(); array.property.isPublic(); array.property.isPrivate(); array.property.isMethod(); array.property.isEnumerable(); array.property.isReadOnly(); array.property.allowsNonUnique(); array.property.getParent();*//* MOB -- should we have an API that takes a EjsCopyDepth */extern void ejsSetReturnValue(Ejs *ejs, EjsVar *vp);extern void ejsSetReturnValueAndFree(Ejs *ejs, EjsVar *vp);extern void ejsSetReturnValueToBoolean(Ejs *ejs, bool value);extern void ejsSetReturnValueToBinaryString(Ejs *ejs, const uchar *value, int len);extern void ejsSetReturnValueToInteger(Ejs *ejs, int value);extern void ejsSetReturnValueToNumber(Ejs *ejs, EjsNum value);extern void ejsSetReturnValueToString(Ejs *ejs, const char *value);extern void ejsSetReturnValueToUndefined(Ejs *ejs);/* * Variable access and control. The fullName arg can contain "[]" and "." */extern bool ejsGetBool(Ejs *ejs, const char *fullName, bool defaultValue);extern int ejsGetInt(Ejs *ejs, const char *fullName, int defaultValue);extern const char *ejsGetStr(Ejs *ejs, const char *fullName, const char *defaultValue);extern EjsVar *ejsGetVar(Ejs *ejs, const char *fullName);extern int ejsSetBool(Ejs *ejs, const char *fullName, bool value);extern int ejsSetInt(Ejs *ejs, const char *fullName, int value);extern int ejsSetStr(Ejs *ejs, const char *fullName, const char *value);extern int ejsSetVar(Ejs *ejs, const char *fullName, const EjsVar *value);extern int ejsSetVarAndFree(Ejs *ejs, const char *fullName, EjsVar *value);extern int ejsDeleteVar(Ejs *ejs, const char *fullName);/* * Error handling */extern void ejsError(Ejs *ejs, const char *errorType, const char *fmt, ...) PRINTF_ATTRIBUTE(3,4);/* MOB -- this should take no arguments */extern void ejsArgError(Ejs *ejs, const char *msg);extern void ejsInternalError(Ejs *ejs, const char *msg);extern void ejsMemoryError(Ejs *ejs);extern void ejsSyntaxError(Ejs *ejs, const char *msg);/* * Utility methods */extern int ejsParseArgs(int argc, char **argv, const char *fmt, ...);extern void ejsExit(Ejs *ejs, int status);extern bool ejsIsExiting(Ejs *ejs);extern void ejsClearExiting(Ejs *ejs);extern bool ejsGotException(Ejs *ejs);/* MOB -- rename Method to Function */extern void ejsFreeMethodArgs(Ejs *ep, MprArray *args);extern int ejsStrcat(Ejs *ep, EjsVar *dest, EjsVar *src);/* * Debugging routines */extern char *ejsGetErrorMsg(Ejs *ejs);extern int ejsGetLineNumber(Ejs *ejs);extern void ejsTrace(Ejs *ejs, const char *fmt, ...);/* * Multithreaded lock routines */#if BLD_FEATURE_MULTITHREAD#define ejsLock(sp) if (sp->lock) { (sp->lock)(sp->lockData); } else#define ejsUnlock(sp) if (sp->unlock) { (sp->unlock)(sp->lockData); } else#else#define ejsLock(sp) #define ejsUnlock(sp) #endif#ifdef __cplusplus}#endif#endif /* _h_EJS *//*****************************************************************************//* * Local variables: * tab-width: 4 * c-basic-offset: 4 * End: * vim:tw=78 * vim600: sw=4 ts=4 fdm=marker * vim<600: sw=4 ts=4 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -