From d819c7b48cfd0b707c8e68535e795f23cf92f0cf Mon Sep 17 00:00:00 2001 From: Marin Tomic Date: Tue, 27 Nov 2018 13:20:35 +0100 Subject: [PATCH] Make analyze_rpc_calls script work with new TypeInfo Reviewers: mferencevic Reviewed By: mferencevic Subscribers: pullbot Differential Revision: https://phabricator.memgraph.io/D1750 --- tools/analyze_rpc_calls | 39 ++++++++++++++++++--------------------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/tools/analyze_rpc_calls b/tools/analyze_rpc_calls index dc4cbe110..201719e63 100755 --- a/tools/analyze_rpc_calls +++ b/tools/analyze_rpc_calls @@ -5,6 +5,7 @@ import dpkt import json import operator import os +import re import socket import subprocess import struct @@ -14,6 +15,14 @@ import tabulate SCRIPT_DIR = os.path.dirname(os.path.realpath(__file__)) PROJECT_DIR = os.path.normpath(os.path.join(SCRIPT_DIR, "..")) +TYPE_INFO_PATTERN = re.compile(r""" + const\s+utils::TypeInfo\s+ + (\S+)\s* # ::kType + {\s* + (\S+)ULL\s*,\s* # + "(\S+)"\s* # "" + } + """, re.VERBOSE) # helpers @@ -21,40 +30,28 @@ def format_endpoint(addr, port): return "{}:{}".format(socket.inet_ntoa(addr), port) -def parse_capnp_header(fname): +def parse_source_file(fname): ret = {} - last_struct = "" with open(fname) as f: - for row in f: - row = row.strip() - if row.startswith("struct") and \ - not row.startswith("struct _capnpPrivate"): - last_struct = row.split()[1] - if row.startswith("CAPNP_DECLARE_STRUCT_HEADER"): - bytes_val = bytes.fromhex(row.split("(")[1].split(",")[0]) - val = struct.unpack(">Q", bytes_val)[0] - ret[val] = last_struct + for match in TYPE_INFO_PATTERN.finditer(f.read()): + id_hex = int(match.groups()[1], 16) + class_name = match.groups()[2] + ret[id_hex] = class_name return ret -# TODO(mferencevic): Update this to parse .cpp files (99% are .lcp.cpp), -# containing the following line. -# -# const utils::TypeInfo ::kType{, ""}; -# -# Note that clang-format may break the line at any of the spaces or after '{'. -def parse_all_capnp_headers(dirname): +def parse_all_source_files(dirname): ids = {} - ret = subprocess.run(["find", dirname, "-name", "*.capnp.h"], + ret = subprocess.run(["find", dirname, "-name", "*.lcp.cpp"], stdout=subprocess.PIPE) ret.check_returncode() headers = list(filter(None, ret.stdout.decode("utf-8").split("\n"))) for header in headers: - ids.update(parse_capnp_header(header)) + ids.update(parse_source_file(header)) return ids -MESSAGES = parse_all_capnp_headers(os.path.join(PROJECT_DIR, "src")) +MESSAGES = parse_all_source_files(os.path.join(PROJECT_DIR, "src")) class Connection: