apache-flexavm2

Subclassing a private (support) class in AVM2


I am developing a dynamic mocking framework for Flex/AS3 and am having trouble with private/support types (ie. those declared outside the package {} in a class file).

In my ABC "file", I am declaring the instance with the PROTECTED_NAMESPACE class flag and with a PRIVATE_NS multiname. I have also experimented with giving it the same namespace as the class it is subclassing (eg. PRIVATE_NS("ContainerClass.as$123")).

No matter what I do, I always get the following error after loadBytes:

VerifyError: Error #1014: Class ContainerClass.as$123::PrivateClass could not be found.

I have experimented with loading the generated bytecode into the same ApplicationDomain as the private class (I use a child domain by default). I even tried registering a class alias before the load (though that was a bit of a stretch).

Am I forgetting anything or is it simply a restriction of the AVM?

Please note that I am fully aware that this is illegal in ActionScript 3.0, I am looking for whether this is actually possible in the AVM.

Edit: For those interested in the work so far, the project is asmock and is on sourceforge.


Solution

  • Having gone back to look at this problem in ernest, I can definitively answer this question: private classes can only be referenced from the LoaderContext that loaded them

    I have been able to add support for private interfaces by reproducing the interface in the loaded ABC 'file', but it cannot be coerced/cast back to the original private interface.

    This is still useful for my requirements, as a private interface can be used to combine multiple interfaces.