in source/module.c [255:307]
static void s_error_map_init(void) {
struct error_pair {
PyObject *py_exception_type;
int aws_error_code;
};
/* If the same key is listed multiple times, later entries overwrite earlier entries
* Ex: Both TypeError and ValueError map to INVALID_ARG, but INVALID_ARG only maps to ValueError. */
struct error_pair s_error_array[] = {
{PyExc_IndexError, AWS_ERROR_INVALID_INDEX},
{PyExc_MemoryError, AWS_ERROR_OOM},
{PyExc_NotImplementedError, AWS_ERROR_UNIMPLEMENTED},
{PyExc_OverflowError, AWS_ERROR_OVERFLOW_DETECTED},
{PyExc_TypeError, AWS_ERROR_INVALID_ARGUMENT},
{PyExc_ValueError, AWS_ERROR_INVALID_ARGUMENT},
{PyExc_FileNotFoundError, AWS_ERROR_FILE_INVALID_PATH},
{PyExc_BlockingIOError, AWS_IO_READ_WOULD_BLOCK},
{PyExc_BrokenPipeError, AWS_IO_BROKEN_PIPE},
};
if (aws_hash_table_init(
&s_py_to_aws_error_map,
aws_default_allocator(), /* non-tracing allocator so this doesn't show up in leak dumps */
AWS_ARRAY_SIZE(s_error_array),
aws_hash_ptr,
aws_ptr_eq,
NULL /*destroy_key_fn*/,
NULL /*destroy_value_fn*/)) {
AWS_FATAL_ASSERT(0);
}
if (aws_hash_table_init(
&s_aws_to_py_error_map,
aws_default_allocator(), /* non-tracing allocator so this doesn't show up in leak dumps */
AWS_ARRAY_SIZE(s_error_array),
aws_hash_ptr,
aws_ptr_eq,
NULL /*destroy_key_fn*/,
NULL /*destroy_value_fn*/)) {
AWS_FATAL_ASSERT(0);
}
for (size_t i = 0; i < AWS_ARRAY_SIZE(s_error_array); ++i) {
void *py_exc = s_error_array[i].py_exception_type;
void *aws_err = (void *)(size_t)s_error_array[i].aws_error_code;
if (aws_hash_table_put(&s_py_to_aws_error_map, py_exc, aws_err, NULL)) {
AWS_FATAL_ASSERT(0);
}
if (aws_hash_table_put(&s_aws_to_py_error_map, aws_err, py_exc, NULL)) {
AWS_FATAL_ASSERT(0);
}
}
}