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));
1017 duk_debug_write_uint(thr, (duk_uint32_t) duk_hthread_get_act_curr_pc(thr, act));
1020 duk_debug_write_eom(thr);
1023#if defined(DUK_USE_DEBUGGER_THROW_NOTIFY)
1036 duk_debug_write_int(thr,
fatal);
1040 duk__debug_write_hstring_safe_top(thr);
1046 duk__debug_write_hstring_safe_top(thr);
1059 duk__debug_write_hstring_safe_top(thr);
1068 duk_debug_write_cstring(thr,
"");
1069 duk_debug_write_uint(thr, 0);
1073 duk_debug_write_eom(thr);
1086 x = duk_debug_read_byte(thr);
1089 duk_debug_skip_byte(thr);
1096 duk_debug_skip_bytes(thr, x - 0x60);
1108 (void) duk__debug_read_uint32_raw(thr);
1112 len = duk__debug_read_uint32_raw(thr);
1113 duk_debug_skip_bytes(thr, len);
1117 len = duk__debug_read_uint16_raw(thr);
1118 duk_debug_skip_bytes(thr, len);
1127 duk_debug_skip_bytes(thr, 8);
1130 duk_debug_skip_byte(thr);
1131 len = duk_debug_read_byte(thr);
1132 duk_debug_skip_bytes(thr, len);
1136 len = duk_debug_read_byte(thr);
1137 duk_debug_skip_bytes(thr, len);
1140 duk_debug_skip_bytes(thr, 2);
1141 len = duk_debug_read_byte(thr);
1142 duk_debug_skip_bytes(thr, len);
1151 DUK__SET_CONN_BROKEN(thr, 1);
1158 if (duk__debug_skip_dvalue(thr)) {
1172 duk_debug_write_reply(thr);
1176#if defined(DUK_USE_DOUBLE_LE)
1177 duk_debug_write_int(thr, 1);
1178#elif defined(DUK_USE_DOUBLE_ME)
1179 duk_debug_write_int(thr, 2);
1180#elif defined(DUK_USE_DOUBLE_BE)
1181 duk_debug_write_int(thr, 3);
1183 duk_debug_write_int(thr, 0);
1185 duk_debug_write_int(thr, (
duk_int_t)
sizeof(
void *));
1186 duk_debug_write_eom(thr);
1193 duk_debug_write_reply(thr);
1194 duk_debug_write_eom(thr);
1195 heap->dbg_state_dirty = 1;
1201 DUK_HEAP_SET_PAUSED(heap);
1202 duk_debug_write_reply(thr);
1203 duk_debug_write_eom(thr);
1209 DUK_HEAP_CLEAR_PAUSED(heap);
1210 duk_debug_write_reply(thr);
1211 duk_debug_write_eom(thr);
1218 DUK_D(
DUK_DPRINT(
"debug command StepInto/StepOver/StepOut: %d", (
int) cmd));
1229 line = duk_debug_curr_line(thr);
1231 heap->dbg_paused = 0;
1232 heap->dbg_step_type = step_type;
1233 heap->dbg_step_thread = thr;
1235 heap->dbg_step_startline = line;
1236 heap->dbg_state_dirty = 1;
1238 DUK_D(
DUK_DPRINT(
"cannot determine current line, stepinto/stepover/stepout ignored"));
1240 duk_debug_write_reply(thr);
1241 duk_debug_write_eom(thr);
1248 duk_debug_write_reply(thr);
1250 duk_debug_write_hstring(thr, heap->dbg_breakpoints[i].filename);
1251 duk_debug_write_uint(thr, (duk_uint32_t) heap->dbg_breakpoints[i].line);
1253 duk_debug_write_eom(thr);
1258 duk_uint32_t linenumber;
1263 filename = duk_debug_read_hstring(thr);
1264 linenumber = (duk_uint32_t) duk_debug_read_int(thr);
1266 idx = duk_debug_add_breakpoint(thr, filename, linenumber);
1268 duk_debug_write_reply(thr);
1269 duk_debug_write_int(thr, (duk_int32_t) idx);
1270 duk_debug_write_eom(thr);
1283 if (duk_debug_remove_breakpoint(thr, idx)) {
1284 duk_debug_write_reply(thr);
1285 duk_debug_write_eom(thr);
1300 str = duk_debug_read_hstring(thr);
1303 level = duk_debug_read_int(thr);
1304 if (level >= 0 || -level > (duk_int32_t) thr->
callstack_top) {
1327 duk_debug_write_reply(thr);
1329 duk_debug_write_int(thr, 1);
1333 duk_debug_write_int(thr, 0);
1334 duk_debug_write_unused(thr);
1336 duk_debug_write_eom(thr);
1347 str = duk_debug_read_hstring(thr);
1349 tv = duk_debug_read_tval(thr);
1355 level = duk_debug_read_int(thr);
1356 if (level >= 0 || -level > (duk_int32_t) thr->
callstack_top) {
1378 duk_debug_write_reply(thr);
1379 duk_debug_write_eom(thr);
1393 duk_debug_write_reply(thr);
1394 while (curr_thr !=
NULL) {
1415 duk__debug_write_hstring_safe_top(thr);
1417 duk__debug_write_hstring_safe_top(thr);
1418 pc = duk_hthread_get_act_curr_pc(thr, curr_act);
1423 duk_debug_write_uint(thr, (duk_uint32_t) line);
1424 duk_debug_write_uint(thr, (duk_uint32_t) pc);
1432 duk_debug_write_eom(thr);
1444 level = duk_debug_read_int(thr);
1445 if (level >= 0 || -level > (duk_int32_t) thr->
callstack_top) {
1450 duk_debug_write_reply(thr);
1452 duk_debug_write_reply(thr);
1454 goto callstack_empty;
1486 duk_debug_write_eom(thr);
1512 (void) duk_debug_read_hstring(thr);
1514 level = duk_debug_read_int(thr);
1515 if (level >= 0 || -level > (duk_int32_t) thr->
callstack_top) {
1562 duk_debug_write_reply(thr);
1563 duk_debug_write_int(thr, (duk_int32_t) eval_err);
1566 duk_debug_write_eom(thr);
1573 duk_debug_write_reply(thr);
1574 duk_debug_write_eom(thr);
1577 DUK__SET_CONN_BROKEN(thr, 0);
1588 if (heap->dbg_request_cb !=
NULL) {
1602 tv = duk_debug_read_tval(thr);
1612 DUK_D(
DUK_DPRINT(
"calling into AppRequest request_cb with nvalues=%ld, old_top=%ld, top=%ld",
1613 (
long) nvalues, (
long) old_top, (
long)
duk_get_top(ctx)));
1614 nrets = heap->dbg_request_cb(ctx, heap->dbg_udata, nvalues);
1615 DUK_D(
DUK_DPRINT(
"returned from AppRequest request_cb; nvalues=%ld -> nrets=%ld, old_top=%ld, top=%ld",
1616 (
long) nvalues, (
long) nrets, (
long) old_top, (
long)
duk_get_top(ctx)));
1620 DUK_D(
DUK_DPRINT(
"AppRequest callback doesn't match value stack configuration, "
1621 "top=%ld < old_top=%ld + nrets=%ld; "
1622 "this might mean it's unsafe to continue!",
1623 (
long)
duk_get_top(ctx), (
long) old_top, (
long) nrets));
1630 for (idx = top - nrets; idx < top; idx++) {
1633 duk_debug_write_eom(thr);
1637 DUK_D(
DUK_DPRINT(
"request callback return value doesn't match value stack configuration"));
1645 DUK_D(
DUK_DPRINT(
"no request callback, treat AppRequest as unsupported"));
1653 DUK__SET_CONN_BROKEN(thr, 1);
1660#if defined(DUK_USE_DEBUGGER_DUMPHEAP)
1667 duk_debug_write_heapptr(thr, hdr);
1670#if defined(DUK_USE_REFERENCE_COUNTING)
1673 duk_debug_write_int(thr, (duk_int32_t) -1);
1683 duk_debug_write_hstring(thr, h);
1703 duk_debug_write_int(thr, 0);
1704 duk_debug_write_unused(thr);
1708 duk_debug_write_int(thr, 1);
1712 duk_debug_write_int(thr, 0);
1743 while (hdr !=
NULL) {
1744 duk__debug_dump_heaphdr(thr, heap, hdr);
1749#if defined(DUK_USE_STRTAB_CHAIN)
1753#if defined(DUK_USE_HEAPPTR16)
1763#if defined(DUK_USE_HEAPPTR16)
1764 lst = (duk_uint16_t *) DUK_USE_HEAPPTR_DEC16(heap->
heap_udata, e->
u.strlist16);
1770 for (j = 0; j < e->
listlen; j++) {
1771#if defined(DUK_USE_HEAPPTR16)
1772 h = DUK_USE_HEAPPTR_DEC16(heap->
heap_udata, lst[j]);
1777 duk__debug_dump_heaphdr(thr, heap, (
duk_heaphdr *) h);
1781#if defined(DUK_USE_HEAPPTR16)
1782 h = DUK_USE_HEAPPTR_DEC16(heap->
heap_udata, e->
u.str16);
1787 duk__debug_dump_heaphdr(thr, heap, (
duk_heaphdr *) h);
1794#if defined(DUK_USE_STRTAB_PROBE)
1799 for (i = 0; i < heap->
st_size; i++) {
1800#if defined(DUK_USE_HEAPPTR16)
1801 h = DUK_USE_HEAPPTR_DEC16(heap->
heap_udata, heap->strtable16[i]);
1809 duk__debug_dump_heaphdr(thr, heap, (
duk_heaphdr *) h);
1817 duk_debug_write_reply(thr);
1818 duk__debug_dump_heap_allocated(thr, heap);
1819#if defined(DUK_USE_STRTAB_CHAIN)
1820 duk__debug_dump_strtab_chain(thr, heap);
1822#if defined(DUK_USE_STRTAB_PROBE)
1823 duk__debug_dump_strtab_probe(thr, heap);
1825 duk_debug_write_eom(thr);
1835 duk_int32_t level = -1;
1842 ibyte = duk_debug_peek_byte(thr);
1844 tv = duk_debug_read_tval(thr);
1862 if (level >= 0 || -level > (duk_int32_t) thr->
callstack_top) {
1876 duk_debug_write_reply(thr);
1878 duk_debug_write_int(thr, (duk_int32_t) n);
1880 for (i = 0; i < n; i++) {
1881 duk_debug_write_tval(thr, tv);
1885 duk_debug_write_int(thr, (duk_int32_t) n);
1887 for (i = 0; i < n; i++) {
1888 duk_debug_write_hobject(thr, *fn);
1891 duk_debug_write_string(thr,
1894 duk_debug_write_eom(thr);
1911#if defined(DUK_USE_DEBUGGER_INSPECT)
1914DUK_LOCAL const char *
const duk__debug_getinfo_heaphdr_keys[] = {
1931DUK_LOCAL const char *
const duk__debug_getinfo_hstring_keys[] = {
1936 "strict_reserved_word",
1937 "eval_or_arguments",
1953DUK_LOCAL const char *
const duk__debug_getinfo_hobject_keys[] = {
1997DUK_LOCAL const char *
const duk__debug_getinfo_hbuffer_keys[] = {
2009 duk_debug_write_uint(thr, 0);
2010 duk_debug_write_cstring(thr, key);
2014 duk_debug_write_uint(thr, 0);
2015 duk_debug_write_cstring(thr, key);
2016 duk_debug_write_uint(thr, val);
2020 duk_debug_write_uint(thr, 0);
2021 duk_debug_write_cstring(thr, key);
2022 duk_debug_write_int(thr, val);
2026 duk_debug_write_uint(thr, 0);
2027 duk_debug_write_cstring(thr, key);
2028 duk_debug_write_boolean(thr, val);
2043 DUK_DD(
DUK_DDPRINT(
"inspect bitmask: key=%s, mask=0x%08lx, flags=0x%08lx", key, (
unsigned long)
mask, (
unsigned long) flags));
2044 duk__debug_getinfo_prop_bool(thr, key, flags &
mask);
2065 duk_debug_write_uint(thr, idx);
2067 duk_debug_write_tval(thr, tv);
2077 if (h_key ==
NULL) {
2078 duk_debug_write_uint(thr, 0);
2079 duk_debug_write_null(thr);
2080 duk_debug_write_unused(thr);
2088 duk_debug_write_uint(thr, flags);
2089 duk_debug_write_hstring(thr, h_key);
2093 duk_debug_write_hobject(thr, h_getset);
2095 duk_debug_write_null(thr);
2099 duk_debug_write_hobject(thr, h_getset);
2101 duk_debug_write_null(thr);
2105 duk_debug_write_tval(thr, tv);
2116 h = duk_debug_read_any_ptr(thr);
2122 duk_debug_write_reply(thr);
2129 duk__debug_getinfo_flags_key(thr,
"heapptr");
2130 duk_debug_write_heapptr(thr, h);
2135#if defined(DUK_USE_REFERENCE_COUNTING)
2139 duk__debug_getinfo_bitmask(thr,
2140 duk__debug_getinfo_heaphdr_keys,
2141 duk__debug_getinfo_heaphdr_masks,
2150 duk__debug_getinfo_bitmask(thr,
2151 duk__debug_getinfo_hstring_keys,
2152 duk__debug_getinfo_hstring_masks,
2157 duk__debug_getinfo_flags_key(thr,
"data");
2158 duk_debug_write_hstring(thr, h_str);
2169 duk__debug_getinfo_bitmask(thr,
2170 duk__debug_getinfo_hobject_keys,
2171 duk__debug_getinfo_hobject_masks,
2174 duk__debug_getinfo_flags_key(thr,
"class_name");
2176 duk__debug_getinfo_flags_key(thr,
"prototype");
2177 if (h_proto !=
NULL) {
2178 duk_debug_write_hobject(thr, h_proto);
2180 duk_debug_write_null(thr);
2182 duk__debug_getinfo_flags_key(thr,
"props");
2194 duk__debug_getinfo_prop_int(thr,
"nargs", h_fun->
nargs);
2195 duk__debug_getinfo_prop_int(thr,
"magic", h_fun->
magic);
2200 duk__debug_getinfo_flags_key(thr,
"funcptr");
2201 duk_debug_write_buffer(thr, (
const char *) &h_fun->
func,
sizeof(h_fun->
func));
2209 duk__debug_getinfo_prop_int(thr,
"nregs", h_fun->
nregs);
2210 duk__debug_getinfo_prop_int(thr,
"nargs", h_fun->
nargs);
2211 duk__debug_getinfo_prop_uint(thr,
"start_line", h_fun->start_line);
2212 duk__debug_getinfo_prop_uint(thr,
"end_line", h_fun->end_line);
2214 if (h_buf !=
NULL) {
2215 duk__debug_getinfo_flags_key(thr,
"data");
2216 duk_debug_write_heapptr(thr, (
duk_heaphdr *) h_buf);
2233 duk__debug_getinfo_prop_uint(thr,
"slice_offset", h_bufobj->
offset);
2234 duk__debug_getinfo_prop_uint(thr,
"slice_length", h_bufobj->
length);
2235 duk__debug_getinfo_prop_uint(thr,
"elem_shift", (
duk_uint_t) h_bufobj->
shift);
2239 duk__debug_getinfo_flags_key(thr,
"buffer");
2249 duk__debug_getinfo_bitmask(thr,
2250 duk__debug_getinfo_hbuffer_keys,
2251 duk__debug_getinfo_hbuffer_masks,
2254 duk__debug_getinfo_flags_key(thr,
"dataptr");
2256 duk__debug_getinfo_flags_key(thr,
"data");
2257 duk_debug_write_hbuffer(thr, h_buf);
2266 duk_debug_write_eom(thr);
2278 h = duk_debug_read_any_ptr(thr);
2283 h_key = duk_debug_read_hstring(thr);
2295 virtual_idx = (desc.
a_idx >= 0 ? desc.
a_idx :
2298 duk_debug_write_reply(thr);
2299 rc = duk__debug_getprop_index(thr, heap, h_obj, (
duk_uint_t) virtual_idx);
2302 duk_debug_write_eom(thr);
2320 h = duk_debug_read_any_ptr(thr);
2321 idx_start = duk_debug_read_int(thr);
2322 idx_end = duk_debug_read_int(thr);
2335 duk_debug_write_reply(thr);
2336 for (idx = idx_start; idx < idx_end; idx++) {
2337 if (!duk__debug_getprop_index(thr, heap, h_obj, idx)) {
2341 duk_debug_write_eom(thr);
2376 x = duk_debug_read_byte(thr);
2379 cmd = duk_debug_read_int(thr);
2382 duk__debug_handle_basic_info(thr, heap);
2386 duk__debug_handle_trigger_status(thr, heap);
2390 duk__debug_handle_pause(thr, heap);
2394 duk__debug_handle_resume(thr, heap);
2400 duk__debug_handle_step(thr, heap, cmd);
2404 duk__debug_handle_list_break(thr, heap);
2408 duk__debug_handle_add_break(thr, heap);
2412 duk__debug_handle_del_break(thr, heap);
2416 duk__debug_handle_get_var(thr, heap);
2420 duk__debug_handle_put_var(thr, heap);
2424 duk__debug_handle_get_call_stack(thr, heap);
2428 duk__debug_handle_get_locals(thr, heap);
2432 duk__debug_handle_eval(thr, heap);
2440 duk__debug_handle_detach(thr, heap);
2443#if defined(DUK_USE_DEBUGGER_DUMPHEAP)
2445 duk__debug_handle_dump_heap(thr, heap);
2450 duk__debug_handle_get_bytecode(thr, heap);
2454 duk__debug_handle_apprequest(thr, heap);
2457#if defined(DUK_USE_DEBUGGER_INSPECT)
2459 duk__debug_handle_get_heap_obj_info(thr, heap);
2463 duk__debug_handle_get_obj_prop_desc(thr, heap);
2467 duk__debug_handle_get_obj_prop_desc_range(thr, heap);
2491 DUK_D(
DUK_DPRINT(
"invalid initial byte, drop connection: %d", (
int) x));
2498 duk__debug_skip_to_eom(thr);
2504 DUK__SET_CONN_BROKEN(thr, 1);
2509 if (thr->
heap->dbg_read_cb !=
NULL && thr->
heap->dbg_state_dirty) {
2510 duk_debug_send_status(thr);
2511 thr->
heap->dbg_state_dirty = 0;
2517#if defined(DUK_USE_ASSERTIONS)
2525#if defined(DUK_USE_ASSERTIONS)
2529 DUK_D(
DUK_DPRINT(
"process debug messages: read_cb=%s, no_block=%ld, detaching=%ld, processing=%ld",
2530 thr->
heap->dbg_read_cb ?
"not NULL" :
"NULL", (long) no_block,
2531 (long) thr->heap->dbg_detaching, (long) thr->heap->dbg_processing));
2539 thr->
heap->dbg_processing = 1;
2545 duk__check_resend_status(thr);
2554 while (thr->
heap->dbg_read_cb ==
NULL && thr->
heap->dbg_detaching) {
2575 DUK_D(
DUK_DPRINT(
"detach pending (dbg_read_cb == NULL, dbg_detaching != 0), call detach2"));
2577 duk__debug_do_detach2(thr->
heap);
2578 thr->
heap->dbg_processing = 1;
2580 DUK_D(
DUK_DPRINT(
"after detach2 (and possible reattach): dbg_read_cb=%s, dbg_detaching=%ld",
2581 thr->
heap->dbg_read_cb ?
"not NULL" :
"NULL", (long) thr->heap->dbg_detaching));
2586 if (thr->
heap->dbg_read_cb ==
NULL) {
2587 DUK_D(
DUK_DPRINT(
"debug connection broken (and not detaching), stop processing messages"));
2591 if (!thr->
heap->dbg_paused || no_block) {
2592 if (!duk_debug_read_peek(thr)) {
2597 DUK_D(
DUK_DPRINT(
"processing debug message, peek indicated no data, stop processing messages"));
2600 DUK_D(
DUK_DPRINT(
"processing debug message, peek indicated there is data, handle it"));
2602 DUK_D(
DUK_DPRINT(
"paused, process debug message, blocking if necessary"));
2605 duk__check_resend_status(thr);
2606 duk__debug_process_message(thr);
2607 duk__check_resend_status(thr);
2614 thr->
heap->dbg_processing = 0;
2619 duk_debug_read_flush(thr);
2624#if defined(DUK_USE_ASSERTIONS)
2652 DUK_HEAP_SET_PAUSED(thr->
heap);
2685 thr->
heap->dbg_state_dirty = 1;
2686 while (thr->
heap->dbg_paused) {
2689 duk_debug_process_messages(thr, 0 );
2723 DUK_D(
DUK_DPRINT(
"failed to add breakpoint for %O:%ld, all breakpoint slots used",
2728 b = heap->dbg_breakpoints + (heap->dbg_breakpoint_count++);
2733 return heap->dbg_breakpoint_count - 1;
2753 if (breakpoint_index >= heap->dbg_breakpoint_count) {
2754 DUK_D(
DUK_DPRINT(
"invalid breakpoint index: %ld", (
long) breakpoint_index));
2757 b = heap->dbg_breakpoints + breakpoint_index;
2762 move_size =
sizeof(
duk_breakpoint) * (heap->dbg_breakpoint_count - breakpoint_index - 1);
2763 if (move_size > 0) {
2765 (
const void *) (b + 1),
2766 (
size_t) move_size);
2768 heap->dbg_breakpoint_count--;
2779#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