Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Re-defining named functions at runtime

What I am trying to do is kind of odd, but I am wondering if anyone can come up with a clever way to do what I want to do. Basically, I want to re-define a named function at runtime. I can do this with anonymous functions, but I can't figure out a way to do it for named functions. I want to do this so that I can implement a "spy" functionality on an object for a testing framework (a port of Jasmine to Flex).

Take, for instance, this class:

public class TestClass
{
    public var anonymous:Function = function():void { 
        trace("original anonymous"); 
    };

    public function named():void {
        trace("original named");
    }
}

I can easily re-define the anonymous function because it is just a variable. Javascript uses this idiom a lot.

var testClass:TestClass = new TestClass();
testClass.anonymous = function():void { trace("overridden anonymous"); }

BUT, when I do the same thing for named functions, you get a compile-time error:

// Does not compile
testClass.named = function():void { trace("overridden named"); }

I tried to make it a bit more "squishy" but this leads to a runtime failure "Cannot assign to a method named on TestClass".

// Compiles with runtime failure
testClass["named"] = function():void { trace("overridden named"); }

Can anyone more clever than I come up with a way to hack this? Can the bytecode be hijacked? Something?

like image 223
Brian Genisio Avatar asked Dec 28 '25 22:12

Brian Genisio


1 Answers

I want to modify an object, not a class

But object doesn't contain functions, only non-static variables. I tried to use prototype property and replace method there, but original method still gets called instead of injected one.

About "hack" bytecode, do you mean "hack" already loaded SWF in runtime? I think it's not possible. I'm sure, though, you can parse SWF with something like as3swf, find method in bytecode, replace it and save result in new SWF.

like image 61
alxx Avatar answered Dec 31 '25 00:12

alxx



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!