duktape 1.1.2.0 → 1.2.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,11 +1,11 @@
1
1
  /*
2
- * Duktape public API for Duktape 1.1.2.
2
+ * Duktape public API for Duktape 1.2.1.
3
3
  * See the API reference for documentation on call semantics.
4
4
  * The exposed API is inside the DUK_API_PUBLIC_H_INCLUDED
5
5
  * include guard. Other parts of the header are Duktape
6
6
  * internal and related to platform/compiler/feature detection.
7
7
  *
8
- * Git commit eb523a027d3d9658a0c0e2150b29e6d87f81860c (v1.1.2).
8
+ * Git commit 74bd1c845e5198b5e2d6cb7c98e54c3af1d6c0e4 (v1.2.1).
9
9
  *
10
10
  * See Duktape AUTHORS.rst and LICENSE.txt for copyright and
11
11
  * licensing information.
@@ -67,6 +67,7 @@
67
67
  * * Niki Dobrev
68
68
  * * Andreas \u00d6man <andreas@lonelycoder.com>
69
69
  * * L\u00e1szl\u00f3 Lang\u00f3 <llango.u-szeged@partner.samsung.com>
70
+ * * Legimet <legimet.calc@gmail.com>
70
71
  *
71
72
  * Other contributions
72
73
  * ===================
@@ -94,6 +95,12 @@
94
95
  * * David Demelier (https://github.com/hftmarkand)
95
96
  * * Tim Caswell (https://github.com/creationix)
96
97
  * * Mitchell Blank Jr (https://github.com/mitchblank)
98
+ * * https://github.com/yushli
99
+ * * Seo Sanghyeon (https://github.com/sanxiyn)
100
+ * * Han ChoongWoo (https://github.com/tunz)
101
+ * * Joshua Peek (https://github.com/josh)
102
+ * * Bruce E. Pascoe (https://github.com/fatcerberus)
103
+ * * https://github.com/Kelledin
97
104
  *
98
105
  * If you are accidentally missing from this list, send me an e-mail
99
106
  * (``sami.vaarala@iki.fi``) and I'll fix the omission.
@@ -241,13 +248,19 @@ static __inline__ unsigned long long duk_rdtsc(void) {
241
248
  #endif
242
249
 
243
250
  /* MIPS */
244
- /* XXX: 32-bit vs. 64-bit MIPS */
251
+ /* Related defines: __MIPSEB__, __MIPSEL__, __mips_isa_rev, __LP64__ */
245
252
  #if defined(__mips__) || defined(mips) || defined(_MIPS_ISA) || \
246
253
  defined(_R3000) || defined(_R4000) || defined(_R5900) || \
247
254
  defined(_MIPS_ISA_MIPS1) || defined(_MIPS_ISA_MIPS2) || \
248
255
  defined(_MIPS_ISA_MIPS3) || defined(_MIPS_ISA_MIPS4) || \
249
256
  defined(__mips) || defined(__MIPS__)
250
257
  #define DUK_F_MIPS
258
+ #if defined(__LP64__) || defined(__mips64) || defined(__mips64__) || \
259
+ defined(__mips_n64)
260
+ #define DUK_F_MIPS64
261
+ #else
262
+ #define DUK_F_MIPS32
263
+ #endif
251
264
  #endif
252
265
 
253
266
  /* SuperH */
@@ -310,6 +323,10 @@ static __inline__ unsigned long long duk_rdtsc(void) {
310
323
  #define DUK_F_WINDOWS
311
324
  #endif
312
325
 
326
+ #if defined(__APPLE__)
327
+ #define DUK_F_APPLE
328
+ #endif
329
+
313
330
  /* Atari ST TOS. __TOS__ defined by PureC (which doesn't work as a target now
314
331
  * because int is 16-bit, to be fixed). No platform define in VBCC apparently,
315
332
  * so to use with VBCC, user must define '__TOS__' manually.
@@ -340,6 +357,11 @@ static __inline__ unsigned long long duk_rdtsc(void) {
340
357
  #define DUK_F_QNX
341
358
  #endif
342
359
 
360
+ /* TI-Nspire (using Ndless) */
361
+ #if defined(_TINSPIRE)
362
+ #define DUK_F_TINSPIRE
363
+ #endif
364
+
343
365
  /* GCC and GCC version convenience define. */
344
366
  #if defined(__GNUC__)
345
367
  #define DUK_F_GCC
@@ -506,6 +528,7 @@ static __inline__ unsigned long long duk_rdtsc(void) {
506
528
  #define DUK_USE_DATE_TZO_GMTIME_R
507
529
  #define DUK_USE_DATE_PRS_STRPTIME
508
530
  #define DUK_USE_DATE_FMT_STRFTIME
531
+ #include <TargetConditionals.h>
509
532
  #include <architecture/byte_order.h>
510
533
  #include <limits.h>
511
534
  #include <sys/param.h>
@@ -587,6 +610,16 @@ static __inline__ unsigned long long duk_rdtsc(void) {
587
610
  #include <sys/param.h>
588
611
  #include <sys/time.h>
589
612
  #include <time.h>
613
+ #elif defined(DUK_F_TINSPIRE)
614
+ #define DUK_USE_DATE_NOW_GETTIMEOFDAY
615
+ #define DUK_USE_DATE_TZO_GMTIME_R
616
+ #define DUK_USE_DATE_PRS_STRPTIME
617
+ #define DUK_USE_DATE_FMT_STRFTIME
618
+ #include <sys/types.h>
619
+ #include <limits.h>
620
+ #include <sys/param.h>
621
+ #include <sys/time.h>
622
+ #include <time.h>
590
623
  #elif defined(DUK_F_LINUX)
591
624
  #define DUK_USE_DATE_NOW_GETTIMEOFDAY
592
625
  #define DUK_USE_DATE_TZO_GMTIME_R
@@ -929,7 +962,7 @@ typedef signed long long duk_int64_t;
929
962
  typedef unsigned long duk_uint64_t;
930
963
  typedef signed long duk_int64_t;
931
964
  #endif
932
- #if !defined(DUK_F_HAVE64BIT)
965
+ #if !defined(DUK_F_HAVE_64BIT)
933
966
  /* cannot detect 64-bit type, not always needed so don't error */
934
967
  #endif
935
968
 
@@ -1247,11 +1280,17 @@ typedef double duk_double_t;
1247
1280
  #define DUK_USE_ALIGN_8
1248
1281
  #elif defined(DUK_F_ARM)
1249
1282
  #define DUK_USE_ALIGN_4
1250
- #elif defined(DUK_F_MIPS)
1283
+ #elif defined(DUK_F_MIPS32)
1251
1284
  /* Based on 'make checkalign' there are no alignment requirements on
1252
- * Linux MIPS except for doubles, which need align by 4.
1285
+ * Linux MIPS except for doubles, which need align by 4. Alignment
1286
+ * requirements vary based on target though.
1253
1287
  */
1254
1288
  #define DUK_USE_ALIGN_4
1289
+ #elif defined(DUK_F_MIPS64)
1290
+ /* Good default is a bit arbitrary because alignment requirements
1291
+ * depend on target. See https://github.com/svaarala/duktape/issues/102.
1292
+ */
1293
+ #define DUK_USE_ALIGN_8
1255
1294
  #elif defined(DUK_F_SUPERH)
1256
1295
  /* Based on 'make checkalign' there are no alignment requirements on
1257
1296
  * Linux SH4, but align by 4 is probably a good basic default.
@@ -2054,19 +2093,29 @@ typedef FILE duk_file;
2054
2093
  #endif
2055
2094
 
2056
2095
  /*
2057
- * DUK_NOINLINE: macro to avoid inlining a function.
2096
+ * Function inlining control
2097
+ *
2098
+ * DUK_NOINLINE: avoid inlining a function.
2099
+ * DUK_INLINE: suggest inlining a function.
2100
+ * DUK_ALWAYS_INLINE: force inlining for critical functions.
2058
2101
  */
2059
2102
 
2060
2103
  #if defined(DUK_F_CLANG)
2061
- #define DUK_NOINLINE __attribute__ ((noinline))
2104
+ #define DUK_NOINLINE __attribute__((noinline))
2105
+ #define DUK_INLINE inline
2106
+ #define DUK_ALWAYS_INLINE inline __attribute__((always_inline))
2062
2107
  #elif defined(DUK_F_GCC) && defined(DUK_F_GCC_VERSION)
2063
2108
  #if (DUK_F_GCC_VERSION >= 30101)
2064
- #define DUK_NOINLINE __attribute__ ((noinline))
2109
+ #define DUK_NOINLINE __attribute__((noinline))
2110
+ #define DUK_INLINE inline
2111
+ #define DUK_ALWAYS_INLINE inline __attribute__((always_inline))
2065
2112
  #endif
2066
2113
  #endif
2067
2114
 
2068
2115
  #if !defined(DUK_NOINLINE)
2069
- #define DUK_NOINLINE /*nop*/
2116
+ #define DUK_NOINLINE /*nop*/
2117
+ #define DUK_INLINE /*nop*/
2118
+ #define DUK_ALWAYS_INLINE /*nop*/
2070
2119
  #endif
2071
2120
 
2072
2121
  /*
@@ -2168,6 +2217,23 @@ typedef FILE duk_file;
2168
2217
  #define DUK_FUNC_MACRO "unknown"
2169
2218
  #endif
2170
2219
 
2220
+ /*
2221
+ * Byteswap macros
2222
+ *
2223
+ * These are here so that inline assembly or other platform functions can be
2224
+ * used if available.
2225
+ */
2226
+
2227
+ #define DUK_BSWAP32(x) \
2228
+ ((((duk_uint32_t) (x)) >> 24) | \
2229
+ ((((duk_uint32_t) (x)) >> 8) & 0xff00UL) | \
2230
+ ((((duk_uint32_t) (x)) << 8) & 0xff0000UL) | \
2231
+ (((duk_uint32_t) (x)) << 24))
2232
+
2233
+ #define DUK_BSWAP16(x) \
2234
+ ((duk_uint16_t) (x) >> 8) | \
2235
+ ((duk_uint16_t) (x) << 8)
2236
+
2171
2237
  /*
2172
2238
  * Architecture string, human readable value exposed in Duktape.env
2173
2239
  */
@@ -2180,8 +2246,10 @@ typedef FILE duk_file;
2180
2246
  #define DUK_USE_ARCH_STRING "x64"
2181
2247
  #elif defined(DUK_F_ARM)
2182
2248
  #define DUK_USE_ARCH_STRING "arm"
2183
- #elif defined(DUK_F_MIPS)
2184
- #define DUK_USE_ARCH_STRING "mips"
2249
+ #elif defined(DUK_F_MIPS32)
2250
+ #define DUK_USE_ARCH_STRING "mips32"
2251
+ #elif defined(DUK_F_MIPS64)
2252
+ #define DUK_USE_ARCH_STRING "mips64"
2185
2253
  #elif defined(DUK_F_SUPERH)
2186
2254
  #define DUK_USE_ARCH_STRING "sh"
2187
2255
  #elif defined(DUK_F_M68K)
@@ -2200,6 +2268,17 @@ typedef FILE duk_file;
2200
2268
 
2201
2269
  #if defined(DUK_F_LINUX)
2202
2270
  #define DUK_USE_OS_STRING "linux"
2271
+ #elif defined(__APPLE__)
2272
+ /* http://stackoverflow.com/questions/5919996/how-to-detect-reliably-mac-os-x-ios-linux-windows-in-c-preprocessor */
2273
+ #if TARGET_IPHONE_SIMULATOR
2274
+ #define DUK_USE_OS_STRING "iphone-sim"
2275
+ #elif TARGET_OS_IPHONE
2276
+ #define DUK_USE_OS_STRING "iphone"
2277
+ #elif TARGET_OS_MAC
2278
+ #define DUK_USE_OS_STRING "ios"
2279
+ #else
2280
+ #define DUK_USE_OS_STRING "ios-unknown"
2281
+ #endif
2203
2282
  #elif defined(DUK_F_FREEBSD)
2204
2283
  #define DUK_USE_OS_STRING "freebsd"
2205
2284
  #elif defined(DUK_F_OPENBSD)
@@ -2218,6 +2297,8 @@ typedef FILE duk_file;
2218
2297
  #define DUK_USE_OS_STRING "amigaos"
2219
2298
  #elif defined(DUK_F_QNX)
2220
2299
  #define DUK_USE_OS_STRING "qnx"
2300
+ #elif defined(DUK_F_TINSPIRE)
2301
+ #define DUK_USE_OS_STRING "tinspire"
2221
2302
  #else
2222
2303
  #define DUK_USE_OS_STRING "unknown"
2223
2304
  #endif
@@ -2280,16 +2361,56 @@ typedef FILE duk_file;
2280
2361
  #error internal error
2281
2362
  #endif
2282
2363
 
2364
+ /*
2365
+ * Target info string
2366
+ */
2367
+
2368
+ #if defined(DUK_OPT_TARGET_INFO)
2369
+ #define DUK_USE_TARGET_INFO DUK_OPT_TARGET_INFO
2370
+ #else
2371
+ #define DUK_USE_TARGET_INFO "unknown"
2372
+ #endif
2373
+
2374
+ /*
2375
+ * Speed/size and other performance options
2376
+ */
2377
+
2378
+ /* Use fast ("inline") refcount operations instead of calling out to helpers
2379
+ * by default. The difference in binary size is small (~1kB on x64).
2380
+ */
2381
+ #define DUK_USE_FAST_REFCOUNT_DEFAULT
2382
+
2383
+ /* Assert for valstack space but don't check for it in non-assert build.
2384
+ * Valstack overruns (writing beyond checked space) is memory unsafe and
2385
+ * potentially a segfault. Produces a smaller and faster binary.
2386
+ * (In practice the speed difference is small with -O3 so default to
2387
+ * safer behavior for now.)
2388
+ */
2389
+ #undef DUK_USE_VALSTACK_UNSAFE
2390
+
2391
+ /* Catch-all flag which can be used to choose between variant algorithms
2392
+ * where a speed-size tradeoff exists (e.g. lookup tables). When it really
2393
+ * matters, specific use flags may be appropriate.
2394
+ */
2395
+ #define DUK_USE_PREFER_SIZE
2396
+
2283
2397
  /*
2284
2398
  * Tagged type representation (duk_tval)
2285
2399
  */
2286
2400
 
2287
2401
  #undef DUK_USE_PACKED_TVAL
2288
- #undef DUK_USE_FULL_TVAL
2289
2402
 
2290
2403
  #if defined(DUK_USE_PACKED_TVAL_POSSIBLE) && !defined(DUK_OPT_NO_PACKED_TVAL)
2291
2404
  #define DUK_USE_PACKED_TVAL
2292
- #undef DUK_USE_FULL_TVAL
2405
+ #endif
2406
+
2407
+ /* Support for 48-bit signed integer duk_tval with transparent semantics. */
2408
+ #undef DUK_USE_FASTINT
2409
+ #if defined(DUK_OPT_FASTINT)
2410
+ #if !defined(DUK_F_HAVE_64BIT)
2411
+ #error DUK_OPT_FASTINT requires 64-bit integer type support at the moment
2412
+ #endif
2413
+ #define DUK_USE_FASTINT
2293
2414
  #endif
2294
2415
 
2295
2416
  /*
@@ -2300,7 +2421,6 @@ typedef FILE duk_file;
2300
2421
  #define DUK_USE_DOUBLE_LINKED_HEAP
2301
2422
  #define DUK_USE_MARK_AND_SWEEP
2302
2423
  #define DUK_USE_MS_STRINGTABLE_RESIZE
2303
- #undef DUK_USE_GC_TORTURE
2304
2424
 
2305
2425
  #if defined(DUK_OPT_NO_REFERENCE_COUNTING)
2306
2426
  #undef DUK_USE_REFERENCE_COUNTING
@@ -2329,6 +2449,7 @@ typedef FILE duk_file;
2329
2449
  #undef DUK_USE_MS_STRINGTABLE_RESIZE
2330
2450
  #endif
2331
2451
 
2452
+ #undef DUK_USE_GC_TORTURE
2332
2453
  #if defined(DUK_OPT_GC_TORTURE)
2333
2454
  #define DUK_USE_GC_TORTURE
2334
2455
  #endif
@@ -2387,15 +2508,44 @@ typedef FILE duk_file;
2387
2508
  * Execution and debugger options
2388
2509
  */
2389
2510
 
2390
- /* Executor interrupt disabled for 1.0 release: there is no API to use it */
2391
- #if 0
2392
- #define DUK_USE_INTERRUPT_COUNTER
2393
- #if defined(DUK_OPT_NO_INTERRUPT_COUNTER)
2394
2511
  #undef DUK_USE_INTERRUPT_COUNTER
2512
+ #if defined(DUK_OPT_INTERRUPT_COUNTER)
2513
+ #define DUK_USE_INTERRUPT_COUNTER
2514
+ #endif
2515
+
2516
+ #undef DUK_USE_EXEC_TIMEOUT_CHECK
2517
+ #if defined(DUK_OPT_EXEC_TIMEOUT_CHECK)
2518
+ #define DUK_USE_EXEC_TIMEOUT_CHECK(udata) DUK_OPT_EXEC_TIMEOUT_CHECK((udata))
2395
2519
  #endif
2520
+
2521
+ #undef DUK_USE_DEBUGGER_SUPPORT
2522
+ #if defined(DUK_OPT_DEBUGGER_SUPPORT)
2523
+ #define DUK_USE_DEBUGGER_SUPPORT
2396
2524
  #endif
2397
2525
 
2398
- #undef DUK_USE_INTERRUPT_COUNTER
2526
+ #undef DUK_USE_DEBUGGER_FWD_PRINTALERT
2527
+ #if defined(DUK_OPT_DEBUGGER_SUPPORT) && defined(DUK_OPT_DEBUGGER_FWD_PRINTALERT)
2528
+ #define DUK_USE_DEBUGGER_FWD_PRINTALERT
2529
+ #endif
2530
+
2531
+ #undef DUK_USE_DEBUGGER_FWD_LOGGING
2532
+ #if defined(DUK_OPT_DEBUGGER_SUPPORT) && defined(DUK_OPT_DEBUGGER_FWD_LOGGING)
2533
+ #define DUK_USE_DEBUGGER_FWD_LOGGING
2534
+ #endif
2535
+
2536
+ /* DumpHeap is optional because it's not always needed and has a relatively
2537
+ * large footprint.
2538
+ */
2539
+ #undef DUK_USE_DEBUGGER_DUMPHEAP
2540
+ #if defined(DUK_OPT_DEBUGGER_DUMPHEAP)
2541
+ #define DUK_USE_DEBUGGER_DUMPHEAP
2542
+ #endif
2543
+
2544
+ /* Debugger transport read/write torture. */
2545
+ #undef DUK_USE_DEBUGGER_TRANSPORT_TORTURE
2546
+ #if defined(DUK_OPT_DEBUGGER_TRANSPORT_TORTURE)
2547
+ #define DUK_USE_DEBUGGER_TRANSPORT_TORTURE
2548
+ #endif
2399
2549
 
2400
2550
  /* For opcodes with indirect indices, check final index against stack size.
2401
2551
  * This should not be necessary because the compiler is trusted, and we don't
@@ -2616,6 +2766,15 @@ typedef FILE duk_file;
2616
2766
  #undef DUK_USE_NONSTD_STRING_FROMCHARCODE_32BIT
2617
2767
  #endif
2618
2768
 
2769
+ /* Non-standard array fast path write behavior: when writing to numeric
2770
+ * indexes of an Array instance, assume Array.prototype doesn't have
2771
+ * conflicting properties (e.g. a non-writable property "7").
2772
+ */
2773
+ #define DUK_USE_NONSTD_ARRAY_WRITE
2774
+ #if defined(DUK_OPT_NO_NONSTD_ARRAY_WRITE)
2775
+ #undef DUK_USE_NONSTD_ARRAY_WRITE
2776
+ #endif
2777
+
2619
2778
  /*
2620
2779
  * Tailcalls
2621
2780
  */
@@ -2980,6 +3139,12 @@ typedef void (*duk_fatal_function) (duk_context *ctx, duk_errcode_t code, const
2980
3139
  typedef void (*duk_decode_char_function) (void *udata, duk_codepoint_t codepoint);
2981
3140
  typedef duk_codepoint_t (*duk_map_char_function) (void *udata, duk_codepoint_t codepoint);
2982
3141
  typedef duk_ret_t (*duk_safe_call_function) (duk_context *ctx);
3142
+ typedef duk_size_t (*duk_debug_read_function) (void *udata, char *buffer, duk_size_t length);
3143
+ typedef duk_size_t (*duk_debug_write_function) (void *udata, const char *buffer, duk_size_t length);
3144
+ typedef duk_size_t (*duk_debug_peek_function) (void *udata);
3145
+ typedef void (*duk_debug_read_flush_function) (void *udata);
3146
+ typedef void (*duk_debug_write_flush_function) (void *udata);
3147
+ typedef void (*duk_debug_detached_function) (void *udata);
2983
3148
 
2984
3149
  struct duk_memory_functions {
2985
3150
  duk_alloc_function alloc_func;
@@ -3009,13 +3174,16 @@ struct duk_number_list_entry {
3009
3174
  * have 99 for patch level (e.g. 0.10.99 would be a development version
3010
3175
  * after 0.10.0 but before the next official release).
3011
3176
  */
3012
- #define DUK_VERSION 10102L
3177
+ #define DUK_VERSION 10201L
3013
3178
 
3014
3179
  /* Git describe for Duktape build. Useful for non-official snapshot builds
3015
3180
  * so that application code can easily log which Duktape snapshot was used.
3016
3181
  * Not available in the Ecmascript environment.
3017
3182
  */
3018
- #define DUK_GIT_DESCRIBE "v1.1.2"
3183
+ #define DUK_GIT_DESCRIBE "v1.2.1"
3184
+
3185
+ /* Duktape debug protocol version used by this build. */
3186
+ #define DUK_DEBUG_PROTOCOL_VERSION 1
3019
3187
 
3020
3188
  /* Used to represent invalid index; if caller uses this without checking,
3021
3189
  * this index will map to a non-existent stack entry. Also used in some
@@ -3333,7 +3501,10 @@ DUK_EXTERNAL_DECL duk_idx_t duk_push_error_object_va_raw(duk_context *ctx, duk_e
3333
3501
  #define duk_push_error_object_va(ctx,err_code,fmt,ap) \
3334
3502
  duk_push_error_object_va_raw((ctx), (err_code), (const char *) (__FILE__), (duk_int_t) (__LINE__), (fmt), (ap))
3335
3503
 
3336
- DUK_EXTERNAL_DECL void *duk_push_buffer_raw(duk_context *ctx, duk_size_t size, duk_bool_t dynamic);
3504
+ #define DUK_BUF_FLAG_DYNAMIC (1 << 0) /* internal flag: dynamic buffer */
3505
+ #define DUK_BUF_FLAG_NOZERO (1 << 1) /* internal flag: don't zero allocated buffer */
3506
+
3507
+ DUK_EXTERNAL_DECL void *duk_push_buffer_raw(duk_context *ctx, duk_size_t size, duk_small_uint_t flags);
3337
3508
 
3338
3509
  #define duk_push_buffer(ctx,size,dynamic) \
3339
3510
  duk_push_buffer_raw((ctx), (size), (dynamic));
@@ -3785,6 +3956,21 @@ DUK_EXTERNAL_DECL void duk_push_context_dump(duk_context *ctx);
3785
3956
  #define duk_dump_context_stderr(ctx) ((void) 0)
3786
3957
  #endif /* DUK_USE_FILE_IO */
3787
3958
 
3959
+ /*
3960
+ * Debugger (debug protocol)
3961
+ */
3962
+
3963
+ DUK_EXTERNAL_DECL void duk_debugger_attach(duk_context *ctx,
3964
+ duk_debug_read_function read_cb,
3965
+ duk_debug_write_function write_cb,
3966
+ duk_debug_peek_function peek_cb,
3967
+ duk_debug_read_flush_function read_flush_cb,
3968
+ duk_debug_write_flush_function write_flush_cb,
3969
+ duk_debug_detached_function detached_cb,
3970
+ void *udata);
3971
+ DUK_EXTERNAL_DECL void duk_debugger_detach(duk_context *ctx);
3972
+ DUK_EXTERNAL_DECL void duk_debugger_cooperate(duk_context *ctx);
3973
+
3788
3974
  /*
3789
3975
  * C++ name mangling
3790
3976
  */
@@ -3867,6 +4053,19 @@ DUK_EXTERNAL_DECL void duk_push_context_dump(duk_context *ctx);
3867
4053
  #error debug printing cannot currently be used with heap pointer compression
3868
4054
  #endif
3869
4055
 
4056
+ /*
4057
+ * Debugger consistency
4058
+ */
4059
+
4060
+ #if defined(DUK_USE_DEBUGGER_SUPPORT)
4061
+ #if !defined(DUK_USE_INTERRUPT_COUNTER)
4062
+ #error DUK_USE_INTERRUPT_COUNTER is needed when debugger support is enabled
4063
+ #endif
4064
+ #if !defined(DUK_USE_PC2LINE)
4065
+ #error DUK_USE_PC2LINE is needed when debugger support is enabled
4066
+ #endif
4067
+ #endif
4068
+
3870
4069
  /*
3871
4070
  * Garbage collection consistency
3872
4071
  */
@@ -4076,6 +4275,25 @@ typedef union duk_double_union duk_double_union;
4076
4275
  #define DUK_DBLUNION_GET_HIGH32(u) ((u)->ui[DUK_DBL_IDX_UI0])
4077
4276
  #define DUK_DBLUNION_GET_LOW32(u) ((u)->ui[DUK_DBL_IDX_UI1])
4078
4277
 
4278
+ #ifdef DUK_USE_64BIT_OPS
4279
+ #ifdef DUK_USE_DOUBLE_ME
4280
+ #define DUK_DBLUNION_SET_UINT64(u,v) do { \
4281
+ (u)->ui[DUK_DBL_IDX_UI0] = (duk_uint32_t) ((v) >> 32); \
4282
+ (u)->ui[DUK_DBL_IDX_UI1] = (duk_uint32_t) (v); \
4283
+ } while (0)
4284
+ #define DUK_DBLUNION_GET_UINT64(u) \
4285
+ ((((duk_uint64_t) (u)->ui[DUK_DBL_IDX_UI0]) << 32) | \
4286
+ ((duk_uint64_t) (u)->ui[DUK_DBL_IDX_UI1]))
4287
+ #else
4288
+ #define DUK_DBLUNION_SET_UINT64(u,v) do { \
4289
+ (u)->ull[DUK_DBL_IDX_ULL0] = (duk_uint64_t) (v); \
4290
+ } while (0)
4291
+ #define DUK_DBLUNION_GET_UINT64(u) ((u)->ull[DUK_DBL_IDX_ULL0])
4292
+ #endif
4293
+ #define DUK_DBLUNION_SET_INT64(u,v) DUK_DBLUNION_SET_UINT64((u), (duk_uint64_t) (v))
4294
+ #define DUK_DBLUNION_GET_INT64(u) ((duk_int64_t) DUK_DBLUNION_GET_UINT64((u)))
4295
+ #endif /* DUK_USE_64BIT_OPS */
4296
+
4079
4297
  /*
4080
4298
  * Double NaN manipulation macros related to NaN normalization needed when
4081
4299
  * using the packed duk_tval representation. NaN normalization is necessary
@@ -4209,6 +4427,33 @@ typedef union duk_double_union duk_double_union;
4209
4427
  } while (0)
4210
4428
  #endif /* DUK_USE_PACKED_TVAL */
4211
4429
 
4430
+ /* Byteswap an (aligned) duk_double_union. */
4431
+ #if defined(DUK_USE_DOUBLE_LE)
4432
+ #define DUK_DBLUNION_BSWAP(u) do { \
4433
+ duk_uint32_t duk__bswaptmp1, duk__bswaptmp2; \
4434
+ duk__bswaptmp1 = (u)->ui[0]; \
4435
+ duk__bswaptmp2 = (u)->ui[1]; \
4436
+ duk__bswaptmp1 = DUK_BSWAP32(duk__bswaptmp1); \
4437
+ duk__bswaptmp2 = DUK_BSWAP32(duk__bswaptmp2); \
4438
+ (u)->ui[0] = duk__bswaptmp2; \
4439
+ (u)->ui[1] = duk__bswaptmp1; \
4440
+ } while (0)
4441
+ #elif defined(DUK_USE_DOUBLE_ME)
4442
+ #define DUK_DBLUNION_BSWAP(u) do { \
4443
+ duk_uint32_t duk__bswaptmp1, duk__bswaptmp2; \
4444
+ duk__bswaptmp1 = (u)->ui[0]; \
4445
+ duk__bswaptmp2 = (u)->ui[1]; \
4446
+ duk__bswaptmp1 = DUK_BSWAP32(duk__bswaptmp1); \
4447
+ duk__bswaptmp2 = DUK_BSWAP32(duk__bswaptmp2); \
4448
+ (u)->ui[0] = duk__bswaptmp1; \
4449
+ (u)->ui[1] = duk__bswaptmp2; \
4450
+ } while (0)
4451
+ #elif defined(DUK_USE_DOUBLE_BE)
4452
+ #define DUK_DBLUNION_BSWAP(u) do { } while (0)
4453
+ #else
4454
+ #error internal error, double endianness insane
4455
+ #endif
4456
+
4212
4457
  #endif /* DUK_DBLUNION_H_INCLUDED */
4213
4458
 
4214
4459
  #endif /* DUKTAPE_H_INCLUDED */