code: def compute_properties(op: parser.InstDef) -> Properties:
      has_free = (
          variable_used(op, "PyCell_New")
          or variable_used(op, "PyCell_GET")
          or variable_used(op, "PyCell_SET")
      )
      infallible = is_infallible(op)
      deopts = variable_used(op, "DEOPT_IF")
      passthrough = stack_effect_only_peeks(op) and infallible
      return Properties(
          escapes=makes_escaping_api_call(op),
          infallible=infallible,
          deopts=deopts,
          oparg=variable_used(op, "oparg"),
          jumps=variable_used(op, "JUMPBY"),
          eval_breaker=variable_used(op, "CHECK_EVAL_BREAKER"),
          ends_with_eval_breaker=eval_breaker_at_end(op),
          needs_this=variable_used(op, "this_instr"),
          always_exits=always_exits(op),
          stores_sp=variable_used(op, "SYNC_SP"),
          tier_one_only=variable_used(op, "TIER_ONE_ONLY"),
          uses_co_consts=variable_used(op, "FRAME_CO_CONSTS"),
          uses_co_names=variable_used(op, "FRAME_CO_NAMES"),
          uses_locals=(
              variable_used(op, "GETLOCAL")
              or variable_used(op, "SETLOCAL")
          )
          and not has_free,
          has_free=has_free,
          pure="pure" in op.annotations,
          passthrough=passthrough,
          guard=passthrough and deopts,
      )
  
imports: from dataclasses import dataclass, field
  import lexer
  import parser
  from typing import Optional
label_desc: Use image node_id 12 for calling a global function with example usage: compute_properties(op) and returns: Properties