Browse Source

Reverted the AngelScript workarounds. Instead applied a fix to the Android function call asm code.

Lasse Öörni 13 years ago
parent
commit
35416390b6

+ 2 - 3
Engine/Engine/CoreAPI.cpp

@@ -222,8 +222,7 @@ static void ConstructVariantBool(bool value, Variant* ptr)
     new(ptr) Variant(value);
     new(ptr) Variant(value);
 }
 }
 
 
-// Workaround for asCALL_CDECL_OBJLAST trashing the first float parameter on Android
-static void ConstructVariantFloat(Variant* ptr, float value)
+static void ConstructVariantFloat(float value, Variant* ptr)
 {
 {
     new(ptr) Variant(value);
     new(ptr) Variant(value);
 }
 }
@@ -427,7 +426,7 @@ static void RegisterVariant(asIScriptEngine* engine)
     engine->RegisterObjectBehaviour("Variant", asBEHAVE_CONSTRUCT, "void f(const StringHash&in)", asFUNCTION(ConstructVariantStringHash), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectBehaviour("Variant", asBEHAVE_CONSTRUCT, "void f(const StringHash&in)", asFUNCTION(ConstructVariantStringHash), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectBehaviour("Variant", asBEHAVE_CONSTRUCT, "void f(const ShortStringHash&in)", asFUNCTION(ConstructVariantShortStringHash), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectBehaviour("Variant", asBEHAVE_CONSTRUCT, "void f(const ShortStringHash&in)", asFUNCTION(ConstructVariantShortStringHash), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectBehaviour("Variant", asBEHAVE_CONSTRUCT, "void f(bool)", asFUNCTION(ConstructVariantBool), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectBehaviour("Variant", asBEHAVE_CONSTRUCT, "void f(bool)", asFUNCTION(ConstructVariantBool), asCALL_CDECL_OBJLAST);
-    engine->RegisterObjectBehaviour("Variant", asBEHAVE_CONSTRUCT, "void f(float)", asFUNCTION(ConstructVariantFloat), asCALL_CDECL_OBJFIRST);
+    engine->RegisterObjectBehaviour("Variant", asBEHAVE_CONSTRUCT, "void f(float)", asFUNCTION(ConstructVariantFloat), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectBehaviour("Variant", asBEHAVE_CONSTRUCT, "void f(const Vector2&in)", asFUNCTION(ConstructVariantVector2), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectBehaviour("Variant", asBEHAVE_CONSTRUCT, "void f(const Vector2&in)", asFUNCTION(ConstructVariantVector2), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectBehaviour("Variant", asBEHAVE_CONSTRUCT, "void f(const Vector3&in)", asFUNCTION(ConstructVariantVector3), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectBehaviour("Variant", asBEHAVE_CONSTRUCT, "void f(const Vector3&in)", asFUNCTION(ConstructVariantVector3), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectBehaviour("Variant", asBEHAVE_CONSTRUCT, "void f(const Vector4&in)", asFUNCTION(ConstructVariantVector4), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectBehaviour("Variant", asBEHAVE_CONSTRUCT, "void f(const Vector4&in)", asFUNCTION(ConstructVariantVector4), asCALL_CDECL_OBJLAST);

+ 10 - 15
Engine/Script/Addons.cpp

@@ -1022,8 +1022,7 @@ static void ConstructStringUInt(unsigned value, String* ptr)
     new(ptr) String(value);
     new(ptr) String(value);
 }
 }
 
 
-// Workaround for asCALL_CDECL_OBJLAST trashing the first float parameter on Android
-static void ConstructStringFloat(String* ptr, float value)
+static void ConstructStringFloat(float value, String* ptr)
 {
 {
     new(ptr) String(value);
     new(ptr) String(value);
 }
 }
@@ -1077,28 +1076,24 @@ static String StringAddUIntReverse(unsigned value, const String& str)
     return String(value) + str;
     return String(value) + str;
 }
 }
 
 
-// Workaround for asCALL_CDECL_OBJLAST trashing the first float parameter on Android
-static String& StringAssignFloat(String& str, float value)
+static String& StringAssignFloat(float value, String& str)
 {
 {
     str = String(value);
     str = String(value);
     return str;
     return str;
 }
 }
 
 
-// Workaround for asCALL_CDECL_OBJLAST trashing the first float parameter on Android
-static String& StringAddAssignFloat(String& str, float value)
+static String& StringAddAssignFloat(float value, String& str)
 {
 {
     str += String(value);
     str += String(value);
     return str;
     return str;
 }
 }
 
 
-// Workaround for asCALL_CDECL_OBJLAST trashing the first float parameter on Android
-static String StringAddFloat(const String& str, float value)
+static String StringAddFloat(float value, const String& str)
 {
 {
     return str + String(value);
     return str + String(value);
 }
 }
 
 
-// Workaround for asCALL_CDECL_OBJLAST trashing the first float parameter on Android
-static String StringAddFloatReverse(const String& str, float value)
+static String StringAddFloatReverse(float value, const String& str)
 {
 {
     return String(value) + str;
     return String(value) + str;
 }
 }
@@ -1176,7 +1171,7 @@ void RegisterString(asIScriptEngine *engine)
     // Register automatic conversion functions for convenience
     // Register automatic conversion functions for convenience
     engine->RegisterObjectBehaviour("String", asBEHAVE_CONSTRUCT, "void f(int)", asFUNCTION(ConstructStringInt), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectBehaviour("String", asBEHAVE_CONSTRUCT, "void f(int)", asFUNCTION(ConstructStringInt), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectBehaviour("String", asBEHAVE_CONSTRUCT, "void f(uint)", asFUNCTION(ConstructStringUInt), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectBehaviour("String", asBEHAVE_CONSTRUCT, "void f(uint)", asFUNCTION(ConstructStringUInt), asCALL_CDECL_OBJLAST);
-    engine->RegisterObjectBehaviour("String", asBEHAVE_CONSTRUCT, "void f(float)", asFUNCTION(ConstructStringFloat), asCALL_CDECL_OBJFIRST);
+    engine->RegisterObjectBehaviour("String", asBEHAVE_CONSTRUCT, "void f(float)", asFUNCTION(ConstructStringFloat), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectBehaviour("String", asBEHAVE_CONSTRUCT, "void f(bool)", asFUNCTION(ConstructStringBool), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectBehaviour("String", asBEHAVE_CONSTRUCT, "void f(bool)", asFUNCTION(ConstructStringBool), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectMethod("String", "String& opAssign(int)", asFUNCTION(StringAssignInt), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectMethod("String", "String& opAssign(int)", asFUNCTION(StringAssignInt), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectMethod("String", "String& opAddAssign(int)", asFUNCTION(StringAddAssignInt), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectMethod("String", "String& opAddAssign(int)", asFUNCTION(StringAddAssignInt), asCALL_CDECL_OBJLAST);
@@ -1186,10 +1181,10 @@ void RegisterString(asIScriptEngine *engine)
     engine->RegisterObjectMethod("String", "String& opAddAssign(uint)", asFUNCTION(StringAddAssignUInt), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectMethod("String", "String& opAddAssign(uint)", asFUNCTION(StringAddAssignUInt), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectMethod("String", "String opAdd(uint) const", asFUNCTION(StringAddUInt), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectMethod("String", "String opAdd(uint) const", asFUNCTION(StringAddUInt), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectMethod("String", "String opAdd_r(uint) const", asFUNCTION(StringAddUIntReverse), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectMethod("String", "String opAdd_r(uint) const", asFUNCTION(StringAddUIntReverse), asCALL_CDECL_OBJLAST);
-    engine->RegisterObjectMethod("String", "String& opAssign(float)", asFUNCTION(StringAssignFloat), asCALL_CDECL_OBJFIRST);
-    engine->RegisterObjectMethod("String", "String& opAddAssign(float)", asFUNCTION(StringAddAssignFloat), asCALL_CDECL_OBJFIRST);
-    engine->RegisterObjectMethod("String", "String opAdd(float) const", asFUNCTION(StringAddFloat), asCALL_CDECL_OBJFIRST);
-    engine->RegisterObjectMethod("String", "String opAdd_r(float) const", asFUNCTION(StringAddFloatReverse), asCALL_CDECL_OBJFIRST);
+    engine->RegisterObjectMethod("String", "String& opAssign(float)", asFUNCTION(StringAssignFloat), asCALL_CDECL_OBJLAST);
+    engine->RegisterObjectMethod("String", "String& opAddAssign(float)", asFUNCTION(StringAddAssignFloat), asCALL_CDECL_OBJLAST);
+    engine->RegisterObjectMethod("String", "String opAdd(float) const", asFUNCTION(StringAddFloat), asCALL_CDECL_OBJLAST);
+    engine->RegisterObjectMethod("String", "String opAdd_r(float) const", asFUNCTION(StringAddFloatReverse), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectMethod("String", "String& opAssign(bool)", asFUNCTION(StringAssignBool), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectMethod("String", "String& opAssign(bool)", asFUNCTION(StringAssignBool), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectMethod("String", "String& opAddAssign(bool)", asFUNCTION(StringAddAssignBool), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectMethod("String", "String& opAddAssign(bool)", asFUNCTION(StringAddAssignBool), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectMethod("String", "String opAdd(bool) const", asFUNCTION(StringAddBool), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectMethod("String", "String opAdd(bool) const", asFUNCTION(StringAddBool), asCALL_CDECL_OBJLAST);

+ 5 - 2
ThirdParty/AngelScript/source/as_callfunc_arm_gcc.S

@@ -28,6 +28,7 @@
   [email protected]
   [email protected]
 */
 */
 
 
+// Modified by Lasse Öörni for Urho3D
 
 
 // Assembly routines for the ARM call convention
 // Assembly routines for the ARM call convention
 // Written by Fredrik Ehnbom in June 2009
 // Written by Fredrik Ehnbom in June 2009
@@ -86,6 +87,7 @@ armFuncObjLast:
 
 
     mov     r0, r3          // objlast. might get overwritten
     mov     r0, r3          // objlast. might get overwritten
     str     r3, [sp, #-4]!  // objlast again.
     str     r3, [sp, #-4]!  // objlast again.
+    str     r3, [sp, #-4]!  // push object ptr twice to ensure 8-byte stack alignment needed by EABI
 
 
     beq     nomoreargsarmFuncObjLast
     beq     nomoreargsarmFuncObjLast
 
 
@@ -116,13 +118,14 @@ nomoreargsarmFuncObjLast:
     sub     sp, sp, r8
     sub     sp, sp, r8
     blx     r4
     blx     r4
     add     sp, sp, r8
     add     sp, sp, r8
-    add     sp, sp, #4
+    add     sp, sp, #8 // cleanup 2 copies of the object ptr
     ldmia   sp!, {r4-r8, pc}
     ldmia   sp!, {r4-r8, pc}
 
 
 armFuncR0ObjLast:
 armFuncR0ObjLast:
     stmdb   sp!, {r4-r8, lr}
     stmdb   sp!, {r4-r8, lr}
     ldr     r7, [sp,#6*4]
     ldr     r7, [sp,#6*4]
     str     r7, [sp,#-4]!
     str     r7, [sp,#-4]!
+    str     r7, [sp,#-4]! // push object ptr twice to ensure 8-byte stack alignment needed by EABI
 
 
     mov     r6, r0  // arg table
     mov     r6, r0  // arg table
     movs    r7, r1  // arg size (also set the condition code flags so that we detect if there are no arguments)
     movs    r7, r1  // arg size (also set the condition code flags so that we detect if there are no arguments)
@@ -158,7 +161,7 @@ nomoreargsarmFuncR0ObjLast:
     sub     sp, sp, r8
     sub     sp, sp, r8
     blx     r4
     blx     r4
     add     sp, sp, r8
     add     sp, sp, r8
-    add     sp, sp, #4
+    add     sp, sp, #8 // cleanup 2 copies of the object ptr
     ldmia   sp!, {r4-r8, pc}
     ldmia   sp!, {r4-r8, pc}