1
0
mirror of https://github.com/samba-team/samba.git synced 2025-12-16 00:23:52 +03:00
Files
samba-mirror/source/lib/appweb/ejs-2.0/ejs/ejs.h

850 lines
28 KiB
C

/*
* ejs.h - EJScript Language (ECMAScript) header.
*/
/********************************* Copyright **********************************/
/*
* @copy default.g
*
* Copyright (c) Mbedthis Software LLC, 2003-2006. All Rights Reserved.
* Copyright (c) Michael O'Brien, 1994-1995. All Rights Reserved.
* Portions Copyright (c) GoAhead Software, 1995-2000. All Rights Reserved.
*
* This software is distributed under commercial and open source licenses.
* You may use the GPL open source license described below or you may acquire
* a commercial license from Mbedthis Software. You agree to be fully bound
* by the terms of either license. Consult the LICENSE.TXT distributed with
* this software for full details.
*
* This software is open source; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version. See the GNU General Public License for more
* details at: http://www.mbedthis.com/downloads/gplLicense.html
*
* This program is distributed WITHOUT ANY WARRANTY; without even the
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
* This GPL license does NOT permit incorporating this software into
* proprietary programs. If you are unable to comply with the GPL, you must
* acquire a commercial license to use this software. Commercial licenses
* for this software and support services are available from Mbedthis
* Software at http://www.mbedthis.com
*
* @end
*/
/********************************** Includes **********************************/
#ifndef _h_EJS
#define _h_EJS 1
#include "mpr.h"
#include "ejsVar.h"
#ifdef __cplusplus
extern "C" {
#endif
/********************************* Prototypes *********************************/
/*
* Constants
*/
#if BLD_FEATURE_SQUEEZE
#define EJS_GC_WORK_QUOTA 160 /* Allocations required before
garbage colllection */
#define EJS_PARSE_INCR 256 /* Growth factor */
#define EJS_MAX_RECURSE 25 /* Sanity for maximum recursion */
#define EJS_SMALL_OBJ_HASH_SIZE 11 /* Small object hash size */
#define EJS_LIST_INCR 8 /* Growth increment for lists */
#define EJS_MAX_BACKTRACE 10 /* Recursion limit for assert */
#else
#define EJS_GC_WORK_QUOTA 500
#define EJS_PARSE_INCR 1024
#define EJS_MAX_RECURSE 100
#define EJS_SMALL_OBJ_HASH_SIZE 11
#define EJS_LIST_INCR 16
#define EJS_MAX_BACKTRACE 25
#endif
/*
* Allocation increments for the default interpreter
*/
#define EJS_DEFAULT_VAR_INC 8 /* Var allocation increment */
#define EJS_DEFAULT_PROP_INC 96 /* Property allocation increment */
#define EJS_DEFAULT_OBJ_INC 24 /* Object allocation increment */
#define EJS_DEFAULT_STR_INC 64 /* Object allocation increment */
#define EJS_MIN_TIME_FOR_GC 300 /**< Need 1/3 sec for GC */
#define EJS_GC_MIN_WORK_QUOTA 50 /**< Min to stop thrashing */
/*
* Allocation increments for all non-default interpreters
*/
#define EJS_VAR_INC 32
#define EJS_PROP_INC 64
#define EJS_OBJ_INC 64
#define EJS_STR_INC 64
#define EJS_INC_FRAMES 8 /* Frame stack increment */
#define EJS_MAX_FRAMES 64 /* Max frame stack */
/*
* Lexical analyser tokens
*/
#define EJS_TOK_ERR -1 /* Any error */
#define EJS_TOK_LPAREN 1 /* ( */
#define EJS_TOK_RPAREN 2 /* ) */
#define EJS_TOK_IF 3 /* if */
#define EJS_TOK_ELSE 4 /* else */
#define EJS_TOK_LBRACE 5 /* { */
#define EJS_TOK_RBRACE 6 /* } */
#define EJS_TOK_LOGICAL 7 /* ||, &&, ! */
#define EJS_TOK_EXPR 8 /* +, -, /, % */
#define EJS_TOK_SEMI 9 /* ; */
#define EJS_TOK_LITERAL 10 /* literal string */
#define EJS_TOK_METHOD_NAME 11 /* methodName( */
#define EJS_TOK_NEWLINE 12 /* newline white space */
#define EJS_TOK_ID 13 /* Identifier */
#define EJS_TOK_EOF 14 /* End of script */
#define EJS_TOK_COMMA 15 /* Comma */
#define EJS_TOK_VAR 16 /* var */
#define EJS_TOK_ASSIGNMENT 17 /* = */
#define EJS_TOK_FOR 18 /* for */
#define EJS_TOK_INC_DEC 19 /* ++, -- */
#define EJS_TOK_RETURN 20 /* return */
#define EJS_TOK_PERIOD 21 /* . */
#define EJS_TOK_LBRACKET 22 /* [ */
#define EJS_TOK_RBRACKET 23 /* ] */
#define EJS_TOK_NEW 24 /* new */
#define EJS_TOK_DELETE 25 /* delete */
#define EJS_TOK_IN 26 /* in */
#define EJS_TOK_FUNCTION 27 /* function */
#define EJS_TOK_NUMBER 28 /* Number */
#define EJS_TOK_CLASS 29 /* class */
#define EJS_TOK_EXTENDS 30 /* extends */
#define EJS_TOK_PUBLIC 31 /* public */
#define EJS_TOK_PRIVATE 32 /* private */
#define EJS_TOK_PROTECTED 33 /* private */
#define EJS_TOK_TRY 34 /* try */
#define EJS_TOK_CATCH 35 /* catch */
#define EJS_TOK_FINALLY 36 /* finally */
#define EJS_TOK_THROW 37 /* throw */
#define EJS_TOK_COLON 38 /* : */
#define EJS_TOK_GET 39 /* get */
#define EJS_TOK_SET 40 /* set */
#define EJS_TOK_MODULE 41 /* module */
#define EJS_TOK_EACH 42 /* each */
/*
* Expression operators
*/
#define EJS_EXPR_LESS 1 /* < */
#define EJS_EXPR_LESSEQ 2 /* <= */
#define EJS_EXPR_GREATER 3 /* > */
#define EJS_EXPR_GREATEREQ 4 /* >= */
#define EJS_EXPR_EQ 5 /* == */
#define EJS_EXPR_NOTEQ 6 /* != */
#define EJS_EXPR_PLUS 7 /* + */
#define EJS_EXPR_MINUS 8 /* - */
#define EJS_EXPR_DIV 9 /* / */
#define EJS_EXPR_MOD 10 /* % */
#define EJS_EXPR_LSHIFT 11 /* << */
#define EJS_EXPR_RSHIFT 12 /* >> */
#define EJS_EXPR_MUL 13 /* * */
#define EJS_EXPR_ASSIGNMENT 14 /* = */
#define EJS_EXPR_INC 15 /* ++ */
#define EJS_EXPR_DEC 16 /* -- */
#define EJS_EXPR_BOOL_COMP 17 /* ! */
/*
* Conditional operators
*/
#define EJS_COND_AND 1 /* && */
#define EJS_COND_OR 2 /* || */
#define EJS_COND_NOT 3 /* ! */
/**
* EJ Parsing States. Error and Return are be negative.
*/
#define EJS_STATE_ERR -1 /**< Error state */
#define EJS_STATE_RET -2 /**< Return statement */
#define EJS_STATE_EOF -3 /**< End of file */
#define EJS_STATE_COND 2 /* Parsing a conditional stmt */
#define EJS_STATE_COND_DONE 3
#define EJS_STATE_RELEXP 4 /* Parsing a relational expr */
#define EJS_STATE_RELEXP_DONE 5
#define EJS_STATE_EXPR 6 /* Parsing an expression */
#define EJS_STATE_EXPR_DONE 7
#define EJS_STATE_STMT 8 /* Parsing General statement */
#define EJS_STATE_STMT_DONE 9
#define EJS_STATE_STMT_BLOCK_DONE 10 /* End of block "}" */
#define EJS_STATE_ARG_LIST 11 /* Method arg list */
#define EJS_STATE_ARG_LIST_DONE 12
#define EJS_STATE_DEC_LIST 16 /* Declaration list */
#define EJS_STATE_DEC_LIST_DONE 17
#define EJS_STATE_DEC 18 /* Declaration statement */
#define EJS_STATE_DEC_DONE 19
#define EJS_STATE_BEGIN EJS_STATE_STMT
/*
* General parsing flags.
*/
#define EJS_FLAGS_EXE 0x1 /* Execute statements */
#define EJS_FLAGS_LOCAL 0x2 /* Get local vars only */
#define EJS_FLAGS_GLOBAL 0x4 /* Get global vars only */
#define EJS_FLAGS_CREATE 0x8 /* Create var */
#define EJS_FLAGS_ASSIGNMENT 0x10 /* In assignment stmt */
#define EJS_FLAGS_DELETE 0x20 /* Deleting a variable */
#define EJS_FLAGS_NEW 0x80 /* In a new stmt() */
#define EJS_FLAGS_EXIT 0x100 /* Must exit */
#define EJS_FLAGS_LHS 0x200 /* Left-hand-side of assignment */
#define EJS_FLAGS_FORIN 0x400 /* In "for (v in ..." */
#define EJS_FLAGS_CLASS_DEC 0x800 /* "class name [extends] name " */
#define EJS_FLAGS_TRY 0x2000 /* In a try {} block */
#define EJS_FLAGS_CATCH 0x4000 /* "catch (variable)" */
#define EJS_FLAGS_DONT_GC 0x8000 /* Don't garbage collect */
#define EJS_FLAGS_NO_ARGS 0x10000 /* Accessors don't use args */
#define EJS_FLAGS_ENUM_HIDDEN 0x20000 /* Enumerate hidden fields */
#define EJS_FLAGS_ENUM_BASE 0x40000 /* Enumerate base classes */
#define EJS_FLAGS_TRACE_ARGS 0x80000 /* Support for printv */
#define EJS_FLAGS_SHARED_SLAB 0x100000/* Using a shared slab */
/*
* Exceptions
*/
#define EJS_ARG_ERROR "ArgError" /**< Method argument error */
#define EJS_ASSERT_ERROR "AssertError" /**< Assertion error */
#define EJS_EVAL_ERROR "EvalError" /**< General evalation error */
#define EJS_INTERNAL_ERROR "InternalError" /**< Internal error */
#define EJS_IO_ERROR "IOError" /**< IO or data error */
#define EJS_MEMORY_ERROR "MemoryError" /**< Memory allocation error */
#define EJS_RANGE_ERROR "RangeError" /**< Data out of range (div by 0) */
#define EJS_REFERENCE_ERROR "ReferenceError"/**< Object or property reference */
#define EJS_SYNTAX_ERROR "SyntaxError" /**< Javascript syntax error */
#define EJS_TYPE_ERROR "TypeError" /**< Wrong type supplied */
/*
* E4X
*/
#if BLD_FEATURE_EJS_E4X
#if BLD_FEATURE_SQUEEZE
#define E4X_BUF_SIZE 512 /* Initial buffer size for tokens */
#define E4X_BUF_MAX (32 * 1024) /* Max size for tokens */
#define E4X_MAX_NODE_DEPTH 24 /* Max nesting of tags */
#else
#define E4X_BUF_SIZE 4096
#define E4X_BUF_MAX (128 * 1024)
#define E4X_MAX_NODE_DEPTH 128
#endif
#define E4X_MAX_ELT_SIZE (E4X_BUF_MAX-1)
#define E4X_TEXT_PROPERTY "-txt"
#define E4X_TAG_NAME_PROPERTY "-tag"
#define E4X_COMMENT_PROPERTY "-com"
#define E4X_ATTRIBUTES_PROPERTY "-att"
#define E4X_PI_PROPERTY "-pi"
#define E4X_PARENT_PROPERTY "-parent"
#endif
#if BLD_FEATURE_MULTITHREAD
/**
* Multithreaded lock function
*/
typedef void (*EjsLockFn)(void *lockData);
/**
* Multithreaded unlock function
*/
typedef void (*EjsUnlockFn)(void *lockData);
#endif
/*
* Token limits
*/
#define EJS_MAX_LINE 128 /* Maximum input line buffer */
#define EJS_MAX_TOKEN 640 /* Max input parse token */
#define EJS_TOKEN_STACK 3 /* Put back token stack */
/*
* Putback token
*/
typedef struct EjsToken {
char tokbuf[EJS_MAX_TOKEN];
int tid; /* Token ID */
} EjsToken;
/*
* EJ evaluation block structure
*/
typedef struct EjsInput {
EjsToken putBack[EJS_TOKEN_STACK]; /* Put back token stack */
int putBackIndex; /* Top of stack index */
char line[EJS_MAX_LINE]; /* Current line */
char *fileName; /* File or script name */
int lineLength; /* Current line length */
int lineNumber; /* Parse line number */
int lineColumn; /* Column in line */
struct EjsInput *next; /* Used for backtraces */
const char *procName; /* Gives name in backtrace */
const char *script; /* Input script for parsing */
char *scriptServp; /* Next token in the script */
int scriptSize; /* Length of script */
char tokbuf[EJS_MAX_TOKEN]; /* Current token */
int tid; /* Token ID */
char *tokEndp; /* Pointer past end of token */
char *tokServp; /* Pointer to next token char */
struct EjsInput *nextInput; /* Free list of input structs */
} EjsInput;
/*
* Method call structure
*/
typedef struct EjsProc {
MprArray *args; /* Args for method */
EjsVar *fn; /* Method definition */
char *procName; /* Method name */
} EjsProc;
/**
* @overview EJScript Service structure
* @description The EJScript service manages the overall language runtime. It
* is the factory that creates interpreter instances via ejsCreateInterp.
* The EJScript service creates a master interpreter that holds the
* standard language classes and properties. When user interpreters are
* created, they reference (without copying) the master interpreter to
* gain access to the standard classes and types.
* @stability Prototype.
* @library libejs.
* @see ejsOpenService, ejsCloseService, ejsCreateInterp, ejsDestoryInterp
*/
typedef struct EjsService {
EjsVar *globalClass; /* Global class */
struct Ejs *master; /* Master Interp inherited by all */
#if BLD_FEATURE_MULTITHREAD
EjsLockFn lock;
EjsUnlockFn unlock;
void *lockData;
#endif
} EjsService;
/*
* Memory statistics
*/
typedef struct EjsMemStats {
uint maxMem;
uint usedMem;
} EjsMemStats;
/*
* Garbage collection block alignment
*/
#define EJS_ALLOC_ALIGN(ptr) \
(((ptr) + sizeof(void*) - 1) & ~(sizeof(void*) - 1))
/*
* Default GC tune factors
*/
#define EJS_GC_START_THRESHOLD (32 * 1024)
/*
* The Garbage collector is a generational collector. It ages blocks and
* optimizes the mark / sweep algorithm to focus on new and recent blocks
*/
typedef enum EjsGeneration {
EJS_GEN_NEW = 0,
EJS_GEN_RECENT_1 = 1,
EJS_GEN_RECENT_2 = 2,
EJS_GEN_OLD = 3,
EJS_GEN_PERMANENT = 4,
EJS_GEN_MAX = 5,
} EjsGeneration;
/*
* Garbage collector control
*/
typedef struct EjsGC {
bool enable;
bool enableDemandCollect;
bool enableIdleCollect;
/*
* maxMemory should be set to be 95% of the real max memory limit
*/
uint maxMemory; /* Above this, Throw Memory exception. */
int workQuota; /* Quota of work before GC */
int workDone; /* Count of allocations */
int degraded; /* Have exceeded maxMemory */
/*
* Debug Levels 0-N (increases verbosity)
* 1 -- Sweep and collection count
* 2 -- Trace objects deleted
* 3 -- Trace objects marked
* 4 -- Print alloc report when needing a demand allocation
*
*/
int debugLevel; /* In debug mode */
int collecting; /* Running garbage collection */
uint collectionCount; /* Number of times GC ran */
#if BLD_DEBUG
int gcIndent; /* Indent formatting */
int objectsInUse; /* Objects currently reachable */
int propertiesInUse; /* Properties currently reachable */
#endif
} EjsGC;
/*
* Slab memory allocation
*/
typedef struct EjsSlab {
uint allocIncrement; /* Growth increment in slab */
uint size; /* Size of allocations */
EjsGCLink freeList; /* Free list (only next ptr is used) */
EjsObj *lastRecentBlock; /* Saved for GC age generations phase */
EjsGCLink allocList[EJS_GEN_MAX]; /* Allocated block list */
#if BLD_FEATURE_ALLOC_STATS
uint totalAlloc; /* Total count of allocation calls */
uint freeCount; /* Number of blocks on the slab freelist */
uint allocCount; /* Number of allocated blocks */
uint peakAllocated; /* Peak allocated */
uint peakFree; /* Peak on the free list */
uint totalReclaimed; /* Total blocks reclaimed on sweeps */
uint totalSweeps; /* Total sweeps */
#endif
} EjsSlab;
/**
* @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_E4X
extern int ejsDefineXmlClasses(Ejs *ejs);
extern EjsVar *ejsCreateXml(Ejs *ejs);
#endif
#if BLD_FEATURE_EJS_DB
extern 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_DEBUG
extern void ejsDumpObjects(Ejs *ejs);
#endif
#if BLD_FEATURE_ALLOC_STATS
extern void ejsPrintAllocReport(Ejs *ejs, bool printLeakReport);
#endif
extern 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_MULTITHREAD
extern 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
*/