def METHOD_NAME(self, rec):
    # These should be kept in sync with changes to SynthTrace.h.
    # Hopefully there is never a key that is used for both objects and
    # non-objects (in different records).
    # If there is a conflict between two keys with the same name and
    # different value types:
    # * if it is another number it will cause a failure at runtime
    # * if it is a string it will cause a failure at parse time
    OBJECT_HOLDING_KEYS = [
        "objID",
        "functionID",
        "hostObjectID",
        "propNamesID",
        "propID",
        "propNameID",
    ]
    VALUE_HOLDING_KEYS = ["value", "retval"]
    if rec.get("type", "") == "CreatePropNameIDRecord":
        # PropNameIDs might get different IDs for the same string depending
        # on the GC schedule, which makes it impossible to compare two
        # traces. Normalize them more aggressively by using the string
        # contents to map to an ID.
        objID = rec["objID"]
        chars = rec["chars"]
        if objID not in self.normal:
            if chars in self.string_normal:
                self.normal[objID] = self.string_normal[chars]
            else:
                self.string_normal[chars] = self.normal[objID]
        rec["objID"] = self.normal[objID]
    else:
        for objkey in OBJECT_HOLDING_KEYS:
            if objkey in rec:
                rec[objkey] = self.normal[rec[objkey]]
    for valuekey in VALUE_HOLDING_KEYS:
        if valuekey in rec:
            rec[valuekey] = self.normalize_value(rec[valuekey])
    if "args" in rec:
        # Args is an array of values, normalize each one if it's an object
        rec["args"] = [self.normalize_value(v) for v in rec["args"]]
    return rec