what have I stumbled upon this time?
Hello ChucKers, Has anyone ever seen the value of a method parameter change based on the value of some other method parameter? The following class, when run after the LiCK library has been loaded, public class MethodNameBug { fun void methodName(int intValue) { <<<"methodName(int)",intValue>>>; } fun void methodName(float floatValue) { <<<"methodName(float)",floatValue>>>; } fun void methodName(int intValue, dur duration, Interpolation interpolation) { <<<"methodName(int, dur, Interpolation)",intValue,duration,interpolation>>>; } } MethodNameBug bug; bug.methodName(60); bug.methodName(2.0); CubicIn cubicIn; bug.methodName(60, 1::minute, cubicIn); 2::second => now; results in "LiCK imported." : (string) [chuck](VM): sporking incoming shred: 1 (MethodNameBug.ck)... methodName(int) 60 methodName(float) 2.000000 methodName(int, dur, Interpolation) 1078853632 2646000.000000 0x4eef80 Somehow the int value 60 passed in as intValue parameter is interpreted as 1078853632 in the methodName(int, dur, Interpolation) method call. Now here's where it gets odd. CubicIn is a LiCK class that extends from Interpolation, and Interpolation extends FloatFunction, all short functor-style classes CubicIn.ck: public class CubicIn extends Interpolation { fun float evaluate(float value) { return Math.pow(value, 3.0); } } Interpolation.ck: public class Interpolation extends FloatFunction { // empty } FloatFunction.ck: public class FloatFunction { 0.0 => float default; fun float evaluate(float value) { return default; } } If instead I instantiate and pass an interpolation instead Interpolation interpolation; bug.methodName(60, 1::minute, interpolation); it works. "LiCK imported." : (string) [chuck](VM): sporking incoming shred: 1 (MethodNameBug.ck)... methodName(int) 60 methodName(float) 2.000000 methodName(int, dur, Interpolation) 60 2646000.000000 0x69dfe0 Changing the method signature to accept an Object, or a string, or another primitive value also works. Object object; bug.methodName(60, 1::minute, object); methodName(int, dur, object) 60 2646000.000000 0x110b830 bug.methodName(60, 1::minute, "message"); methodName(int, dur, string) 60 2646000.000000 message bug.methodName(60, 1::minute, 42); methodName(int, dur, int) 60 2646000.000000 42 I have a special set of swear words reserved for ChucK, and I'm afraid I've use them all up by this point. Any ideas? michael
participants (1)
-
Michael Heuer