/* for thread dumping */ static char duk__get_cat_summary_char(duk_catcher *catcher) { switch (DUK_CAT_GET_TYPE(catcher)) { case DUK_CAT_TYPE_TCF: if (DUK_CAT_HAS_CATCH_ENABLED(catcher)) { if (DUK_CAT_HAS_FINALLY_ENABLED(catcher)) { return 'C'; /* catch and finally active */ } else { return 'c'; /* only catch active */ } } else { if (DUK_CAT_HAS_FINALLY_ENABLED(catcher)) { return 'f'; /* only finally active */ } else { return 'w'; /* neither active (usually 'with') */ } } case DUK_CAT_TYPE_LABEL: return 'l'; case DUK_CAT_TYPE_UNKNOWN: default: return '?'; } DUK_UNREACHABLE(); }
DUK_LOCAL duk_bool_t duk__have_active_catcher(duk_hthread *thr) { /* * XXX: As noted above, a protected API call won't be counted as a * catcher. This is usually convenient, e.g. in the case of a top- * level duk_pcall(), but may not always be desirable. Perhaps add an * argument to treat them as catchers? */ duk_size_t i; DUK_ASSERT(thr != NULL); while (thr != NULL) { for (i = 0; i < thr->catchstack_top; i++) { duk_catcher *cat = thr->catchstack + i; if (DUK_CAT_HAS_CATCH_ENABLED(cat)) { return 1; /* all we need to know */ } } thr = thr->resumer; } return 0; }