一种函数调用方法、装置、设备及存储介质与流程

未命名 09-24 阅读:96 评论:0


1.本公开涉及数据处理领域,尤其涉及一种函数调用方法、装置、设备及存储介质。


背景技术:

2.flutter是谷歌的移动端跨平台ui框架,可以快速在ios和android上构建高质量的原生用户界面。
3.然而,出于安全和性能的考虑,flutter不支持动态化,中间语言il的函数调用是实现基于il的解释执行器的基础,可以进一步丰富flutter动态化的实现,因此,如何实现il的函数调用是亟需解决的技术问题。


技术实现要素:

4.为了解决上述技术问题,本公开实施例提供了一种函数调用方法、装置、设备及存储介质。
5.第一方面,本公开实施例提供了一种函数调用方法,所述方法包括:
6.当接收到中间语言il函数调用指令时,获取il函数调用指令中携带的函数调用输入参数;
7.调用il函数加载器,查询是否存在函数调用输入参数对应的il函数;
8.如果确定存在函数调用输入参数对应的il函数,则将il函数确定为目标函数;
9.针对il函数调用指令,返回目标函数。
10.一种可选的实施方式中,调用il函数加载器,查询是否存在函数调用输入参数对应的il函数,包括:
11.调用il函数加载器,在缓存中查询是否存在函数调用输入参数对应的il函数;
12.如果确定缓存中不存在函数调用输入参数对应的il函数,则由il函数加载器在il函数查找表中查询函数调用输入参数对应的il函数;其中,il函数查找表中包括il静态函数与地址索引的对应关系以及il实例函数与名称索引的对应关系。
13.一种可选的实施方式中,针对il函数调用指令,返回目标函数之前,还包括:
14.如果确定不存在函数调用输入参数对应的il函数,则调用提前编译aot函数加载器,查询是否存在函数调用输入参数对应的aot函数;
15.如果确定存在函数调用输入参数对应的aot函数,则基于aot函数确定目标函数,继续执行针对il函数调用指令,返回目标函数的步骤。
16.一种可选的实施方式中,调用提前编译aot函数加载器,查询是否存在函数调用输入参数对应的aot函数,包括:
17.调用aot函数加载器,在缓存中查询是否存在函数调用输入参数对应的aot函数;
18.如果确定缓存中不存在函数调用输入参数对应的aot函数,则由aot函数加载器在aot函数查找表中,查询函数调用输入参数对应的aot函数;其中,aot函数查找表中包括aot静态函数与地址索引的对应关系以及aot实例函数与名称索引的对应关系。
19.一种可选的实施方式中,如果确定存在函数调用输入参数对应的aot函数,则基于aot函数确定目标函数,包括:
20.如果确定存在函数调用输入参数对应的aot函数,则获取aot函数对应的代理函数;其中,代理函数为基于预设第一数据结构对aot函数处理得到;
21.将aot函数对应的代理函数确定为目标函数。
22.一种可选的实施方式中,方法还包括:
23.当接收到针对已插桩函数的函数调用指令时,确定函数调用指令是否来自aot函数;
24.如果确定函数调用指令来自aot函数,则拦截函数调用指令,并针对函数调用指令,返回已插桩函数对应的il函数;其中,已插桩函数对应的il函数是基于预设第二数据结构承载已插桩函数的运行参数。
25.一种可选的实施方式中,目标函数的数据结构包括函数基础类、il函数类和aot函数类,il函数类和aot函数类均继承函数基础类,目标函数为il函数类描述的对象或者为aot函数类描述的对象。
26.第二方面,本公开还提供了一种函数调用装置,所述装置包括:
27.获取模块,用于当接收到中间语言il函数调用指令时,获取il函数调用指令中携带的函数调用输入参数;
28.查询模块,用于调用il函数加载器,查询是否存在函数调用输入参数对应的il函数;
29.第一确定模块,用于如果确定存在函数调用输入参数对应的il函数,则将il函数确定为目标函数;
30.第一返回模块,用于针对il函数调用指令,返回目标函数。
31.第三方面,本公开提供了一种计算机可读存储介质,所述计算机可读存储介质中存储有指令,当所述指令在终端设备上运行时,使得所述终端设备实现上述的方法。
32.第四方面,本公开提供了一种设备,包括:存储器,处理器,及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时,实现上述的方法。
33.第五方面,本公开提供了一种计算机程序产品,所述计算机程序产品包括计算机程序/指令,所述计算机程序/指令被处理器执行时实现上述的方法。
34.本公开实施例提供的技术方案与现有技术相比至少具有如下优点:
35.本公开实施例提供的函数调用的方法中,当接收到中间语言il函数调用指令时,获取il函数调用指令中携带的函数调用输入参数,调用il函数加载器,查询是否存在函数调用输入参数对应的il函数,如果确定存在函数调用输入参数对应的il函数,则将il函数确定为目标函数,针对il函数调用指令,返回目标函数,基于il函数加载器完成il函数调用,为实现基于il的解释执行器提供了基础,从而进一步实现flutter动态化能力。
附图说明
36.此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本公开的实施例,并与说明书一起用于解释本公开的原理。
37.为了更清楚地说明本公开实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,对于本领域普通技术人员而言,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
38.图1为本公开实施例提供的一种函数调用方法流程图;
39.图2为本公开实施例提供的一种il函数查找表示例图;
40.图3为本公开实施例提供的一种目标函数数据结构示意图;
41.图4为本公开实施例提供的另一种函数调用方法流程图;
42.图5为本公开实施例提供的一种aot函数查找表示例图;
43.图6为本公开实施例提供的一种函数调用方法的执行过程示意图;
44.图7为本公开实施例提供的一种函数调用装置的结构示意图;
45.图8为本公开实施例提供的一种函数调用设备的结构示意图。
具体实施方式
46.为了能够更清楚地理解本公开的上述目的、特征和优点,下面将对本公开的方案进行进一步描述。需要说明的是,在不冲突的情况下,本公开的实施例及实施例中的特征可以相互组合。
47.在下面的描述中阐述了很多具体细节以便于充分理解本公开,但本公开还可以采用其他不同于在此描述的方式来实施;显然,说明书中的实施例只是本公开的一部分实施例,而不是全部的实施例。
48.flutter是谷歌的移动端跨平台ui(user interface,用户界面)框架,可以快速在ios和android上构建高质量的原生用户界面,目前,flutter正在被越来越多的开发者和组织使用。
49.然而,出于安全和性能的考虑,flutter没有支持动态化能力,即无法执行远程下发的代码,il(intermediate language,中间语言)的函数调用是实现基于il的解释执行器的基础,可以进一步丰富flutter动态化的实现。
50.因此,为了保证flutter具有动态化能力,如何实现对il函数的调用,是目前亟需解决的技术问题。
51.为此,本公开提供了一种函数调用方法,当接收到中间语言il函数调用指令时,获取il函数调用指令中携带的函数调用输入参数,调用il函数加载器,查询是否存在函数调用输入参数对应的il函数,如果确定存在函数调用输入参数对应的il函数,则将il函数确定为目标函数,针对il函数调用指令,返回目标函数。
52.基于此,本公开实施例提供了一种函数调用方法,参考图1,为本公开实施例提供的一种函数调用方法流程图,该方法包括:
53.s101:当接收到中间语言il函数调用指令时,获取il函数调用指令中携带的函数调用输入参数。
54.其中,il函数调用指令用于实现il函数对其他函数发起的函数调用,具体地,il函数调用包括以下几种调用方式:
55.staticcall:静态调用,被调用的函数(即目标函数)地址在编译时已经确定;
56.instancecall:动态调用,被调用的函数(即目标函数)地址需在运行时由具体的
类确定;
57.closurecall:闭包调用,闭包是dart语法中的一个可执行代码块,当执行闭包时,需要通过该指令发起调用;
58.nativecall:本地调用,当从dart语言调用本地(如c、c++或者objectc)实现的代码时,需通过该指令发起调用。
59.在本公开实施例中,当接收到中间语言il函数调用指令时,根据il函数调用指令,获取il函数调用指令中携带的函数调用输入参数,例如:当il函数调用指令为staticcall时,获取il函数调用指令中携带的函数调用输入参数addr地址,根据地址查找对应的目标函数。
60.s102:调用il函数加载器,查询是否存在函数调用输入参数对应的il函数。
61.其中,il函数加载器用于根据函数调用输入参数查询是否存在相应的il函数,并对il函数进行加载。
62.在本公开实施例中,当接收到中间语言il函数调用指令时,获取il函数调用指令中携带的函数调用输入参数,调用il函数加载器,在缓存中查询是否存在函数调用输入参数对应的il函数,若缓存中存在函数调用输入参数对应的il函数,则将该il函数作为目标函数,其中,缓存中存储有近一段时间内被调用过的函数,il函数加载器能够优先从缓存中查询是否存在函数调用输入参数对应的il函数,以提升il函数的调用效率;若缓存中不存在函数调用参数对应的il函数,则继续在il函数查找表中查询是否存在函数调用输入参数对应的il函数,其中,il函数查找表中包括il静态函数与地址索引的对应关系以及il实例函数与名称索引的对应关系。
63.具体地,基于il文件中的il函数预先建立il函数查找表,其中,il文件中包括多个cfg(control flow graph,控制流图),cfg与il函数具有对应关系,用于存储对应的il函数中的数据。il函数包括il静态函数和il实例函数,由于il静态函数地址在编译时已经确定,因此可以基于地址来建立索引生成il静态函数与地址索引的对应关系;il实例函数地址编译时无法确定,需要根据运行时的对象实例来确定地址,因此需要通过名称如包名、类名、函数名建立索引生成il实例函数与名称索引的对应关系,为方便对il函数查找表的进一步理解,参考图2,为本公开实施例提供的一种il函数查找表示例图。
64.如图2所示,il函数1为il静态函数,可以通过全局唯一的一个地址来建立il函数1与地址0x239a87c1的映射关系,il函数2为实例函数,无法确定地址,可通过名称librarya.classa.funca来建立与il函数2的映射关系。
65.s103:如果确定存在函数调用输入参数对应的il函数,则将il函数确定为目标函数。
66.在本公开实施例中,在接收到中间语言il函数调用指令后,获取il函数调用指令中携带的函数调用输入参数,在缓存中进行查询,若缓存中存在函数调用输入参数对应的il函数,则将查找到的il函数确定为目标函数;若缓存中未查询到函数调用输入参数对应的il函数,继续在il函数查找表查找,并将查找到的il函数确定为目标函数。
67.s104:针对il函数调用指令,返回目标函数。
68.本公开实施例中,在获取到目标函数之后,针对接收到的il函数调用指令返回该目标函数,完成该il函数调用指令的函数调用。
69.一种可选的实施方式中,目标函数的数据结构可以包括函数基础类、il函数类和aot(ahead of time,提前编译)函数类,il函数类和aot函数类均继承函数基础类,目标函数为il函数类描述的对象或者为aot函数类描述的对象,具体如图3所示,为本公开实施例提供的一种目标函数数据结构示意图。
70.其中,函数基础类是所有函数的一个抽象描述,包含函数的基本信息如函数名、包名、类名等以及对外提供的能力如栈帧绑定、发起调用、栈帧解绑等;il函数类是il函数的描述即在il中定义的函数,除函数基础类包含的基本信息外,还包括代码块、参数描述、函数地址等信息,其中参数描述包含类型变量数、位置变量数、具名变量数等信息;aot函数类是aot函数的描述即不在il中定义的函数,除函数基础类包含的基本信息外,还包括aot函数对象及拆箱参数等。
71.本公开实施例提供的一种函数调用方法,当接收到中间语言il函数调用指令时,获取il函数调用指令中携带的函数调用输入参数,调用il函数加载器,查询是否存在函数调用输入参数对应的il函数,如果确定存在函数调用输入参数对应的il函数,则将il函数确定为目标函数,针对il函数调用指令,返回目标函数,基于il函数加载器完成il函数调用,为实现基于il的解释执行器提供了基础,从而进一步实现flutter动态化能力。
72.基于此,本公开实施例还提供了一种函数调用方法,参考图4,为本公开实施例提供的另一种函数调用方法流程图,该方法包括:
73.s401:当接收到中间语言il函数调用指令时,获取il函数调用指令中携带的函数调用输入参数。
74.s402:调用il函数加载器,查询是否存在函数调用输入参数对应的il函数。
75.需要说明的是,步骤401-402与上述步骤101-102相同,具体参见对步骤101-102的描述,此处不再详述。
76.s403:如果确定不存在函数调用输入参数对应的il函数,则调用提前编译aot函数加载器,查询是否存在函数调用输入参数对应的aot函数。
77.在本公开实施例中,若缓存中以及il函数查找表中均不存在函数调用输入参数对应的il函数,则调用aot函数加载器,在缓存中查询是否存在函数调用输入参数对应的aot函数,若缓存中存在函数调用输入参数对应的aot函数,则将该aot函数作为目标函数,其中,缓存中存储有近一段时间内被调用过的函数,aot函数加载器能够优先从缓存中查询是否存在函数调用输入参数对应的aot函数,以提升aot函数的调用效率;若缓存中不存在函数调用参数对应的aot函数,则继续在aot函数查找表中查询是否存在函数调用输入参数对应的aot函数,其中,aot函数查找表中包括aot静态函数与地址索引的对应关系以及aot实例函数与名称索引的对应关系,如果aot函数查找表中确定存在函数调用输入参数对应的aot函数,则获取aot函数对应的代理函数,将aot函数对应的代理函数确定为目标函数。
78.其中,代理函数为基于预设第一数据结构对aot函数处理得到,预设第一数据结构可以为堆栈式虚拟机支持的数据结构。代理函数具体是通过对aot函数进行包装,将aot函数转化成一个可以被il函数调用的形态,具体地,若根据函数调用输入参数进行查询,确定存在函数调用输入参数对应的aot函数时,需要通过一个中间转换,将aot函数转化成一个可以被il函数调用的形态,即对aot函数的一个包装,将il函数调用输入参数转换为aot函数可以接受的方式,再利用dart标准库中提供的function.apply()来发起实际对aot函数
的调用。
79.此外,为方便对aot函数查找表进一步理解,具体地参考图5,为本公开实施例提供的一种aot函数查找表示例图。
80.如图5所示,aot函数1为il静态函数,可以通过全局唯一的一个地址来建立aot函数1与地址0x8ef41183的映射关系,aot函数2为静态函数,无法确定地址,可通过名称librarya.classb.funce来建立与aot函数2的映射关系。
81.一种可选的实施方式中,aot函数查找表和il函数查找表可以构成函数查找表,用于基于函数调用输入参数查询对应的目标函数。
82.s404:如果确定存在函数调用输入参数对应的aot函数,则基于aot函数确定目标函数;
83.在本公开实施例中,在接收到中间语言il函数调用指令后,获取il函数调用指令中携带的函数调用输入参数,若确定不存在函数调用输入参数对应的il函数,则调用提前编译aot函数加载器,查询是否存在函数调用输入参数对应的aot函数,若存在函数调用输入参数对应的aot函数,则将该aot函数确定为目标函数。
84.s405:针对il函数调用指令,返回目标函数。
85.本公开实施例中,在获取到函数调用输入参数对应的aot函数之后,针对il函数调用指令返回该目标函数,完成该il函数调用指令的函数调用。
86.本公开实施例提供的一种函数调用方法,当接收到中间语言il函数调用指令时,获取il函数调用指令中携带的函数调用输入参数,调用il函数加载器,查询是否存在函数调用输入参数对应的il函数。如果确定不存在函数调用输入参数对应的il函数,则调用提前编译aot函数加载器,查询是否存在函数调用输入参数对应的aot函数,如果确定存在函数调用输入参数对应的aot函数,则基于aot函数确定目标函数,针对il函数调用指令,返回目标函数,本公开基于il函数调用指令中携带的函数调用输入参数,通过分级的方式,对目标函数进行查找,从而实现il函数调用,进一步实现flutter动态化。
87.在本公开一些实施例中,当接收到针对已插桩函数的函数调用指令时,首先确定函数调用指令是否来自aot函数,如果确定函数调用指令来自aot函数,则拦截函数调用指令,并针对该函数调用指令,返回该已插桩函数对应的il函数;其中,已插桩函数对应的il函数是基于预设第二数据结构承载已插桩函数的运行参数。
88.由于aot函数无法感知il函数,因此aot函数若具备调用il函数的能力,需在aot函数的调用处做拦截操作,将aot函数的执行逻辑替换成il函数的执行逻辑,而aot函数的拦截称为插桩,插桩位置可以根据预先基于功能需求确定,并完成插桩。
89.以state的initstate()方法进行“插桩”为例,state.initstate()方法是一个会被系统aot函数调用的函数,当il函数中包含state.initstate()方法时,表示该函数需要被解释执行。具体地,当接收到针对state.initstate()函数的函数调用指令时,首先判定调用方是否来自系统的aot函数,如果是,则对本次调用进行拦截,并针对该函数调用指令返回state.initstate()函数对应的il函数,如果确定调用方不是来自系统的aot函数,则直接调用state父类的initstate()函数。
90.为了便于对本公开实施例提供的函数调用方法的进一步理解,本公开实施例提供的一种函数调用方法的执行过程示意图,参考图6。
91.本公开设计了一个工具类il函数加载器,其保存了所有il函数,支持通过函数调用输入参数进行函数查找,同时本公开还设计了一个工具类aot函数加载器,其保存了所有的aot函数,支持通过函数调用输入参数进行函数查找。
92.具体地,当接收到中间语言il函数调用指令时,获取il函数调用指令中携带的函数调用输入参数,调用il函数加载器,查询是否存在函数调用输入参数对应的il函数,若存在则将对应的il函数确定为目标函数并根据il函数调用指令返回,若不存在则调用aot函数加载器将对应的aot函数确定为目标函数并根据il函数调用指令返回,为了更清楚的理解本公开实施例,将分别从以下两个部分进行具体阐述。
93.1.il函数中查找目标函数
94.在接收到函数调用输入参数时,调用il函数加载器,首先在缓存中进行查找,若缓存中存在函数调用输入参数对应的il函数,那么将该il函数作为目标函数并返回;若缓存中不存在调用输入参数对应的il函数,那么继续在il函数查找表中进行查找,其中il函数查找表基于控制流图构建,若il函数查找表中存在函数调用输入参数对应的il函数,那么将该il函数作为目标函数并返回,若不存在则进行下一级查找。
95.2.aot函数中查找目标函数
96.在接收到函数调用输入参数时,调用il函数加载器,若确定不存在函数调用输入参数对应的il函数,则调用aot函数加载器,查询是否存在函数调用输入参数对应的aot函数,具体地,首先在缓存中查找是否存在函数调用输入参数对应的aot函数,若缓存中存在函数调用输入参数对应的aot函数,那么将该aot函数作为目标函数并返回;若缓存中不存在调用输入参数对应的aot函数,那么由aot函数加载器在aot函数查找表中继续查找,若aot函数查找表中存在函数调用输入参数对应的aot函数,获取该aot函数对应的代理函数,并将该aot函数对应的代理函数作为目标函数并返回,若aot函数查找表中不存在函数调用输入参数对应的aot函数,则返回异常。
97.与上述方法实施例对应的,本公开还提供了一种函数调用装置,参考图7,为本公开实施例提供的一种函数调用装置结构示意图,具体地,所述装置包括:
98.获取模块701,用于当接收到中间语言il函数调用指令时,获取il函数调用指令中携带的函数调用输入参数;
99.查询模块702,用于调用il函数加载器,查询是否存在函数调用输入参数对应的il函数;
100.第一确定模块703,用于如果确定存在函数调用输入参数对应的il函数,则将il函数确定为目标函数;
101.第一返回模块704,用于针对il函数调用指令,返回目标函数。
102.相应的,所述查询模块702,包括:
103.第一查询子模块,用于调用il函数加载器,在缓存中查询是否存在函数调用输入参数对应的il函数;
104.第二查询子模块,用于如果确定缓存中不存在函数调用输入参数对应的il函数,则由il函数加载器在il函数查找表中查询函数调用输入参数对应的il函数;其中,il函数查找表中包括il静态函数与地址索引的对应关系以及il实例函数与名称索引的对应关系。
105.可选地,所述装置还包括:
106.第二确定模块,用于如果确定不存在函数调用输入参数对应的il函数,则调用提前编译aot函数加载器,查询是否存在函数调用输入参数对应的aot函数;
107.第三确定模块,用于如果确定存在函数调用输入参数对应的aot函数,则基于aot函数确定目标函数,继续执行针对il函数调用指令,返回目标函数的步骤。
108.相应的,所述第二确定模块,包括:
109.第三查询子模块,用于调用aot函数加载器,在缓存中查询是否存在函数调用输入参数对应的aot函数;
110.第四查询子模块,用于如果确定缓存中不存在函数调用输入参数对应的aot函数,则由aot函数加载器在aot函数查找表中,查询函数调用输入参数对应的aot函数;其中,aot函数查找表中包括aot静态函数与地址索引的对应关系以及aot实例函数与名称索引的对应关系。
111.相应地,所述第三确定模块,包括:
112.第一获取子模块,用于如果确定存在函数调用输入参数对应的aot函数,则获取aot函数对应的代理函数;其中,代理函数为基于预设第一数据结构对aot函数处理得到;
113.第一确定子模块,用于将aot函数对应的代理函数确定为目标函数。
114.可选地,所述装置还包括:
115.第四确定模块,用于当接收到针对已插桩函数的函数调用指令时,确定函数调用指令是否来自aot函数;
116.第二返回模块,用于如果确定函数调用指令来自aot函数,则拦截函数调用指令,并针对函数调用指令,返回已插桩函数对应的il函数;其中,已插桩函数对应的il函数是基于预设第二数据结构承载已插桩函数的运行参数。
117.本公开实施例提供的函数调用装置中,接收到中间语言il函数调用指令,获取il函数调用指令中携带的函数调用输入参数,调用il函数加载器,查询是否存在函数调用输入参数对应的il函数,如果确定存在函数调用输入参数对应的il函数,则将il函数确定为目标函数,针对il函数调用指令,返回目标函数,基于il函数加载器完成il函数调用,为实现基于il的解释执行器提供了基础,从而进一步实现flutter动态化能力。
118.除了上述方法和装置以外,本公开实施例还提供了一种函数调用介质,计算机可读存储介质中存储有指令,当所述指令在终端设备上运行时,使得所述终端设备实现本公开实施例所述的函数调用方法。
119.本公开实施例还提供了一种计算机程序产品,所述计算机程序产品包括计算机程序/指令,所述计算机程序/指令被处理器执行时实现本公开实施例所述的函数调用方法。
120.另外,本公开实施例还提供了一种函数调用设备,参见图8所示,可以包括:
121.处理器801、存储器802、输入装置803和输出装置804。函数调用设备中的处理器801的数量可以一个或多个,图8中以一个处理器为例。在本公开的一些实施例中,处理器801、存储器802、输入装置803和输出装置804可通过总线或其它方式连接,其中,图8中以通过总线连接为例。
122.存储器802可用于存储软件程序以及模块,处理器801通过运行存储在存储器802的软件程序以及模块,从而执行函数调用设备的各种功能应用以及数据处理。存储器802可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需
的应用程序等。此外,存储器802可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。输入装置803可用于接收输入的数字或字符信息,以及产生与函数调用设备的用户设置以及功能控制有关的信号输入。
123.具体在本实施例中,处理器801会按照如下的指令,将一个或一个以上的应用程序的进程对应的可执行文件加载到存储器802中,并由处理器801来运行存储在存储器802中的应用程序,从而实现上述函数调用设备的各种功能。
124.需要说明的是,在本文中,诸如“第一”和“第二”等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个
……”
限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
125.以上所述仅是本公开的具体实施方式,使本领域技术人员能够理解或实现本公开。对这些实施例的多种修改对本领域的技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本公开的精神或范围的情况下,在其它实施例中实现。因此,本公开将不会被限制于本文所述的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。

技术特征:
1.一种函数调用方法,其特征在于,所述方法包括:当接收到中间语言il函数调用指令时,获取所述il函数调用指令中携带的函数调用输入参数;调用il函数加载器,查询是否存在所述函数调用输入参数对应的il函数;如果确定存在所述函数调用输入参数对应的il函数,则将所述il函数确定为目标函数;针对所述il函数调用指令,返回所述目标函数。2.根据权利要求1所述的方法,其特征在于,所述调用il函数加载器,查询是否存在所述函数调用输入参数对应的il函数,包括:调用il函数加载器,在缓存中查询是否存在所述函数调用输入参数对应的il函数;如果确定所述缓存中不存在所述函数调用输入参数对应的il函数,则由所述il函数加载器在il函数查找表中查询所述函数调用输入参数对应的il函数;其中,所述il函数查找表中包括il静态函数与地址索引的对应关系以及il实例函数与名称索引的对应关系。3.根据权利要求1或2所述的方法,其特征在于,所述针对所述il函数调用指令,返回所述目标函数之前,还包括:如果确定不存在所述函数调用输入参数对应的il函数,则调用提前编译aot函数加载器,查询是否存在所述函数调用输入参数对应的aot函数;如果确定存在所述函数调用输入参数对应的aot函数,则基于所述aot函数确定目标函数,继续执行所述针对所述il函数调用指令,返回所述目标函数的步骤。4.根据权利要求3所述的方法,其特征在于,所述调用提前编译aot函数加载器,查询是否存在所述函数调用输入参数对应的aot函数,包括:调用aot函数加载器,在缓存中查询是否存在所述函数调用输入参数对应的aot函数;如果确定所述缓存中不存在所述函数调用输入参数对应的aot函数,则由所述aot函数加载器在aot函数查找表中,查询所述函数调用输入参数对应的aot函数;其中,所述aot函数查找表中包括aot静态函数与地址索引的对应关系以及aot实例函数与名称索引的对应关系。5.根据权利要求3所述的方法,其特征在于,所述如果确定存在所述函数调用输入参数对应的aot函数,则基于所述aot函数确定目标函数,包括:如果确定存在所述函数调用输入参数对应的aot函数,则获取所述aot函数对应的代理函数;其中,所述代理函数为基于预设第一数据结构对所述aot函数处理得到;将所述aot函数对应的代理函数确定为目标函数。6.根据权利要求1所述的方法,其特征在于,所述方法还包括:当接收到针对已插桩函数的函数调用指令时,确定所述函数调用指令是否来自aot函数;如果确定所述函数调用指令来自aot函数,则拦截所述函数调用指令,并针对所述函数调用指令,返回所述已插桩函数对应的il函数;其中,所述已插桩函数对应的il函数是基于预设第二数据结构承载所述已插桩函数的运行参数。7.根据权利要求1所述的方法,其特征在于,所述目标函数的数据结构包括函数基础类、il函数类和aot函数类,所述il函数类和所述aot函数类均继承所述函数基础类,所述目
标函数为所述il函数类描述的对象或者为所述aot函数类描述的对象。8.一种函数调用装置,所述装置包括:获取模块,用于当接收到中间语言il函数调用指令时,获取所述il函数调用指令中携带的函数调用输入参数;查询模块,用于调用il函数加载器,查询是否存在所述函数调用输入参数对应的il函数;第一确定模块,用于如果确定存在所述函数调用输入参数对应的il函数,则将所述il函数确定为目标函数;第一返回模块,用于针对所述il函数调用指令,返回所述目标函数。9.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质中存储有指令,当所述指令在终端设备上运行时,使得所述终端设备实现如权利要求1-7任一项所述的方法。10.一种函数调用设备,其特征在于,包括:存储器,处理器,及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时,实现如权利要求1-7任一项所述的方法。11.一种计算机程序产品,其特征在于,所述计算机程序产品包括计算机程序/指令,所述计算机程序/指令被处理器执行时实现如权利要求1-7任一项所述的方法。

技术总结
本公开提供了一种函数调用方法、装置、设备及存储介质,其中,函数调用方法包括:当接收到中间语言IL函数调用指令时,获取IL函数调用指令中携带的函数调用输入参数,调用IL函数加载器,查询是否存在函数调用输入参数对应的IL函数,如果确定存在函数调用输入参数对应的IL函数,则将IL函数确定为目标函数,针对IL函数调用指令,返回目标函数,基于IL函数加载器完成IL函数调用,为实现基于IL的解释执行器提供了基础,从而进一步实现Flutter动态化能力。从而进一步实现Flutter动态化能力。从而进一步实现Flutter动态化能力。


技术研发人员:段启智
受保护的技术使用者:北京字节跳动网络技术有限公司
技术研发日:2022.03.14
技术公布日:2023/9/23
版权声明

本文仅代表作者观点,不代表航家之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)

航空之家 https://www.aerohome.com.cn/

航空商城 https://mall.aerohome.com.cn/

航空资讯 https://news.aerohome.com.cn/

分享:

扫一扫在手机阅读、分享本文

评论

相关推荐