我有一些旧代码正在尝试清理一个使用 Adobe Crossbridge 管理 C++ 后端和 AS3 前端的项目。代码没有充分利用互操作功能,我正在努力实现这一目标,但所有文档似乎都过时了,似乎没有任何活跃的论坛,每当我尝试大部分例如,它们似乎不起作用,所以我从一些更简单的转换开始,以便更适应它。
现在我在使用 package_as3 导入 AS3 类时遇到问题。这是我们拥有的一些命名空间的一个过于简单的示例:
namespace A
{
inline void func1(int a, int b)
{
inline_nonreentrant_as3("import MyAS3Class;");
inline_nonreentrant_as3("MyAS3Class.func1(%0, %1);" :: "r"(a), "r"(b));
}
inline void func2(int x, int y)
{
inline_nonreentrant_as3("import MyAS3Class;");
inline_nonreentrant_as3("MyAS3Class.func2(%0, %1);" :: "r"(x), "r"(y));
}
}
namespace B
{
inline void func1(int a, int b)
{
inline_nonreentrant_as3("import com.packagename.MyOtherAS3Class;");
inline_nonreentrant_as3("MyOtherAS3Class.func1(%0, %1);" :: "r"(a), "r"(b));
}
inline void func2(int x, int y)
{
inline_nonreentrant_as3("import com.packagename.MyOtherAS3Class;");
inline_nonreentrant_as3("MyOtherAS3Class.func2(%0, %1);" :: "r"(x), "r"(y));
}
}
此代码有效,但我不确定编译器是否可以优化重复导入,尤其是在随后调用同一函数时,但如果除了可读性之外没有其他原因,拉出导入似乎是合理的。所以我尝试这样做,使用 package_as3,如下所示:
namespace A
{
package_as3("import MyAS3Class;");
inline void func1(int a, int b)
{
inline_nonreentrant_as3("MyAS3Class.func1(%0, %1);" :: "r"(a), "r"(b));
}
inline void func2(int x, int y)
{
inline_nonreentrant_as3("MyAS3Class.func2(%0, %1);" :: "r"(x), "r"(y));
}
}
namespace B
{
package_as3("import com.packagename.MyOtherAS3Class;");
inline void func1(int a, int b)
{
inline_nonreentrant_as3("MyOtherAS3Class.func1(%0, %1);" :: "r"(a), "r"(b));
}
inline void func2(int x, int y)
{
inline_nonreentrant_as3("MyOtherAS3Class.func2(%0, %1);" :: "r"(x), "r"(y));
}
}
有趣的是,调用命名空间 A 中的函数可以正常工作,但调用命名空间 B 中的函数会在运行时导致 ReferenceError。
[Fault] exception, information=ReferenceError: Error #1065: Variable MyOtherAS3Class is not defined.
就像我说的,这个例子非常简化,但据我所知,两者之间唯一真正的区别是一个 AS3 类 (MyAS3Class) 位于项目源代码的根目录,而另一个 (MyOtherAS3Class ) 不是。我曾尝试使用完全限定名称(即 com.packagename.MyOtherAS3Class.func1(...))等,但后来我得到了相同的 ReferenceError,说“未定义变量 com”。有谁知道这里发生了什么?