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
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
|
#include "UnityPrefix.h"
#include "../ScriptingTypes.h"
#include "ScriptingBackendApi_Flash.h"
#include "../ScriptingTypeRegistry.h"
#include "../ScriptingMethodRegistry.h"
#include <string>
#include "../ScriptingArguments.h"
#include "PlatformDependent\FlashSupport\cpp\FlashUtils.h"
std::string scripting_cpp_string_for(ScriptingStringPtr str)
{
return std::string((const char*)str);
}
//implemented in raw actionscript
extern "C" ScriptingClass* Ext_Flash_GetBaseClassFromScriptingClass(ScriptingClass* klass);
bool scripting_method_is_instance(ScriptingMethodPtr method)
{
//not implemented on flash yet.
return true;
}
ScriptingStringPtr scripting_string_new(const char* str)
{
__asm __volatile__("returnString = strFromPtr(%0);" : : "r" (str) );
return (ScriptingStringPtr)str;
}
ScriptingStringPtr scripting_string_new(const std::string& str)
{
return scripting_string_new(str.c_str());
}
extern "C" int Ext_Flash_ScriptingGetMethodParamCount(ScriptingObjectPtr object, AS3String as3String);
int scripting_method_get_argument_count(ScriptingMethodPtr method, ScriptingTypeRegistry& typeRegistry)
{
ScriptingObjectPtr methodInfo = method->GetSystemReflectionMethodInfo();
if (methodInfo==NULL)
return 0;
int result;
FLASH_ASM_WITH_NEWSP("%0 = ScriptingMethodHelper.NumberOfArgumentsOf(marshallmap.getObjectWithId(%1));" : "=r"(result) : "r"(methodInfo));
return result;
}
ScriptingTypePtr scripting_method_get_nth_argumenttype(ScriptingMethodPtr method, int index, ScriptingTypeRegistry& typeRegistry)
{
ScriptingObjectPtr methodInfo = method->GetSystemReflectionMethodInfo();
if (methodInfo==NULL)
return NULL;
ScriptingTypePtr result;
FLASH_ASM_WITH_NEWSP("scratch_object = ScriptingMethodHelper.NthArgumentType(marshallmap.getObjectWithId(%0), %1)" : : "r"(methodInfo), "r"(index));
FLASH_ASM_WITH_NEWSP("if (scratch_object!=null) %0 = marshallmap.getIdForObject(scratch_object.GetClass()); else %0 = 0;" : "=r"(result));
return result;
}
const char* scripting_method_get_name(ScriptingMethodPtr method)
{
return method->GetName();
}
bool scripting_method_has_attribute (ScriptingMethodPtr method, ScriptingClassPtr attribute)
{
//not implemented on flash yet
return false;
}
ScriptingTypePtr scripting_class_get_parent(ScriptingTypePtr type, ScriptingTypeRegistry& typeRegistry)
{
return Ext_Flash_GetBaseClassFromScriptingClass(type);
}
bool scripting_class_is_enum(ScriptingTypePtr type)
{
//todo: implement
return false;
}
extern "C" const char* Ext_Flash_GetNameFromClass(ScriptingClassPtr klass);
const char* scripting_class_get_name(ScriptingClassPtr klass)
{
//Horrible, we can only clean this up once we create a struct ScriptingClass for flash.
std::string* s = new std::string(Ext_Flash_GetNameFromClass(klass));
return s->c_str();
}
extern "C" const char* Ext_Flash_GetNameSpaceFromScriptingType(ScriptingType* scriptingType);
const char* scripting_class_get_namespace(ScriptingClassPtr klass)
{
//Horrible, we can only clean this up once we create a struct ScriptingClass for flash.
std::string* s = new std::string(Ext_Flash_GetNameSpaceFromScriptingType(klass));
return s->c_str();
}
extern "C" bool Ext_Flash_ScriptingClassIsSubclassOf(ScriptingTypePtr t1, ScriptingTypePtr t2);
bool scripting_class_is_subclass_of(ScriptingTypePtr t1, ScriptingTypePtr t2)
{
return Ext_Flash_ScriptingClassIsSubclassOf(t1,t2);
}
ScriptingTypePtr scripting_method_get_returntype(ScriptingMethodPtr method, ScriptingTypeRegistry& typeRegistry)
{
return method->GetReturnType();
}
extern "C" ScriptingObjectPtr Ext_Flash_InvokeMethodOnObject(void* object, AS3String as3String, ScriptingException** exception);
ScriptingObjectPtr scripting_method_invoke(ScriptingMethodPtr method, ScriptingObjectPtr object, ScriptingArguments& arguments, ScriptingExceptionPtr* exception)
{
void* objectToInvokeOn = object;
*exception = NULL;
if (object==NULL)
{
objectToInvokeOn = method->m_Class;
if (objectToInvokeOn == NULL)
ErrorString("flash_invoke_method called with NULL object, and scriptmethod->m_Class is NULL too.");
}
__asm __volatile__("invocation_arguments.length = 0;\n");
for (int i=0; i!=arguments.GetCount(); i++)
{
switch (arguments.GetTypeAt(i))
{
case ScriptingArguments::ARGTYPE_BOOLEAN:
__asm __volatile__("invocation_arguments.push(%0 ? true : false);" : : "r"(arguments.GetBooleanAt(i)));
break;
case ScriptingArguments::ARGTYPE_INT:
__asm __volatile__("invocation_arguments.push(%0);" : : "r"(arguments.GetIntAt(i)));
break;
case ScriptingArguments::ARGTYPE_FLOAT:
__asm __volatile__("invocation_arguments.push(%0);" : : "f"(arguments.GetFloatAt(i)));
break;
case ScriptingArguments::ARGTYPE_STRING:
__asm __volatile__("invocation_arguments.push(strFromPtr(%0));" : : "r"(arguments.GetStringAt(i)));
break;
case ScriptingArguments::ARGTYPE_OBJECT:
__asm __volatile__("invocation_arguments.push(marshallmap.getObjectWithId(%0));" : : "r"(arguments.GetObjectAt(i)));
break;
default:
ErrorString(Format("Flash does not support calling managed methods with this type of argument: %d",arguments.GetTypeAt(i)));
break;
}
}
return Ext_Flash_InvokeMethodOnObject(objectToInvokeOn, method->m_As3String,exception);
}
ScriptingTypePtr scripting_class_from_systemtypeinstance(ScriptingObjectPtr systemTypeInstance, ScriptingTypeRegistry& typeRegistry)
{
//todo: think about if this is actually correct.
return (ScriptingClassPtr)systemTypeInstance;
}
extern "C" ScriptingObjectPtr Ext_Flash_CreateInstance(ScriptingClass* klass);
ScriptingObjectPtr scripting_object_new(ScriptingTypePtr t)
{
return Ext_Flash_CreateInstance(t);
}
extern "C" ScriptingClassPtr Ext_Flash_GetScriptingTypeOfScriptingObject(ScriptingObjectPtr);
ScriptingTypePtr scripting_object_get_class(ScriptingObjectPtr o, ScriptingTypeRegistry& typeRegistry)
{
return Ext_Flash_GetScriptingTypeOfScriptingObject(o);
}
ScriptingMethodPtr scripting_object_get_virtual_method(ScriptingObjectPtr o, ScriptingMethodPtr method, ScriptingMethodRegistry& methodRegistry)
{
return method;
}
void scripting_object_invoke_default_constructor(ScriptingObjectPtr o, ScriptingExceptionPtr* exc)
{
*exc = NULL;
//todo: properly deal with exception.
FLASH_ASM_WITH_NEWSP("marshallmap.getObjectWithId(%0).cil2as_DefaultConstructor()" : : "r"(o));
}
int scripting_gchandle_new(ScriptingObjectPtr o)
{
__asm __volatile__("marshallmap.gcHandle(%0);" : : "r" (o));
return (int)o;
}
int scripting_gchandle_weak_new(ScriptingObjectPtr o)
{
FatalErrorMsg("ToDo");
return 0;
}
void scripting_gchandle_free(int handle)
{
__asm __volatile__("marshallmap.gcFree(%0);" : : "r" (handle));
}
ScriptingObjectPtr scripting_gchandle_get_target(int handle)
{
return (ScriptingObjectPtr) handle;
}
int scripting_gc_maxgeneration()
{
return 0;
}
void scripting_gc_collect(int maxGeneration)
{
FatalErrorMsg("ToDo");
}
void ScriptingMethod::Init(const char* name, const char* mappedName, const char* sig, ScriptingClass* klass)
{
m_Name = strcpy(new char[strlen(name) + 1],name);
m_Mappedname = strcpy(new char[strlen(mappedName) + 1],mappedName);
__asm __volatile__("%0 = getAS3StringForPtr(%1);\n" : "=r" (m_As3String) : "r" (m_Mappedname));
m_Signature = strcpy(new char[strlen(sig) + 1],sig);
m_Class = klass;
m_MethodInfo = NULL;
FLASH_ASM_WITH_NEWSP("%0 = marshallmap.getIdForObject(System.Type.ForClass(marshallmap.getObjectWithId(%1)));\n" : "=r" (m_SystemType) : "r"(m_Class) );
scripting_gchandle_new(m_SystemType);
}
extern "C" const char* Ext_GetMappedMethodName(const char* name, ScriptingType* klass);
ScriptingMethod::ScriptingMethod(const char* name, ScriptingClass* klass)
{
const char* mappedName = Ext_GetMappedMethodName(name,klass);
Init(name,mappedName,"",klass);
}
ScriptingMethod::ScriptingMethod(const char* name, const char* mappedName, const char* sig, ScriptingClass* klass)
{
Init(name,mappedName,sig,klass);
}
extern "C" ScriptingClass* Ext_Flash_GetMethodReturnType(const char* methodname, ScriptingClass* klass);
ScriptingClass* ScriptingMethod::GetReturnType()
{
return Ext_Flash_GetMethodReturnType(m_Mappedname, m_Class);
}
ScriptingObjectPtr ScriptingMethod::GetSystemReflectionMethodInfo()
{
if (m_MethodInfo)
return m_MethodInfo;
FLASH_ASM_WITH_NEWSP("%0 = marshallmap.getIdForObject(ScriptingMethodHelper.GetMethodInfo(marshallmap.getObjectWithId(%1), strFromPtr(%2)));" : "=r"(m_MethodInfo) : "r"(m_SystemType),"r"(m_Name) );
scripting_gchandle_new(m_MethodInfo);
return m_MethodInfo;
}
ScriptingObjectPtr scripting_class_get_object(ScriptingClassPtr klass)
{
FatalErrorMsg("ToDo");
return SCRIPTING_NULL;
}
ScriptingArrayPtr scripting_cast_object_to_array(ScriptingObjectPtr o)
{
FatalErrorMsg("ToDo");
return SCRIPTING_NULL;
}
void scripting_stack_trace_info_for(ScriptingExceptionPtr exception, StackTraceInfo& info)
{
AssertIf (exception == NULL);
__asm __volatile__("var errorStr:String = marshallmap.getObjectWithId(%0) as String;"::"r"(exception));
int length;
__asm __volatile__("%0=getStringMarshallingLength(errorStr);":"=r"(length));
char* errorStrPtr = (char*)alloca(length);
__asm __volatile__("var ptr:int = placeStringAtPtr(errorStr,%0);"::"r"(errorStrPtr));
info.condition = errorStrPtr;
info.strippedStacktrace = "";
info.stacktrace = "";
info.errorNum = 0;
info.file = "";
info.line = 0;
}
void* scripting_array_element_ptr(ScriptingArrayPtr array, int i, size_t element_size)
{
return (UInt8*)array + sizeof(int) + i * element_size;
}
|