Caché 提供了将源代码字符串数组转换为目标代码的$COMPILE
函数。object
参数允许您将二进制对象数据保存到局部数组变量中,而不会影响任何全局数组。
该文档解释说,您可以将例程的^rOBJ(routine)
中的数据替换为object
参数中返回的行,这将更改运行routine
的程序。
我的问题是,我可以在不修改任何全局变量的情况下直接运行object
数组(例如,先将行保存在^rOBJ
中(吗?我的代码字符串由外部应用程序动态生成,无法预加载到例程中。
我想限制调用程序对整个系统的访问。有权修改^rOBJ
意味着能够更改控制系统的应用程序例程。这也意味着我必须维护一堆临时例程,确保即使作业意外终止,它们也会在外部进程中得到清理。
目前,我使用XECUTE
直接运行代码行,但我宁愿使用编译后的代码,因为它更快。
我找不到直接运行$COMPILE
代码的方法。不过,我确实找到了解决方法:
从XECUTE
,您可以ZLOAD
一个通用的空模板例程,然后ZINSERT
要编译但不能ZSAVE
的代码,以便更改对当前进程保持私有。然后可以DO
到您刚才插入的例程的本地"例程缓冲区"版本(显然是编译的和所有内容(并运行上传的代码。
从我的测试中,我发现如果我从XECUTE
返回,$ZNAME
会恢复到调用例程,并且ZINSERT
中上传的更改会恢复。因此,重要的是在同一条XECUTE
行中完成ZLOAD
,ZINSERT
和DO
。