js2c.py源码分析:
def main():
//将目标文件赋值给natives .sys.argv[0]是自身的文件名
natives = sys.argv[1]
//将所有要编译的JS文件加入到source_files列表中去
source_files = sys.argv[2:]
//下面这条if语句实际上变没有执行,不用理会
if source_files[-2] == ‘-t’:
global TEMPLATE
TEMPLATE = source_files[-1]
source_files = source_files[:-2]
//核心函数,将所有JS文件转换成数组,一一对应
JS2C(source_files, [natives])
def JS2C(source, target):
modules = []
consts = {}
macros = {}
macro_lines = []
for s in source:
//按照路径符对字符串解析,以macros.py结尾的文件读取存在列表中
if (os.path.split(str(s))[1]).endswith(‘macros.py’):
macro_lines.extend(ReadLines(str(s)))
else:
//将所有JS文件加到列表中
modules.append(s)
Process input from all *macro.py files
//用正则将读取的数据提到到字典里面,
(consts, macros) = ReadMacros(macro_lines)
//通过对数据分析发现consts是空的,MACROS的数据如下
“”"
name=DTRACE_HTTP_CLIENT_REQUEST macro=<main.TextMacro instance at 0x7fbf8282d200>
name=DTRACE_NET_STREAM_END macro=<main.TextMacro instance at 0x7fbf8282d3b0>
name=DCHECK_NE macro=<main.TextMacro instance at 0x7fbf8282d878>
name=DTRACE_HTTP_CLIENT_RESPONSE macro=<main.TextMacro instance at 0x7fbf8282d248>
name=CHECK_LT macro=<main.TextMacro instance at 0x7fbf8282d170>
name=DCHECK_LE macro=<main.TextMacro instance at 0x7fbf8282d7e8>
name=COUNTER_HTTP_CLIENT_REQUEST macro=<main.TextMacro instance at 0x7fbf8282d5f0>
name=CHECK_LE macro=<main.TextMacro instance at 0x7fbf8282d128>
name=DTRACE_HTTP_SERVER_RESPONSE macro=<main.TextMacro instance at 0x7fbf8282d2d8>
name=DCHECK_LT macro=<main.TextMacro instance at 0x7fbf8282d830>
name=CHECK macro=<main.TextMacro instance at 0x7fbf82820a28>
name=COUNTER_HTTP_SERVER_RESPONSE macro=<main.TextMacro instance at 0x7fbf8282d5a8>
name=COUNTER_NET_SERVER_CONNECTION_CLOSE macro=<main.TextMacro ins