コード例 #1
0
ファイル: package.c プロジェクト: dipinhora/ponyc
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);
}
コード例 #2
0
ファイル: program.c プロジェクト: Theodus/ponyc
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;
}