7#if defined(DUK_USE_DEBUGGER_SUPPORT)
26#define DUK__SET_CONN_BROKEN(thr,reason) do { \
28 duk__debug_do_detach1((thr)->heap, (reason)); \
40 if (heap->dbg_detaching) {
45 DUK_D(
DUK_DPRINT(
"debugger transport detaching, marking transport broken"));
47 heap->dbg_detaching = 1;
49 if (heap->dbg_write_cb !=
NULL) {
56 duk_debug_write_int(thr, reason);
57 duk_debug_write_eom(thr);
60 heap->dbg_read_cb =
NULL;
61 heap->dbg_write_cb =
NULL;
62 heap->dbg_peek_cb =
NULL;
63 heap->dbg_read_flush_cb =
NULL;
64 heap->dbg_write_flush_cb =
NULL;
65 heap->dbg_request_cb =
NULL;
70 heap->dbg_state_dirty = 0;
71 heap->dbg_force_restart = 0;
72 heap->dbg_step_type = 0;
73 heap->dbg_step_thread =
NULL;
74 heap->dbg_step_csindex = 0;
75 heap->dbg_step_startline = 0;
76 heap->dbg_have_next_byte = 0;
94 detached_cb = heap->dbg_detached_cb;
95 detached_udata = heap->dbg_udata;
96 heap->dbg_detached_cb =
NULL;
97 heap->dbg_udata =
NULL;
104 DUK_D(
DUK_DPRINT(
"detached during message loop, delayed call to detached_cb"));
105 detached_cb(detached_udata);
108 heap->dbg_detaching = 0;
112 duk__debug_do_detach1(heap, 0);
113 duk__debug_do_detach2(heap);
124 DUK_D(
DUK_DPRINT(
"transport read/write error, NULL all callbacks expected detached"));
125 heap->dbg_read_cb =
NULL;
126 heap->dbg_write_cb =
NULL;
127 heap->dbg_peek_cb =
NULL;
128 heap->dbg_read_flush_cb =
NULL;
129 heap->dbg_write_flush_cb =
NULL;
130 heap->dbg_request_cb =
NULL;
145 if (heap->dbg_read_cb ==
NULL) {
146 DUK_D(
DUK_DPRINT(
"attempt to peek in detached state, return zero (= no data)"));
149 if (heap->dbg_peek_cb ==
NULL) {
154 return (
duk_bool_t) (heap->dbg_peek_cb(heap->dbg_udata) > 0);
164 if (heap->dbg_read_cb ==
NULL) {
168 if (heap->dbg_read_flush_cb ==
NULL) {
173 heap->dbg_read_flush_cb(heap->dbg_udata);
183 if (heap->dbg_read_cb ==
NULL) {
187 if (heap->dbg_write_flush_cb ==
NULL) {
192 heap->dbg_write_flush_cb(heap->dbg_udata);
201 duk_uint8_t
dummy[64];
207 now = (length >
sizeof(
dummy) ?
sizeof(
dummy) : length);
208 duk_debug_read_bytes(thr,
dummy, now);
216 (void) duk_debug_read_byte(thr);
232 x = duk_debug_read_byte(thr);
233 thr->
heap->dbg_have_next_byte = 1;
234 thr->
heap->dbg_next_byte = x;
249 if (heap->dbg_read_cb ==
NULL) {
250 DUK_D(
DUK_DPRINT(
"attempt to read %ld bytes in detached state, return zero data", (
long) length));
256 if (length >= 1 && heap->dbg_have_next_byte) {
257 heap->dbg_have_next_byte = 0;
258 *p++ = heap->dbg_next_byte;
267#if defined(DUK_USE_DEBUGGER_TRANSPORT_TORTURE)
270 got = heap->dbg_read_cb(heap->dbg_udata, (
char *) p,
left);
271 if (got == 0 || got >
left) {
273 duk__debug_null_most_callbacks(thr);
274 DUK__SET_CONN_BROKEN(thr, 1);
289 duk_debug_read_bytes(thr, &x, 1);
298 duk_debug_read_bytes(thr, buf, 4);
299 return ((duk_uint32_t) buf[0] << 24) |
300 ((duk_uint32_t) buf[1] << 16) |
301 ((duk_uint32_t) buf[2] << 8) |
302 (duk_uint32_t) buf[3];
306 return (duk_int32_t) duk__debug_read_uint32_raw(thr);
314 duk_debug_read_bytes(thr, buf, 2);
315 return ((duk_uint16_t) buf[0] << 8) |
316 (duk_uint16_t) buf[1];
325 x = duk_debug_read_byte(thr);
327 t = duk_debug_read_byte(thr);
328 return (duk_int32_t) (((x - 0xc0) << 8) + t);
329 }
else if (x >= 0x80) {
330 return (duk_int32_t) (x - 0x80);
332 return (duk_int32_t) duk__debug_read_uint32_raw(thr);
336 DUK__SET_CONN_BROKEN(thr, 1);
345 if (len <=
sizeof(buf)) {
346 duk_debug_read_bytes(thr, buf, (
duk_size_t) len);
351 duk_debug_read_bytes(thr, p, (
duk_size_t) len);
365 x = duk_debug_read_byte(thr);
366 if (x >= 0x60 && x <= 0x7f) {
368 len = (duk_uint32_t) (x - 0x60);
370 len = (duk_uint32_t) duk__debug_read_uint16_raw(thr);
372 len = (duk_uint32_t) duk__debug_read_uint32_raw(thr);
377 return duk__debug_read_hstring_raw(thr, len);
381 DUK__SET_CONN_BROKEN(thr, 1);
392 duk_debug_read_bytes(thr, p, (
duk_size_t) len);
403 x = duk_debug_read_byte(thr);
404 if (x !=
sizeof(pu)) {
407 duk_debug_read_bytes(thr, (duk_uint8_t *) &pu.p,
sizeof(pu));
408#if defined(DUK_USE_INTEGER_LE)
409 duk_byteswap_bytes((duk_uint8_t *) pu.b,
sizeof(pu));
411 return (
void *) pu.p;
415 DUK__SET_CONN_BROKEN(thr, 1);
416 return (
void *)
NULL;
423 duk_debug_read_bytes(thr, (duk_uint8_t *) du.
uc,
sizeof(du.
uc));
434 x = duk_debug_read_byte(thr);
439 return (
duk_heaphdr *) duk__debug_read_pointer_raw(thr);
443 DUK__SET_CONN_BROKEN(thr, 1);
453 x = duk_debug_read_byte(thr);
462 duk_debug_skip_byte(thr);
469 return (
duk_heaphdr *) duk__debug_read_pointer_raw(thr);
472 DUK_D(
DUK_DPRINT(
"debug connection error: failed to decode any pointer (object, pointer, heapptr)"));
473 DUK__SET_CONN_BROKEN(thr, 1);
485 x = duk_debug_read_byte(thr);
489 t = (t << 8) + duk_debug_read_byte(thr);
498 len = (duk_uint32_t) (x - 0x60);
499 duk__debug_read_hstring_raw(thr, len);
505 duk_int32_t i = duk__debug_read_int32_raw(thr);
510 len = duk__debug_read_uint32_raw(thr);
511 duk__debug_read_hstring_raw(thr, len);
515 len = duk__debug_read_uint16_raw(thr);
516 duk__debug_read_hstring_raw(thr, len);
520 len = duk__debug_read_uint32_raw(thr);
521 duk__debug_read_hbuffer_raw(thr, len);
525 len = duk__debug_read_uint16_raw(thr);
526 duk__debug_read_hbuffer_raw(thr, len);
547 d = duk__debug_read_double_raw(thr);
553 duk_debug_skip_byte(thr);
554 h = (
duk_heaphdr *) duk__debug_read_pointer_raw(thr);
560 ptr = duk__debug_read_pointer_raw(thr);
574 h = (
duk_heaphdr *) duk__debug_read_pointer_raw(thr);
588 DUK__SET_CONN_BROKEN(thr, 1);
599 const duk_uint8_t *p;
608 if (heap->dbg_write_cb ==
NULL) {
609 DUK_D(
DUK_DPRINT(
"attempt to write %ld bytes in detached state, ignore", (
long) length));
628#if defined(DUK_USE_DEBUGGER_TRANSPORT_TORTURE)
631 got = heap->dbg_write_cb(heap->dbg_udata, (
const char *) p,
left);
632 if (got == 0 || got >
left) {
633 duk__debug_null_most_callbacks(thr);
635 DUK__SET_CONN_BROKEN(thr, 1);
643 duk_debug_write_bytes(thr, (
const duk_uint8_t *) &x, 1);
654#if defined(DUK_USE_DEBUGGER_INSPECT)
671 if (x >= 0 && x <= 0x3fL) {
672 buf[0] = (duk_uint8_t) (0x80 + x);
674 }
else if (x >= 0 && x <= 0x3fffL) {
675 buf[0] = (duk_uint8_t) (0xc0 + (x >> 8));
676 buf[1] = (duk_uint8_t) (x & 0xff);
681 buf[1] = (duk_uint8_t) ((x >> 24) & 0xff);
682 buf[2] = (duk_uint8_t) ((x >> 16) & 0xff);
683 buf[3] = (duk_uint8_t) ((x >> 8) & 0xff);
684 buf[4] = (duk_uint8_t) (x & 0xff);
687 duk_debug_write_bytes(thr, buf, len);
699 if (x >= 0x80000000UL) {
703 duk_debug_write_int(thr, (duk_int32_t) x);
715 buf[0] = (duk_uint8_t) (0x60 + length);
717 }
else if (length <= 0xffffUL) {
718 buf[0] = (duk_uint8_t) (marker_base + 1);
719 buf[1] = (duk_uint8_t) (length >> 8);
720 buf[2] = (duk_uint8_t) (length & 0xff);
723 buf[0] = (duk_uint8_t) marker_base;
724 buf[1] = (duk_uint8_t) (length >> 24);
725 buf[2] = (duk_uint8_t) ((length >> 16) & 0xff);
726 buf[3] = (duk_uint8_t) ((length >> 8) & 0xff);
727 buf[4] = (duk_uint8_t) (length & 0xff);
731 duk_debug_write_bytes(thr, (
const duk_uint8_t *) buf, buflen);
732 duk_debug_write_bytes(thr, (
const duk_uint8_t *) data, length);
742 duk_debug_write_string(thr,
751 duk_debug_write_string(thr,
758 duk_debug_write_hstring(thr, duk_safe_to_hstring(ctx, -1));
768 duk_debug_write_buffer(thr,
778 DUK_ASSERT(
sizeof(ptr) >= 1 &&
sizeof(ptr) <= 16);
783 duk_debug_write_bytes(thr, buf, 2);
785#if defined(DUK_USE_INTEGER_LE)
786 duk_byteswap_bytes((duk_uint8_t *) pu.b,
sizeof(pu));
788 duk_debug_write_bytes(thr, (
const duk_uint8_t *) &pu.p, (
duk_size_t)
sizeof(pu));
795#if defined(DUK_USE_DEBUGGER_DUMPHEAP) || defined(DUK_USE_DEBUGGER_INSPECT)
806 DUK_ASSERT(
sizeof(obj) >= 1 &&
sizeof(obj) <= 16);
812 duk_debug_write_bytes(thr, buf, 3);
814#if defined(DUK_USE_INTEGER_LE)
815 duk_byteswap_bytes((duk_uint8_t *) pu.b,
sizeof(pu));
817 duk_debug_write_bytes(thr, (
const duk_uint8_t *) &pu.p, (
duk_size_t)
sizeof(pu));
852 buf[1] = (duk_uint8_t) (lf_flags >> 8);
853 buf[2] = (duk_uint8_t) (lf_flags & 0xff);
854 buf[3] =
sizeof(lf_func);
855 duk_debug_write_bytes(thr, buf, 4);
856 duk_debug_write_bytes(thr, (
const duk_uint8_t *) &lf_func,
sizeof(lf_func));
867#if defined(DUK_USE_FASTINT)
868 case DUK_TAG_FASTINT:
882 i32 = (duk_int32_t) du1.
d;
886 "du2=%02x%02x%02x%02x%02x%02x%02x%02x",
888 (
unsigned int) du1.
uc[0], (
unsigned int) du1.
uc[1],
889 (
unsigned int) du1.
uc[2], (
unsigned int) du1.
uc[3],
890 (
unsigned int) du1.
uc[4], (
unsigned int) du1.
uc[5],
891 (
unsigned int) du1.
uc[6], (
unsigned int) du1.
uc[7],
892 (
unsigned int) du2.
uc[0], (
unsigned int) du2.
uc[1],
893 (
unsigned int) du2.
uc[2], (
unsigned int) du2.
uc[3],
894 (
unsigned int) du2.
uc[4], (
unsigned int) du2.
uc[5],
895 (
unsigned int) du2.
uc[6], (
unsigned int) du2.
uc[7]));
897 if (
DUK_MEMCMP((
const void *) du1.
uc, (
const void *) du2.
uc,
sizeof(du1.
uc)) == 0) {
898 duk_debug_write_int(thr, i32);
900 DUK_DBLUNION_DOUBLE_HTON(&du1);
902 duk_debug_write_bytes(thr, (
const duk_uint8_t *) du1.
uc,
sizeof(du1.
uc));
907#if defined(DUK_USE_DEBUGGER_DUMPHEAP)
914 duk_debug_write_heapptr(thr, h);
916 duk_debug_write_tval(thr, tv);
928 duk_debug_write_int(thr, command);
939 duk_debug_write_int(thr, (duk_int32_t) err_code);
940 duk_debug_write_cstring(thr, msg);
941 duk_debug_write_eom(thr);
946 duk_debug_write_int(thr, command);
957 duk_debug_write_flush(thr);
982 pc = duk_hthread_get_act_curr_pc(thr, act);
998 duk_debug_write_int(thr, thr->
heap->dbg_paused);
1002 duk_debug_write_undefined(thr);
1003 duk_debug_write_undefined(thr);
1004 duk_debug_write_int(thr, 0);
1005 duk_debug_write_int(thr, 0);
1010 duk__debug_write_hstring_safe_top(thr);
1012 duk__debug_write_hstring_safe_top(thr);
1015 duk_debug_write_uint(thr, (duk_uint32_t) duk_debug_curr_line(thr));
1016 duk_debug_write_uint(thr, (duk_uint32_t) duk_hthread_get_act_curr_pc(thr, act));
1019 duk_debug_write_eom(thr);
1022#if defined(DUK_USE_DEBUGGER_THROW_NOTIFY)
1035 duk_debug_write_int(thr,
fatal);
1039 duk__debug_write_hstring_safe_top(thr);
1045 duk__debug_write_hstring_safe_top(thr);
1055 duk__debug_write_hstring_safe_top(thr);
1061 duk_debug_write_eom(thr);
1074 x = duk_debug_read_byte(thr);
1077 duk_debug_skip_byte(thr);
1084 duk_debug_skip_bytes(thr, x - 0x60);
1096 (void) duk__debug_read_uint32_raw(thr);
1100 len = duk__debug_read_uint32_raw(thr);
1101 duk_debug_skip_bytes(thr, len);
1105 len = duk__debug_read_uint16_raw(thr);
1106 duk_debug_skip_bytes(thr, len);
1115 duk_debug_skip_bytes(thr, 8);
1118 duk_debug_skip_byte(thr);
1119 len = duk_debug_read_byte(thr);
1120 duk_debug_skip_bytes(thr, len);
1124 len = duk_debug_read_byte(thr);
1125 duk_debug_skip_bytes(thr, len);
1128 duk_debug_skip_bytes(thr, 2);
1129 len = duk_debug_read_byte(thr);
1130 duk_debug_skip_bytes(thr, len);
1139 DUK__SET_CONN_BROKEN(thr, 1);
1146 if (duk__debug_skip_dvalue(thr)) {
1160 duk_debug_write_reply(thr);
1164#if defined(DUK_USE_DOUBLE_LE)
1165 duk_debug_write_int(thr, 1);
1166#elif defined(DUK_USE_DOUBLE_ME)
1167 duk_debug_write_int(thr, 2);
1168#elif defined(DUK_USE_DOUBLE_BE)
1169 duk_debug_write_int(thr, 3);
1171 duk_debug_write_int(thr, 0);
1173 duk_debug_write_int(thr, (
duk_int_t)
sizeof(
void *));
1174 duk_debug_write_eom(thr);
1181 duk_debug_write_reply(thr);
1182 duk_debug_write_eom(thr);
1183 heap->dbg_state_dirty = 1;
1189 DUK_HEAP_SET_PAUSED(heap);
1190 duk_debug_write_reply(thr);
1191 duk_debug_write_eom(thr);
1197 DUK_HEAP_CLEAR_PAUSED(heap);
1198 duk_debug_write_reply(thr);
1199 duk_debug_write_eom(thr);
1206 DUK_D(
DUK_DPRINT(
"debug command StepInto/StepOver/StepOut: %d", (
int) cmd));
1217 line = duk_debug_curr_line(thr);
1219 heap->dbg_paused = 0;
1220 heap->dbg_step_type = step_type;
1221 heap->dbg_step_thread = thr;
1223 heap->dbg_step_startline = line;
1224 heap->dbg_state_dirty = 1;
1226 DUK_D(
DUK_DPRINT(
"cannot determine current line, stepinto/stepover/stepout ignored"));
1228 duk_debug_write_reply(thr);
1229 duk_debug_write_eom(thr);
1236 duk_debug_write_reply(thr);
1238 duk_debug_write_hstring(thr, heap->dbg_breakpoints[i].filename);
1239 duk_debug_write_uint(thr, (duk_uint32_t) heap->dbg_breakpoints[i].line);
1241 duk_debug_write_eom(thr);
1246 duk_uint32_t linenumber;
1251 filename = duk_debug_read_hstring(thr);
1252 linenumber = (duk_uint32_t) duk_debug_read_int(thr);
1254 idx = duk_debug_add_breakpoint(thr, filename, linenumber);
1256 duk_debug_write_reply(thr);
1257 duk_debug_write_int(thr, (duk_int32_t) idx);
1258 duk_debug_write_eom(thr);
1271 if (duk_debug_remove_breakpoint(thr, idx)) {
1272 duk_debug_write_reply(thr);
1273 duk_debug_write_eom(thr);
1288 str = duk_debug_read_hstring(thr);
1291 level = duk_debug_read_int(thr);
1292 if (level >= 0 || -level > (duk_int32_t) thr->
callstack_top) {
1315 duk_debug_write_reply(thr);
1317 duk_debug_write_int(thr, 1);
1321 duk_debug_write_int(thr, 0);
1322 duk_debug_write_unused(thr);
1324 duk_debug_write_eom(thr);
1335 str = duk_debug_read_hstring(thr);
1337 tv = duk_debug_read_tval(thr);
1343 level = duk_debug_read_int(thr);
1344 if (level >= 0 || -level > (duk_int32_t) thr->
callstack_top) {
1366 duk_debug_write_reply(thr);
1367 duk_debug_write_eom(thr);
1381 duk_debug_write_reply(thr);
1382 while (curr_thr !=
NULL) {
1403 duk__debug_write_hstring_safe_top(thr);
1405 duk__debug_write_hstring_safe_top(thr);
1406 pc = duk_hthread_get_act_curr_pc(thr, curr_act);
1411 duk_debug_write_uint(thr, (duk_uint32_t) line);
1412 duk_debug_write_uint(thr, (duk_uint32_t) pc);
1420 duk_debug_write_eom(thr);
1432 level = duk_debug_read_int(thr);
1433 if (level >= 0 || -level > (duk_int32_t) thr->
callstack_top) {
1438 duk_debug_write_reply(thr);
1440 duk_debug_write_reply(thr);
1442 goto callstack_empty;
1474 duk_debug_write_eom(thr);
1500 (void) duk_debug_read_hstring(thr);
1502 level = duk_debug_read_int(thr);
1503 if (level >= 0 || -level > (duk_int32_t) thr->
callstack_top) {
1550 duk_debug_write_reply(thr);
1551 duk_debug_write_int(thr, (duk_int32_t) eval_err);
1554 duk_debug_write_eom(thr);
1561 duk_debug_write_reply(thr);
1562 duk_debug_write_eom(thr);
1565 DUK__SET_CONN_BROKEN(thr, 0);
1576 if (heap->dbg_request_cb !=
NULL) {
1590 tv = duk_debug_read_tval(thr);
1600 DUK_D(
DUK_DPRINT(
"calling into AppRequest request_cb with nvalues=%ld, old_top=%ld, top=%ld",
1601 (
long) nvalues, (
long) old_top, (
long)
duk_get_top(ctx)));
1602 nrets = heap->dbg_request_cb(ctx, heap->dbg_udata, nvalues);
1603 DUK_D(
DUK_DPRINT(
"returned from AppRequest request_cb; nvalues=%ld -> nrets=%ld, old_top=%ld, top=%ld",
1604 (
long) nvalues, (
long) nrets, (
long) old_top, (
long)
duk_get_top(ctx)));
1608 DUK_D(
DUK_DPRINT(
"AppRequest callback doesn't match value stack configuration, "
1609 "top=%ld < old_top=%ld + nrets=%ld; "
1610 "this might mean it's unsafe to continue!",
1611 (
long)
duk_get_top(ctx), (
long) old_top, (
long) nrets));
1618 for (idx = top - nrets; idx < top; idx++) {
1621 duk_debug_write_eom(thr);
1625 DUK_D(
DUK_DPRINT(
"request callback return value doesn't match value stack configuration"));
1633 DUK_D(
DUK_DPRINT(
"no request callback, treat AppRequest as unsupported"));
1641 DUK__SET_CONN_BROKEN(thr, 1);
1648#if defined(DUK_USE_DEBUGGER_DUMPHEAP)
1655 duk_debug_write_heapptr(thr, hdr);
1658#if defined(DUK_USE_REFERENCE_COUNTING)
1661 duk_debug_write_int(thr, (duk_int32_t) -1);
1671 duk_debug_write_hstring(thr, h);
1691 duk_debug_write_int(thr, 0);
1692 duk_debug_write_unused(thr);
1696 duk_debug_write_int(thr, 1);
1700 duk_debug_write_int(thr, 0);
1731 while (hdr !=
NULL) {
1732 duk__debug_dump_heaphdr(thr, heap, hdr);
1737#if defined(DUK_USE_STRTAB_CHAIN)
1741#if defined(DUK_USE_HEAPPTR16)
1751#if defined(DUK_USE_HEAPPTR16)
1752 lst = (duk_uint16_t *) DUK_USE_HEAPPTR_DEC16(heap->
heap_udata, e->
u.strlist16);
1758 for (j = 0; j < e->
listlen; j++) {
1759#if defined(DUK_USE_HEAPPTR16)
1760 h = DUK_USE_HEAPPTR_DEC16(heap->
heap_udata, lst[j]);
1765 duk__debug_dump_heaphdr(thr, heap, (
duk_heaphdr *) h);
1769#if defined(DUK_USE_HEAPPTR16)
1770 h = DUK_USE_HEAPPTR_DEC16(heap->
heap_udata, e->
u.str16);
1775 duk__debug_dump_heaphdr(thr, heap, (
duk_heaphdr *) h);
1782#if defined(DUK_USE_STRTAB_PROBE)
1787 for (i = 0; i < heap->
st_size; i++) {
1788#if defined(DUK_USE_HEAPPTR16)
1789 h = DUK_USE_HEAPPTR_DEC16(heap->
heap_udata, heap->strtable16[i]);
1797 duk__debug_dump_heaphdr(thr, heap, (
duk_heaphdr *) h);
1805 duk_debug_write_reply(thr);
1806 duk__debug_dump_heap_allocated(thr, heap);
1807#if defined(DUK_USE_STRTAB_CHAIN)
1808 duk__debug_dump_strtab_chain(thr, heap);
1810#if defined(DUK_USE_STRTAB_PROBE)
1811 duk__debug_dump_strtab_probe(thr, heap);
1813 duk_debug_write_eom(thr);
1823 duk_int32_t level = -1;
1830 ibyte = duk_debug_peek_byte(thr);
1832 tv = duk_debug_read_tval(thr);
1850 if (level >= 0 || -level > (duk_int32_t) thr->
callstack_top) {
1864 duk_debug_write_reply(thr);
1866 duk_debug_write_int(thr, (duk_int32_t) n);
1868 for (i = 0; i < n; i++) {
1869 duk_debug_write_tval(thr, tv);
1873 duk_debug_write_int(thr, (duk_int32_t) n);
1875 for (i = 0; i < n; i++) {
1876 duk_debug_write_hobject(thr, *fn);
1879 duk_debug_write_string(thr,
1882 duk_debug_write_eom(thr);
1899#if defined(DUK_USE_DEBUGGER_INSPECT)
1902DUK_LOCAL const char *
const duk__debug_getinfo_heaphdr_keys[] = {
1919DUK_LOCAL const char *
const duk__debug_getinfo_hstring_keys[] = {
1924 "strict_reserved_word",
1925 "eval_or_arguments",
1941DUK_LOCAL const char *
const duk__debug_getinfo_hobject_keys[] = {
1985DUK_LOCAL const char *
const duk__debug_getinfo_hbuffer_keys[] = {
1997 duk_debug_write_uint(thr, 0);
1998 duk_debug_write_cstring(thr, key);
2002 duk_debug_write_uint(thr, 0);
2003 duk_debug_write_cstring(thr, key);
2004 duk_debug_write_uint(thr, val);
2008 duk_debug_write_uint(thr, 0);
2009 duk_debug_write_cstring(thr, key);
2010 duk_debug_write_int(thr, val);
2014 duk_debug_write_uint(thr, 0);
2015 duk_debug_write_cstring(thr, key);
2016 duk_debug_write_boolean(thr, val);
2031 DUK_DD(
DUK_DDPRINT(
"inspect bitmask: key=%s, mask=0x%08lx, flags=0x%08lx", key, (
unsigned long)
mask, (
unsigned long) flags));
2032 duk__debug_getinfo_prop_bool(thr, key, flags &
mask);
2053 duk_debug_write_uint(thr, idx);
2055 duk_debug_write_tval(thr, tv);
2065 if (h_key ==
NULL) {
2066 duk_debug_write_uint(thr, 0);
2067 duk_debug_write_null(thr);
2068 duk_debug_write_unused(thr);
2076 duk_debug_write_uint(thr, flags);
2077 duk_debug_write_hstring(thr, h_key);
2081 duk_debug_write_hobject(thr, h_getset);
2083 duk_debug_write_null(thr);
2087 duk_debug_write_hobject(thr, h_getset);
2089 duk_debug_write_null(thr);
2093 duk_debug_write_tval(thr, tv);
2104 h = duk_debug_read_any_ptr(thr);
2110 duk_debug_write_reply(thr);
2117 duk__debug_getinfo_flags_key(thr,
"heapptr");
2118 duk_debug_write_heapptr(thr, h);
2123#if defined(DUK_USE_REFERENCE_COUNTING)
2127 duk__debug_getinfo_bitmask(thr,
2128 duk__debug_getinfo_heaphdr_keys,
2129 duk__debug_getinfo_heaphdr_masks,
2138 duk__debug_getinfo_bitmask(thr,
2139 duk__debug_getinfo_hstring_keys,
2140 duk__debug_getinfo_hstring_masks,
2145 duk__debug_getinfo_flags_key(thr,
"data");
2146 duk_debug_write_hstring(thr, h_str);
2157 duk__debug_getinfo_bitmask(thr,
2158 duk__debug_getinfo_hobject_keys,
2159 duk__debug_getinfo_hobject_masks,
2162 duk__debug_getinfo_flags_key(thr,
"class_name");
2164 duk__debug_getinfo_flags_key(thr,
"prototype");
2165 if (h_proto !=
NULL) {
2166 duk_debug_write_hobject(thr, h_proto);
2168 duk_debug_write_null(thr);
2170 duk__debug_getinfo_flags_key(thr,
"props");
2182 duk__debug_getinfo_prop_int(thr,
"nargs", h_fun->
nargs);
2183 duk__debug_getinfo_prop_int(thr,
"magic", h_fun->
magic);
2188 duk__debug_getinfo_flags_key(thr,
"funcptr");
2189 duk_debug_write_buffer(thr, (
const char *) &h_fun->
func,
sizeof(h_fun->
func));
2197 duk__debug_getinfo_prop_int(thr,
"nregs", h_fun->
nregs);
2198 duk__debug_getinfo_prop_int(thr,
"nargs", h_fun->
nargs);
2199 duk__debug_getinfo_prop_uint(thr,
"start_line", h_fun->start_line);
2200 duk__debug_getinfo_prop_uint(thr,
"end_line", h_fun->end_line);
2202 if (h_buf !=
NULL) {
2203 duk__debug_getinfo_flags_key(thr,
"data");
2204 duk_debug_write_heapptr(thr, (
duk_heaphdr *) h_buf);
2221 duk__debug_getinfo_prop_uint(thr,
"slice_offset", h_bufobj->
offset);
2222 duk__debug_getinfo_prop_uint(thr,
"slice_length", h_bufobj->
length);
2223 duk__debug_getinfo_prop_uint(thr,
"elem_shift", (
duk_uint_t) h_bufobj->
shift);
2227 duk__debug_getinfo_flags_key(thr,
"buffer");
2237 duk__debug_getinfo_bitmask(thr,
2238 duk__debug_getinfo_hbuffer_keys,
2239 duk__debug_getinfo_hbuffer_masks,
2242 duk__debug_getinfo_flags_key(thr,
"dataptr");
2244 duk__debug_getinfo_flags_key(thr,
"data");
2245 duk_debug_write_hbuffer(thr, h_buf);
2254 duk_debug_write_eom(thr);
2266 h = duk_debug_read_any_ptr(thr);
2271 h_key = duk_debug_read_hstring(thr);
2283 virtual_idx = (desc.
a_idx >= 0 ? desc.
a_idx :
2286 duk_debug_write_reply(thr);
2287 rc = duk__debug_getprop_index(thr, heap, h_obj, (
duk_uint_t) virtual_idx);
2290 duk_debug_write_eom(thr);
2308 h = duk_debug_read_any_ptr(thr);
2309 idx_start = duk_debug_read_int(thr);
2310 idx_end = duk_debug_read_int(thr);
2323 duk_debug_write_reply(thr);
2324 for (idx = idx_start; idx < idx_end; idx++) {
2325 if (!duk__debug_getprop_index(thr, heap, h_obj, idx)) {
2329 duk_debug_write_eom(thr);
2364 x = duk_debug_read_byte(thr);
2367 cmd = duk_debug_read_int(thr);
2370 duk__debug_handle_basic_info(thr, heap);
2374 duk__debug_handle_trigger_status(thr, heap);
2378 duk__debug_handle_pause(thr, heap);
2382 duk__debug_handle_resume(thr, heap);
2388 duk__debug_handle_step(thr, heap, cmd);
2392 duk__debug_handle_list_break(thr, heap);
2396 duk__debug_handle_add_break(thr, heap);
2400 duk__debug_handle_del_break(thr, heap);
2404 duk__debug_handle_get_var(thr, heap);
2408 duk__debug_handle_put_var(thr, heap);
2412 duk__debug_handle_get_call_stack(thr, heap);
2416 duk__debug_handle_get_locals(thr, heap);
2420 duk__debug_handle_eval(thr, heap);
2428 duk__debug_handle_detach(thr, heap);
2431#if defined(DUK_USE_DEBUGGER_DUMPHEAP)
2433 duk__debug_handle_dump_heap(thr, heap);
2438 duk__debug_handle_get_bytecode(thr, heap);
2442 duk__debug_handle_apprequest(thr, heap);
2445#if defined(DUK_USE_DEBUGGER_INSPECT)
2447 duk__debug_handle_get_heap_obj_info(thr, heap);
2451 duk__debug_handle_get_obj_prop_desc(thr, heap);
2455 duk__debug_handle_get_obj_prop_desc_range(thr, heap);
2479 DUK_D(
DUK_DPRINT(
"invalid initial byte, drop connection: %d", (
int) x));
2486 duk__debug_skip_to_eom(thr);
2492 DUK__SET_CONN_BROKEN(thr, 1);
2497 if (thr->
heap->dbg_read_cb !=
NULL && thr->
heap->dbg_state_dirty) {
2498 duk_debug_send_status(thr);
2499 thr->
heap->dbg_state_dirty = 0;
2505#if defined(DUK_USE_ASSERTIONS)
2513#if defined(DUK_USE_ASSERTIONS)
2517 DUK_D(
DUK_DPRINT(
"process debug messages: read_cb=%s, no_block=%ld, detaching=%ld, processing=%ld",
2518 thr->
heap->dbg_read_cb ?
"not NULL" :
"NULL", (long) no_block,
2519 (long) thr->heap->dbg_detaching, (long) thr->heap->dbg_processing));
2527 thr->
heap->dbg_processing = 1;
2533 duk__check_resend_status(thr);
2542 while (thr->
heap->dbg_read_cb ==
NULL && thr->
heap->dbg_detaching) {
2563 DUK_D(
DUK_DPRINT(
"detach pending (dbg_read_cb == NULL, dbg_detaching != 0), call detach2"));
2565 duk__debug_do_detach2(thr->
heap);
2566 thr->
heap->dbg_processing = 1;
2568 DUK_D(
DUK_DPRINT(
"after detach2 (and possible reattach): dbg_read_cb=%s, dbg_detaching=%ld",
2569 thr->
heap->dbg_read_cb ?
"not NULL" :
"NULL", (long) thr->heap->dbg_detaching));
2574 if (thr->
heap->dbg_read_cb ==
NULL) {
2575 DUK_D(
DUK_DPRINT(
"debug connection broken (and not detaching), stop processing messages"));
2579 if (!thr->
heap->dbg_paused || no_block) {
2580 if (!duk_debug_read_peek(thr)) {
2585 DUK_D(
DUK_DPRINT(
"processing debug message, peek indicated no data, stop processing messages"));
2588 DUK_D(
DUK_DPRINT(
"processing debug message, peek indicated there is data, handle it"));
2590 DUK_D(
DUK_DPRINT(
"paused, process debug message, blocking if necessary"));
2593 duk__check_resend_status(thr);
2594 duk__debug_process_message(thr);
2595 duk__check_resend_status(thr);
2602 thr->
heap->dbg_processing = 0;
2607 duk_debug_read_flush(thr);
2612#if defined(DUK_USE_ASSERTIONS)
2640 DUK_HEAP_SET_PAUSED(thr->
heap);
2673 thr->
heap->dbg_state_dirty = 1;
2674 while (thr->
heap->dbg_paused) {
2677 duk_debug_process_messages(thr, 0 );
2711 DUK_D(
DUK_DPRINT(
"failed to add breakpoint for %O:%ld, all breakpoint slots used",
2716 b = heap->dbg_breakpoints + (heap->dbg_breakpoint_count++);
2721 return heap->dbg_breakpoint_count - 1;
2741 if (breakpoint_index >= heap->dbg_breakpoint_count) {
2742 DUK_D(
DUK_DPRINT(
"invalid breakpoint index: %ld", (
long) breakpoint_index));
2745 b = heap->dbg_breakpoints + breakpoint_index;
2750 move_size =
sizeof(
duk_breakpoint) * (heap->dbg_breakpoint_count - breakpoint_index - 1);
2751 if (move_size > 0) {
2753 (
const void *) (b + 1),
2754 (
size_t) move_size);
2756 heap->dbg_breakpoint_count--;
2767#undef DUK__SET_CONN_BROKEN
unsigned int duk_small_uint_t
duk_int_fast32_t duk_int_t
duk_uint_fast32_t duk_uint_t
#define DUK_MEMZERO(p, n)
#define DUK_USE_TARGET_INFO
duk_small_int_t duk_bool_t
duk_uint32_t duk_uint_fast32_t
DUK_EXTERNAL void duk_enum(duk_context *ctx, duk_idx_t obj_index, duk_uint_t enum_flags)
#define DUK_DBG_CMD_APPREQUEST
#define DUK_STRTAB_DELETED_MARKER(heap)
#define DUK_HOBJECT_FLAG_NEWENV
struct duk_breakpoint duk_breakpoint
#define DUK_HOBJECT_A_GET_VALUE_PTR(heap, h, i)
#define DUK_HCOMPILEDFUNCTION_GET_CONSTS_BASE(heap, h)
#define DUK_DBG_IB_OBJECT
DUK_EXTERNAL void duk_pop_2(duk_context *ctx)
#define DUK_DBG_IB_NOTIFY
#define DUK_DBG_IB_NUMBER
#define DUK_HSTRING_GET_DATA(x)
#define DUK_HCOMPILEDFUNCTION_GET_CODE_BASE(heap, h)
#define DUK_HEAPHDR_GET_TYPE(h)
#define DUK_HOBJECT_GET_PROTOTYPE(heap, h)
#define DUK_TVAL_IS_NUMBER(tv)
#define DUK_HOBJECT_FLAG_CONSTRUCTABLE
#define DUK_DBG_CMD_GETOBJPROPDESC
DUK_INTERNAL_DECL duk_bool_t duk_get_prop_stridx(duk_context *ctx, duk_idx_t obj_index, duk_small_int_t stridx)
#define DUK_DBG_CMD_GETBYTECODE
DUK_EXTERNAL void duk_push_true(duk_context *ctx)
#define DUK_HOBJECT_FLAG_NAMEBINDING
#define DUK_HOBJECT_GET_ENEXT(h)
DUK_INTERNAL_DECL void duk_js_putvar_activation(duk_hthread *thr, duk_activation *act, duk_hstring *name, duk_tval *val, duk_bool_t strict)
#define DUK_TVAL_GET_OBJECT(tv)
#define DUK_HOBJECT_GET_PROPS(heap, h)
#define DUK_DBG_CMD_GETCALLSTACK
#define DUK_HOBJECT_FLAG_NOTAIL
#define DUK_DBG_ERR_UNKNOWN
#define DUK_HEAPHDR_FLAG_READONLY
#define DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(heap, h, i)
#define DUK_STEP_TYPE_INTO
#define DUK_DBG_PROPFLAG_INTERNAL
#define DUK_STRIDX_LINE_NUMBER
#define DUK_HOBJECT_FLAG_COMPILEDFUNCTION
DUK_EXTERNAL duk_bool_t duk_next(duk_context *ctx, duk_idx_t enum_index, duk_bool_t get_value)
#define DUK_HCOMPILEDFUNCTION_GET_FUNCS_COUNT(heap, h)
#define DUK_HEAPHDR_GET_FLAGS_RAW(h)
#define DUK_STRIDX_FILE_NAME
#define DUK_HOBJECT_IS_COMPILEDFUNCTION(h)
#define DUK_HEAP_MAX_BREAKPOINTS
#define DUK_TVAL_IS_OBJECT(tv)
#define DUK_HSTRING_FLAG_EVAL_OR_ARGUMENTS
#define DUK_HEAPHDR_FLAG_TEMPROOT
#define DUK_DBG_IB_UNUSED
#define DUK_TVAL_GET_BUFFER(tv)
DUK_INTERNAL_DECL void duk_push_hstring_stridx(duk_context *ctx, duk_small_int_t stridx)
#define DUK_HSTRING_GET_CHARLEN(x)
#define DUK_DBG_CMD_STATUS
#define DUK_DBG_CMD_GETOBJPROPDESCRANGE
#define DUK_HOBJECT_E_GET_VALUE_SETTER(heap, h, i)
#define DUK_PROPDESC_FLAG_ACCESSOR
#define DUK_HCOMPILEDFUNCTION_GET_FUNCS_BASE(heap, h)
#define DUK_HOBJECT_E_GET_KEY(heap, h, i)
#define DUK_TVAL_GET_TAG(tv)
#define DUK_HOBJECT_FLAG_EXOTIC_ARGUMENTS
DUK_EXTERNAL const char * duk_push_lstring(duk_context *ctx, const char *str, duk_size_t len)
#define DUK_DBG_CMD_RESUME
#define DUK_DBG_CMD_TRIGGERSTATUS
#define DUK_HOBJECT_GET_ASIZE(h)
#define DUK_DBG_CMD_THROW
#define DUK_TVAL_IS_UNUSED(tv)
#define DUK_HSTRING_GET_HASH(x)
#define DUK_HOBJECT_FLAG_BUFFEROBJECT
#define DUK_HOBJECT_FLAG_CREATEARGS
#define DUK_HOBJECT_GET_CLASS_STRING(heap, h)
DUK_EXTERNAL duk_idx_t duk_push_c_function(duk_context *ctx, duk_c_function func, duk_int_t nargs)
#define DUK_HSTRING_FLAG_RESERVED_WORD
#define DUK_ASSERT_DISABLE(x)
DUK_EXTERNAL void duk_push_null(duk_context *ctx)
DUK_EXTERNAL void duk_push_int(duk_context *ctx, duk_int_t val)
DUK_EXTERNAL void duk_pop_3(duk_context *ctx)
#define DUK_DBG_CMD_ADDBREAK
#define DUK_HBUFFER_FLAG_EXTERNAL
#define DUK_DBG_CMD_PAUSE
#define DUK_HEAPHDR_GET_REFCOUNT(h)
#define DUK_HOBJECT_IS_THREAD(h)
#define DUK_TVAL_GET_STRING(tv)
#define DUK_DBG_CMD_GETVAR
DUK_EXTERNAL void duk_push_pointer(duk_context *ctx, void *val)
#define DUK_HSTRING_DECREF(thr, h)
#define DUK_HEAPHDR_FLAG_FINALIZED
#define DUK_HSTRING_INCREF(thr, h)
#define DUK_HOBJECT_FLAG_EXOTIC_STRINGOBJ
#define DUK_HEAPHDR_FLAG_REACHABLE
#define DUK_HOBJECT_IS_NATIVEFUNCTION(h)
DUK_EXTERNAL const char * duk_get_string(duk_context *ctx, duk_idx_t index)
DUK_INTERNAL_DECL duk_uint_fast32_t duk_hobject_pc2line_query(duk_context *ctx, duk_idx_t idx_func, duk_uint_fast32_t pc)
#define DUK_DBG_IB_HEAPPTR
DUK_EXTERNAL duk_bool_t duk_is_object(duk_context *ctx, duk_idx_t index)
#define DUK_HOBJECT_GET_HSIZE(h)
#define DUK_HOBJECT_FLAG_BOUND
#define DUK_HOBJECT_IS_BUFFEROBJECT(h)
#define DUK_HSTRING_GET_BYTELEN(x)
DUK_EXTERNAL void duk_set_top(duk_context *ctx, duk_idx_t index)
#define DUK_DBG_IB_LIGHTFUNC
#define DUK_DBG_CMD_STEPOUT
#define DUK_HEAPHDR_GET_FLAGS(h)
DUK_INTERNAL_DECL duk_hbuffer * duk_require_hbuffer(duk_context *ctx, duk_idx_t index)
#define DUK_STRIDX_EMPTY_STRING
#define DUK_DBG_CMD_GETLOCALS
#define DUK_HOBJECT_FLAG_EXOTIC_DUKFUNC
#define DUK_STRIDX_INT_VARMAP
#define DUK_STRTAB_CHAIN_SIZE
DUK_EXTERNAL void duk_dup(duk_context *ctx, duk_idx_t from_index)
#define DUK_STEP_TYPE_OVER
#define DUK_DBG_CMD_LISTBREAK
#define DUK_DBG_CMD_STEPOVER
#define DUK_HSTRING_FLAG_EXTDATA
#define DUK_DBG_CMD_STEPINTO
DUK_EXTERNAL duk_idx_t duk_get_top(duk_context *ctx)
#define DUK_HOBJECT_E_SLOT_IS_ACCESSOR(heap, h, i)
#define DUK_HCOMPILEDFUNCTION_GET_CONSTS_COUNT(heap, h)
#define DUK_DBG_CMD_DETACHING
#define DUK_TVAL_IS_HEAP_ALLOCATED(tv)
#define DUK_HOBJECT_FLAG_STRICT
DUK_INTERNAL_DECL void duk_hthread_sync_currpc(duk_hthread *thr)
DUK_INTERNAL_DECL void duk_push_tval(duk_context *ctx, duk_tval *tv)
DUK_INTERNAL_DECL duk_bool_t duk_js_getvar_activation(duk_hthread *thr, duk_activation *act, duk_hstring *name, duk_bool_t throw_flag)
#define DUK_HOBJECT_E_GET_VALUE_PTR(heap, h, i)
DUK_EXTERNAL void duk_push_uint(duk_context *ctx, duk_uint_t val)
#define DUK_HOBJECT_FLAG_ENVRECCLOSED
#define DUK_DBG_IB_UNDEFINED
DUK_EXTERNAL void duk_push_undefined(duk_context *ctx)
#define DUK_DBG_ERR_UNSUPPORTED
#define DUK_HOBJECT_FLAG_THREAD
#define DUK_HSTRING_HAS_INTERNAL(x)
#define DUK_TAG_UNDEFINED
DUK_INTERNAL_DECL duk_uint_fast32_t duk_hthread_get_act_prev_pc(duk_hthread *thr, duk_activation *act)
DUK_EXTERNAL duk_bool_t duk_get_prop_string(duk_context *ctx, duk_idx_t obj_index, const char *key)
DUK_EXTERNAL duk_uint_t duk_get_uint(duk_context *ctx, duk_idx_t index)
#define DUK_TVAL_GET_POINTER(tv)
#define DUK_HNATIVEFUNCTION_NARGS_VARARGS
DUK_EXTERNAL void duk_push_number(duk_context *ctx, duk_double_t val)
#define DUK_DBG_ERR_TOOMANY
#define DUK_HOBJECT_FLAG_EXOTIC_PROXYOBJ
#define DUK_GET_TVAL_NEGIDX(ctx, idx)
DUK_EXTERNAL void duk_push_false(duk_context *ctx)
#define duk_push_i32(ctx, val)
#define DUK_HOBJECT_FLAG_EXOTIC_ARRAY
#define DUK_HOBJECT_FLAG_EXTENSIBLE
#define DUK_HSTRING_FLAG_STRICT_RESERVED_WORD
#define DUK_DBG_CMD_PUTVAR
#define DUK_PROPDESC_FLAGS_WEC
#define DUK_HOBJECT_FLAG_NATIVEFUNCTION
#define DUK_TVAL_GET_LIGHTFUNC(tv, out_fp, out_flags)
#define DUK_DBG_CMD_DELBREAK
#define DUK_DBG_CMD_DUMPHEAP
DUK_INTERNAL_DECL duk_int_t duk_handle_call_protected(duk_hthread *thr, duk_idx_t num_stack_args, duk_small_uint_t call_flags)
#define DUK_TVAL_GET_BOOLEAN(tv)
#define DUK_HCOMPILEDFUNCTION_GET_DATA(heap, h)
DUK_EXTERNAL const char * duk_to_string(duk_context *ctx, duk_idx_t index)
#define DUK_DBG_ERR_NOTFOUND
#define DUK_STEP_TYPE_OUT
#define DUK_DBG_CMD_BASICINFO
#define DUK_GET_TVAL_POSIDX(ctx, idx)
#define DUK_HBUFFER_GET_DATA_PTR(heap, x)
#define DUK_ACT_GET_FUNC(act)
DUK_EXTERNAL void duk_pop(duk_context *ctx)
#define DUK_HBUFFER_FLAG_DYNAMIC
DUK_EXTERNAL duk_bool_t duk_check_stack(duk_context *ctx, duk_idx_t extra)
#define DUK_HEAPHDR_FLAG_FINALIZABLE
#define DUK_TVAL_GET_NUMBER(tv)
#define DUK_DBG_IB_POINTER
#define DUK_HOBJECT_GET_CLASS_NUMBER(h)
#define DUK_CALL_FLAG_DIRECT_EVAL
#define DUK_TVAL_GET_HEAPHDR(tv)
#define DUK_DBG_CMD_GETHEAPOBJINFO
#define DUK_HOBJECT_E_GET_FLAGS(heap, h, i)
#define DUK_HOBJECT_E_GET_VALUE_GETTER(heap, h, i)
DUK_INTERNAL_DECL duk_hstring * duk_get_hstring(duk_context *ctx, duk_idx_t index)
DUK_INTERNAL_DECL duk_hstring * duk_require_hstring(duk_context *ctx, duk_idx_t index)
#define DUK_HOBJECT_GET_ESIZE(h)
DUK_INTERNAL_DECL duk_bool_t duk_hobject_get_own_propdesc(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_propdesc *out_desc, duk_small_uint_t flags)
#define DUK_HEAPHDR_GET_NEXT(heap, h)
#define DUK_HSTRING_FLAG_ARRIDX
#define DUK_DBG_ERR_APPLICATION
DUK_INTERNAL_DECL duk_ret_t duk_bi_global_object_eval(duk_context *ctx)
#define DUK_DBG_CMD_DETACH
#define DUK_DBG_IB_REQUEST
DUK_EXTERNAL duk_idx_t duk_push_heapptr(duk_context *ctx, void *ptr)
#define DUK_HSTRING_FLAG_INTERNAL
#define DUK_HBUFFER_GET_SIZE(x)
#define DUK_HCOMPILEDFUNCTION_GET_CODE_SIZE(heap, h)
#define DUK_HOBJECT_FLAG_ARRAY_PART
DUK_INTERNAL_DECL duk_tval * duk_get_tval(duk_context *ctx, duk_idx_t index)
#define DUK_TAG_LIGHTFUNC
DUK_INTERNAL_DECL duk_activation * duk_hthread_get_current_activation(duk_hthread *thr)
#define duk_push_fixed_buffer(ctx, size)
#define duk_safe_to_string(ctx, index)
void(* duk_debug_detached_function)(void *udata)
#define DUK_DBLUNION_DOUBLE_NTOH(u)
#define duk_is_error(ctx, index)
duk_ret_t(* duk_c_function)(duk_context *ctx)
static void fatal(const char *message)
duk_hthread * heap_thread
duk_heaphdr * heap_allocated
duk_activation * callstack
union duk_strtab_entry::@21 u