Пример #1
0
def _build_call(state, addr, instruction):
    call = nodes.FunctionCall()
    call.function = _build_slot(state, addr, instruction.A)
    call.arguments.contents = _build_call_arguments(state, addr, instruction)

    line_marked = [call]

    if instruction.opcode <= ins.CALL.opcode:
        if instruction.B == 0:
            node = nodes.Assignment()
            node.destinations.contents.append(nodes.MULTRES())
            node.expressions.contents.append(call)
        elif instruction.B == 1:
            node = call
        else:
            from_slot = instruction.A
            to_slot = instruction.A + instruction.B - 2
            node = _build_range_assignment(state, addr, from_slot, to_slot)
            node.expressions.contents.append(call)
    else:
        assert instruction.opcode <= ins.CALLT.opcode
        node = nodes.Return()
        node.returns.contents.append(call)
        line_marked.append(node)

    return node, line_marked
Пример #2
0
def _build_return(state, addr, instruction):
    node = nodes.Return()

    base = instruction.A
    last_slot = base + instruction.CD - 1

    if instruction.opcode != ins.RETM.opcode:
        last_slot -= 1

    slot = base

    # Negative count for the RETM is OK
    while slot <= last_slot:
        variable = _build_slot(state, addr, slot)
        node.returns.contents.append(variable)
        slot += 1

    if instruction.opcode == ins.RETM.opcode:
        node.returns.contents.append(nodes.MULTRES())

    return node
Пример #3
0
def _build_call(state, addr, instruction):
    call = nodes.FunctionCall()
    call.function = _build_slot(state, addr, instruction.A)
    call.arguments.contents = _build_call_arguments(state, addr, instruction)
    call.name = _lookup_variable_name(state, addr, instruction.A)
    if gconfig.gVerbose:
        print("_build_call " + call.name)

    # CALLM Call: A, ..., A+B-2 = A(A+1, ..., A+C+MULTRES)
    # CALL Call: A, ..., A+B-2 = A(A+1, ..., A+C-1)
    if instruction.opcode <= ins.CALL.opcode:
        if instruction.B == 0:
            node = nodes.Assignment()
            node.destinations.contents.append(nodes.MULTRES())
            node.expressions.contents.append(call)
        elif instruction.B == 1:
            node = call
        # elif call.name and call.name == "class" and instruction.B == 2:
        #     class_name = _lookup_variable_name(state, addr, instruction.A+1)
        #     print("class " + class_name)
        #     assert class_name is not None
        #     node = _build_class_assignment(addr, instruction.A, class_name)
        #     node.expressions.contents.append(call)
        else:
            from_slot = instruction.A
            to_slot = instruction.A + instruction.B - 2
            node = _build_range_assignment(state, addr, from_slot, to_slot)
            node.expressions.contents.append(call)
    # CALLMT Tailcall: return A(A+1, ..., A+D+MULTRES)
    # CALLT Tailcall: return A(A+1, ..., A+D-1)
    else:
        assert instruction.opcode <= ins.CALLT.opcode
        node = nodes.Return()
        node.returns.contents.append(call)

    return node