duktape 1.0.2.0 → 1.1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +17 -0
- data/README.md +50 -19
- data/ext/duktape/duktape.c +18317 -16099
- data/ext/duktape/duktape.h +384 -72
- data/ext/duktape/duktape_ext.c +577 -66
- data/ext/duktape/extconf.rb +1 -0
- data/lib/duktape/version.rb +1 -1
- metadata +2 -2
data/ext/duktape/duktape.h
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
/*
|
2
|
-
* Duktape public API for Duktape 1.
|
2
|
+
* Duktape public API for Duktape 1.1.2.
|
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
|
8
|
+
* Git commit eb523a027d3d9658a0c0e2150b29e6d87f81860c (v1.1.2).
|
9
9
|
*
|
10
10
|
* See Duktape AUTHORS.rst and LICENSE.txt for copyright and
|
11
11
|
* licensing information.
|
@@ -19,7 +19,7 @@
|
|
19
19
|
*
|
20
20
|
* (http://opensource.org/licenses/MIT)
|
21
21
|
*
|
22
|
-
* Copyright (c) 2013-
|
22
|
+
* Copyright (c) 2013-2015 by Duktape authors (see AUTHORS.rst)
|
23
23
|
*
|
24
24
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
25
25
|
* of this software and associated documentation files (the "Software"), to deal
|
@@ -66,12 +66,13 @@
|
|
66
66
|
* * Sami Vaarala <sami.vaarala@iki.fi>
|
67
67
|
* * Niki Dobrev
|
68
68
|
* * Andreas \u00d6man <andreas@lonelycoder.com>
|
69
|
+
* * L\u00e1szl\u00f3 Lang\u00f3 <llango.u-szeged@partner.samsung.com>
|
69
70
|
*
|
70
71
|
* Other contributions
|
71
72
|
* ===================
|
72
73
|
*
|
73
74
|
* The following people have contributed something other than code (e.g. reported
|
74
|
-
* bugs, provided ideas, etc; in order of appearance):
|
75
|
+
* bugs, provided ideas, etc; roughly in order of appearance):
|
75
76
|
*
|
76
77
|
* * Greg Burns
|
77
78
|
* * Anthony Rabine
|
@@ -87,8 +88,15 @@
|
|
87
88
|
* * Rajaran Gaunker (https://github.com/zimbabao)
|
88
89
|
* * Andreas \u00d6man
|
89
90
|
* * Doug Sanden
|
91
|
+
* * Josh Engebretson (https://github.com/JoshEngebretson)
|
90
92
|
* * Remo Eichenberger (https://github.com/remoe)
|
91
|
-
* *
|
93
|
+
* * Mamod Mehyar (https://github.com/mamod)
|
94
|
+
* * David Demelier (https://github.com/hftmarkand)
|
95
|
+
* * Tim Caswell (https://github.com/creationix)
|
96
|
+
* * Mitchell Blank Jr (https://github.com/mitchblank)
|
97
|
+
*
|
98
|
+
* If you are accidentally missing from this list, send me an e-mail
|
99
|
+
* (``sami.vaarala@iki.fi``) and I'll fix the omission.
|
92
100
|
*/
|
93
101
|
|
94
102
|
#ifndef DUKTAPE_H_INCLUDED
|
@@ -242,6 +250,16 @@ static __inline__ unsigned long long duk_rdtsc(void) {
|
|
242
250
|
#define DUK_F_MIPS
|
243
251
|
#endif
|
244
252
|
|
253
|
+
/* SuperH */
|
254
|
+
#if defined(__sh__) || \
|
255
|
+
defined(__sh1__) || defined(__SH1__) || \
|
256
|
+
defined(__sh2__) || defined(__SH2__) || \
|
257
|
+
defined(__sh3__) || defined(__SH3__) || \
|
258
|
+
defined(__sh4__) || defined(__SH4__) || \
|
259
|
+
defined(__sh5__) || defined(__SH5__)
|
260
|
+
#define DUK_F_SUPERH
|
261
|
+
#endif
|
262
|
+
|
245
263
|
/* Motorola 68K. Not defined by VBCC, so user must define one of these
|
246
264
|
* manually when using VBCC.
|
247
265
|
*/
|
@@ -363,6 +381,7 @@ static __inline__ unsigned long long duk_rdtsc(void) {
|
|
363
381
|
|
364
382
|
/* MinGW */
|
365
383
|
#if defined(__MINGW32__) || defined(__MINGW64__)
|
384
|
+
/* NOTE: Also GCC flags are detected (DUK_F_GCC etc). */
|
366
385
|
#define DUK_F_MINGW
|
367
386
|
#endif
|
368
387
|
|
@@ -471,6 +490,16 @@ static __inline__ unsigned long long duk_rdtsc(void) {
|
|
471
490
|
#define DUK_F_NO_STDINT_H
|
472
491
|
#endif
|
473
492
|
|
493
|
+
/* Workaround for older C++ compilers before including <inttypes.h>,
|
494
|
+
* see e.g.: https://sourceware.org/bugzilla/show_bug.cgi?id=15366
|
495
|
+
*/
|
496
|
+
#if defined(__cplusplus) && !defined(__STDC_LIMIT_MACROS)
|
497
|
+
#define __STDC_LIMIT_MACROS
|
498
|
+
#endif
|
499
|
+
#if defined(__cplusplus) && !defined(__STDC_CONSTANT_MACROS)
|
500
|
+
#define __STDC_CONSTANT_MACROS
|
501
|
+
#endif
|
502
|
+
|
474
503
|
#if defined(__APPLE__)
|
475
504
|
/* Mac OSX, iPhone, Darwin */
|
476
505
|
#define DUK_USE_DATE_NOW_GETTIMEOFDAY
|
@@ -624,7 +653,9 @@ static __inline__ unsigned long long duk_rdtsc(void) {
|
|
624
653
|
#if defined(DUK_F_NO_STDINT_H)
|
625
654
|
/* stdint.h not available */
|
626
655
|
#else
|
627
|
-
/*
|
656
|
+
/* Technically C99 (C++11) but found in many systems. Note the workaround
|
657
|
+
* above for some C++ compilers (__STDC_LIMIT_MACROS etc).
|
658
|
+
*/
|
628
659
|
#include <stdint.h>
|
629
660
|
#endif
|
630
661
|
#include <math.h>
|
@@ -710,7 +741,8 @@ static __inline__ unsigned long long duk_rdtsc(void) {
|
|
710
741
|
* through automatic detection.
|
711
742
|
*/
|
712
743
|
#if defined(DUK_F_HAVE_INTTYPES)
|
713
|
-
/* C99 */
|
744
|
+
/* C99 or compatible */
|
745
|
+
|
714
746
|
#define DUK_F_HAVE_64BIT
|
715
747
|
#include <inttypes.h>
|
716
748
|
|
@@ -1162,10 +1194,11 @@ typedef double duk_double_t;
|
|
1162
1194
|
#error DUK_SIZE_MAX is undefined, probably missing SIZE_MAX
|
1163
1195
|
#elif !defined(DUK_SIZE_MAX_COMPUTED)
|
1164
1196
|
#if DUK_SIZE_MAX < 0xffffffffUL
|
1165
|
-
/*
|
1166
|
-
*
|
1197
|
+
/* On some systems SIZE_MAX can be smaller than max unsigned 32-bit value
|
1198
|
+
* which seems incorrect if size_t is (at least) an unsigned 32-bit type.
|
1199
|
+
* However, it doesn't seem useful to error out compilation if this is the
|
1200
|
+
* case.
|
1167
1201
|
*/
|
1168
|
-
#error size_t is too small
|
1169
1202
|
#endif
|
1170
1203
|
#endif
|
1171
1204
|
|
@@ -1215,12 +1248,23 @@ typedef double duk_double_t;
|
|
1215
1248
|
#elif defined(DUK_F_ARM)
|
1216
1249
|
#define DUK_USE_ALIGN_4
|
1217
1250
|
#elif defined(DUK_F_MIPS)
|
1251
|
+
/* Based on 'make checkalign' there are no alignment requirements on
|
1252
|
+
* Linux MIPS except for doubles, which need align by 4.
|
1253
|
+
*/
|
1254
|
+
#define DUK_USE_ALIGN_4
|
1255
|
+
#elif defined(DUK_F_SUPERH)
|
1256
|
+
/* Based on 'make checkalign' there are no alignment requirements on
|
1257
|
+
* Linux SH4, but align by 4 is probably a good basic default.
|
1258
|
+
*/
|
1218
1259
|
#define DUK_USE_ALIGN_4
|
1219
1260
|
#elif defined(DUK_F_X86) || defined(DUK_F_X32) || defined(DUK_F_X64) || \
|
1220
1261
|
defined(DUK_F_BCC)
|
1262
|
+
/* XXX: This is technically not guaranteed because it's possible to configure
|
1263
|
+
* an x86 to require aligned accesses with Alignment Check (AC) flag.
|
1264
|
+
*/
|
1221
1265
|
#define DUK_USE_UNALIGNED_ACCESSES_POSSIBLE
|
1222
1266
|
#else
|
1223
|
-
/*
|
1267
|
+
/* Unknown, use safe default */
|
1224
1268
|
#define DUK_USE_ALIGN_8
|
1225
1269
|
#endif
|
1226
1270
|
|
@@ -1871,8 +1915,6 @@ typedef FILE duk_file;
|
|
1871
1915
|
|
1872
1916
|
#define DUK_ABORT abort
|
1873
1917
|
#define DUK_EXIT exit
|
1874
|
-
#define DUK_SETJMP setjmp
|
1875
|
-
#define DUK_LONGJMP longjmp
|
1876
1918
|
|
1877
1919
|
/*
|
1878
1920
|
* Macro hackery to convert e.g. __LINE__ to a string without formatting,
|
@@ -1891,7 +1933,7 @@ typedef FILE duk_file;
|
|
1891
1933
|
*/
|
1892
1934
|
|
1893
1935
|
#define DUK_CAUSE_SEGFAULT() do { \
|
1894
|
-
*((duk_uint32_t *) NULL) = (duk_uint32_t) 0xdeadbeefUL; \
|
1936
|
+
*((volatile duk_uint32_t *) NULL) = (duk_uint32_t) 0xdeadbeefUL; \
|
1895
1937
|
} while (0)
|
1896
1938
|
|
1897
1939
|
/*
|
@@ -1992,7 +2034,7 @@ typedef FILE duk_file;
|
|
1992
2034
|
#endif
|
1993
2035
|
|
1994
2036
|
#if defined(DUK_USE_BRANCH_HINTS)
|
1995
|
-
#if defined(DUK_F_GCC_VERSION) && (
|
2037
|
+
#if defined(DUK_F_GCC_VERSION) && (DUK_F_GCC_VERSION >= 40500L)
|
1996
2038
|
/* GCC: test not very accurate; enable only in relatively recent builds
|
1997
2039
|
* because of bugs in gcc-4.4 (http://lists.debian.org/debian-gcc/2010/04/msg00000.html)
|
1998
2040
|
*/
|
@@ -2011,16 +2053,45 @@ typedef FILE duk_file;
|
|
2011
2053
|
#define DUK_UNLIKELY(x) (x)
|
2012
2054
|
#endif
|
2013
2055
|
|
2056
|
+
/*
|
2057
|
+
* DUK_NOINLINE: macro to avoid inlining a function.
|
2058
|
+
*/
|
2059
|
+
|
2060
|
+
#if defined(DUK_F_CLANG)
|
2061
|
+
#define DUK_NOINLINE __attribute__ ((noinline))
|
2062
|
+
#elif defined(DUK_F_GCC) && defined(DUK_F_GCC_VERSION)
|
2063
|
+
#if (DUK_F_GCC_VERSION >= 30101)
|
2064
|
+
#define DUK_NOINLINE __attribute__ ((noinline))
|
2065
|
+
#endif
|
2066
|
+
#endif
|
2067
|
+
|
2068
|
+
#if !defined(DUK_NOINLINE)
|
2069
|
+
#define DUK_NOINLINE /*nop*/
|
2070
|
+
#endif
|
2071
|
+
|
2014
2072
|
/*
|
2015
2073
|
* Symbol visibility macros
|
2074
|
+
*
|
2075
|
+
* To avoid C++ declaration issues (see GH-63):
|
2076
|
+
*
|
2077
|
+
* - Don't use DUK_LOCAL_DECL for local -data symbols- so that you don't
|
2078
|
+
* end up with both a "static" declaration and a definition.
|
2079
|
+
*
|
2080
|
+
* - Wrap any DUK_INTERNAL_DECL with a '#if !defined(DUK_SINGLE_FILE)'
|
2081
|
+
* so that the internal declarations (which would map to "static" in
|
2082
|
+
* a single file distribution) get dropped.
|
2016
2083
|
*/
|
2017
2084
|
|
2018
2085
|
/* XXX: user override for these? user override for just using the default visibility macros? */
|
2019
2086
|
/* XXX: separate macros for function and data may be necessary at some point. */
|
2020
2087
|
|
2021
2088
|
#if defined(DUK_F_GCC_VERSION)
|
2022
|
-
#if (DUK_F_GCC_VERSION >= 40000)
|
2023
|
-
/* Might work on earlier versions too but limit to GCC 4+.
|
2089
|
+
#if (DUK_F_GCC_VERSION >= 40000) && !(defined(DUK_F_MINGW) || defined(DUK_F_CYGWIN))
|
2090
|
+
/* Might work on earlier versions too but limit to GCC 4+.
|
2091
|
+
* MinGW should use Windows specific __declspec or no visibility attributes at all,
|
2092
|
+
* otherwise: "warning: visibility attribute not supported in this configuration; ignored".
|
2093
|
+
* Same applies to Cygwin GCC.
|
2094
|
+
*/
|
2024
2095
|
#define DUK_F_GCC_SYMBOL_VISIBILITY
|
2025
2096
|
#endif
|
2026
2097
|
#endif
|
@@ -2081,24 +2152,6 @@ typedef FILE duk_file;
|
|
2081
2152
|
#define DUK_LOCAL_DECL static
|
2082
2153
|
#define DUK_LOCAL static
|
2083
2154
|
|
2084
|
-
/* In C++ one cannot declare and define "static" variables separately (GH-63).
|
2085
|
-
* As a quick workaround, use "extern" instead: it makes the symbol table ugly
|
2086
|
-
* but allows compilation. A better fix is to avoid the need to forward declare
|
2087
|
-
* internal symbols, but it requires changes to combine_src.py.
|
2088
|
-
*
|
2089
|
-
* XXX: better fix is needed.
|
2090
|
-
*/
|
2091
|
-
#if defined(DUK_F_CPP)
|
2092
|
-
#undef DUK_INTERNAL_DECL
|
2093
|
-
#undef DUK_INTERNAL
|
2094
|
-
#undef DUK_LOCAL_DECL
|
2095
|
-
#undef DUK_LOCAL
|
2096
|
-
#define DUK_INTERNAL_DECL extern
|
2097
|
-
#define DUK_INTERNAL /*empty*/
|
2098
|
-
#define DUK_LOCAL_DECL extern
|
2099
|
-
#define DUK_LOCAL /*empty*/
|
2100
|
-
#endif
|
2101
|
-
|
2102
2155
|
/*
|
2103
2156
|
* __FILE__, __LINE__, __func__ are wrapped. Especially __func__ is a
|
2104
2157
|
* problem because it is not available even in some compilers which try
|
@@ -2129,6 +2182,8 @@ typedef FILE duk_file;
|
|
2129
2182
|
#define DUK_USE_ARCH_STRING "arm"
|
2130
2183
|
#elif defined(DUK_F_MIPS)
|
2131
2184
|
#define DUK_USE_ARCH_STRING "mips"
|
2185
|
+
#elif defined(DUK_F_SUPERH)
|
2186
|
+
#define DUK_USE_ARCH_STRING "sh"
|
2132
2187
|
#elif defined(DUK_F_M68K)
|
2133
2188
|
#define DUK_USE_ARCH_STRING "m68k"
|
2134
2189
|
#elif defined(DUK_F_FLASHPLAYER)
|
@@ -2171,20 +2226,60 @@ typedef FILE duk_file;
|
|
2171
2226
|
* Compiler string, human readable value exposed in Duktape.env
|
2172
2227
|
*/
|
2173
2228
|
|
2174
|
-
#if defined(
|
2229
|
+
#if defined(DUK_F_MINGW)
|
2230
|
+
#define DUK_USE_COMPILER_STRING "mingw"
|
2231
|
+
#elif defined(DUK_F_GCC)
|
2232
|
+
#if defined(DUK_F_CPP)
|
2233
|
+
#define DUK_USE_COMPILER_STRING "g++"
|
2234
|
+
#else
|
2175
2235
|
#define DUK_USE_COMPILER_STRING "gcc"
|
2236
|
+
#endif
|
2176
2237
|
#elif defined(DUK_F_CLANG)
|
2177
2238
|
#define DUK_USE_COMPILER_STRING "clang"
|
2178
2239
|
#elif defined(DUK_F_MSVC)
|
2179
2240
|
#define DUK_USE_COMPILER_STRING "msvc"
|
2180
|
-
#elif defined(DUK_F_MINGW)
|
2181
|
-
#define DUK_USE_COMPILER_STRING "mingw"
|
2182
2241
|
#elif defined(DUK_F_VBCC)
|
2183
2242
|
#define DUK_USE_COMPILER_STRING "vbcc"
|
2184
2243
|
#else
|
2185
2244
|
#define DUK_USE_COMPILER_STRING "unknown"
|
2186
2245
|
#endif
|
2187
2246
|
|
2247
|
+
/*
|
2248
|
+
* Long control transfer, setjmp/longjmp or alternatives
|
2249
|
+
*
|
2250
|
+
* Signal mask is not saved (when that can be communicated to the platform)
|
2251
|
+
*/
|
2252
|
+
|
2253
|
+
/* dummy non-zero value to be used as an argument for longjmp(), see man longjmp */
|
2254
|
+
#define DUK_LONGJMP_DUMMY_VALUE 1
|
2255
|
+
|
2256
|
+
#if defined(DUK_OPT_SETJMP)
|
2257
|
+
#define DUK_USE_SETJMP
|
2258
|
+
#elif defined(DUK_OPT_UNDERSCORE_SETJMP)
|
2259
|
+
#define DUK_USE_UNDERSCORE_SETJMP
|
2260
|
+
#elif defined(DUK_OPT_SIGSETJMP)
|
2261
|
+
#define DUK_USE_SIGSETJMP
|
2262
|
+
#elif defined(__APPLE__)
|
2263
|
+
/* Use _setjmp() on Apple by default, see GH-55. */
|
2264
|
+
#define DUK_USE_UNDERSCORE_SETJMP
|
2265
|
+
#else
|
2266
|
+
/* The most portable default is setjmp(). */
|
2267
|
+
#define DUK_USE_SETJMP
|
2268
|
+
#endif
|
2269
|
+
|
2270
|
+
#if defined(DUK_USE_UNDERSCORE_SETJMP)
|
2271
|
+
#define DUK_SETJMP(jb) _setjmp((jb))
|
2272
|
+
#define DUK_LONGJMP(jb) _longjmp((jb), DUK_LONGJMP_DUMMY_VALUE)
|
2273
|
+
#elif defined(DUK_USE_SIGSETJMP)
|
2274
|
+
#define DUK_SETJMP(jb) sigsetjmp((jb), 0 /*savesigs*/)
|
2275
|
+
#define DUK_LONGJMP(jb) siglongjmp((jb), DUK_LONGJMP_DUMMY_VALUE)
|
2276
|
+
#elif defined(DUK_USE_SETJMP)
|
2277
|
+
#define DUK_SETJMP(jb) setjmp((jb))
|
2278
|
+
#define DUK_LONGJMP(jb) longjmp((jb), DUK_LONGJMP_DUMMY_VALUE)
|
2279
|
+
#else
|
2280
|
+
#error internal error
|
2281
|
+
#endif
|
2282
|
+
|
2188
2283
|
/*
|
2189
2284
|
* Tagged type representation (duk_tval)
|
2190
2285
|
*/
|
@@ -2238,6 +2333,19 @@ typedef FILE duk_file;
|
|
2238
2333
|
#define DUK_USE_GC_TORTURE
|
2239
2334
|
#endif
|
2240
2335
|
|
2336
|
+
/*
|
2337
|
+
* String table options
|
2338
|
+
*/
|
2339
|
+
|
2340
|
+
#if defined(DUK_OPT_STRTAB_CHAIN) && defined(DUK_OPT_STRTAB_CHAIN_SIZE)
|
2341
|
+
/* Low memory algorithm: separate chaining using arrays, fixed size hash */
|
2342
|
+
#define DUK_USE_STRTAB_CHAIN
|
2343
|
+
#define DUK_USE_STRTAB_CHAIN_SIZE DUK_OPT_STRTAB_CHAIN_SIZE
|
2344
|
+
#else
|
2345
|
+
/* Default algorithm: open addressing (probing) */
|
2346
|
+
#define DUK_USE_STRTAB_PROBE
|
2347
|
+
#endif
|
2348
|
+
|
2241
2349
|
/*
|
2242
2350
|
* Error handling options
|
2243
2351
|
*/
|
@@ -2363,6 +2471,11 @@ typedef FILE duk_file;
|
|
2363
2471
|
#define DUK_USE_MATH_BUILTIN
|
2364
2472
|
#endif
|
2365
2473
|
|
2474
|
+
#define DUK_USE_STRICT_DECL
|
2475
|
+
#if defined(DUK_OPT_NO_STRICT_DECL)
|
2476
|
+
#undef DUK_USE_STRICT_DECL
|
2477
|
+
#endif
|
2478
|
+
|
2366
2479
|
#define DUK_USE_REGEXP_SUPPORT
|
2367
2480
|
#if defined(DUK_OPT_NO_REGEXP_SUPPORT)
|
2368
2481
|
#undef DUK_USE_REGEXP_SUPPORT
|
@@ -2489,6 +2602,20 @@ typedef FILE duk_file;
|
|
2489
2602
|
#undef DUK_USE_NONSTD_SETTER_KEY_ARGUMENT
|
2490
2603
|
#endif
|
2491
2604
|
|
2605
|
+
/* JSON escaping of U+2028 and U+2029.
|
2606
|
+
*/
|
2607
|
+
|
2608
|
+
#define DUK_USE_NONSTD_JSON_ESC_U2028_U2029
|
2609
|
+
#if defined(DUK_OPT_NO_NONSTD_JSON_ESC_U2028_U2029)
|
2610
|
+
#undef DUK_USE_NONSTD_JSON_ESC_U2028_U2029
|
2611
|
+
#endif
|
2612
|
+
|
2613
|
+
/* Allow 32-bit codepoints in String.fromCharCode. */
|
2614
|
+
#define DUK_USE_NONSTD_STRING_FROMCHARCODE_32BIT
|
2615
|
+
#if defined(DUK_OPT_NO_NONSTD_STRING_FROMCHARCODE_32BIT)
|
2616
|
+
#undef DUK_USE_NONSTD_STRING_FROMCHARCODE_32BIT
|
2617
|
+
#endif
|
2618
|
+
|
2492
2619
|
/*
|
2493
2620
|
* Tailcalls
|
2494
2621
|
*/
|
@@ -2530,6 +2657,11 @@ typedef FILE duk_file;
|
|
2530
2657
|
#define DUK_USE_ESBC_MAX_LINENUMBER 0x7fff0000L
|
2531
2658
|
#define DUK_USE_ESBC_MAX_BYTES 0x7fff0000L
|
2532
2659
|
|
2660
|
+
#undef DUK_USE_SHUFFLE_TORTURE
|
2661
|
+
#if defined(DUK_OPT_SHUFFLE_TORTURE)
|
2662
|
+
#define DUK_USE_SHUFFLE_TORTURE
|
2663
|
+
#endif
|
2664
|
+
|
2533
2665
|
/*
|
2534
2666
|
* User panic handler, panic exit behavior for default panic handler
|
2535
2667
|
*/
|
@@ -2607,6 +2739,105 @@ typedef FILE duk_file;
|
|
2607
2739
|
#define DUK_USE_USER_INITJS (DUK_OPT_USER_INITJS)
|
2608
2740
|
#endif
|
2609
2741
|
|
2742
|
+
/*
|
2743
|
+
* External string data support
|
2744
|
+
*
|
2745
|
+
* Allow duk_hstrings to store data also behind an external pointer (see
|
2746
|
+
* duk_hstring_external). This increases code size slightly but is useful
|
2747
|
+
* in low memory environments where memory is more limited than flash.
|
2748
|
+
*/
|
2749
|
+
|
2750
|
+
#undef DUK_USE_HSTRING_EXTDATA
|
2751
|
+
#if defined(DUK_OPT_EXTERNAL_STRINGS)
|
2752
|
+
#define DUK_USE_HSTRING_EXTDATA
|
2753
|
+
#endif
|
2754
|
+
|
2755
|
+
#undef DUK_USE_EXTSTR_INTERN_CHECK
|
2756
|
+
#if defined(DUK_OPT_EXTERNAL_STRINGS) && defined(DUK_OPT_EXTSTR_INTERN_CHECK)
|
2757
|
+
#define DUK_USE_EXTSTR_INTERN_CHECK(udata,ptr,len) DUK_OPT_EXTSTR_INTERN_CHECK((udata), (ptr), (len))
|
2758
|
+
#endif
|
2759
|
+
|
2760
|
+
#undef DUK_USE_EXTSTR_FREE
|
2761
|
+
#if defined(DUK_OPT_EXTERNAL_STRINGS) && defined(DUK_OPT_EXTSTR_FREE)
|
2762
|
+
#define DUK_USE_EXTSTR_FREE(udata,ptr) DUK_OPT_EXTSTR_FREE((udata), (ptr))
|
2763
|
+
#endif
|
2764
|
+
|
2765
|
+
/*
|
2766
|
+
* Lightweight functions
|
2767
|
+
*/
|
2768
|
+
|
2769
|
+
/* Force built-ins to use lightfunc function pointers when possible. This
|
2770
|
+
* makes the built-in functions non-compliant with respect to their property
|
2771
|
+
* values and such, but is very useful in low memory environments (can save
|
2772
|
+
* around 14kB of initial RAM footprint).
|
2773
|
+
*/
|
2774
|
+
#undef DUK_USE_LIGHTFUNC_BUILTINS
|
2775
|
+
#if defined(DUK_OPT_LIGHTFUNC_BUILTINS)
|
2776
|
+
#define DUK_USE_LIGHTFUNC_BUILTINS
|
2777
|
+
#endif
|
2778
|
+
|
2779
|
+
/*
|
2780
|
+
* Pointer compression and 16-bit header fields for low memory environments
|
2781
|
+
*/
|
2782
|
+
|
2783
|
+
#undef DUK_USE_HEAPPTR16
|
2784
|
+
#undef DUK_USE_HEAPPTR_ENC16
|
2785
|
+
#undef DUK_USE_HEAPPTR_DEC16
|
2786
|
+
#if defined(DUK_OPT_HEAPPTR16) && defined(DUK_OPT_HEAPPTR_ENC16) && defined(DUK_OPT_HEAPPTR_DEC16)
|
2787
|
+
#define DUK_USE_HEAPPTR16
|
2788
|
+
#define DUK_USE_HEAPPTR_ENC16(udata,ptr) DUK_OPT_HEAPPTR_ENC16((udata),(ptr))
|
2789
|
+
#define DUK_USE_HEAPPTR_DEC16(udata,ptr) DUK_OPT_HEAPPTR_DEC16((udata),(ptr))
|
2790
|
+
#endif
|
2791
|
+
|
2792
|
+
#undef DUK_USE_DATAPTR16
|
2793
|
+
#undef DUK_USE_DATAPTR_ENC16
|
2794
|
+
#undef DUK_USE_DATAPTR_DEC16
|
2795
|
+
#if defined(DUK_OPT_DATAPTR16) && defined(DUK_OPT_DATAPTR_ENC16) && defined(DUK_OPT_DATAPTR_DEC16)
|
2796
|
+
#define DUK_USE_DATAPTR16
|
2797
|
+
#define DUK_USE_DATAPTR_ENC16(udata,ptr) DUK_OPT_DATAPTR_ENC16((udata),(ptr))
|
2798
|
+
#define DUK_USE_DATAPTR_DEC16(udata,ptr) DUK_OPT_DATAPTR_DEC16((udata),(ptr))
|
2799
|
+
#endif
|
2800
|
+
|
2801
|
+
#undef DUK_USE_FUNCPTR16
|
2802
|
+
#undef DUK_USE_FUNCPTR_ENC16
|
2803
|
+
#undef DUK_USE_FUNCPTR_DEC16
|
2804
|
+
#if defined(DUK_OPT_FUNCPTR16) && defined(DUK_OPT_FUNCPTR_ENC16) && defined(DUK_OPT_FUNCPTR_DEC16)
|
2805
|
+
#define DUK_USE_FUNCPTR16
|
2806
|
+
#define DUK_USE_FUNCPTR_ENC16(udata,ptr) DUK_OPT_FUNCPTR_ENC16((udata),(ptr))
|
2807
|
+
#define DUK_USE_FUNCPTR_DEC16(udata,ptr) DUK_OPT_FUNCPTR_DEC16((udata),(ptr))
|
2808
|
+
#endif
|
2809
|
+
|
2810
|
+
#undef DUK_USE_REFCOUNT16
|
2811
|
+
#if defined(DUK_OPT_REFCOUNT16)
|
2812
|
+
#define DUK_USE_REFCOUNT16
|
2813
|
+
#endif
|
2814
|
+
|
2815
|
+
#undef DUK_USE_STRHASH16
|
2816
|
+
#if defined(DUK_OPT_STRHASH16)
|
2817
|
+
#define DUK_USE_STRHASH16
|
2818
|
+
#endif
|
2819
|
+
|
2820
|
+
#undef DUK_USE_STRLEN16
|
2821
|
+
#if defined(DUK_OPT_STRLEN16)
|
2822
|
+
#define DUK_USE_STRLEN16
|
2823
|
+
#endif
|
2824
|
+
|
2825
|
+
#undef DUK_USE_BUFLEN16
|
2826
|
+
#if defined(DUK_OPT_BUFLEN16)
|
2827
|
+
#define DUK_USE_BUFLEN16
|
2828
|
+
#endif
|
2829
|
+
|
2830
|
+
#undef DUK_USE_OBJSIZES16
|
2831
|
+
#if defined(DUK_OPT_OBJSIZES16)
|
2832
|
+
#define DUK_USE_OBJSIZES16
|
2833
|
+
#endif
|
2834
|
+
|
2835
|
+
/* For now, hash part is dropped if and only if 16-bit object fields are used. */
|
2836
|
+
#define DUK_USE_HOBJECT_HASH_PART
|
2837
|
+
#if defined(DUK_USE_OBJSIZES16)
|
2838
|
+
#undef DUK_USE_HOBJECT_HASH_PART
|
2839
|
+
#endif
|
2840
|
+
|
2610
2841
|
/*
|
2611
2842
|
* Miscellaneous
|
2612
2843
|
*/
|
@@ -2778,7 +3009,13 @@ struct duk_number_list_entry {
|
|
2778
3009
|
* have 99 for patch level (e.g. 0.10.99 would be a development version
|
2779
3010
|
* after 0.10.0 but before the next official release).
|
2780
3011
|
*/
|
2781
|
-
#define DUK_VERSION
|
3012
|
+
#define DUK_VERSION 10102L
|
3013
|
+
|
3014
|
+
/* Git describe for Duktape build. Useful for non-official snapshot builds
|
3015
|
+
* so that application code can easily log which Duktape snapshot was used.
|
3016
|
+
* Not available in the Ecmascript environment.
|
3017
|
+
*/
|
3018
|
+
#define DUK_GIT_DESCRIBE "v1.1.2"
|
2782
3019
|
|
2783
3020
|
/* Used to represent invalid index; if caller uses this without checking,
|
2784
3021
|
* this index will map to a non-existent stack entry. Also used in some
|
@@ -2806,6 +3043,7 @@ struct duk_number_list_entry {
|
|
2806
3043
|
#define DUK_TYPE_OBJECT 6 /* Ecmascript object: includes objects, arrays, functions, threads */
|
2807
3044
|
#define DUK_TYPE_BUFFER 7 /* fixed or dynamic, garbage collected byte buffer */
|
2808
3045
|
#define DUK_TYPE_POINTER 8 /* raw void pointer */
|
3046
|
+
#define DUK_TYPE_LIGHTFUNC 9 /* lightweight function pointer */
|
2809
3047
|
|
2810
3048
|
/* Value mask types, used by e.g. duk_get_type_mask() */
|
2811
3049
|
#define DUK_TYPE_MASK_NONE (1 << DUK_TYPE_NONE)
|
@@ -2817,6 +3055,7 @@ struct duk_number_list_entry {
|
|
2817
3055
|
#define DUK_TYPE_MASK_OBJECT (1 << DUK_TYPE_OBJECT)
|
2818
3056
|
#define DUK_TYPE_MASK_BUFFER (1 << DUK_TYPE_BUFFER)
|
2819
3057
|
#define DUK_TYPE_MASK_POINTER (1 << DUK_TYPE_POINTER)
|
3058
|
+
#define DUK_TYPE_MASK_LIGHTFUNC (1 << DUK_TYPE_LIGHTFUNC)
|
2820
3059
|
#define DUK_TYPE_MASK_THROW (1 << 10) /* internal flag value: throw if mask doesn't match */
|
2821
3060
|
|
2822
3061
|
/* Coercion hints */
|
@@ -2843,6 +3082,18 @@ struct duk_number_list_entry {
|
|
2843
3082
|
#define DUK_COMPILE_NOSOURCE (1 << 5) /* (internal) no source string on stack */
|
2844
3083
|
#define DUK_COMPILE_STRLEN (1 << 6) /* (internal) take strlen() of src_buffer (avoids double evaluation in macro) */
|
2845
3084
|
|
3085
|
+
/* Flags for duk_def_prop() and its variants */
|
3086
|
+
#define DUK_DEFPROP_WRITABLE (1 << 0) /* set writable (effective if DUK_DEFPROP_HAVE_WRITABLE set) */
|
3087
|
+
#define DUK_DEFPROP_ENUMERABLE (1 << 1) /* set enumerable (effective if DUK_DEFPROP_HAVE_ENUMERABLE set) */
|
3088
|
+
#define DUK_DEFPROP_CONFIGURABLE (1 << 2) /* set configurable (effective if DUK_DEFPROP_HAVE_CONFIGURABLE set) */
|
3089
|
+
#define DUK_DEFPROP_HAVE_WRITABLE (1 << 3) /* set/clear writable */
|
3090
|
+
#define DUK_DEFPROP_HAVE_ENUMERABLE (1 << 4) /* set/clear enumerable */
|
3091
|
+
#define DUK_DEFPROP_HAVE_CONFIGURABLE (1 << 5) /* set/clear configurable */
|
3092
|
+
#define DUK_DEFPROP_HAVE_VALUE (1 << 6) /* set value (given on value stack) */
|
3093
|
+
#define DUK_DEFPROP_HAVE_GETTER (1 << 7) /* set getter (given on value stack) */
|
3094
|
+
#define DUK_DEFPROP_HAVE_SETTER (1 << 8) /* set setter (given on value stack) */
|
3095
|
+
#define DUK_DEFPROP_FORCE (1 << 9) /* force change if possible, may still fail for e.g. virtual properties */
|
3096
|
+
|
2846
3097
|
/* Flags for duk_push_thread_raw() */
|
2847
3098
|
#define DUK_THREAD_NEW_GLOBAL_ENV (1 << 0) /* create a new global environment */
|
2848
3099
|
|
@@ -2850,6 +3101,7 @@ struct duk_number_list_entry {
|
|
2850
3101
|
#define DUK_STRING_PUSH_SAFE (1 << 0) /* no error if file does not exist */
|
2851
3102
|
|
2852
3103
|
/* Duktape specific error codes */
|
3104
|
+
#define DUK_ERR_NONE 0 /* no error (e.g. from duk_get_error_code()) */
|
2853
3105
|
#define DUK_ERR_UNIMPLEMENTED_ERROR 50 /* UnimplementedError */
|
2854
3106
|
#define DUK_ERR_UNSUPPORTED_ERROR 51 /* UnsupportedError */
|
2855
3107
|
#define DUK_ERR_INTERNAL_ERROR 52 /* InternalError */
|
@@ -2913,7 +3165,7 @@ DUK_EXTERNAL_DECL
|
|
2913
3165
|
duk_context *duk_create_heap(duk_alloc_function alloc_func,
|
2914
3166
|
duk_realloc_function realloc_func,
|
2915
3167
|
duk_free_function free_func,
|
2916
|
-
void *
|
3168
|
+
void *heap_udata,
|
2917
3169
|
duk_fatal_function fatal_handler);
|
2918
3170
|
DUK_EXTERNAL_DECL void duk_destroy_heap(duk_context *ctx);
|
2919
3171
|
|
@@ -2940,11 +3192,13 @@ DUK_EXTERNAL_DECL void duk_gc(duk_context *ctx, duk_uint_t flags);
|
|
2940
3192
|
*/
|
2941
3193
|
|
2942
3194
|
DUK_API_NORETURN(DUK_EXTERNAL_DECL void duk_throw(duk_context *ctx));
|
3195
|
+
DUK_API_NORETURN(DUK_EXTERNAL_DECL void duk_fatal(duk_context *ctx, duk_errcode_t err_code, const char *err_msg));
|
2943
3196
|
|
2944
3197
|
DUK_API_NORETURN(DUK_EXTERNAL_DECL void duk_error_raw(duk_context *ctx, duk_errcode_t err_code, const char *filename, duk_int_t line, const char *fmt, ...));
|
3198
|
+
|
2945
3199
|
#ifdef DUK_API_VARIADIC_MACROS
|
2946
3200
|
#define duk_error(ctx,err_code,...) \
|
2947
|
-
duk_error_raw((ctx), (duk_errcode_t) (err_code), __FILE__, (duk_int_t) __LINE__, __VA_ARGS__)
|
3201
|
+
duk_error_raw((ctx), (duk_errcode_t) (err_code), (const char *) (__FILE__), (duk_int_t) (__LINE__), __VA_ARGS__)
|
2948
3202
|
#else
|
2949
3203
|
DUK_API_NORETURN(DUK_EXTERNAL_DECL void duk_error_stash(duk_context *ctx, duk_errcode_t err_code, const char *fmt, ...));
|
2950
3204
|
/* One problem with this macro is that expressions like the following fail
|
@@ -2952,12 +3206,14 @@ DUK_API_NORETURN(DUK_EXTERNAL_DECL void duk_error_stash(duk_context *ctx, duk_er
|
|
2952
3206
|
* they make little sense anyway.
|
2953
3207
|
*/
|
2954
3208
|
#define duk_error \
|
2955
|
-
duk_api_global_filename = __FILE__, \
|
2956
|
-
|
2957
|
-
|
3209
|
+
(duk_api_global_filename = (const char *) (__FILE__), \
|
3210
|
+
duk_api_global_line = (duk_int_t) (__LINE__), \
|
3211
|
+
duk_error_stash) /* last value is func pointer, arguments follow in parens */
|
2958
3212
|
#endif
|
2959
3213
|
|
2960
|
-
DUK_API_NORETURN(DUK_EXTERNAL_DECL void
|
3214
|
+
DUK_API_NORETURN(DUK_EXTERNAL_DECL void duk_error_va_raw(duk_context *ctx, duk_errcode_t err_code, const char *filename, duk_int_t line, const char *fmt, va_list ap));
|
3215
|
+
#define duk_error_va(ctx,err_code,fmt,ap) \
|
3216
|
+
duk_error_va_raw((ctx), (duk_errcode_t) (err_code), (const char *) (__FILE__), (duk_int_t) (__LINE__), (fmt), (ap))
|
2961
3217
|
|
2962
3218
|
/*
|
2963
3219
|
* Other state related functions
|
@@ -3050,6 +3306,7 @@ DUK_EXTERNAL_DECL void duk_push_thread_stash(duk_context *ctx, duk_context *targ
|
|
3050
3306
|
DUK_EXTERNAL_DECL duk_idx_t duk_push_object(duk_context *ctx);
|
3051
3307
|
DUK_EXTERNAL_DECL duk_idx_t duk_push_array(duk_context *ctx);
|
3052
3308
|
DUK_EXTERNAL_DECL duk_idx_t duk_push_c_function(duk_context *ctx, duk_c_function func, duk_idx_t nargs);
|
3309
|
+
DUK_EXTERNAL_DECL duk_idx_t duk_push_c_lightfunc(duk_context *ctx, duk_c_function func, duk_idx_t nargs, duk_idx_t length, duk_int_t magic);
|
3053
3310
|
DUK_EXTERNAL_DECL duk_idx_t duk_push_thread_raw(duk_context *ctx, duk_uint_t flags);
|
3054
3311
|
|
3055
3312
|
#define duk_push_thread(ctx) \
|
@@ -3059,20 +3316,33 @@ DUK_EXTERNAL_DECL duk_idx_t duk_push_thread_raw(duk_context *ctx, duk_uint_t fla
|
|
3059
3316
|
duk_push_thread_raw((ctx), DUK_THREAD_NEW_GLOBAL_ENV /*flags*/)
|
3060
3317
|
|
3061
3318
|
DUK_EXTERNAL_DECL duk_idx_t duk_push_error_object_raw(duk_context *ctx, duk_errcode_t err_code, const char *filename, duk_int_t line, const char *fmt, ...);
|
3319
|
+
|
3062
3320
|
#ifdef DUK_API_VARIADIC_MACROS
|
3063
3321
|
#define duk_push_error_object(ctx,err_code,...) \
|
3064
|
-
duk_push_error_object_raw((ctx),(err_code),__FILE__,__LINE__,__VA_ARGS__)
|
3322
|
+
duk_push_error_object_raw((ctx), (err_code), (const char *) (__FILE__), (duk_int_t) (__LINE__), __VA_ARGS__)
|
3065
3323
|
#else
|
3066
3324
|
DUK_EXTERNAL_DECL duk_idx_t duk_push_error_object_stash(duk_context *ctx, duk_errcode_t err_code, const char *fmt, ...);
|
3325
|
+
/* Note: parentheses are required so that the comma expression works in assignments. */
|
3067
3326
|
#define duk_push_error_object \
|
3068
|
-
duk_api_global_filename = __FILE__, \
|
3069
|
-
|
3070
|
-
|
3327
|
+
(duk_api_global_filename = (const char *) (__FILE__), \
|
3328
|
+
duk_api_global_line = (duk_int_t) (__LINE__), \
|
3329
|
+
duk_push_error_object_stash) /* last value is func pointer, arguments follow in parens */
|
3071
3330
|
#endif
|
3072
3331
|
|
3073
|
-
DUK_EXTERNAL_DECL
|
3074
|
-
|
3075
|
-
|
3332
|
+
DUK_EXTERNAL_DECL duk_idx_t duk_push_error_object_va_raw(duk_context *ctx, duk_errcode_t err_code, const char *filename, duk_int_t line, const char *fmt, va_list ap);
|
3333
|
+
#define duk_push_error_object_va(ctx,err_code,fmt,ap) \
|
3334
|
+
duk_push_error_object_va_raw((ctx), (err_code), (const char *) (__FILE__), (duk_int_t) (__LINE__), (fmt), (ap))
|
3335
|
+
|
3336
|
+
DUK_EXTERNAL_DECL void *duk_push_buffer_raw(duk_context *ctx, duk_size_t size, duk_bool_t dynamic);
|
3337
|
+
|
3338
|
+
#define duk_push_buffer(ctx,size,dynamic) \
|
3339
|
+
duk_push_buffer_raw((ctx), (size), (dynamic));
|
3340
|
+
#define duk_push_fixed_buffer(ctx,size) \
|
3341
|
+
duk_push_buffer_raw((ctx), (size), 0 /*dynamic*/)
|
3342
|
+
#define duk_push_dynamic_buffer(ctx,size) \
|
3343
|
+
duk_push_buffer_raw((ctx), (size), 1 /*dynamic*/)
|
3344
|
+
|
3345
|
+
DUK_EXTERNAL_DECL duk_idx_t duk_push_heapptr(duk_context *ctx, void *ptr);
|
3076
3346
|
|
3077
3347
|
/*
|
3078
3348
|
* Pop operations
|
@@ -3105,6 +3375,7 @@ DUK_EXTERNAL_DECL duk_bool_t duk_is_string(duk_context *ctx, duk_idx_t index);
|
|
3105
3375
|
DUK_EXTERNAL_DECL duk_bool_t duk_is_object(duk_context *ctx, duk_idx_t index);
|
3106
3376
|
DUK_EXTERNAL_DECL duk_bool_t duk_is_buffer(duk_context *ctx, duk_idx_t index);
|
3107
3377
|
DUK_EXTERNAL_DECL duk_bool_t duk_is_pointer(duk_context *ctx, duk_idx_t index);
|
3378
|
+
DUK_EXTERNAL_DECL duk_bool_t duk_is_lightfunc(duk_context *ctx, duk_idx_t index);
|
3108
3379
|
|
3109
3380
|
DUK_EXTERNAL_DECL duk_bool_t duk_is_array(duk_context *ctx, duk_idx_t index);
|
3110
3381
|
DUK_EXTERNAL_DECL duk_bool_t duk_is_function(duk_context *ctx, duk_idx_t index);
|
@@ -3124,7 +3395,12 @@ DUK_EXTERNAL_DECL duk_bool_t duk_is_primitive(duk_context *ctx, duk_idx_t index)
|
|
3124
3395
|
DUK_TYPE_MASK_STRING | \
|
3125
3396
|
DUK_TYPE_MASK_OBJECT | \
|
3126
3397
|
DUK_TYPE_MASK_BUFFER | \
|
3127
|
-
DUK_TYPE_MASK_POINTER
|
3398
|
+
DUK_TYPE_MASK_POINTER | \
|
3399
|
+
DUK_TYPE_MASK_LIGHTFUNC)
|
3400
|
+
|
3401
|
+
DUK_EXTERNAL_DECL duk_errcode_t duk_get_error_code(duk_context *ctx, duk_idx_t index);
|
3402
|
+
#define duk_is_error(ctx,index) \
|
3403
|
+
(duk_get_error_code((ctx), (index)) != 0)
|
3128
3404
|
|
3129
3405
|
/*
|
3130
3406
|
* Get operations: no coercion, returns default value for invalid
|
@@ -3144,6 +3420,7 @@ DUK_EXTERNAL_DECL void *duk_get_buffer(duk_context *ctx, duk_idx_t index, duk_si
|
|
3144
3420
|
DUK_EXTERNAL_DECL void *duk_get_pointer(duk_context *ctx, duk_idx_t index);
|
3145
3421
|
DUK_EXTERNAL_DECL duk_c_function duk_get_c_function(duk_context *ctx, duk_idx_t index);
|
3146
3422
|
DUK_EXTERNAL_DECL duk_context *duk_get_context(duk_context *ctx, duk_idx_t index);
|
3423
|
+
DUK_EXTERNAL_DECL void *duk_get_heapptr(duk_context *ctx, duk_idx_t index);
|
3147
3424
|
DUK_EXTERNAL_DECL duk_size_t duk_get_length(duk_context *ctx, duk_idx_t index);
|
3148
3425
|
|
3149
3426
|
/*
|
@@ -3166,6 +3443,7 @@ DUK_EXTERNAL_DECL void *duk_require_buffer(duk_context *ctx, duk_idx_t index, du
|
|
3166
3443
|
DUK_EXTERNAL_DECL void *duk_require_pointer(duk_context *ctx, duk_idx_t index);
|
3167
3444
|
DUK_EXTERNAL_DECL duk_c_function duk_require_c_function(duk_context *ctx, duk_idx_t index);
|
3168
3445
|
DUK_EXTERNAL_DECL duk_context *duk_require_context(duk_context *ctx, duk_idx_t index);
|
3446
|
+
DUK_EXTERNAL_DECL void *duk_require_heapptr(duk_context *ctx, duk_idx_t index);
|
3169
3447
|
|
3170
3448
|
#define duk_require_object_coercible(ctx,index) \
|
3171
3449
|
((void) duk_check_type_mask((ctx), (index), DUK_TYPE_MASK_BOOLEAN | \
|
@@ -3174,6 +3452,7 @@ DUK_EXTERNAL_DECL duk_context *duk_require_context(duk_context *ctx, duk_idx_t i
|
|
3174
3452
|
DUK_TYPE_MASK_OBJECT | \
|
3175
3453
|
DUK_TYPE_MASK_BUFFER | \
|
3176
3454
|
DUK_TYPE_MASK_POINTER | \
|
3455
|
+
DUK_TYPE_MASK_LIGHTFUNC | \
|
3177
3456
|
DUK_TYPE_MASK_THROW))
|
3178
3457
|
|
3179
3458
|
/*
|
@@ -3194,14 +3473,23 @@ DUK_EXTERNAL_DECL duk_uint32_t duk_to_uint32(duk_context *ctx, duk_idx_t index);
|
|
3194
3473
|
DUK_EXTERNAL_DECL duk_uint16_t duk_to_uint16(duk_context *ctx, duk_idx_t index);
|
3195
3474
|
DUK_EXTERNAL_DECL const char *duk_to_string(duk_context *ctx, duk_idx_t index);
|
3196
3475
|
DUK_EXTERNAL_DECL const char *duk_to_lstring(duk_context *ctx, duk_idx_t index, duk_size_t *out_len);
|
3197
|
-
DUK_EXTERNAL_DECL void *
|
3198
|
-
DUK_EXTERNAL_DECL void *duk_to_fixed_buffer(duk_context *ctx, duk_idx_t index, duk_size_t *out_size);
|
3199
|
-
DUK_EXTERNAL_DECL void *duk_to_dynamic_buffer(duk_context *ctx, duk_idx_t index, duk_size_t *out_size);
|
3476
|
+
DUK_EXTERNAL_DECL void *duk_to_buffer_raw(duk_context *ctx, duk_idx_t index, duk_size_t *out_size, duk_uint_t flags);
|
3200
3477
|
DUK_EXTERNAL_DECL void *duk_to_pointer(duk_context *ctx, duk_idx_t index);
|
3201
3478
|
DUK_EXTERNAL_DECL void duk_to_object(duk_context *ctx, duk_idx_t index);
|
3202
3479
|
DUK_EXTERNAL_DECL void duk_to_defaultvalue(duk_context *ctx, duk_idx_t index, duk_int_t hint);
|
3203
3480
|
DUK_EXTERNAL_DECL void duk_to_primitive(duk_context *ctx, duk_idx_t index, duk_int_t hint);
|
3204
3481
|
|
3482
|
+
#define DUK_BUF_MODE_FIXED 0 /* internal: request fixed buffer result */
|
3483
|
+
#define DUK_BUF_MODE_DYNAMIC 1 /* internal: request dynamic buffer result */
|
3484
|
+
#define DUK_BUF_MODE_DONTCARE 2 /* internal: don't care about fixed/dynamic nature */
|
3485
|
+
|
3486
|
+
#define duk_to_buffer(ctx,index,out_size) \
|
3487
|
+
duk_to_buffer_raw((ctx), (index), (out_size), DUK_BUF_MODE_DONTCARE)
|
3488
|
+
#define duk_to_fixed_buffer(ctx,index,out_size) \
|
3489
|
+
duk_to_buffer_raw((ctx), (index), (out_size), DUK_BUF_MODE_FIXED)
|
3490
|
+
#define duk_to_dynamic_buffer(ctx,index,out_size) \
|
3491
|
+
duk_to_buffer_raw((ctx), (index), (out_size), DUK_BUF_MODE_DYNAMIC)
|
3492
|
+
|
3205
3493
|
/* safe variants of a few coercion operations */
|
3206
3494
|
DUK_EXTERNAL_DECL const char *duk_safe_to_lstring(duk_context *ctx, duk_idx_t index, duk_size_t *out_len);
|
3207
3495
|
#define duk_safe_to_string(ctx,index) \
|
@@ -3244,6 +3532,7 @@ DUK_EXTERNAL_DECL duk_bool_t duk_del_prop_index(duk_context *ctx, duk_idx_t obj_
|
|
3244
3532
|
DUK_EXTERNAL_DECL duk_bool_t duk_has_prop(duk_context *ctx, duk_idx_t obj_index);
|
3245
3533
|
DUK_EXTERNAL_DECL duk_bool_t duk_has_prop_string(duk_context *ctx, duk_idx_t obj_index, const char *key);
|
3246
3534
|
DUK_EXTERNAL_DECL duk_bool_t duk_has_prop_index(duk_context *ctx, duk_idx_t obj_index, duk_uarridx_t arr_index);
|
3535
|
+
DUK_EXTERNAL_DECL void duk_def_prop(duk_context *ctx, duk_idx_t obj_index, duk_uint_t flags);
|
3247
3536
|
|
3248
3537
|
DUK_EXTERNAL_DECL duk_bool_t duk_get_global_string(duk_context *ctx, const char *key);
|
3249
3538
|
DUK_EXTERNAL_DECL duk_bool_t duk_put_global_string(duk_context *ctx, const char *key);
|
@@ -3352,19 +3641,19 @@ DUK_EXTERNAL_DECL duk_int_t duk_compile_raw(duk_context *ctx, const char *src_bu
|
|
3352
3641
|
|
3353
3642
|
/* plain */
|
3354
3643
|
#define duk_eval(ctx) \
|
3355
|
-
((void) duk_push_string((ctx), __FILE__), \
|
3644
|
+
((void) duk_push_string((ctx), (const char *) (__FILE__)), \
|
3356
3645
|
(void) duk_eval_raw((ctx), NULL, 0, DUK_COMPILE_EVAL))
|
3357
3646
|
|
3358
3647
|
#define duk_eval_noresult(ctx) \
|
3359
|
-
((void) duk_push_string((ctx), __FILE__), \
|
3648
|
+
((void) duk_push_string((ctx), (const char *) (__FILE__)), \
|
3360
3649
|
(void) duk_eval_raw((ctx), NULL, 0, DUK_COMPILE_EVAL | DUK_COMPILE_NORESULT))
|
3361
3650
|
|
3362
3651
|
#define duk_peval(ctx) \
|
3363
|
-
((void) duk_push_string((ctx), __FILE__), \
|
3652
|
+
((void) duk_push_string((ctx), (const char *) (__FILE__)), \
|
3364
3653
|
duk_eval_raw((ctx), NULL, 0, DUK_COMPILE_EVAL | DUK_COMPILE_SAFE))
|
3365
3654
|
|
3366
3655
|
#define duk_peval_noresult(ctx) \
|
3367
|
-
((void) duk_push_string((ctx), __FILE__), \
|
3656
|
+
((void) duk_push_string((ctx), (const char *) (__FILE__)), \
|
3368
3657
|
duk_eval_raw((ctx), NULL, 0, DUK_COMPILE_EVAL | DUK_COMPILE_SAFE | DUK_COMPILE_NORESULT))
|
3369
3658
|
|
3370
3659
|
#define duk_compile(ctx,flags) \
|
@@ -3375,30 +3664,30 @@ DUK_EXTERNAL_DECL duk_int_t duk_compile_raw(duk_context *ctx, const char *src_bu
|
|
3375
3664
|
|
3376
3665
|
/* string */
|
3377
3666
|
#define duk_eval_string(ctx,src) \
|
3378
|
-
((void) duk_push_string((ctx), __FILE__), \
|
3667
|
+
((void) duk_push_string((ctx), (const char *) (__FILE__)), \
|
3379
3668
|
(void) duk_eval_raw((ctx), (src), 0, DUK_COMPILE_EVAL | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN))
|
3380
3669
|
|
3381
3670
|
#define duk_eval_string_noresult(ctx,src) \
|
3382
|
-
((void) duk_push_string((ctx), __FILE__), \
|
3671
|
+
((void) duk_push_string((ctx), (const char *) (__FILE__)), \
|
3383
3672
|
(void) duk_eval_raw((ctx), (src), 0, DUK_COMPILE_EVAL | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN | DUK_COMPILE_NORESULT))
|
3384
3673
|
|
3385
3674
|
#define duk_peval_string(ctx,src) \
|
3386
|
-
((void) duk_push_string((ctx), __FILE__), \
|
3675
|
+
((void) duk_push_string((ctx), (const char *) (__FILE__)), \
|
3387
3676
|
duk_eval_raw((ctx), (src), 0, DUK_COMPILE_EVAL | DUK_COMPILE_SAFE | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN))
|
3388
3677
|
|
3389
3678
|
#define duk_peval_string_noresult(ctx,src) \
|
3390
|
-
((void) duk_push_string((ctx), __FILE__), \
|
3679
|
+
((void) duk_push_string((ctx), (const char *) (__FILE__)), \
|
3391
3680
|
duk_eval_raw((ctx), (src), 0, DUK_COMPILE_EVAL | DUK_COMPILE_SAFE | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN | DUK_COMPILE_NORESULT))
|
3392
3681
|
|
3393
3682
|
#define duk_compile_string(ctx,flags,src) \
|
3394
|
-
((void) duk_push_string((ctx), __FILE__), \
|
3683
|
+
((void) duk_push_string((ctx), (const char *) (__FILE__)), \
|
3395
3684
|
(void) duk_compile_raw((ctx), (src), 0, (flags) | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN))
|
3396
3685
|
|
3397
3686
|
#define duk_compile_string_filename(ctx,flags,src) \
|
3398
3687
|
((void) duk_compile_raw((ctx), (src), 0, (flags) | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN))
|
3399
3688
|
|
3400
3689
|
#define duk_pcompile_string(ctx,flags,src) \
|
3401
|
-
((void) duk_push_string((ctx), __FILE__), \
|
3690
|
+
((void) duk_push_string((ctx), (const char *) (__FILE__)), \
|
3402
3691
|
duk_compile_raw((ctx), (src), 0, (flags) | DUK_COMPILE_SAFE | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN))
|
3403
3692
|
|
3404
3693
|
#define duk_pcompile_string_filename(ctx,flags,src) \
|
@@ -3406,30 +3695,30 @@ DUK_EXTERNAL_DECL duk_int_t duk_compile_raw(duk_context *ctx, const char *src_bu
|
|
3406
3695
|
|
3407
3696
|
/* lstring */
|
3408
3697
|
#define duk_eval_lstring(ctx,buf,len) \
|
3409
|
-
((void) duk_push_string((ctx), __FILE__), \
|
3698
|
+
((void) duk_push_string((ctx), (const char *) (__FILE__)), \
|
3410
3699
|
(void) duk_eval_raw((ctx), buf, len, DUK_COMPILE_EVAL | DUK_COMPILE_NOSOURCE))
|
3411
3700
|
|
3412
3701
|
#define duk_eval_lstring_noresult(ctx,buf,len) \
|
3413
|
-
((void) duk_push_string((ctx), __FILE__), \
|
3702
|
+
((void) duk_push_string((ctx), (const char *) (__FILE__)), \
|
3414
3703
|
(void) duk_eval_raw((ctx), buf, len, DUK_COMPILE_EVAL | DUK_COMPILE_NOSOURCE | DUK_COMPILE_NORESULT))
|
3415
3704
|
|
3416
3705
|
#define duk_peval_lstring(ctx,buf,len) \
|
3417
|
-
((void) duk_push_string((ctx), __FILE__), \
|
3706
|
+
((void) duk_push_string((ctx), (const char *) (__FILE__)), \
|
3418
3707
|
duk_eval_raw((ctx), buf, len, DUK_COMPILE_EVAL | DUK_COMPILE_NOSOURCE | DUK_COMPILE_SAFE))
|
3419
3708
|
|
3420
3709
|
#define duk_peval_lstring_noresult(ctx,buf,len) \
|
3421
|
-
((void) duk_push_string((ctx), __FILE__), \
|
3710
|
+
((void) duk_push_string((ctx), (const char *) (__FILE__)), \
|
3422
3711
|
duk_eval_raw((ctx), buf, len, DUK_COMPILE_EVAL | DUK_COMPILE_SAFE | DUK_COMPILE_NOSOURCE | DUK_COMPILE_NORESULT))
|
3423
3712
|
|
3424
3713
|
#define duk_compile_lstring(ctx,flags,buf,len) \
|
3425
|
-
((void) duk_push_string((ctx), __FILE__), \
|
3714
|
+
((void) duk_push_string((ctx), (const char *) (__FILE__)), \
|
3426
3715
|
(void) duk_compile_raw((ctx), buf, len, (flags) | DUK_COMPILE_NOSOURCE))
|
3427
3716
|
|
3428
3717
|
#define duk_compile_lstring_filename(ctx,flags,buf,len) \
|
3429
3718
|
((void) duk_compile_raw((ctx), buf, len, (flags) | DUK_COMPILE_NOSOURCE))
|
3430
3719
|
|
3431
3720
|
#define duk_pcompile_lstring(ctx,flags,buf,len) \
|
3432
|
-
((void) duk_push_string((ctx), __FILE__), \
|
3721
|
+
((void) duk_push_string((ctx), (const char *) (__FILE__)), \
|
3433
3722
|
duk_compile_raw((ctx), buf, len, (flags) | DUK_COMPILE_SAFE | DUK_COMPILE_NOSOURCE))
|
3434
3723
|
|
3435
3724
|
#define duk_pcompile_lstring_filename(ctx,flags,buf,len) \
|
@@ -3471,6 +3760,7 @@ DUK_EXTERNAL_DECL duk_int_t duk_compile_raw(duk_context *ctx, const char *src_bu
|
|
3471
3760
|
*/
|
3472
3761
|
|
3473
3762
|
DUK_EXTERNAL_DECL void duk_log(duk_context *ctx, duk_int_t level, const char *fmt, ...);
|
3763
|
+
DUK_EXTERNAL_DECL void duk_log_va(duk_context *ctx, duk_int_t level, const char *fmt, va_list ap);
|
3474
3764
|
|
3475
3765
|
/*
|
3476
3766
|
* Debugging
|
@@ -3572,6 +3862,11 @@ DUK_EXTERNAL_DECL void duk_push_context_dump(duk_context *ctx);
|
|
3572
3862
|
#error DUK_USE_DDDPRINT without DUK_USE_DEBUG
|
3573
3863
|
#endif
|
3574
3864
|
|
3865
|
+
#if defined(DUK_USE_HEAPPTR16) && defined(DUK_USE_DEBUG)
|
3866
|
+
/* Debug code doesn't have access to 'heap' so it cannot decode pointers. */
|
3867
|
+
#error debug printing cannot currently be used with heap pointer compression
|
3868
|
+
#endif
|
3869
|
+
|
3575
3870
|
/*
|
3576
3871
|
* Garbage collection consistency
|
3577
3872
|
*/
|
@@ -3584,6 +3879,23 @@ DUK_EXTERNAL_DECL void duk_push_context_dump(duk_context *ctx);
|
|
3584
3879
|
#error DUK_USE_GC_TORTURE defined without DUK_USE_MARK_AND_SWEEP
|
3585
3880
|
#endif
|
3586
3881
|
|
3882
|
+
/*
|
3883
|
+
* Low memory feature consistency
|
3884
|
+
*/
|
3885
|
+
|
3886
|
+
#if defined(DUK_USE_OBJSIZES16)
|
3887
|
+
#if defined(DUK_USE_HOBJECT_HASH_PART)
|
3888
|
+
#error DUK_USE_OBJSIZES16 assumes DUK_USE_HOBJECT_HASH_PART is not defined
|
3889
|
+
#endif
|
3890
|
+
#endif
|
3891
|
+
|
3892
|
+
#if defined(DUK_USE_STRTAB_CHAIN) && defined(DUK_USE_STRTAB_PROBE)
|
3893
|
+
#error both DUK_USE_STRTAB_CHAIN and DUK_USE_STRTAB_PROBE defined
|
3894
|
+
#endif
|
3895
|
+
#if !defined(DUK_USE_STRTAB_CHAIN) && !defined(DUK_USE_STRTAB_PROBE)
|
3896
|
+
#error neither DUK_USE_STRTAB_CHAIN nor DUK_USE_STRTAB_PROBE is defined
|
3897
|
+
#endif
|
3898
|
+
|
3587
3899
|
#endif /* DUK_FEATURES_SANITY_H_INCLUDED */
|
3588
3900
|
|
3589
3901
|
/*
|