File: as_module.h

package info (click to toggle)
scummvm 2.9.1%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 450,580 kB
  • sloc: cpp: 4,299,825; asm: 28,322; python: 12,901; sh: 11,302; java: 9,289; xml: 7,895; perl: 2,639; ansic: 2,465; yacc: 1,670; javascript: 1,020; makefile: 933; lex: 578; awk: 275; objc: 82; sed: 11; php: 1
file content (254 lines) | stat: -rw-r--r-- 11,197 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
/*
   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_memory.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> &params, const asCArray<asCString> &paramNames, 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> &params, 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