in scripts/generate_fingerprint_outfuncs.rb [174:253]
def generate_fingerprint_defs!
@fingerprint_defs = {}
['nodes/parsenodes', 'nodes/primnodes'].each do |group|
@struct_defs[group].each do |type, struct_def|
next if struct_def['fields'].nil?
next if IGNORE_FOR_GENERATOR.include?(type)
fp_override = FINGERPRINT_OVERRIDE_NODES[type]
if fp_override
fp_override = " // Intentionally ignoring all fields for fingerprinting\n" if fp_override == :skip
fingerprint_def = fp_override
else
fingerprint_def = format(" _fingerprintString(ctx, \"%s\");\n\n", type)
struct_def['fields'].reject { |f| f['name'].nil? }.sort_by { |f| f['name'] }.each do |field|
name = field['name']
field_type = field['c_type']
fp_override = FINGERPRINT_OVERRIDE_FIELDS[[type, field['name']]] || FINGERPRINT_OVERRIDE_FIELDS[[nil, field['name']]]
if fp_override
if fp_override == :skip
fp_override = format(" // Intentionally ignoring node->%s for fingerprinting\n\n", name)
end
fingerprint_def += fp_override
next
end
case field_type
when 'Node'
fingerprint_def += format(FINGERPRINT_NODE, name: name)
when 'Node*', 'Expr*'
fingerprint_def += format(FINGERPRINT_NODE_PTR, name: name)
when 'List*'
fingerprint_def += format(FINGERPRINT_LIST, name: name)
when 'CreateStmt'
fingerprint_def += format(" _fingerprintString(ctx, \"%s\");\n", name)
fingerprint_def += format(" _fingerprintCreateStmt(ctx, (const CreateStmt*) &node->%s, node, \"%s\", depth);\n", name, name)
when 'char'
fingerprint_def += format(FINGERPRINT_CHAR, name: name)
when 'char*'
fingerprint_def += format(FINGERPRINT_CHAR_PTR, name: name)
when 'string'
fingerprint_def += format(FINGERPRINT_STRING, name: name)
when 'bool'
fingerprint_def += format(FINGERPRINT_BOOL, name: name)
when 'Datum', 'void*', 'Expr', 'NodeTag'
when *INT_TYPES
fingerprint_def += format(FINGERPRINT_INT, name: name)
when *LONG_INT_TYPES
fingerprint_def += format(FINGERPRINT_LONG_INT, name: name)
when *INT_ARRAY_TYPES
fingerprint_def += format(FINGERPRINT_INT_ARRAY, name: name)
when *FLOAT_TYPES
fingerprint_def += format(FINGERPRINT_FLOAT, name: name)
else
if field_type.end_with?('*') && @nodetypes.include?(field_type[0..-2])
fingerprint_def += format(FINGERPRINT_NODE_PTR, name: name)
elsif @all_known_enums.include?(field_type)
fingerprint_def += format(FINGERPRINT_INT, name: name)
else
puts type
puts name
puts field_type
raise type
end
end
end
end
@fingerprint_defs[type] = fingerprint_def
end
end
end