运行$COMPILE目标代码,而不将其保存到全局优先



Caché 提供了将源代码字符串数组转换为目标代码的$COMPILE函数。object参数允许您将二进制对象数据保存到局部数组变量中,而不会影响任何全局数组。

该文档解释说,您可以将例程的^rOBJ(routine)中的数据替换为object参数中返回的行,这将更改运行routine的程序。

我的问题是,我可以在不修改任何全局变量的情况下直接运行object数组(例如,先将行保存在^rOBJ中(吗?我的代码字符串由外部应用程序动态生成,无法预加载到例程中。

我想限制调用程序对整个系统的访问。有权修改^rOBJ意味着能够更改控制系统的应用程序例程。这也意味着我必须维护一堆临时例程,确保即使作业意外终止,它们也会在外部进程中得到清理。

目前,我使用XECUTE直接运行代码行,但我宁愿使用编译后的代码,因为它更快。

我找不到直接运行$COMPILE代码的方法。不过,我确实找到了解决方法:

XECUTE,您可以ZLOAD一个通用的空模板例程,然后ZINSERT要编译但不能ZSAVE的代码,以便更改对当前进程保持私有。然后可以DO到您刚才插入的例程的本地"例程缓冲区"版本(显然是编译的和所有内容(并运行上传的代码。

从我的测试中,我发现如果我从XECUTE返回,$ZNAME会恢复到调用例程,并且ZINSERT中上传的更改会恢复。因此,重要的是在同一条XECUTE行中完成ZLOADZINSERTDO