123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258 |
- /*
- AngelCode Scripting Library
- Copyright (c) 2003-2020 Andreas Jonsson
- This software is provided 'as-is', without any express or implied
- warranty. In no event will the authors be held liable for any
- damages arising from the use of this software.
- Permission is granted to anyone to use this software for any
- purpose, including commercial applications, and to alter it and
- redistribute it freely, subject to the following restrictions:
- 1. The origin of this software must not be misrepresented; you
- must not claim that you wrote the original software. If you use
- this software in a product, an acknowledgment in the product
- documentation would be appreciated but is not required.
- 2. Altered source versions must be plainly marked as such, and
- must not be misrepresented as being the original software.
- 3. This notice may not be removed or altered from any source
- distribution.
- The original version of this library can be located at:
- http://www.angelcode.com/angelscript/
- Andreas Jonsson
- andreas@angelcode.com
- */
- //
- // as_module.h
- //
- // A class that holds a script module
- //
- #ifndef AS_MODULE_H
- #define AS_MODULE_H
- #include "as_config.h"
- #include "as_symboltable.h"
- #include "as_atomic.h"
- #include "as_string.h"
- #include "as_array.h"
- #include "as_datatype.h"
- #include "as_scriptfunction.h"
- #include "as_property.h"
- BEGIN_AS_NAMESPACE
- // TODO: import: Remove this when the imported functions are removed
- const int FUNC_IMPORTED = 0x40000000;
- class asCScriptEngine;
- class asCCompiler;
- class asCBuilder;
- class asCContext;
- class asCConfigGroup;
- class asCTypedefType;
- class asCFuncdefType;
- struct asSNameSpace;
- struct sBindInfo
- {
- asCScriptFunction *importedFunctionSignature;
- asCString importFromModule;
- int boundFunctionId;
- };
- struct sObjectTypePair
- {
- asCObjectType *a;
- asCObjectType *b;
- };
- // TODO: import: Remove function imports. When I have implemented function
- // pointers the function imports should be deprecated.
- // TODO: Need a separate interface for compiling scripts. The asIScriptCompiler
- // will have a target module, and will allow the compilation of an entire
- // script or just individual functions within the scope of the module
- //
- // With this separation it will be possible to compile the library without
- // the compiler, thus giving a much smaller binary executable.
- // TODO: There should be a special compile option that will let the application
- // recompile an already compiled script. The compiler should check if no
- // destructive changes have been made (changing function signatures, etc)
- // then it should simply replace the bytecode within the functions without
- // changing the values of existing global properties, etc.
- class asCModule : public asIScriptModule
- {
- //-------------------------------------------
- // Public interface
- //--------------------------------------------
- public:
- virtual asIScriptEngine *GetEngine() const;
- virtual void SetName(const char *name);
- virtual const char *GetName() const;
- virtual void Discard();
- // Compilation
- virtual int AddScriptSection(const char *name, const char *code, size_t codeLength, int lineOffset);
- virtual int Build();
- virtual int CompileFunction(const char *sectionName, const char *code, int lineOffset, asDWORD reserved, asIScriptFunction **outFunc);
- virtual int CompileGlobalVar(const char *sectionName, const char *code, int lineOffset);
- virtual asDWORD SetAccessMask(asDWORD accessMask);
- virtual int SetDefaultNamespace(const char *nameSpace);
- virtual const char *GetDefaultNamespace() const;
- // Script functions
- virtual asUINT GetFunctionCount() const;
- virtual asIScriptFunction *GetFunctionByIndex(asUINT index) const;
- virtual asIScriptFunction *GetFunctionByDecl(const char *decl) const;
- virtual asIScriptFunction *GetFunctionByName(const char *name) const;
- virtual int RemoveFunction(asIScriptFunction *func);
- // Script global variables
- // TODO: interface: Should be called InitGlobalVars, and should have a bool to reset in case already initialized
- virtual int ResetGlobalVars(asIScriptContext *ctx);
- virtual asUINT GetGlobalVarCount() const;
- virtual int GetGlobalVarIndexByName(const char *name) const;
- virtual int GetGlobalVarIndexByDecl(const char *decl) const;
- virtual const char *GetGlobalVarDeclaration(asUINT index, bool includeNamespace) const;
- virtual int GetGlobalVar(asUINT index, const char **name, const char **nameSpace, int *typeId, bool *isConst) const;
- virtual void *GetAddressOfGlobalVar(asUINT index);
- virtual int RemoveGlobalVar(asUINT index);
- // Type identification
- virtual asUINT GetObjectTypeCount() const;
- virtual asITypeInfo *GetObjectTypeByIndex(asUINT index) const;
- virtual int GetTypeIdByDecl(const char *decl) const;
- virtual asITypeInfo *GetTypeInfoByName(const char *name) const;
- virtual asITypeInfo *GetTypeInfoByDecl(const char *decl) const;
- // Enums
- virtual asUINT GetEnumCount() const;
- virtual asITypeInfo *GetEnumByIndex(asUINT index) const;
- // Typedefs
- virtual asUINT GetTypedefCount() const;
- virtual asITypeInfo *GetTypedefByIndex(asUINT index) const;
- // Dynamic binding between modules
- virtual asUINT GetImportedFunctionCount() const;
- virtual int GetImportedFunctionIndexByDecl(const char *decl) const;
- virtual const char *GetImportedFunctionDeclaration(asUINT importIndex) const;
- virtual const char *GetImportedFunctionSourceModule(asUINT importIndex) const;
- virtual int BindImportedFunction(asUINT index, asIScriptFunction *func);
- virtual int UnbindImportedFunction(asUINT importIndex);
- virtual int BindAllImportedFunctions();
- virtual int UnbindAllImportedFunctions();
- // Bytecode Saving/Loading
- virtual int SaveByteCode(asIBinaryStream *out, bool stripDebugInfo) const;
- virtual int LoadByteCode(asIBinaryStream *in, bool *wasDebugInfoStripped);
- // User data
- virtual void *SetUserData(void *data, asPWORD type);
- virtual void *GetUserData(asPWORD type) const;
- //-----------------------------------------------
- // Internal
- //-----------------------------------------------
- asCModule(const char *name, asCScriptEngine *engine);
- ~asCModule();
- //protected:
- friend class asCScriptEngine;
- friend class asCBuilder;
- friend class asCCompiler;
- friend class asCContext;
- friend class asCRestore;
- void InternalReset();
- bool IsEmpty() const;
- bool HasExternalReferences(bool shuttingDown);
- int CallInit(asIScriptContext *ctx);
- void CallExit();
- int InitGlobalProp(asCGlobalProperty *prop, asIScriptContext *ctx);
- void JITCompile();
- #ifndef AS_NO_COMPILER
- int AddScriptFunction(int sectionIdx, int declaredAt, int id, const asCString &name, const asCDataType &returnType, const asCArray<asCDataType> ¶ms, const asCArray<asCString> ¶mNames, const asCArray<asETypeModifiers> &inOutFlags, const asCArray<asCString *> &defaultArgs, bool isInterface, asCObjectType *objType = 0, bool isGlobalFunction = false, asSFunctionTraits funcTraits = asSFunctionTraits(), asSNameSpace *ns = 0);
- int AddScriptFunction(asCScriptFunction *func);
- int AddImportedFunction(int id, const asCString &name, const asCDataType &returnType, const asCArray<asCDataType> ¶ms, const asCArray<asETypeModifiers> &inOutFlags, const asCArray<asCString *> &defaultArgs, asSFunctionTraits funcTraits, asSNameSpace *ns, const asCString &moduleName);
- int AddFuncDef(const asCString &name, asSNameSpace *ns, asCObjectType *parent);
- #endif
- int GetNextImportedFunctionId();
- asCScriptFunction *GetImportedFunction(int funcId) const;
- asCTypeInfo *GetType(const asCString &type, asSNameSpace *ns) const;
- asCObjectType *GetObjectType(const char *type, asSNameSpace *ns) const;
- asCGlobalProperty *AllocateGlobalProperty(const char *name, const asCDataType &dt, asSNameSpace *ns);
- void UninitializeGlobalProp(asCGlobalProperty *prop);
-
- // Adds the class type to the module. The module assumes ownership of the reference without increasing it
- void AddClassType(asCObjectType*);
- // Adds the enum type to the module. The module assumes ownership of the reference without increasing it
- void AddEnumType(asCEnumType*);
- // Adds the typedef to the module. The module assumes ownership of the reference without increasing it
- void AddTypeDef(asCTypedefType*);
- // Adds the funcdef to the module. The module assumes ownership of the reference without increasing it
- void AddFuncDef(asCFuncdefType*);
- // Replaces an existing funcdef with another (used for shared funcdefs). Doesn't add or release refCounts
- void ReplaceFuncDef(asCFuncdefType *oldType, asCFuncdefType *newType);
- asCString m_name;
- asCScriptEngine *m_engine;
- asCBuilder *m_builder;
- asCArray<asPWORD> m_userData;
- asDWORD m_accessMask;
- asSNameSpace *m_defaultNamespace;
- // This array holds all functions, class members, factories, etc that were compiled with the module.
- // These references hold an internal reference to the function object.
- asCArray<asCScriptFunction *> m_scriptFunctions; // increases ref count
- // This array holds global functions declared in the module. These references are not counted,
- // as the same pointer is always present in the scriptFunctions array too.
- asCSymbolTable<asCScriptFunction> m_globalFunctions; // doesn't increase ref count
- // This array holds imported functions in the module.
- asCArray<sBindInfo *> m_bindInformations; // increases ref count
- // This array holds template instance types created for the module's object types
- asCArray<asCObjectType*> m_templateInstances; // increases ref count
- // This array holds the global variables declared in the script
- asCSymbolTable<asCGlobalProperty> m_scriptGlobals; // increases ref count
- bool m_isGlobalVarInitialized;
- // This array holds class and interface types
- asCArray<asCObjectType*> m_classTypes; // increases ref count
- // This array holds enum types
- asCArray<asCEnumType*> m_enumTypes; // increases ref count
- // This array holds typedefs
- asCArray<asCTypedefType*> m_typeDefs; // increases ref count
- // This array holds the funcdefs declared in the module
- asCArray<asCFuncdefType*> m_funcDefs; // increases ref count
- // This map contains all the types (also contained in the arrays above) for quick lookup
- // TODO: memory: Can we eliminate the arrays above?
- asCMap<asSNameSpaceNamePair, asCTypeInfo*> m_typeLookup; // doesn't increase ref count
- // This array holds types that have been explicitly declared with 'external'
- asCArray<asCTypeInfo*> m_externalTypes; // doesn't increase ref count
- // This array holds functions that have been explicitly declared with 'external'
- asCArray<asCScriptFunction*> m_externalFunctions; // doesn't increase ref count
- };
- END_AS_NAMESPACE
- #endif
|