const char* package_signature(ast_t* package) { pony_assert(ast_id(package) == TK_PACKAGE); package_t* pkg = (package_t*)ast_data(package); pony_assert(pkg->group != NULL); return package_group_signature(pkg->group); }
const char* program_signature(ast_t* program) { pony_assert(program != NULL); pony_assert(ast_id(program) == TK_PROGRAM); program_t* data = (program_t*)ast_data(program); pony_assert(data != NULL); if(data->signature == NULL) { ast_t* first_package = ast_child(program); pony_assert(first_package != NULL); pony_assert(data->package_groups == NULL); data->package_groups = package_dependency_groups(first_package); blake2b_state hash_state; int status = blake2b_init(&hash_state, SIGNATURE_LENGTH); pony_assert(status == 0); package_group_list_t* iter = data->package_groups; while(iter != NULL) { package_group_t* group = package_group_list_data(iter); const char* group_sig = package_group_signature(group); blake2b_update(&hash_state, group_sig, SIGNATURE_LENGTH); iter = package_group_list_next(iter); } data->signature = (char*)ponyint_pool_alloc_size(SIGNATURE_LENGTH); status = blake2b_final(&hash_state, data->signature, SIGNATURE_LENGTH); pony_assert(status == 0); } return data->signature; }