Update duktape

This commit is contained in:
Kovid Goyal 2016-05-01 11:33:57 +05:30
parent 1f09ee2e97
commit 576d96f1da
3 changed files with 173 additions and 133 deletions

View File

@ -1,9 +1,9 @@
/* /*
* duk_config.h configuration header generated by genconfig.py. * duk_config.h configuration header generated by genconfig.py.
* *
* Git commit: cad6f595382a0cc1a7e4207794ade5be11b3e397 * Git commit: 70315eded64ade7852680433e4becbfa28afe8e2
* Git describe: v1.4.0 * Git describe: v1.4.1
* Git branch: master * Git branch: HEAD
* *
* Supported platforms: * Supported platforms:
* - Mac OSX, iPhone, Darwin * - Mac OSX, iPhone, Darwin
@ -3126,7 +3126,7 @@ typedef FILE duk_file;
#elif defined(DUK_OPT_NO_PACKED_TVAL) #elif defined(DUK_OPT_NO_PACKED_TVAL)
#undef DUK_USE_PACKED_TVAL #undef DUK_USE_PACKED_TVAL
#else #else
#undef DUK_USE_PACKED_TVAL /* Already provided above */
#endif #endif
#undef DUK_USE_PANIC_ABORT #undef DUK_USE_PANIC_ABORT
@ -3213,7 +3213,7 @@ typedef FILE duk_file;
#elif defined(DUK_OPT_NO_SETJMP) #elif defined(DUK_OPT_NO_SETJMP)
#undef DUK_USE_SETJMP #undef DUK_USE_SETJMP
#else #else
#define DUK_USE_SETJMP /* Already provided above */
#endif #endif
#if defined(DUK_OPT_SHUFFLE_TORTURE) #if defined(DUK_OPT_SHUFFLE_TORTURE)
@ -3229,7 +3229,7 @@ typedef FILE duk_file;
#elif defined(DUK_OPT_NO_SIGSETJMP) #elif defined(DUK_OPT_NO_SIGSETJMP)
#undef DUK_USE_SIGSETJMP #undef DUK_USE_SIGSETJMP
#else #else
#undef DUK_USE_SIGSETJMP /* Already provided above */
#endif #endif
#if defined(DUK_OPT_SOURCE_NONBMP) #if defined(DUK_OPT_SOURCE_NONBMP)
@ -3319,7 +3319,7 @@ typedef FILE duk_file;
#elif defined(DUK_OPT_NO_UNDERSCORE_SETJMP) #elif defined(DUK_OPT_NO_UNDERSCORE_SETJMP)
#undef DUK_USE_UNDERSCORE_SETJMP #undef DUK_USE_UNDERSCORE_SETJMP
#else #else
#undef DUK_USE_UNDERSCORE_SETJMP /* Already provided above */
#endif #endif
#if defined(DUK_OPT_DECLARE) #if defined(DUK_OPT_DECLARE)

View File

@ -1,8 +1,8 @@
/* /*
* Single source autogenerated distributable for Duktape 1.4.0. * Single source autogenerated distributable for Duktape 1.4.1.
* *
* Git commit cad6f595382a0cc1a7e4207794ade5be11b3e397 (v1.4.0). * Git commit 70315eded64ade7852680433e4becbfa28afe8e2 (v1.4.1).
* Git branch master. * Git branch HEAD.
* *
* See Duktape AUTHORS.rst and LICENSE.txt for copyright and * See Duktape AUTHORS.rst and LICENSE.txt for copyright and
* licensing information. * licensing information.
@ -12367,35 +12367,35 @@ DUK_INTERNAL const duk_uint8_t duk_builtins_data[1955] = {
146,25,106,5,0,4,101,40,20,0,21,146,160,80,0,102,66,129,64,1,216,234,5,0,8, 146,25,106,5,0,4,101,40,20,0,21,146,160,80,0,102,66,129,64,1,216,234,5,0,8,
99,39,47,49,83,215,152,138,73,0,1,97,168,129,132,160,80,0,150,10,129,64,2, 99,39,47,49,83,215,152,138,73,0,1,97,168,129,132,160,80,0,150,10,129,64,2,
152,10,5,0,11,95,168,20,0,48,31,255,224,5,17,72,66,249,37,129,127,255,0,0, 152,10,5,0,11,95,168,20,0,48,31,255,224,5,17,72,66,249,37,129,127,255,0,0,
191,255,128,0,63,255,197,31,192,0,0,0,0,0,80,196,64,8,26,112,17,169,0,154, 191,255,128,0,63,255,197,31,192,0,0,0,0,128,80,196,64,8,26,112,17,169,0,
80,1,171,28,124,88,65,233,49,7,133,100,29,149,15,14,138,71,135,37,3,195,66, 154,80,1,171,28,124,88,65,233,49,7,133,100,29,149,15,14,138,71,135,37,3,
114,5,77,252,0,243,178,40,25,200,48,101,30,0,127,210,128,0,85,31,192,0,31, 195,66,114,5,77,252,0,243,178,40,25,200,48,101,30,0,127,210,128,0,85,31,
244,224,5,71,22,8,0,13,20,88,1,85,127,0,0,127,212,128,21,29,220,32,0,52,87, 192,0,31,244,224,5,71,22,8,0,13,20,88,1,85,127,0,0,127,212,128,21,29,220,
112,5,89,252,0,1,255,86,16,166,64,0,0,0,0,0,0,2,0,170,72,38,29,219,247,16, 32,0,52,87,112,5,89,252,0,1,255,86,16,166,64,0,0,0,0,0,0,2,0,170,72,38,29,
49,75,32,193,52,130,244,193,225,114,96,248,0,8,249,48,124,0,8,90,152,62,0, 219,247,16,49,75,32,193,52,130,244,193,225,114,96,248,0,8,249,48,124,0,8,
6,44,76,31,0,4,21,166,15,128,2,147,255,252,38,212,16,184,155,250,226,217, 90,152,62,0,6,44,76,31,0,4,21,166,15,128,2,147,255,252,38,212,16,184,155,
150,47,46,91,249,54,96,139,229,229,203,127,36,26,119,32,203,203,150,254,72, 250,226,217,150,47,46,91,249,54,96,139,229,229,203,127,36,26,119,32,203,
52,97,221,147,102,157,217,192,10,191,248,0,157,4,72,15,250,224,1,154,140, 203,150,254,72,52,97,221,147,102,157,217,192,10,191,248,0,157,4,72,15,250,
36,0,8,43,31,224,0,15,251,0,16,55,139,164,0,192,220,46,144,2,3,104,186,64, 224,1,154,140,36,0,8,43,31,224,0,15,251,0,16,55,139,164,0,192,220,46,144,2,
12,77,130,233,0,33,53,139,164,0,200,212,46,144,2,35,72,186,64,8,205,2,233, 3,104,186,64,12,77,130,233,0,33,53,139,164,0,200,212,46,144,2,35,72,186,64,
0,36,51,140,180,0,192,204,50,208,2,3,40,203,64,12,76,131,45,0,33,49,140, 8,205,2,233,0,36,51,140,180,0,192,204,50,208,2,3,40,203,64,12,76,131,45,0,
180,0,200,196,50,208,2,35,8,203,64,8,204,3,45,0,36,7,255,248,1,82,101,16, 33,49,140,180,0,200,196,50,208,2,35,8,203,64,8,204,3,45,0,36,7,255,248,1,
112,24,72,0,8,86,159,193,56,192,0,0,0,0,0,0,240,63,1,151,246,96,0,21,183, 82,101,16,112,24,72,0,8,86,159,193,56,192,0,0,0,0,0,0,240,63,1,151,246,96,
240,78,48,0,0,0,0,0,0,60,15,192,101,253,168,0,5,113,252,19,140,0,0,0,0,0,0, 0,21,183,240,78,48,0,0,0,0,0,0,60,15,192,101,253,168,0,5,113,252,19,140,0,
15,3,240,25,127,110,0,1,93,127,4,227,0,0,0,0,0,0,0,1,0,6,95,220,128,0,87, 0,0,0,0,0,15,3,240,25,127,110,0,1,93,127,4,227,0,0,0,0,0,0,0,1,0,6,95,220,
159,193,56,192,0,0,0,0,0,0,0,64,1,151,247,96,0,21,247,240,78,48,0,0,0,0,0, 128,0,87,159,193,56,192,0,0,0,0,0,0,0,64,1,151,247,96,0,21,247,240,78,48,0,
0,4,16,0,101,253,232,0,5,129,252,19,140,0,0,0,0,0,0,1,4,0,25,127,126,0,1, 0,0,0,0,0,4,16,0,101,253,232,0,5,129,252,19,140,0,0,0,0,0,0,1,4,0,25,127,
97,127,4,227,0,0,0,0,0,0,0,65,0,6,95,224,128,0,88,159,193,56,192,0,0,0,0,0, 126,0,1,97,127,4,227,0,0,0,0,0,0,0,65,0,6,95,224,128,0,88,159,193,56,192,0,
0,32,64,1,151,248,96,0,22,55,240,5,157,170,33,68,178,69,10,193,20,10,104, 0,0,0,0,0,32,64,1,151,248,96,0,22,55,240,5,157,170,33,68,178,69,10,193,20,
79,138,36,0,12,31,248,160,88,154,23,66,100,93,32,2,9,129,116,128,0,165,197, 10,104,79,138,36,0,12,31,248,160,88,154,23,66,100,93,32,2,9,129,116,128,0,
210,0,18,150,23,72,0,138,84,93,32,3,41,65,116,128,1,36,197,210,0,20,146,23, 165,197,210,0,18,150,23,72,0,138,84,93,32,3,41,65,116,128,1,36,197,210,0,
72,0,146,68,93,32,3,73,1,116,128,1,163,197,210,0,22,142,23,72,0,34,52,93, 20,146,23,72,0,146,68,93,32,3,73,1,116,128,1,163,197,210,0,22,142,23,72,0,
32,1,136,193,118,128,2,162,197,218,0,26,138,23,104,0,170,36,93,160,3,168, 34,52,93,32,1,136,193,118,128,2,162,197,218,0,26,138,23,104,0,170,36,93,
129,150,33,198,90,0,32,134,25,104,0,10,20,101,160,1,40,65,150,128,8,160, 160,3,168,129,150,33,198,90,0,32,134,25,104,0,10,20,101,160,1,40,65,150,
198,90,0,50,130,25,104,0,18,4,101,160,1,72,1,150,128,9,31,198,90,0,52,126, 128,8,160,198,90,0,50,130,25,104,0,18,4,101,160,1,72,1,150,128,9,31,198,90,
25,104,0,25,244,101,160,1,103,193,150,128,2,30,198,90,0,24,122,25,136,0,41, 0,52,126,25,104,0,25,244,101,160,1,103,193,150,128,2,30,198,90,0,24,122,25,
228,102,32,1,167,129,152,128,10,157,198,98,0,59,71,91,99,157,104,9,213,118, 136,0,41,228,102,32,1,167,129,152,128,10,157,198,98,0,59,71,91,99,157,104,
39,5,8,159,20,40,0,10,109,90,19,81,132,39,151,32, 9,213,118,39,5,8,159,20,40,0,10,109,90,19,81,132,39,151,32,
}; };
#ifdef DUK_USE_BUILTIN_INITJS #ifdef DUK_USE_BUILTIN_INITJS
DUK_INTERNAL const duk_uint8_t duk_initjs_data[187] = { DUK_INTERNAL const duk_uint8_t duk_initjs_data[187] = {
@ -12754,8 +12754,8 @@ DUK_INTERNAL const duk_uint8_t duk_builtins_data[1955] = {
98,146,25,106,5,0,4,101,40,20,0,21,146,160,80,0,102,66,129,64,1,216,234,5, 98,146,25,106,5,0,4,101,40,20,0,21,146,160,80,0,102,66,129,64,1,216,234,5,
0,8,99,39,47,49,83,215,152,138,73,0,1,97,168,129,132,160,80,0,150,10,129, 0,8,99,39,47,49,83,215,152,138,73,0,1,97,168,129,132,160,80,0,150,10,129,
64,2,152,10,5,0,11,95,168,20,0,48,31,255,224,5,17,72,66,249,37,129,127,255, 64,2,152,10,5,0,11,95,168,20,0,48,31,255,224,5,17,72,66,249,37,129,127,255,
0,0,191,255,128,0,63,255,197,31,192,64,196,80,0,0,0,0,0,8,26,112,17,169,0, 0,0,191,255,128,0,63,255,197,31,192,64,196,80,128,0,0,0,0,8,26,112,17,169,
154,80,1,171,28,124,88,65,233,49,7,133,100,29,149,15,14,138,71,135,37,3, 0,154,80,1,171,28,124,88,65,233,49,7,133,100,29,149,15,14,138,71,135,37,3,
195,66,114,5,77,252,0,243,178,40,25,200,48,101,30,0,127,210,128,0,85,31, 195,66,114,5,77,252,0,243,178,40,25,200,48,101,30,0,127,210,128,0,85,31,
192,0,31,244,224,5,71,22,8,0,13,20,88,1,85,127,0,0,127,212,128,21,29,220, 192,0,31,244,224,5,71,22,8,0,13,20,88,1,85,127,0,0,127,212,128,21,29,220,
32,0,52,87,112,5,89,252,0,1,255,86,16,166,66,0,0,0,0,0,0,0,0,170,72,38,29, 32,0,52,87,112,5,89,252,0,1,255,86,16,166,66,0,0,0,0,0,0,0,0,170,72,38,29,
@ -13141,8 +13141,8 @@ DUK_INTERNAL const duk_uint8_t duk_builtins_data[1955] = {
98,146,25,106,5,0,4,101,40,20,0,21,146,160,80,0,102,66,129,64,1,216,234,5, 98,146,25,106,5,0,4,101,40,20,0,21,146,160,80,0,102,66,129,64,1,216,234,5,
0,8,99,39,47,49,83,215,152,138,73,0,1,97,168,129,132,160,80,0,150,10,129, 0,8,99,39,47,49,83,215,152,138,73,0,1,97,168,129,132,160,80,0,150,10,129,
64,2,152,10,5,0,11,95,168,20,0,48,31,255,224,5,17,72,66,249,37,129,127,255, 64,2,152,10,5,0,11,95,168,20,0,48,31,255,224,5,17,72,66,249,37,129,127,255,
0,0,191,255,128,0,63,255,197,31,192,0,80,196,64,0,0,0,0,8,26,112,17,169,0, 0,0,191,255,128,0,63,255,197,31,192,128,80,196,64,0,0,0,0,8,26,112,17,169,
154,80,1,171,28,124,88,65,233,49,7,133,100,29,149,15,14,138,71,135,37,3, 0,154,80,1,171,28,124,88,65,233,49,7,133,100,29,149,15,14,138,71,135,37,3,
195,66,114,5,77,252,0,243,178,40,25,200,48,101,30,0,127,210,128,0,85,31, 195,66,114,5,77,252,0,243,178,40,25,200,48,101,30,0,127,210,128,0,85,31,
192,0,31,244,224,5,71,22,8,0,13,20,88,1,85,127,0,0,127,212,128,21,29,220, 192,0,31,244,224,5,71,22,8,0,13,20,88,1,85,127,0,0,127,212,128,21,29,220,
32,0,52,87,112,5,89,252,0,1,255,86,16,166,64,0,0,2,0,0,0,0,0,170,72,38,29, 32,0,52,87,112,5,89,252,0,1,255,86,16,166,64,0,0,2,0,0,0,0,0,170,72,38,29,
@ -17183,6 +17183,8 @@ DUK_EXTERNAL void duk_debugger_attach(duk_context *ctx,
* already attached? * already attached?
*/ */
DUK_D(DUK_DPRINT("application called duk_debugger_attach()"));
DUK_ASSERT_CTX_VALID(ctx); DUK_ASSERT_CTX_VALID(ctx);
DUK_ASSERT(read_cb != NULL); DUK_ASSERT(read_cb != NULL);
DUK_ASSERT(write_cb != NULL); DUK_ASSERT(write_cb != NULL);
@ -17229,6 +17231,8 @@ DUK_EXTERNAL void duk_debugger_attach(duk_context *ctx,
DUK_EXTERNAL void duk_debugger_detach(duk_context *ctx) { DUK_EXTERNAL void duk_debugger_detach(duk_context *ctx) {
duk_hthread *thr; duk_hthread *thr;
DUK_D(DUK_DPRINT("application called duk_debugger_detach()"));
DUK_ASSERT_CTX_VALID(ctx); DUK_ASSERT_CTX_VALID(ctx);
thr = (duk_hthread *) ctx; thr = (duk_hthread *) ctx;
DUK_ASSERT(thr != NULL); DUK_ASSERT(thr != NULL);
@ -17258,9 +17262,7 @@ DUK_EXTERNAL void duk_debugger_cooperate(duk_context *ctx) {
return; return;
} }
thr->heap->dbg_processing = 1;
processed_messages = duk_debug_process_messages(thr, 1 /*no_block*/); processed_messages = duk_debug_process_messages(thr, 1 /*no_block*/);
thr->heap->dbg_processing = 0;
DUK_UNREF(processed_messages); DUK_UNREF(processed_messages);
} }
@ -40057,6 +40059,7 @@ DUK_LOCAL void duk__debug_do_detach1(duk_heap *heap, duk_int_t reason) {
*/ */
if (heap->dbg_detaching) { if (heap->dbg_detaching) {
DUK_D(DUK_DPRINT("debugger already detaching, ignore detach1"));
return; return;
} }
@ -40082,7 +40085,7 @@ DUK_LOCAL void duk__debug_do_detach1(duk_heap *heap, duk_int_t reason) {
heap->dbg_write_flush_cb = NULL; heap->dbg_write_flush_cb = NULL;
/* heap->dbg_detached_cb: keep */ /* heap->dbg_detached_cb: keep */
/* heap->dbg_udata: keep */ /* heap->dbg_udata: keep */
heap->dbg_processing = 0; /*heap->dbg_processing: keep on purpose to avoid debugger re-entry in detaching state */
heap->dbg_paused = 0; heap->dbg_paused = 0;
heap->dbg_state_dirty = 0; heap->dbg_state_dirty = 0;
heap->dbg_force_restart = 0; heap->dbg_force_restart = 0;
@ -40268,7 +40271,7 @@ DUK_INTERNAL void duk_debug_read_bytes(duk_hthread *thr, duk_uint8_t *data, duk_
#endif #endif
got = heap->dbg_read_cb(heap->dbg_udata, (char *) p, left); got = heap->dbg_read_cb(heap->dbg_udata, (char *) p, left);
if (got == 0 || got > left) { if (got == 0 || got > left) {
heap->dbg_write_cb = NULL; /* squelch further writes */ heap->dbg_write_cb = NULL; /* squelch further writes in detach1() */
DUK_D(DUK_DPRINT("connection error during read, return zero data")); DUK_D(DUK_DPRINT("connection error during read, return zero data"));
DUK__SET_CONN_BROKEN(thr, 1); DUK__SET_CONN_BROKEN(thr, 1);
goto fail; goto fail;
@ -40563,7 +40566,7 @@ DUK_INTERNAL void duk_debug_write_bytes(duk_hthread *thr, const duk_uint8_t *dat
#endif #endif
got = heap->dbg_write_cb(heap->dbg_udata, (const char *) p, left); got = heap->dbg_write_cb(heap->dbg_udata, (const char *) p, left);
if (got == 0 || got > left) { if (got == 0 || got > left) {
heap->dbg_write_cb = NULL; /* squelch further writes */ heap->dbg_write_cb = NULL; /* squelch further writes in detach1() */
DUK_D(DUK_DPRINT("connection error during write")); DUK_D(DUK_DPRINT("connection error during write"));
DUK__SET_CONN_BROKEN(thr, 1); DUK__SET_CONN_BROKEN(thr, 1);
return; return;
@ -40573,24 +40576,7 @@ DUK_INTERNAL void duk_debug_write_bytes(duk_hthread *thr, const duk_uint8_t *dat
} }
DUK_INTERNAL void duk_debug_write_byte(duk_hthread *thr, duk_uint8_t x) { DUK_INTERNAL void duk_debug_write_byte(duk_hthread *thr, duk_uint8_t x) {
duk_heap *heap; duk_debug_write_bytes(thr, (const duk_uint8_t *) &x, 1);
duk_size_t got;
DUK_ASSERT(thr != NULL);
heap = thr->heap;
DUK_ASSERT(heap != NULL);
if (heap->dbg_write_cb == NULL) {
DUK_D(DUK_DPRINT("attempt to write 1 bytes in detached state, ignore"));
return;
}
DUK_ASSERT(heap->dbg_write_cb != NULL);
got = heap->dbg_write_cb(heap->dbg_udata, (const char *) (&x), 1);
if (got != 1) {
DUK_D(DUK_DPRINT("connection error during write"));
DUK__SET_CONN_BROKEN(thr, 1);
}
} }
DUK_INTERNAL void duk_debug_write_unused(duk_hthread *thr) { DUK_INTERNAL void duk_debug_write_unused(duk_hthread *thr) {
@ -41860,18 +41846,17 @@ DUK_INTERNAL void duk_debug_halt_execution(duk_hthread *thr, duk_bool_t use_prev
/* Process debug messages until we are no longer paused. */ /* Process debug messages until we are no longer paused. */
/* NOTE: This is a bit fragile. It's important to ensure that neither /* NOTE: This is a bit fragile. It's important to ensure that
* duk_debug_send_status() or duk_debug_process_messages() throws an * duk_debug_process_messages() never throws an error or
* error or act->curr_pc will never be reset. * act->curr_pc will never be reset.
*/ */
thr->heap->dbg_processing = 1; thr->heap->dbg_state_dirty = 1;
duk_debug_send_status(thr);
while (thr->heap->dbg_paused) { while (thr->heap->dbg_paused) {
DUK_ASSERT(DUK_HEAP_IS_DEBUGGER_ATTACHED(thr->heap));
DUK_ASSERT(thr->heap->dbg_processing); DUK_ASSERT(thr->heap->dbg_processing);
duk_debug_process_messages(thr, 0 /*no_block*/); duk_debug_process_messages(thr, 0 /*no_block*/);
} }
thr->heap->dbg_processing = 0;
/* XXX: Decrementing and restoring act->curr_pc works now, but if the /* XXX: Decrementing and restoring act->curr_pc works now, but if the
* debugger message loop gains the ability to adjust the current PC * debugger message loop gains the ability to adjust the current PC
@ -41885,6 +41870,13 @@ DUK_INTERNAL void duk_debug_halt_execution(duk_hthread *thr, duk_bool_t use_prev
} }
} }
DUK_LOCAL void duk__check_resend_status(duk_hthread *thr) {
if (thr->heap->dbg_read_cb != NULL && thr->heap->dbg_state_dirty) {
duk_debug_send_status(thr);
thr->heap->dbg_state_dirty = 0;
}
}
DUK_INTERNAL duk_bool_t duk_debug_process_messages(duk_hthread *thr, duk_bool_t no_block) { DUK_INTERNAL duk_bool_t duk_debug_process_messages(duk_hthread *thr, duk_bool_t no_block) {
duk_context *ctx = (duk_context *) thr; duk_context *ctx = (duk_context *) thr;
#if defined(DUK_USE_ASSERTIONS) #if defined(DUK_USE_ASSERTIONS)
@ -41895,25 +41887,79 @@ DUK_INTERNAL duk_bool_t duk_debug_process_messages(duk_hthread *thr, duk_bool_t
DUK_ASSERT(thr != NULL); DUK_ASSERT(thr != NULL);
DUK_UNREF(ctx); DUK_UNREF(ctx);
DUK_ASSERT(thr->heap != NULL); DUK_ASSERT(thr->heap != NULL);
DUK_ASSERT(DUK_HEAP_IS_DEBUGGER_ATTACHED(thr->heap));
#if defined(DUK_USE_ASSERTIONS) #if defined(DUK_USE_ASSERTIONS)
entry_top = duk_get_top(ctx); entry_top = duk_get_top(ctx);
#endif #endif
DUK_D(DUK_DPRINT("process debug messages: read_cb=%s, no_block=%ld, detaching=%ld, processing=%ld",
thr->heap->dbg_read_cb ? "not NULL" : "NULL", (long) no_block,
(long) thr->heap->dbg_detaching, (long) thr->heap->dbg_processing));
DUK_DD(DUK_DDPRINT("top at entry: %ld", (long) duk_get_top(ctx))); DUK_DD(DUK_DDPRINT("top at entry: %ld", (long) duk_get_top(ctx)));
/* thr->heap->dbg_detaching may be != 0 if a debugger write outside
* the message loop caused a transport error and detach1() to run.
*/
DUK_ASSERT(thr->heap->dbg_detaching == 0 || thr->heap->dbg_detaching == 1);
DUK_ASSERT(thr->heap->dbg_processing == 0);
thr->heap->dbg_processing = 1;
/* Ensure dirty state causes a Status even if never process any
* messages. This is expected by the bytecode executor when in
* the running state.
*/
duk__check_resend_status(thr);
for (;;) { for (;;) {
/* Process messages until we're no longer paused or we peek /* Process messages until we're no longer paused or we peek
* and see there's nothing to read right now. * and see there's nothing to read right now.
*/ */
DUK_DD(DUK_DDPRINT("top at loop top: %ld", (long) duk_get_top(ctx))); DUK_DD(DUK_DDPRINT("top at loop top: %ld", (long) duk_get_top(ctx)));
DUK_ASSERT(thr->heap->dbg_processing == 1);
while (thr->heap->dbg_read_cb == NULL && thr->heap->dbg_detaching) {
/* Detach is pending; can be triggered from outside the
* debugger loop (e.g. Status notify write error) or by
* previous message handling. Call detached callback
* here, in a controlled state, to ensure a possible
* reattach inside the detached_cb is handled correctly.
*
* Recheck for detach in a while loop: an immediate
* reattach involves a call to duk_debugger_attach()
* which writes a debugger handshake line immediately
* inside the API call. If the transport write fails
* for that handshake, we can immediately end up in a
* "transport broken, detaching" case several times here.
* Loop back until we're either cleanly attached or
* fully detached.
*
* NOTE: Reset dbg_processing = 1 forcibly, in case we
* re-attached; duk_debugger_attach() sets dbg_processing
* to 0 at the moment.
*/
DUK_D(DUK_DPRINT("detach pending (dbg_read_cb == NULL, dbg_detaching != 0), call detach2"));
duk__debug_do_detach2(thr->heap);
thr->heap->dbg_processing = 1; /* may be set to 0 by duk_debugger_attach() inside callback */
DUK_D(DUK_DPRINT("after detach2 (and possible reattach): dbg_read_cb=%s, dbg_detaching=%ld",
thr->heap->dbg_read_cb ? "not NULL" : "NULL", (long) thr->heap->dbg_detaching));
}
DUK_ASSERT(thr->heap->dbg_detaching == 0); /* true even with reattach */
DUK_ASSERT(thr->heap->dbg_processing == 1); /* even after a detach and possible reattach */
if (thr->heap->dbg_read_cb == NULL) { if (thr->heap->dbg_read_cb == NULL) {
DUK_D(DUK_DPRINT("debug connection broken, stop processing messages")); DUK_D(DUK_DPRINT("debug connection broken (and not detaching), stop processing messages"));
break; break;
} else if (!thr->heap->dbg_paused || no_block) { }
if (!thr->heap->dbg_paused || no_block) {
if (!duk_debug_read_peek(thr)) { if (!duk_debug_read_peek(thr)) {
DUK_D(DUK_DPRINT("processing debug message, peek indicated no data, stop processing")); /* Note: peek cannot currently trigger a detach
* so the dbg_detaching == 0 assert outside the
* loop is correct.
*/
DUK_D(DUK_DPRINT("processing debug message, peek indicated no data, stop processing messages"));
break; break;
} }
DUK_D(DUK_DPRINT("processing debug message, peek indicated there is data, handle it")); DUK_D(DUK_DPRINT("processing debug message, peek indicated there is data, handle it"));
@ -41921,32 +41967,22 @@ DUK_INTERNAL duk_bool_t duk_debug_process_messages(duk_hthread *thr, duk_bool_t
DUK_D(DUK_DPRINT("paused, process debug message, blocking if necessary")); DUK_D(DUK_DPRINT("paused, process debug message, blocking if necessary"));
} }
duk__check_resend_status(thr);
duk__debug_process_message(thr); duk__debug_process_message(thr);
duk__check_resend_status(thr);
if (thr->heap->dbg_read_cb == NULL) {
/* Became detached during message handling (perhaps because
* of an error or by an explicit Detach). Call detached
* callback here, between messages, to avoid confusing the
* broken connection and a possible replacement (which may
* be provided by an instant reattach inside the detached
* callback).
*/
duk__debug_do_detach2(thr->heap);
}
if (thr->heap->dbg_state_dirty) {
/* Executed something that may have affected status,
* resend.
*/
duk_debug_send_status(thr);
thr->heap->dbg_state_dirty = 0;
}
retval = 1; /* processed one or more messages */ retval = 1; /* processed one or more messages */
} }
DUK_ASSERT(thr->heap->dbg_detaching == 0);
DUK_ASSERT(thr->heap->dbg_processing == 1);
thr->heap->dbg_processing = 0;
/* As an initial implementation, read flush after exiting the message /* As an initial implementation, read flush after exiting the message
* loop. * loop. If transport is broken, this is a no-op (with debug logs).
*/ */
duk_debug_read_flush(thr); duk_debug_read_flush(thr); /* this cannot initiate a detach */
DUK_ASSERT(thr->heap->dbg_detaching == 0);
DUK_DD(DUK_DDPRINT("top at exit: %ld", (long) duk_get_top(ctx))); DUK_DD(DUK_DDPRINT("top at exit: %ld", (long) duk_get_top(ctx)));
@ -42999,7 +43035,7 @@ DUK_INTERNAL duk_hbuffer *duk_hbuffer_alloc(duk_heap *heap, duk_size_t size, duk
if (flags & DUK_BUF_FLAG_EXTERNAL) { if (flags & DUK_BUF_FLAG_EXTERNAL) {
header_size = sizeof(duk_hbuffer_external); header_size = sizeof(duk_hbuffer_external);
alloc_size = sizeof(duk_hbuffer_external); alloc_size = sizeof(duk_hbuffer_external);
} if (flags & DUK_BUF_FLAG_DYNAMIC) { } else if (flags & DUK_BUF_FLAG_DYNAMIC) {
header_size = sizeof(duk_hbuffer_dynamic); header_size = sizeof(duk_hbuffer_dynamic);
alloc_size = sizeof(duk_hbuffer_dynamic); alloc_size = sizeof(duk_hbuffer_dynamic);
} else { } else {
@ -46506,8 +46542,12 @@ DUK_LOCAL void duk__refzero_free_pending(duk_hthread *thr) {
DUK_ASSERT(!DUK_HEAPHDR_HAS_FINALIZABLE(h1)); DUK_ASSERT(!DUK_HEAPHDR_HAS_FINALIZABLE(h1));
DUK_ASSERT(DUK_HEAPHDR_HAS_FINALIZED(h1)); DUK_ASSERT(DUK_HEAPHDR_HAS_FINALIZED(h1));
DUK_HEAPHDR_CLEAR_FINALIZED(h1); DUK_HEAPHDR_CLEAR_FINALIZED(h1);
h2 = heap->heap_allocated;
DUK_HEAPHDR_SET_PREV(heap, h1, NULL); DUK_HEAPHDR_SET_PREV(heap, h1, NULL);
DUK_HEAPHDR_SET_NEXT(heap, h1, heap->heap_allocated); if (h2) {
DUK_HEAPHDR_SET_PREV(heap, h2, h1);
}
DUK_HEAPHDR_SET_NEXT(heap, h1, h2);
heap->heap_allocated = h1; heap->heap_allocated = h1;
} else { } else {
/* no -> decref members, then free */ /* no -> decref members, then free */
@ -68732,10 +68772,11 @@ DUK_LOCAL void duk__interrupt_handle_debugger(duk_hthread *thr, duk_bool_t *out_
duk_breakpoint *bp; duk_breakpoint *bp;
duk_breakpoint **bp_active; duk_breakpoint **bp_active;
duk_uint_fast32_t line = 0; duk_uint_fast32_t line = 0;
duk_bool_t send_status;
duk_bool_t process_messages; duk_bool_t process_messages;
duk_bool_t processed_messages = 0; duk_bool_t processed_messages = 0;
DUK_ASSERT(thr->heap->dbg_processing == 0); /* don't re-enter e.g. during Eval */
ctx = (duk_context *) thr; ctx = (duk_context *) thr;
act = thr->callstack + thr->callstack_top - 1; act = thr->callstack + thr->callstack_top - 1;
@ -68812,16 +68853,12 @@ DUK_LOCAL void duk__interrupt_handle_debugger(duk_hthread *thr, duk_bool_t *out_
* counter is used to rate limit getting timestamps. * counter is used to rate limit getting timestamps.
*/ */
if (thr->heap->dbg_state_dirty || thr->heap->dbg_paused) {
send_status = 1;
} else {
send_status = 0;
}
if (thr->heap->dbg_paused) {
process_messages = 1;
} else {
process_messages = 0; process_messages = 0;
if (thr->heap->dbg_state_dirty || thr->heap->dbg_paused || thr->heap->dbg_detaching) {
/* Enter message processing loop for sending Status notifys and
* to finish a pending detach.
*/
process_messages = 1;
} }
/* XXX: remove heap->dbg_exec_counter, use heap->inst_count_interrupt instead? */ /* XXX: remove heap->dbg_exec_counter, use heap->inst_count_interrupt instead? */
@ -68846,33 +68883,33 @@ DUK_LOCAL void duk__interrupt_handle_debugger(duk_hthread *thr, duk_bool_t *out_
*/ */
thr->heap->dbg_last_time = now; thr->heap->dbg_last_time = now;
send_status = 1; thr->heap->dbg_state_dirty = 1;
process_messages = 1; process_messages = 1;
} }
} }
/* /*
* Send status * Process messages and send status if necessary.
*
* If we're paused, we'll block for new messages. If we're not
* paused, we'll process anything we can peek but won't block
* for more. Detach (and re-attach) handling is all localized
* to duk_debug_process_messages() too.
*
* Debugger writes outside the message loop may cause debugger
* detach1 phase to run, after which dbg_read_cb == NULL and
* dbg_detaching != 0. The message loop will finish the detach
* by running detach2 phase, so enter the message loop also when
* detaching.
*/ */
act = NULL; /* may be changed */ act = NULL; /* may be changed */
if (send_status) {
duk_debug_send_status(thr);
thr->heap->dbg_state_dirty = 0;
}
/*
* Process messages. If we're paused, we'll block for new messages.
* if we're not paused, we'll process anything we can peek but won't
* block for more.
*/
if (process_messages) { if (process_messages) {
DUK_ASSERT(thr->heap->dbg_processing == 0);
processed_messages = duk_debug_process_messages(thr, 0 /*no_block*/); processed_messages = duk_debug_process_messages(thr, 0 /*no_block*/);
DUK_ASSERT(thr->heap->dbg_processing == 0);
} }
/* XXX: any case here where we need to re-send status? */
/* Continue checked execution if there are breakpoints or we're stepping. /* Continue checked execution if there are breakpoints or we're stepping.
* Also use checked execution if paused flag is active - it shouldn't be * Also use checked execution if paused flag is active - it shouldn't be
* because the debug message loop shouldn't terminate if it was. Step out * because the debug message loop shouldn't terminate if it was. Step out
@ -68985,7 +69022,11 @@ DUK_LOCAL duk_small_uint_t duk__executor_interrupt(duk_hthread *thr) {
#endif /* DUK_USE_EXEC_TIMEOUT_CHECK */ #endif /* DUK_USE_EXEC_TIMEOUT_CHECK */
#if defined(DUK_USE_DEBUGGER_SUPPORT) #if defined(DUK_USE_DEBUGGER_SUPPORT)
if (DUK_HEAP_IS_DEBUGGER_ATTACHED(thr->heap)) { if (!thr->heap->dbg_processing &&
(thr->heap->dbg_read_cb != NULL || thr->heap->dbg_detaching)) {
/* Avoid recursive re-entry; enter when we're attached or
* detaching (to finish off the pending detach).
*/
duk__interrupt_handle_debugger(thr, &immediate, &retval); duk__interrupt_handle_debugger(thr, &immediate, &retval);
act = thr->callstack + thr->callstack_top - 1; /* relookup if changed */ act = thr->callstack + thr->callstack_top - 1; /* relookup if changed */
} }
@ -69021,6 +69062,7 @@ DUK_LOCAL duk_small_uint_t duk__executor_interrupt(duk_hthread *thr) {
* in checked or normal mode. Note that we can't do this when an activation * in checked or normal mode. Note that we can't do this when an activation
* is created, because breakpoint status (and stepping status) may change * is created, because breakpoint status (and stepping status) may change
* later, so we must recheck every time we're executing an activation. * later, so we must recheck every time we're executing an activation.
* This primitive should be side effect free to avoid changes during check.
*/ */
#if defined(DUK_USE_DEBUGGER_SUPPORT) #if defined(DUK_USE_DEBUGGER_SUPPORT)
@ -69486,10 +69528,8 @@ DUK_LOCAL DUK_NOINLINE void duk__js_execute_bytecode_inner(duk_hthread *entry_th
#if defined(DUK_USE_DEBUGGER_SUPPORT) #if defined(DUK_USE_DEBUGGER_SUPPORT)
if (DUK_HEAP_IS_DEBUGGER_ATTACHED(thr->heap) && !thr->heap->dbg_processing) { if (DUK_HEAP_IS_DEBUGGER_ATTACHED(thr->heap) && !thr->heap->dbg_processing) {
thr->heap->dbg_processing = 1;
duk__executor_recheck_debugger(thr, act, fun); duk__executor_recheck_debugger(thr, act, fun);
act = thr->callstack + thr->callstack_top - 1; /* relookup after side effects */ act = thr->callstack + thr->callstack_top - 1; /* relookup after side effects (no side effects currently however) */
thr->heap->dbg_processing = 0;
} }
#endif /* DUK_USE_DEBUGGER_SUPPORT */ #endif /* DUK_USE_DEBUGGER_SUPPORT */

View File

@ -1,12 +1,12 @@
/* /*
* Duktape public API for Duktape 1.4.0. * Duktape public API for Duktape 1.4.1.
* See the API reference for documentation on call semantics. * See the API reference for documentation on call semantics.
* The exposed API is inside the DUK_API_PUBLIC_H_INCLUDED * The exposed API is inside the DUK_API_PUBLIC_H_INCLUDED
* include guard. Other parts of the header are Duktape * include guard. Other parts of the header are Duktape
* internal and related to platform/compiler/feature detection. * internal and related to platform/compiler/feature detection.
* *
* Git commit cad6f595382a0cc1a7e4207794ade5be11b3e397 (v1.4.0). * Git commit 70315eded64ade7852680433e4becbfa28afe8e2 (v1.4.1).
* Git branch master. * Git branch HEAD.
* *
* See Duktape AUTHORS.rst and LICENSE.txt for copyright and * See Duktape AUTHORS.rst and LICENSE.txt for copyright and
* licensing information. * licensing information.
@ -213,16 +213,16 @@ struct duk_number_list_entry {
* have 99 for patch level (e.g. 0.10.99 would be a development version * have 99 for patch level (e.g. 0.10.99 would be a development version
* after 0.10.0 but before the next official release). * after 0.10.0 but before the next official release).
*/ */
#define DUK_VERSION 10400L #define DUK_VERSION 10401L
/* Git commit, describe, and branch for Duktape build. Useful for /* Git commit, describe, and branch for Duktape build. Useful for
* non-official snapshot builds so that application code can easily log * non-official snapshot builds so that application code can easily log
* which Duktape snapshot was used. Not available in the Ecmascript * which Duktape snapshot was used. Not available in the Ecmascript
* environment. * environment.
*/ */
#define DUK_GIT_COMMIT "cad6f595382a0cc1a7e4207794ade5be11b3e397" #define DUK_GIT_COMMIT "70315eded64ade7852680433e4becbfa28afe8e2"
#define DUK_GIT_DESCRIBE "v1.4.0" #define DUK_GIT_DESCRIBE "v1.4.1"
#define DUK_GIT_BRANCH "master" #define DUK_GIT_BRANCH "HEAD"
/* Duktape debug protocol version used by this build. */ /* Duktape debug protocol version used by this build. */
#define DUK_DEBUG_PROTOCOL_VERSION 1 #define DUK_DEBUG_PROTOCOL_VERSION 1