import json  

#--------------------------Function Area Start----------------------------------------
def HelloASTCore():
    print("Hello,ASTCore!")

def JsonKeyHasValidValue(json_data, strNodeKey):
    return strNodeKey in json_data \
    and type(json_data[strNodeKey]).__name__=="dict" \
    and type(json_data[strNodeKey].items()).__name__=="dict_items" \
    and len(list(json_data[strNodeKey].items()))>0

def CheckLeafValue(nodeDict, value):
    return "Leaf" in nodeDict and value == nodeDict["Leaf"]

def traverse(dataflow, json_data, lsInsUp, lsInsDown):
    metholdDownMatched = traverseDown(dataflow, json_data, lsInsDown)
    if metholdDownMatched is not None:
        # print(json_data)
        upJsonData = json_data["Reverse"]
        metholdUpMatched = traverseUp(dataflow, upJsonData, lsInsUp)
        if metholdDownMatched == metholdUpMatched:
            return metholdDownMatched
    return None

def traverseDown(dataflow, json_data, lsInsDown):
    # print(dataflow)
    # print(json_data)
    if JsonKeyHasValidValue(json_data, "Left"):
        key, value = list(json_data["Left"].items())[0]
        print("down left opr:", key)
        matchKeyPos = [i for i, s in enumerate(dataflow) if key in s] # the pos of shr 
        print("down matchKeyPos:", matchKeyPos)
        if len(matchKeyPos)>0:
            fstMatchedPos = matchKeyPos[0]
            lsInsDown += [dataflow[fstMatchedPos]]
            ret = None
            if fstMatchedPos+1<len(dataflow):
                ret = traverseDown(dataflow[fstMatchedPos+1:], value, lsInsDown)
                if ret is not None:
                    return ret
            if ret is None and CheckLeafValue(value, "End"):
                print("End:", value["MethodModel"])
                return value["MethodModel"]

    if JsonKeyHasValidValue(json_data, "Right"):
        return traverseDown(dataflow, json_data["Right"], lsInsDown)
    return None

def traverseUp(dataflow, json_data, lsInsUp):
    # print(dataflow)
    if JsonKeyHasValidValue(json_data, "Left"):
        key, value = list(json_data["Left"].items())[0]
        print("up left opr:", key)
        matchKeyPos = [i for i, s in enumerate(dataflow) if key in s] # the pos of shr 
        print("up matchKeyPos:", matchKeyPos)
        if len(matchKeyPos)>0:
            lastMatchedPos = matchKeyPos[-1]
            lsInsUp += [dataflow[lastMatchedPos]]
            ret = None
            if lastMatchedPos>0:
                ret = traverseUp(dataflow[0:lastMatchedPos], value, lsInsUp)
                if ret is not None:
                    return ret
            if ret is None and CheckLeafValue(value, "Start"):
                print("Start:", value["MethodModel"])
                return value["MethodModel"]

    if JsonKeyHasValidValue(json_data, "Right"):
        return traverseUp(dataflow, json_data["Right"], lsInsUp)

    return None


#--------------------------Function Area End----------------------------------------

# 打开要分析的反汇编代码片段
dataflow = []
with open('data.asm', 'r', encoding='utf-8') as file:
    dataflow = file.read().split('\n')
print(dataflow)
if len(dataflow)<=0 or dataflow[0] == '':
    print("No ins data!")
    exit(0)
json_data = {}

# 打开文件并读取内容  
with open('DivTree.json', 'r') as f:
    json_data = json.load(f)
    json_str  = json.dumps(json_data, indent=4)
    # 输出解析后的Python对象  
    # print(json_str)

# print(json_data['div'])
lsInsUp, lsInsDown = [], []
methodMatched = traverse(dataflow, json_data["div"], lsInsUp, lsInsDown)
print("lsInsDown:", lsInsDown)
print("lsInsUp:", lsInsUp)
if methodMatched is not None:
    print("------------------result------------------")
    print(" <<< method matched:", methodMatched, " >>>")
else:
    print("No one method matched")