diff --git a/src/hx/cppia/CppiaCompiler.cpp b/src/hx/cppia/CppiaCompiler.cpp index e6f8087e9..3d16cd81f 100644 --- a/src/hx/cppia/CppiaCompiler.cpp +++ b/src/hx/cppia/CppiaCompiler.cpp @@ -898,7 +898,7 @@ class CppiaJitCompiler : public CppiaCompiler { if (inSrc.uses(SLJIT_R1)) { - move(sJitArg0, inSrc); + move(sJitArg0.as(jtInt), inSrc.as(jtInt)); add( sJitTemp1, inTarget.getReg(), inTarget.offset ); callNative( (void *)intToStr, sJitArg0.as(jtInt), sJitTemp1.as(jtPointer)); } @@ -917,7 +917,7 @@ class CppiaJitCompiler : public CppiaCompiler case etObject: if (inSrc.uses(SLJIT_R1)) { - move(sJitArg0, inSrc); + move(sJitArg0.as(jtPointer), inSrc.as(jtPointer)); add( sJitTemp1, inTarget.getReg(), inTarget.offset ); callNative( (void *)objToStr, sJitArg0.as(jtPointer), sJitTemp1.as(jtPointer) ); } @@ -944,7 +944,7 @@ class CppiaJitCompiler : public CppiaCompiler case etObject: if (inSrc==sJitTemp1) { - move(sJitArg0, inSrc); + move(sJitArg0.as(jtPointer), inSrc.as(jtPointer)); makeAddress(sJitTemp1,inTarget); callNative( (void *)objToFloat, sJitArg0.as(jtPointer), sJitTemp1.as(jtPointer)); } diff --git a/test/cppia/Client.hx b/test/cppia/Client.hx index 710373f4b..c9b733f84 100644 --- a/test/cppia/Client.hx +++ b/test/cppia/Client.hx @@ -14,6 +14,16 @@ class ClientFoo implements IFoo { } } +class ClientUntypedMove { + + public static function subtractIndexed():String { + var a:Int = 2; + var ints:Array = [7,8,9]; + + return "" + (ints[a - 1] - ints[0]); + } +} + class Client { public static var clientBool0 = true; diff --git a/test/cppia/cases/TestCommon.hx b/test/cppia/cases/TestCommon.hx index eaacb5a76..7a32b9f36 100644 --- a/test/cppia/cases/TestCommon.hx +++ b/test/cppia/cases/TestCommon.hx @@ -59,6 +59,16 @@ class TestCommon extends Test { Assert.equals(2, Common.callbackSet, 'Bad cppia closure'); } + @:depends(testStatus) + function testUntypedRegisterMove() { + final cls = Type.resolveClass('ClientUntypedMove'); + + if (Assert.notNull(cls, 'Unable to resolve ClientUntypedMove')) { + Assert.equals('1', Std.string(Reflect.callMethod(null, Reflect.field(cls, 'subtractIndexed'), [])), + 'Subtracting two array elements into a string did not answer'); + } + } + @:depends(testStatus) function testInterfaceCalling() { final obj : IFoo = Type.createInstance(Type.resolveClass('ClientFoo'), []);