2021-03-27 release
This commit is contained in:
parent
204682fb87
commit
b5e62895c6
19 changed files with 585 additions and 268 deletions
|
@ -1,3 +1,10 @@
|
||||||
|
2021-03-27:
|
||||||
|
|
||||||
|
- faster Array.prototype.push and Array.prototype.unshift
|
||||||
|
- added JS_UpdateStackTop()
|
||||||
|
- fixed Windows console
|
||||||
|
- misc bug fixes
|
||||||
|
|
||||||
2020-11-08:
|
2020-11-08:
|
||||||
|
|
||||||
- improved function parameter initializers
|
- improved function parameter initializers
|
||||||
|
|
22
LICENSE
Normal file
22
LICENSE
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
QuickJS Javascript Engine
|
||||||
|
|
||||||
|
Copyright (c) 2017-2021 Fabrice Bellard
|
||||||
|
Copyright (c) 2017-2021 Charlie Gordon
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||||
|
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
5
Makefile
5
Makefile
|
@ -1,8 +1,8 @@
|
||||||
#
|
#
|
||||||
# QuickJS Javascript Engine
|
# QuickJS Javascript Engine
|
||||||
#
|
#
|
||||||
# Copyright (c) 2017-2020 Fabrice Bellard
|
# Copyright (c) 2017-2021 Fabrice Bellard
|
||||||
# Copyright (c) 2017-2020 Charlie Gordon
|
# Copyright (c) 2017-2021 Charlie Gordon
|
||||||
#
|
#
|
||||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
# of this software and associated documentation files (the "Software"), to deal
|
# of this software and associated documentation files (the "Software"), to deal
|
||||||
|
@ -179,6 +179,7 @@ LIBS=-lm
|
||||||
ifndef CONFIG_WIN32
|
ifndef CONFIG_WIN32
|
||||||
LIBS+=-ldl -lpthread
|
LIBS+=-ldl -lpthread
|
||||||
endif
|
endif
|
||||||
|
LIBS+=$(EXTRA_LIBS)
|
||||||
|
|
||||||
$(OBJDIR):
|
$(OBJDIR):
|
||||||
mkdir -p $(OBJDIR) $(OBJDIR)/examples $(OBJDIR)/tests
|
mkdir -p $(OBJDIR) $(OBJDIR)/examples $(OBJDIR)/tests
|
||||||
|
|
4
TODO
4
TODO
|
@ -66,5 +66,5 @@ Optimization ideas:
|
||||||
Test262o: 0/11262 errors, 463 excluded
|
Test262o: 0/11262 errors, 463 excluded
|
||||||
Test262o commit: 7da91bceb9ce7613f87db47ddd1292a2dda58b42 (es5-tests branch)
|
Test262o commit: 7da91bceb9ce7613f87db47ddd1292a2dda58b42 (es5-tests branch)
|
||||||
|
|
||||||
Result: 51/75119 errors, 899 excluded, 570 skipped
|
Result: 35/75280 errors, 909 excluded, 585 skipped
|
||||||
Test262 commit: 1c33fdb0ca60fb9d7392403be769ed0d26209132
|
Test262 commit: 31126581e7290f9233c29cefd93f66c6ac78f1c9
|
||||||
|
|
2
VERSION
2
VERSION
|
@ -1 +1 @@
|
||||||
2020-11-08
|
2021-03-27
|
||||||
|
|
|
@ -896,10 +896,11 @@ set the C opaque point with
|
||||||
@code{JS_GetOpaque()}/@code{JS_SetOpaque()}.
|
@code{JS_GetOpaque()}/@code{JS_SetOpaque()}.
|
||||||
|
|
||||||
When defining a new JS class, it is possible to declare a finalizer
|
When defining a new JS class, it is possible to declare a finalizer
|
||||||
which is called when the object is destroyed. A @code{gc_mark} method
|
which is called when the object is destroyed. The finalizer should be
|
||||||
can be provided so that the cycle removal algorithm can find the other
|
used to release C resources. It is invalid to execute JS code from
|
||||||
objects referenced by this object. Other methods are available to
|
it. A @code{gc_mark} method can be provided so that the cycle removal
|
||||||
define exotic object behaviors.
|
algorithm can find the other objects referenced by this object. Other
|
||||||
|
methods are available to define exotic object behaviors.
|
||||||
|
|
||||||
The Class ID are globally allocated (i.e. for all runtimes). The
|
The Class ID are globally allocated (i.e. for all runtimes). The
|
||||||
JSClass are allocated per @code{JSRuntime}. @code{JS_SetClassProto()}
|
JSClass are allocated per @code{JSRuntime}. @code{JS_SetClassProto()}
|
||||||
|
|
2
libbf.c
2
libbf.c
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* Tiny arbitrary precision floating point library
|
* Tiny arbitrary precision floating point library
|
||||||
*
|
*
|
||||||
* Copyright (c) 2017-2020 Fabrice Bellard
|
* Copyright (c) 2017-2021 Fabrice Bellard
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|
2
libbf.h
2
libbf.h
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* Tiny arbitrary precision floating point library
|
* Tiny arbitrary precision floating point library
|
||||||
*
|
*
|
||||||
* Copyright (c) 2017-2020 Fabrice Bellard
|
* Copyright (c) 2017-2021 Fabrice Bellard
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|
12
qjs.c
12
qjs.c
|
@ -1,8 +1,8 @@
|
||||||
/*
|
/*
|
||||||
* QuickJS stand alone interpreter
|
* QuickJS stand alone interpreter
|
||||||
*
|
*
|
||||||
* Copyright (c) 2017-2020 Fabrice Bellard
|
* Copyright (c) 2017-2021 Fabrice Bellard
|
||||||
* Copyright (c) 2017-2020 Charlie Gordon
|
* Copyright (c) 2017-2021 Charlie Gordon
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
@ -156,7 +156,13 @@ static inline size_t js_trace_malloc_usable_size(void *ptr)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __attribute__((format(printf, 2, 3)))
|
static void
|
||||||
|
#ifdef _WIN32
|
||||||
|
/* mingw printf is used */
|
||||||
|
__attribute__((format(gnu_printf, 2, 3)))
|
||||||
|
#else
|
||||||
|
__attribute__((format(printf, 2, 3)))
|
||||||
|
#endif
|
||||||
js_trace_malloc_printf(JSMallocState *s, const char *fmt, ...)
|
js_trace_malloc_printf(JSMallocState *s, const char *fmt, ...)
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
|
2
qjsc.c
2
qjsc.c
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* QuickJS command line compiler
|
* QuickJS command line compiler
|
||||||
*
|
*
|
||||||
* Copyright (c) 2018-2020 Fabrice Bellard
|
* Copyright (c) 2018-2021 Fabrice Bellard
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|
13
qjscalc.js
13
qjscalc.js
|
@ -2299,8 +2299,13 @@ var Integer, Float, Fraction, Complex, Mod, Polynomial, PolyMod, RationalFunctio
|
||||||
function array_div(a, b) {
|
function array_div(a, b) {
|
||||||
return array_mul(a, b.inverse());
|
return array_mul(a, b.inverse());
|
||||||
}
|
}
|
||||||
function array_scalar_div(a, b) {
|
function array_element_wise_inverse(a) {
|
||||||
return a * b.inverse();
|
var r, i, n;
|
||||||
|
n = a.length;
|
||||||
|
r = [];
|
||||||
|
for(i = 0; i < n; i++)
|
||||||
|
r[i] = a[i].inverse();
|
||||||
|
return r;
|
||||||
}
|
}
|
||||||
function array_eq(a, b) {
|
function array_eq(a, b) {
|
||||||
var n, i;
|
var n, i;
|
||||||
|
@ -2337,14 +2342,14 @@ var Integer, Float, Fraction, Complex, Mod, Polynomial, PolyMod, RationalFunctio
|
||||||
right: [Number, BigInt, Float, Fraction, Complex, Mod,
|
right: [Number, BigInt, Float, Fraction, Complex, Mod,
|
||||||
Polynomial, PolyMod, RationalFunction, Series],
|
Polynomial, PolyMod, RationalFunction, Series],
|
||||||
"*": array_scalar_mul,
|
"*": array_scalar_mul,
|
||||||
"/": array_scalar_div,
|
"/"(a, b) { return a * b.inverse(); },
|
||||||
"**": generic_pow, /* XXX: only for integer */
|
"**": generic_pow, /* XXX: only for integer */
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
left: [Number, BigInt, Float, Fraction, Complex, Mod,
|
left: [Number, BigInt, Float, Fraction, Complex, Mod,
|
||||||
Polynomial, PolyMod, RationalFunction, Series],
|
Polynomial, PolyMod, RationalFunction, Series],
|
||||||
"*"(a, b) { return array_scalar_mul(b, a); },
|
"*"(a, b) { return array_scalar_mul(b, a); },
|
||||||
"/"(a, b) { return array_scalar_div(b, a); },
|
"/"(a, b) { return a * array_element_wise_inverse(b); },
|
||||||
});
|
});
|
||||||
|
|
||||||
add_props(Array.prototype, {
|
add_props(Array.prototype, {
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
/*
|
/*
|
||||||
* QuickJS C library
|
* QuickJS C library
|
||||||
*
|
*
|
||||||
* Copyright (c) 2017-2020 Fabrice Bellard
|
* Copyright (c) 2017-2021 Fabrice Bellard
|
||||||
* Copyright (c) 2017-2020 Charlie Gordon
|
* Copyright (c) 2017-2021 Charlie Gordon
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
@ -1663,7 +1663,7 @@ static JSValue js_os_isatty(JSContext *ctx, JSValueConst this_val,
|
||||||
int fd;
|
int fd;
|
||||||
if (JS_ToInt32(ctx, &fd, argv[0]))
|
if (JS_ToInt32(ctx, &fd, argv[0]))
|
||||||
return JS_EXCEPTION;
|
return JS_EXCEPTION;
|
||||||
return JS_NewBool(ctx, isatty(fd) == 1);
|
return JS_NewBool(ctx, (isatty(fd) != 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
|
@ -1689,6 +1689,10 @@ static JSValue js_os_ttyGetWinSize(JSContext *ctx, JSValueConst this_val,
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Windows 10 built-in VT100 emulation */
|
||||||
|
#define __ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004
|
||||||
|
#define __ENABLE_VIRTUAL_TERMINAL_INPUT 0x0200
|
||||||
|
|
||||||
static JSValue js_os_ttySetRaw(JSContext *ctx, JSValueConst this_val,
|
static JSValue js_os_ttySetRaw(JSContext *ctx, JSValueConst this_val,
|
||||||
int argc, JSValueConst *argv)
|
int argc, JSValueConst *argv)
|
||||||
{
|
{
|
||||||
|
@ -1698,8 +1702,12 @@ static JSValue js_os_ttySetRaw(JSContext *ctx, JSValueConst this_val,
|
||||||
if (JS_ToInt32(ctx, &fd, argv[0]))
|
if (JS_ToInt32(ctx, &fd, argv[0]))
|
||||||
return JS_EXCEPTION;
|
return JS_EXCEPTION;
|
||||||
handle = (HANDLE)_get_osfhandle(fd);
|
handle = (HANDLE)_get_osfhandle(fd);
|
||||||
|
SetConsoleMode(handle, ENABLE_WINDOW_INPUT | __ENABLE_VIRTUAL_TERMINAL_INPUT);
|
||||||
SetConsoleMode(handle, ENABLE_WINDOW_INPUT);
|
_setmode(fd, _O_BINARY);
|
||||||
|
if (fd == 0) {
|
||||||
|
handle = (HANDLE)_get_osfhandle(1); /* corresponding output */
|
||||||
|
SetConsoleMode(handle, ENABLE_PROCESSED_OUTPUT | ENABLE_WRAP_AT_EOL_OUTPUT | __ENABLE_VIRTUAL_TERMINAL_PROCESSING);
|
||||||
|
}
|
||||||
return JS_UNDEFINED;
|
return JS_UNDEFINED;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
@ -1772,7 +1780,19 @@ static JSValue js_os_remove(JSContext *ctx, JSValueConst this_val,
|
||||||
filename = JS_ToCString(ctx, argv[0]);
|
filename = JS_ToCString(ctx, argv[0]);
|
||||||
if (!filename)
|
if (!filename)
|
||||||
return JS_EXCEPTION;
|
return JS_EXCEPTION;
|
||||||
ret = js_get_errno(remove(filename));
|
#if defined(_WIN32)
|
||||||
|
{
|
||||||
|
struct stat st;
|
||||||
|
if (stat(filename, &st) == 0 && S_ISDIR(st.st_mode)) {
|
||||||
|
ret = rmdir(filename);
|
||||||
|
} else {
|
||||||
|
ret = unlink(filename);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
ret = remove(filename);
|
||||||
|
#endif
|
||||||
|
ret = js_get_errno(ret);
|
||||||
JS_FreeCString(ctx, filename);
|
JS_FreeCString(ctx, filename);
|
||||||
return JS_NewInt32(ctx, ret);
|
return JS_NewInt32(ctx, ret);
|
||||||
}
|
}
|
||||||
|
@ -2588,7 +2608,47 @@ static JSValue js_os_utimes(JSContext *ctx, JSValueConst this_val,
|
||||||
return JS_NewInt32(ctx, ret);
|
return JS_NewInt32(ctx, ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !defined(_WIN32)
|
/* sleep(delay_ms) */
|
||||||
|
static JSValue js_os_sleep(JSContext *ctx, JSValueConst this_val,
|
||||||
|
int argc, JSValueConst *argv)
|
||||||
|
{
|
||||||
|
int64_t delay;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (JS_ToInt64(ctx, &delay, argv[0]))
|
||||||
|
return JS_EXCEPTION;
|
||||||
|
if (delay < 0)
|
||||||
|
delay = 0;
|
||||||
|
#if defined(_WIN32)
|
||||||
|
{
|
||||||
|
if (delay > INT32_MAX)
|
||||||
|
delay = INT32_MAX;
|
||||||
|
Sleep(delay);
|
||||||
|
ret = 0;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
{
|
||||||
|
struct timespec ts;
|
||||||
|
|
||||||
|
ts.tv_sec = delay / 1000;
|
||||||
|
ts.tv_nsec = (delay % 1000) * 1000000;
|
||||||
|
ret = js_get_errno(nanosleep(&ts, NULL));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return JS_NewInt32(ctx, ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(_WIN32)
|
||||||
|
static char *realpath(const char *path, char *buf)
|
||||||
|
{
|
||||||
|
if (!_fullpath(buf, path, PATH_MAX)) {
|
||||||
|
errno = ENOENT;
|
||||||
|
return NULL;
|
||||||
|
} else {
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* return [path, errorcode] */
|
/* return [path, errorcode] */
|
||||||
static JSValue js_os_realpath(JSContext *ctx, JSValueConst this_val,
|
static JSValue js_os_realpath(JSContext *ctx, JSValueConst this_val,
|
||||||
|
@ -2612,6 +2672,7 @@ static JSValue js_os_realpath(JSContext *ctx, JSValueConst this_val,
|
||||||
return make_string_error(ctx, buf, err);
|
return make_string_error(ctx, buf, err);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if !defined(_WIN32)
|
||||||
static JSValue js_os_symlink(JSContext *ctx, JSValueConst this_val,
|
static JSValue js_os_symlink(JSContext *ctx, JSValueConst this_val,
|
||||||
int argc, JSValueConst *argv)
|
int argc, JSValueConst *argv)
|
||||||
{
|
{
|
||||||
|
@ -3031,22 +3092,6 @@ static JSValue js_os_kill(JSContext *ctx, JSValueConst this_val,
|
||||||
return JS_NewInt32(ctx, ret);
|
return JS_NewInt32(ctx, ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* sleep(delay_ms) */
|
|
||||||
static JSValue js_os_sleep(JSContext *ctx, JSValueConst this_val,
|
|
||||||
int argc, JSValueConst *argv)
|
|
||||||
{
|
|
||||||
int64_t delay;
|
|
||||||
struct timespec ts;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
if (JS_ToInt64(ctx, &delay, argv[0]))
|
|
||||||
return JS_EXCEPTION;
|
|
||||||
ts.tv_sec = delay / 1000;
|
|
||||||
ts.tv_nsec = (delay % 1000) * 1000000;
|
|
||||||
ret = js_get_errno(nanosleep(&ts, NULL));
|
|
||||||
return JS_NewInt32(ctx, ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* dup(fd) */
|
/* dup(fd) */
|
||||||
static JSValue js_os_dup(JSContext *ctx, JSValueConst this_val,
|
static JSValue js_os_dup(JSContext *ctx, JSValueConst this_val,
|
||||||
int argc, JSValueConst *argv)
|
int argc, JSValueConst *argv)
|
||||||
|
@ -3598,9 +3643,10 @@ static const JSCFunctionListEntry js_os_funcs[] = {
|
||||||
#endif
|
#endif
|
||||||
JS_CFUNC_MAGIC_DEF("stat", 1, js_os_stat, 0 ),
|
JS_CFUNC_MAGIC_DEF("stat", 1, js_os_stat, 0 ),
|
||||||
JS_CFUNC_DEF("utimes", 3, js_os_utimes ),
|
JS_CFUNC_DEF("utimes", 3, js_os_utimes ),
|
||||||
|
JS_CFUNC_DEF("sleep", 1, js_os_sleep ),
|
||||||
|
JS_CFUNC_DEF("realpath", 1, js_os_realpath ),
|
||||||
#if !defined(_WIN32)
|
#if !defined(_WIN32)
|
||||||
JS_CFUNC_MAGIC_DEF("lstat", 1, js_os_stat, 1 ),
|
JS_CFUNC_MAGIC_DEF("lstat", 1, js_os_stat, 1 ),
|
||||||
JS_CFUNC_DEF("realpath", 1, js_os_realpath ),
|
|
||||||
JS_CFUNC_DEF("symlink", 2, js_os_symlink ),
|
JS_CFUNC_DEF("symlink", 2, js_os_symlink ),
|
||||||
JS_CFUNC_DEF("readlink", 1, js_os_readlink ),
|
JS_CFUNC_DEF("readlink", 1, js_os_readlink ),
|
||||||
JS_CFUNC_DEF("exec", 1, js_os_exec ),
|
JS_CFUNC_DEF("exec", 1, js_os_exec ),
|
||||||
|
@ -3608,7 +3654,6 @@ static const JSCFunctionListEntry js_os_funcs[] = {
|
||||||
OS_FLAG(WNOHANG),
|
OS_FLAG(WNOHANG),
|
||||||
JS_CFUNC_DEF("pipe", 0, js_os_pipe ),
|
JS_CFUNC_DEF("pipe", 0, js_os_pipe ),
|
||||||
JS_CFUNC_DEF("kill", 2, js_os_kill ),
|
JS_CFUNC_DEF("kill", 2, js_os_kill ),
|
||||||
JS_CFUNC_DEF("sleep", 1, js_os_sleep ),
|
|
||||||
JS_CFUNC_DEF("dup", 1, js_os_dup ),
|
JS_CFUNC_DEF("dup", 1, js_os_dup ),
|
||||||
JS_CFUNC_DEF("dup2", 2, js_os_dup2 ),
|
JS_CFUNC_DEF("dup2", 2, js_os_dup2 ),
|
||||||
#endif
|
#endif
|
||||||
|
|
570
quickjs.c
570
quickjs.c
|
@ -1,8 +1,8 @@
|
||||||
/*
|
/*
|
||||||
* QuickJS Javascript Engine
|
* QuickJS Javascript Engine
|
||||||
*
|
*
|
||||||
* Copyright (c) 2017-2020 Fabrice Bellard
|
* Copyright (c) 2017-2021 Fabrice Bellard
|
||||||
* Copyright (c) 2017-2020 Charlie Gordon
|
* Copyright (c) 2017-2021 Charlie Gordon
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
@ -36,6 +36,8 @@
|
||||||
#include <malloc/malloc.h>
|
#include <malloc/malloc.h>
|
||||||
#elif defined(__linux__)
|
#elif defined(__linux__)
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
|
#elif defined(__FreeBSD__)
|
||||||
|
#include <malloc_np.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "cutils.h"
|
#include "cutils.h"
|
||||||
|
@ -265,8 +267,9 @@ struct JSRuntime {
|
||||||
struct list_head string_list; /* list of JSString.link */
|
struct list_head string_list; /* list of JSString.link */
|
||||||
#endif
|
#endif
|
||||||
/* stack limitation */
|
/* stack limitation */
|
||||||
const uint8_t *stack_top;
|
uintptr_t stack_size; /* in bytes, 0 if no limit */
|
||||||
size_t stack_size; /* in bytes */
|
uintptr_t stack_top;
|
||||||
|
uintptr_t stack_limit; /* lower stack limit */
|
||||||
|
|
||||||
JSValue current_exception;
|
JSValue current_exception;
|
||||||
/* true if inside an out of memory error, to avoid recursing */
|
/* true if inside an out of memory error, to avoid recursing */
|
||||||
|
@ -1569,9 +1572,9 @@ static void set_dummy_numeric_ops(JSNumericOperations *ops)
|
||||||
|
|
||||||
#if !defined(CONFIG_STACK_CHECK)
|
#if !defined(CONFIG_STACK_CHECK)
|
||||||
/* no stack limitation */
|
/* no stack limitation */
|
||||||
static inline uint8_t *js_get_stack_pointer(void)
|
static inline uintptr_t js_get_stack_pointer(void)
|
||||||
{
|
{
|
||||||
return NULL;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline BOOL js_check_stack_overflow(JSRuntime *rt, size_t alloca_size)
|
static inline BOOL js_check_stack_overflow(JSRuntime *rt, size_t alloca_size)
|
||||||
|
@ -1580,16 +1583,16 @@ static inline BOOL js_check_stack_overflow(JSRuntime *rt, size_t alloca_size)
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
/* Note: OS and CPU dependent */
|
/* Note: OS and CPU dependent */
|
||||||
static inline uint8_t *js_get_stack_pointer(void)
|
static inline uintptr_t js_get_stack_pointer(void)
|
||||||
{
|
{
|
||||||
return __builtin_frame_address(0);
|
return (uintptr_t)__builtin_frame_address(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline BOOL js_check_stack_overflow(JSRuntime *rt, size_t alloca_size)
|
static inline BOOL js_check_stack_overflow(JSRuntime *rt, size_t alloca_size)
|
||||||
{
|
{
|
||||||
size_t size;
|
uintptr_t sp;
|
||||||
size = rt->stack_top - js_get_stack_pointer();
|
sp = js_get_stack_pointer() - alloca_size;
|
||||||
return unlikely((size + alloca_size) > rt->stack_size);
|
return unlikely(sp < rt->stack_limit);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1649,8 +1652,9 @@ JSRuntime *JS_NewRuntime2(const JSMallocFunctions *mf, void *opaque)
|
||||||
if (init_shape_hash(rt))
|
if (init_shape_hash(rt))
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
rt->stack_top = js_get_stack_pointer();
|
|
||||||
rt->stack_size = JS_DEFAULT_STACK_SIZE;
|
rt->stack_size = JS_DEFAULT_STACK_SIZE;
|
||||||
|
JS_UpdateStackTop(rt);
|
||||||
|
|
||||||
rt->current_exception = JS_NULL;
|
rt->current_exception = JS_NULL;
|
||||||
|
|
||||||
return rt;
|
return rt;
|
||||||
|
@ -2338,9 +2342,25 @@ JSRuntime *JS_GetRuntime(JSContext *ctx)
|
||||||
return ctx->rt;
|
return ctx->rt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void update_stack_limit(JSRuntime *rt)
|
||||||
|
{
|
||||||
|
if (rt->stack_size == 0) {
|
||||||
|
rt->stack_limit = 0; /* no limit */
|
||||||
|
} else {
|
||||||
|
rt->stack_limit = rt->stack_top - rt->stack_size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void JS_SetMaxStackSize(JSRuntime *rt, size_t stack_size)
|
void JS_SetMaxStackSize(JSRuntime *rt, size_t stack_size)
|
||||||
{
|
{
|
||||||
rt->stack_size = stack_size;
|
rt->stack_size = stack_size;
|
||||||
|
update_stack_limit(rt);
|
||||||
|
}
|
||||||
|
|
||||||
|
void JS_UpdateStackTop(JSRuntime *rt)
|
||||||
|
{
|
||||||
|
rt->stack_top = js_get_stack_pointer();
|
||||||
|
update_stack_limit(rt);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline BOOL is_strict_mode(JSContext *ctx)
|
static inline BOOL is_strict_mode(JSContext *ctx)
|
||||||
|
@ -3377,6 +3397,8 @@ static int JS_NewClass1(JSRuntime *rt, JSClassID class_id,
|
||||||
JSClass *cl, *new_class_array;
|
JSClass *cl, *new_class_array;
|
||||||
struct list_head *el;
|
struct list_head *el;
|
||||||
|
|
||||||
|
if (class_id >= (1 << 16))
|
||||||
|
return -1;
|
||||||
if (class_id < rt->class_count &&
|
if (class_id < rt->class_count &&
|
||||||
rt->class_array[class_id].class_id != 0)
|
rt->class_array[class_id].class_id != 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -8231,6 +8253,23 @@ static int set_array_length(JSContext *ctx, JSObject *p, JSValue val,
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* return -1 if exception */
|
||||||
|
static int expand_fast_array(JSContext *ctx, JSObject *p, uint32_t new_len)
|
||||||
|
{
|
||||||
|
uint32_t new_size;
|
||||||
|
size_t slack;
|
||||||
|
JSValue *new_array_prop;
|
||||||
|
/* XXX: potential arithmetic overflow */
|
||||||
|
new_size = max_int(new_len, p->u.array.u1.size * 3 / 2);
|
||||||
|
new_array_prop = js_realloc2(ctx, p->u.array.u.values, sizeof(JSValue) * new_size, &slack);
|
||||||
|
if (!new_array_prop)
|
||||||
|
return -1;
|
||||||
|
new_size += slack / sizeof(*new_array_prop);
|
||||||
|
p->u.array.u.values = new_array_prop;
|
||||||
|
p->u.array.u1.size = new_size;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* Preconditions: 'p' must be of class JS_CLASS_ARRAY, p->fast_array =
|
/* Preconditions: 'p' must be of class JS_CLASS_ARRAY, p->fast_array =
|
||||||
TRUE and p->extensible = TRUE */
|
TRUE and p->extensible = TRUE */
|
||||||
static int add_fast_array_element(JSContext *ctx, JSObject *p,
|
static int add_fast_array_element(JSContext *ctx, JSObject *p,
|
||||||
|
@ -8253,19 +8292,10 @@ static int add_fast_array_element(JSContext *ctx, JSObject *p,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (unlikely(new_len > p->u.array.u1.size)) {
|
if (unlikely(new_len > p->u.array.u1.size)) {
|
||||||
uint32_t new_size;
|
if (expand_fast_array(ctx, p, new_len)) {
|
||||||
size_t slack;
|
|
||||||
JSValue *new_array_prop;
|
|
||||||
/* XXX: potential arithmetic overflow */
|
|
||||||
new_size = max_int(new_len, p->u.array.u1.size * 3 / 2);
|
|
||||||
new_array_prop = js_realloc2(ctx, p->u.array.u.values, sizeof(JSValue) * new_size, &slack);
|
|
||||||
if (!new_array_prop) {
|
|
||||||
JS_FreeValue(ctx, val);
|
JS_FreeValue(ctx, val);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
new_size += slack / sizeof(*new_array_prop);
|
|
||||||
p->u.array.u.values = new_array_prop;
|
|
||||||
p->u.array.u1.size = new_size;
|
|
||||||
}
|
}
|
||||||
p->u.array.u.values[new_len - 1] = val;
|
p->u.array.u.values[new_len - 1] = val;
|
||||||
p->u.array.count = new_len;
|
p->u.array.count = new_len;
|
||||||
|
@ -8279,22 +8309,24 @@ static void js_free_desc(JSContext *ctx, JSPropertyDescriptor *desc)
|
||||||
JS_FreeValue(ctx, desc->value);
|
JS_FreeValue(ctx, desc->value);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* generic (and slower) version of JS_SetProperty() for Reflect.set() */
|
/* generic (and slower) version of JS_SetProperty() for
|
||||||
|
* Reflect.set(). 'obj' must be an object. */
|
||||||
static int JS_SetPropertyGeneric(JSContext *ctx,
|
static int JS_SetPropertyGeneric(JSContext *ctx,
|
||||||
JSObject *p, JSAtom prop,
|
JSValueConst obj, JSAtom prop,
|
||||||
JSValue val, JSValueConst this_obj,
|
JSValue val, JSValueConst this_obj,
|
||||||
int flags)
|
int flags)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
JSPropertyDescriptor desc;
|
JSPropertyDescriptor desc;
|
||||||
|
JSValue obj1;
|
||||||
|
JSObject *p;
|
||||||
|
|
||||||
while (p != NULL) {
|
obj1 = JS_DupValue(ctx, obj);
|
||||||
|
for(;;) {
|
||||||
|
p = JS_VALUE_GET_OBJ(obj1);
|
||||||
if (p->is_exotic) {
|
if (p->is_exotic) {
|
||||||
const JSClassExoticMethods *em = ctx->rt->class_array[p->class_id].exotic;
|
const JSClassExoticMethods *em = ctx->rt->class_array[p->class_id].exotic;
|
||||||
if (em && em->set_property) {
|
if (em && em->set_property) {
|
||||||
JSValue obj1;
|
|
||||||
/* set_property can free the prototype */
|
|
||||||
obj1 = JS_DupValue(ctx, JS_MKPTR(JS_TAG_OBJECT, p));
|
|
||||||
ret = em->set_property(ctx, obj1, prop,
|
ret = em->set_property(ctx, obj1, prop,
|
||||||
val, this_obj, flags);
|
val, this_obj, flags);
|
||||||
JS_FreeValue(ctx, obj1);
|
JS_FreeValue(ctx, obj1);
|
||||||
|
@ -8304,8 +8336,11 @@ static int JS_SetPropertyGeneric(JSContext *ctx,
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = JS_GetOwnPropertyInternal(ctx, &desc, p, prop);
|
ret = JS_GetOwnPropertyInternal(ctx, &desc, p, prop);
|
||||||
if (ret < 0)
|
if (ret < 0) {
|
||||||
|
JS_FreeValue(ctx, obj1);
|
||||||
|
JS_FreeValue(ctx, val);
|
||||||
return ret;
|
return ret;
|
||||||
|
}
|
||||||
if (ret) {
|
if (ret) {
|
||||||
if (desc.flags & JS_PROP_GETSET) {
|
if (desc.flags & JS_PROP_GETSET) {
|
||||||
JSObject *setter;
|
JSObject *setter;
|
||||||
|
@ -8316,27 +8351,38 @@ static int JS_SetPropertyGeneric(JSContext *ctx,
|
||||||
ret = call_setter(ctx, setter, this_obj, val, flags);
|
ret = call_setter(ctx, setter, this_obj, val, flags);
|
||||||
JS_FreeValue(ctx, desc.getter);
|
JS_FreeValue(ctx, desc.getter);
|
||||||
JS_FreeValue(ctx, desc.setter);
|
JS_FreeValue(ctx, desc.setter);
|
||||||
|
JS_FreeValue(ctx, obj1);
|
||||||
return ret;
|
return ret;
|
||||||
} else {
|
} else {
|
||||||
JS_FreeValue(ctx, desc.value);
|
JS_FreeValue(ctx, desc.value);
|
||||||
if (!(desc.flags & JS_PROP_WRITABLE)) {
|
if (!(desc.flags & JS_PROP_WRITABLE)) {
|
||||||
|
JS_FreeValue(ctx, obj1);
|
||||||
goto read_only_error;
|
goto read_only_error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
p = p->shape->proto;
|
/* Note: at this point 'obj1' cannot be a proxy. XXX: may have
|
||||||
|
to check recursion */
|
||||||
|
obj1 = JS_GetPrototypeFree(ctx, obj1);
|
||||||
|
if (JS_IsNull(obj1))
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
JS_FreeValue(ctx, obj1);
|
||||||
|
|
||||||
if (!JS_IsObject(this_obj))
|
if (!JS_IsObject(this_obj)) {
|
||||||
|
JS_FreeValue(ctx, val);
|
||||||
return JS_ThrowTypeErrorOrFalse(ctx, flags, "receiver is not an object");
|
return JS_ThrowTypeErrorOrFalse(ctx, flags, "receiver is not an object");
|
||||||
|
}
|
||||||
|
|
||||||
p = JS_VALUE_GET_OBJ(this_obj);
|
p = JS_VALUE_GET_OBJ(this_obj);
|
||||||
|
|
||||||
/* modify the property in this_obj if it already exists */
|
/* modify the property in this_obj if it already exists */
|
||||||
ret = JS_GetOwnPropertyInternal(ctx, &desc, p, prop);
|
ret = JS_GetOwnPropertyInternal(ctx, &desc, p, prop);
|
||||||
if (ret < 0)
|
if (ret < 0) {
|
||||||
|
JS_FreeValue(ctx, val);
|
||||||
return ret;
|
return ret;
|
||||||
|
}
|
||||||
if (ret) {
|
if (ret) {
|
||||||
if (desc.flags & JS_PROP_GETSET) {
|
if (desc.flags & JS_PROP_GETSET) {
|
||||||
JS_FreeValue(ctx, desc.getter);
|
JS_FreeValue(ctx, desc.getter);
|
||||||
|
@ -15022,10 +15068,10 @@ static JSValue js_build_rest(JSContext *ctx, int first, int argc, JSValueConst *
|
||||||
|
|
||||||
static JSValue build_for_in_iterator(JSContext *ctx, JSValue obj)
|
static JSValue build_for_in_iterator(JSContext *ctx, JSValue obj)
|
||||||
{
|
{
|
||||||
JSObject *p, *p1;
|
JSObject *p;
|
||||||
JSPropertyEnum *tab_atom;
|
JSPropertyEnum *tab_atom;
|
||||||
int i;
|
int i;
|
||||||
JSValue enum_obj;
|
JSValue enum_obj, obj1;
|
||||||
JSForInIterator *it;
|
JSForInIterator *it;
|
||||||
uint32_t tag, tab_atom_count;
|
uint32_t tag, tab_atom_count;
|
||||||
|
|
||||||
|
@ -15054,20 +15100,34 @@ static JSValue build_for_in_iterator(JSContext *ctx, JSValue obj)
|
||||||
if (tag == JS_TAG_NULL || tag == JS_TAG_UNDEFINED)
|
if (tag == JS_TAG_NULL || tag == JS_TAG_UNDEFINED)
|
||||||
return enum_obj;
|
return enum_obj;
|
||||||
|
|
||||||
p = JS_VALUE_GET_OBJ(obj);
|
|
||||||
|
|
||||||
/* fast path: assume no enumerable properties in the prototype chain */
|
/* fast path: assume no enumerable properties in the prototype chain */
|
||||||
p1 = p->shape->proto;
|
obj1 = JS_DupValue(ctx, obj);
|
||||||
while (p1 != NULL) {
|
for(;;) {
|
||||||
if (JS_GetOwnPropertyNamesInternal(ctx, &tab_atom, &tab_atom_count, p1,
|
obj1 = JS_GetPrototypeFree(ctx, obj1);
|
||||||
JS_GPN_STRING_MASK | JS_GPN_ENUM_ONLY))
|
if (JS_IsNull(obj1))
|
||||||
|
break;
|
||||||
|
if (JS_IsException(obj1))
|
||||||
goto fail;
|
goto fail;
|
||||||
|
if (JS_GetOwnPropertyNamesInternal(ctx, &tab_atom, &tab_atom_count,
|
||||||
|
JS_VALUE_GET_OBJ(obj1),
|
||||||
|
JS_GPN_STRING_MASK | JS_GPN_ENUM_ONLY)) {
|
||||||
|
JS_FreeValue(ctx, obj1);
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
js_free_prop_enum(ctx, tab_atom, tab_atom_count);
|
js_free_prop_enum(ctx, tab_atom, tab_atom_count);
|
||||||
if (tab_atom_count != 0) {
|
if (tab_atom_count != 0) {
|
||||||
|
JS_FreeValue(ctx, obj1);
|
||||||
goto slow_path;
|
goto slow_path;
|
||||||
}
|
}
|
||||||
p1 = p1->shape->proto;
|
/* must check for timeout to avoid infinite loop */
|
||||||
|
if (js_poll_interrupts(ctx)) {
|
||||||
|
JS_FreeValue(ctx, obj1);
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
p = JS_VALUE_GET_OBJ(obj);
|
||||||
|
|
||||||
if (p->fast_array) {
|
if (p->fast_array) {
|
||||||
JSShape *sh;
|
JSShape *sh;
|
||||||
JSShapeProperty *prs;
|
JSShapeProperty *prs;
|
||||||
|
@ -15095,17 +15155,30 @@ static JSValue build_for_in_iterator(JSContext *ctx, JSValue obj)
|
||||||
slow_path:
|
slow_path:
|
||||||
/* non enumerable properties hide the enumerables ones in the
|
/* non enumerable properties hide the enumerables ones in the
|
||||||
prototype chain */
|
prototype chain */
|
||||||
while (p != NULL) {
|
obj1 = JS_DupValue(ctx, obj);
|
||||||
if (JS_GetOwnPropertyNamesInternal(ctx, &tab_atom, &tab_atom_count, p,
|
for(;;) {
|
||||||
JS_GPN_STRING_MASK | JS_GPN_SET_ENUM))
|
if (JS_GetOwnPropertyNamesInternal(ctx, &tab_atom, &tab_atom_count,
|
||||||
|
JS_VALUE_GET_OBJ(obj1),
|
||||||
|
JS_GPN_STRING_MASK | JS_GPN_SET_ENUM)) {
|
||||||
|
JS_FreeValue(ctx, obj1);
|
||||||
goto fail;
|
goto fail;
|
||||||
|
}
|
||||||
for(i = 0; i < tab_atom_count; i++) {
|
for(i = 0; i < tab_atom_count; i++) {
|
||||||
JS_DefinePropertyValue(ctx, enum_obj, tab_atom[i].atom, JS_NULL,
|
JS_DefinePropertyValue(ctx, enum_obj, tab_atom[i].atom, JS_NULL,
|
||||||
(tab_atom[i].is_enumerable ?
|
(tab_atom[i].is_enumerable ?
|
||||||
JS_PROP_ENUMERABLE : 0));
|
JS_PROP_ENUMERABLE : 0));
|
||||||
}
|
}
|
||||||
js_free_prop_enum(ctx, tab_atom, tab_atom_count);
|
js_free_prop_enum(ctx, tab_atom, tab_atom_count);
|
||||||
p = p->shape->proto;
|
obj1 = JS_GetPrototypeFree(ctx, obj1);
|
||||||
|
if (JS_IsNull(obj1))
|
||||||
|
break;
|
||||||
|
if (JS_IsException(obj1))
|
||||||
|
goto fail;
|
||||||
|
/* must check for timeout to avoid infinite loop */
|
||||||
|
if (js_poll_interrupts(ctx)) {
|
||||||
|
JS_FreeValue(ctx, obj1);
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return enum_obj;
|
return enum_obj;
|
||||||
|
|
||||||
|
@ -15572,7 +15645,9 @@ static __exception int JS_CopyDataProperties(JSContext *ctx,
|
||||||
uint32_t i, tab_atom_count;
|
uint32_t i, tab_atom_count;
|
||||||
JSObject *p;
|
JSObject *p;
|
||||||
JSObject *pexcl = NULL;
|
JSObject *pexcl = NULL;
|
||||||
int ret = 0, flags;
|
int ret, gpn_flags;
|
||||||
|
JSPropertyDescriptor desc;
|
||||||
|
BOOL is_enumerable;
|
||||||
|
|
||||||
if (JS_VALUE_GET_TAG(source) != JS_TAG_OBJECT)
|
if (JS_VALUE_GET_TAG(source) != JS_TAG_OBJECT)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -15581,37 +15656,57 @@ static __exception int JS_CopyDataProperties(JSContext *ctx,
|
||||||
pexcl = JS_VALUE_GET_OBJ(excluded);
|
pexcl = JS_VALUE_GET_OBJ(excluded);
|
||||||
|
|
||||||
p = JS_VALUE_GET_OBJ(source);
|
p = JS_VALUE_GET_OBJ(source);
|
||||||
if (JS_GetOwnPropertyNamesInternal(ctx, &tab_atom, &tab_atom_count, p,
|
|
||||||
JS_GPN_STRING_MASK | JS_GPN_SYMBOL_MASK |
|
|
||||||
JS_GPN_ENUM_ONLY))
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
flags = JS_PROP_C_W_E;
|
gpn_flags = JS_GPN_STRING_MASK | JS_GPN_SYMBOL_MASK | JS_GPN_ENUM_ONLY;
|
||||||
|
if (p->is_exotic) {
|
||||||
|
const JSClassExoticMethods *em = ctx->rt->class_array[p->class_id].exotic;
|
||||||
|
/* cannot use JS_GPN_ENUM_ONLY with e.g. proxies because it
|
||||||
|
introduces a visible change */
|
||||||
|
if (em && em->get_own_property_names) {
|
||||||
|
gpn_flags &= ~JS_GPN_ENUM_ONLY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (JS_GetOwnPropertyNamesInternal(ctx, &tab_atom, &tab_atom_count, p,
|
||||||
|
gpn_flags))
|
||||||
|
return -1;
|
||||||
|
|
||||||
for (i = 0; i < tab_atom_count; i++) {
|
for (i = 0; i < tab_atom_count; i++) {
|
||||||
if (pexcl) {
|
if (pexcl) {
|
||||||
ret = JS_GetOwnPropertyInternal(ctx, NULL, pexcl, tab_atom[i].atom);
|
ret = JS_GetOwnPropertyInternal(ctx, NULL, pexcl, tab_atom[i].atom);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
break;
|
goto exception;
|
||||||
ret = 0;
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ret = -1;
|
if (!(gpn_flags & JS_GPN_ENUM_ONLY)) {
|
||||||
|
/* test if the property is enumerable */
|
||||||
|
ret = JS_GetOwnPropertyInternal(ctx, &desc, p, tab_atom[i].atom);
|
||||||
|
if (ret < 0)
|
||||||
|
goto exception;
|
||||||
|
if (!ret)
|
||||||
|
continue;
|
||||||
|
is_enumerable = (desc.flags & JS_PROP_ENUMERABLE) != 0;
|
||||||
|
js_free_desc(ctx, &desc);
|
||||||
|
if (!is_enumerable)
|
||||||
|
continue;
|
||||||
|
}
|
||||||
val = JS_GetProperty(ctx, source, tab_atom[i].atom);
|
val = JS_GetProperty(ctx, source, tab_atom[i].atom);
|
||||||
if (JS_IsException(val))
|
if (JS_IsException(val))
|
||||||
break;
|
goto exception;
|
||||||
if (setprop)
|
if (setprop)
|
||||||
ret = JS_SetProperty(ctx, target, tab_atom[i].atom, val);
|
ret = JS_SetProperty(ctx, target, tab_atom[i].atom, val);
|
||||||
else
|
else
|
||||||
ret = JS_DefinePropertyValue(ctx, target, tab_atom[i].atom, val, flags);
|
ret = JS_DefinePropertyValue(ctx, target, tab_atom[i].atom, val,
|
||||||
|
JS_PROP_C_W_E);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
break;
|
goto exception;
|
||||||
ret = 0;
|
|
||||||
}
|
}
|
||||||
js_free_prop_enum(ctx, tab_atom, tab_atom_count);
|
js_free_prop_enum(ctx, tab_atom, tab_atom_count);
|
||||||
return ret;
|
return 0;
|
||||||
|
exception:
|
||||||
|
js_free_prop_enum(ctx, tab_atom, tab_atom_count);
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* only valid inside C functions */
|
/* only valid inside C functions */
|
||||||
|
@ -16654,7 +16749,7 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValueConst func_obj,
|
||||||
BREAK;
|
BREAK;
|
||||||
CASE(OP_check_ctor):
|
CASE(OP_check_ctor):
|
||||||
if (JS_IsUndefined(new_target)) {
|
if (JS_IsUndefined(new_target)) {
|
||||||
JS_ThrowTypeError(caller_ctx, "class constructors must be invoked with 'new'");
|
JS_ThrowTypeError(ctx, "class constructors must be invoked with 'new'");
|
||||||
goto exception;
|
goto exception;
|
||||||
}
|
}
|
||||||
BREAK;
|
BREAK;
|
||||||
|
@ -17770,8 +17865,7 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValueConst func_obj,
|
||||||
atom = JS_ValueToAtom(ctx, sp[-2]);
|
atom = JS_ValueToAtom(ctx, sp[-2]);
|
||||||
if (unlikely(atom == JS_ATOM_NULL))
|
if (unlikely(atom == JS_ATOM_NULL))
|
||||||
goto exception;
|
goto exception;
|
||||||
ret = JS_SetPropertyGeneric(ctx, JS_VALUE_GET_OBJ(sp[-3]),
|
ret = JS_SetPropertyGeneric(ctx, sp[-3], atom, sp[-1], sp[-4],
|
||||||
atom, sp[-1], sp[-4],
|
|
||||||
JS_PROP_THROW_STRICT);
|
JS_PROP_THROW_STRICT);
|
||||||
JS_FreeAtom(ctx, atom);
|
JS_FreeAtom(ctx, atom);
|
||||||
JS_FreeValue(ctx, sp[-4]);
|
JS_FreeValue(ctx, sp[-4]);
|
||||||
|
@ -22678,7 +22772,7 @@ static __exception int js_parse_left_hand_side_expr(JSParseState *s)
|
||||||
return js_parse_postfix_expr(s, PF_POSTFIX_CALL);
|
return js_parse_postfix_expr(s, PF_POSTFIX_CALL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* XXX: is there is nicer solution ? */
|
/* XXX: could generate specific bytecode */
|
||||||
static __exception int js_parse_class_default_ctor(JSParseState *s,
|
static __exception int js_parse_class_default_ctor(JSParseState *s,
|
||||||
BOOL has_super,
|
BOOL has_super,
|
||||||
JSFunctionDef **pfd)
|
JSFunctionDef **pfd)
|
||||||
|
@ -22691,7 +22785,8 @@ static __exception int js_parse_class_default_ctor(JSParseState *s,
|
||||||
|
|
||||||
js_parse_get_pos(s, &pos);
|
js_parse_get_pos(s, &pos);
|
||||||
if (has_super) {
|
if (has_super) {
|
||||||
str = "(...a){super(...a);}";
|
/* spec change: no argument evaluation */
|
||||||
|
str = "(){super(...arguments);}";
|
||||||
func_type = JS_PARSE_FUNC_DERIVED_CLASS_CONSTRUCTOR;
|
func_type = JS_PARSE_FUNC_DERIVED_CLASS_CONSTRUCTOR;
|
||||||
} else {
|
} else {
|
||||||
str = "(){}";
|
str = "(){}";
|
||||||
|
@ -34227,6 +34322,7 @@ static int JS_WriteFunctionTag(BCWriterState *s, JSValueConst obj)
|
||||||
bc_put_leb128(s, b->cpool_count);
|
bc_put_leb128(s, b->cpool_count);
|
||||||
bc_put_leb128(s, b->byte_code_len);
|
bc_put_leb128(s, b->byte_code_len);
|
||||||
if (b->vardefs) {
|
if (b->vardefs) {
|
||||||
|
/* XXX: this field is redundant */
|
||||||
bc_put_leb128(s, b->arg_count + b->var_count);
|
bc_put_leb128(s, b->arg_count + b->var_count);
|
||||||
for(i = 0; i < b->arg_count + b->var_count; i++) {
|
for(i = 0; i < b->arg_count + b->var_count; i++) {
|
||||||
JSVarDef *vd = &b->vardefs[i];
|
JSVarDef *vd = &b->vardefs[i];
|
||||||
|
@ -35196,6 +35292,16 @@ static JSValue JS_ReadFunctionTag(BCReaderState *s)
|
||||||
|
|
||||||
memcpy(b, &bc, offsetof(JSFunctionBytecode, debug));
|
memcpy(b, &bc, offsetof(JSFunctionBytecode, debug));
|
||||||
b->header.ref_count = 1;
|
b->header.ref_count = 1;
|
||||||
|
if (local_count != 0) {
|
||||||
|
b->vardefs = (void *)((uint8_t*)b + vardefs_offset);
|
||||||
|
}
|
||||||
|
if (b->closure_var_count != 0) {
|
||||||
|
b->closure_var = (void *)((uint8_t*)b + closure_var_offset);
|
||||||
|
}
|
||||||
|
if (b->cpool_count != 0) {
|
||||||
|
b->cpool = (void *)((uint8_t*)b + cpool_offset);
|
||||||
|
}
|
||||||
|
|
||||||
add_gc_object(ctx->rt, &b->header, JS_GC_OBJ_TYPE_FUNCTION_BYTECODE);
|
add_gc_object(ctx->rt, &b->header, JS_GC_OBJ_TYPE_FUNCTION_BYTECODE);
|
||||||
|
|
||||||
obj = JS_MKPTR(JS_TAG_FUNCTION_BYTECODE, b);
|
obj = JS_MKPTR(JS_TAG_FUNCTION_BYTECODE, b);
|
||||||
|
@ -35211,7 +35317,6 @@ static JSValue JS_ReadFunctionTag(BCReaderState *s)
|
||||||
|
|
||||||
if (local_count != 0) {
|
if (local_count != 0) {
|
||||||
bc_read_trace(s, "vars {\n");
|
bc_read_trace(s, "vars {\n");
|
||||||
b->vardefs = (void *)((uint8_t*)b + vardefs_offset);
|
|
||||||
for(i = 0; i < local_count; i++) {
|
for(i = 0; i < local_count; i++) {
|
||||||
JSVarDef *vd = &b->vardefs[i];
|
JSVarDef *vd = &b->vardefs[i];
|
||||||
if (bc_get_atom(s, &vd->var_name))
|
if (bc_get_atom(s, &vd->var_name))
|
||||||
|
@ -35236,7 +35341,6 @@ static JSValue JS_ReadFunctionTag(BCReaderState *s)
|
||||||
}
|
}
|
||||||
if (b->closure_var_count != 0) {
|
if (b->closure_var_count != 0) {
|
||||||
bc_read_trace(s, "closure vars {\n");
|
bc_read_trace(s, "closure vars {\n");
|
||||||
b->closure_var = (void *)((uint8_t*)b + closure_var_offset);
|
|
||||||
for(i = 0; i < b->closure_var_count; i++) {
|
for(i = 0; i < b->closure_var_count; i++) {
|
||||||
JSClosureVar *cv = &b->closure_var[i];
|
JSClosureVar *cv = &b->closure_var[i];
|
||||||
int var_idx;
|
int var_idx;
|
||||||
|
@ -35288,7 +35392,6 @@ static JSValue JS_ReadFunctionTag(BCReaderState *s)
|
||||||
}
|
}
|
||||||
if (b->cpool_count != 0) {
|
if (b->cpool_count != 0) {
|
||||||
bc_read_trace(s, "cpool {\n");
|
bc_read_trace(s, "cpool {\n");
|
||||||
b->cpool = (void *)((uint8_t*)b + cpool_offset);
|
|
||||||
for(i = 0; i < b->cpool_count; i++) {
|
for(i = 0; i < b->cpool_count; i++) {
|
||||||
JSValue val;
|
JSValue val;
|
||||||
val = JS_ReadObjectRec(s);
|
val = JS_ReadObjectRec(s);
|
||||||
|
@ -37493,6 +37596,10 @@ static JSValue *build_arg_list(JSContext *ctx, uint32_t *plen,
|
||||||
}
|
}
|
||||||
if (js_get_length32(ctx, &len, array_arg))
|
if (js_get_length32(ctx, &len, array_arg))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
if (len > JS_MAX_LOCAL_VARS) {
|
||||||
|
JS_ThrowInternalError(ctx, "too many arguments");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
/* avoid allocating 0 bytes */
|
/* avoid allocating 0 bytes */
|
||||||
tab = js_mallocz(ctx, sizeof(tab[0]) * max_uint32(1, len));
|
tab = js_mallocz(ctx, sizeof(tab[0]) * max_uint32(1, len));
|
||||||
if (!tab)
|
if (!tab)
|
||||||
|
@ -38293,9 +38400,16 @@ static JSValue js_array_every(JSContext *ctx, JSValueConst this_val,
|
||||||
n = 0;
|
n = 0;
|
||||||
|
|
||||||
for(k = 0; k < len; k++) {
|
for(k = 0; k < len; k++) {
|
||||||
present = JS_TryGetPropertyInt64(ctx, obj, k, &val);
|
if (special & special_TA) {
|
||||||
if (present < 0)
|
val = JS_GetPropertyInt64(ctx, obj, k);
|
||||||
goto exception;
|
if (JS_IsException(val))
|
||||||
|
goto exception;
|
||||||
|
present = TRUE;
|
||||||
|
} else {
|
||||||
|
present = JS_TryGetPropertyInt64(ctx, obj, k, &val);
|
||||||
|
if (present < 0)
|
||||||
|
goto exception;
|
||||||
|
}
|
||||||
if (present) {
|
if (present) {
|
||||||
index_val = JS_NewInt64(ctx, k);
|
index_val = JS_NewInt64(ctx, k);
|
||||||
if (JS_IsException(index_val))
|
if (JS_IsException(index_val))
|
||||||
|
@ -38413,18 +38527,32 @@ static JSValue js_array_reduce(JSContext *ctx, JSValueConst this_val,
|
||||||
}
|
}
|
||||||
k1 = (special & special_reduceRight) ? len - k - 1 : k;
|
k1 = (special & special_reduceRight) ? len - k - 1 : k;
|
||||||
k++;
|
k++;
|
||||||
present = JS_TryGetPropertyInt64(ctx, obj, k1, &acc);
|
if (special & special_TA) {
|
||||||
if (present < 0)
|
acc = JS_GetPropertyInt64(ctx, obj, k1);
|
||||||
goto exception;
|
if (JS_IsException(acc))
|
||||||
if (present)
|
goto exception;
|
||||||
break;
|
break;
|
||||||
|
} else {
|
||||||
|
present = JS_TryGetPropertyInt64(ctx, obj, k1, &acc);
|
||||||
|
if (present < 0)
|
||||||
|
goto exception;
|
||||||
|
if (present)
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (; k < len; k++) {
|
for (; k < len; k++) {
|
||||||
k1 = (special & special_reduceRight) ? len - k - 1 : k;
|
k1 = (special & special_reduceRight) ? len - k - 1 : k;
|
||||||
present = JS_TryGetPropertyInt64(ctx, obj, k1, &val);
|
if (special & special_TA) {
|
||||||
if (present < 0)
|
val = JS_GetPropertyInt64(ctx, obj, k1);
|
||||||
goto exception;
|
if (JS_IsException(val))
|
||||||
|
goto exception;
|
||||||
|
present = TRUE;
|
||||||
|
} else {
|
||||||
|
present = JS_TryGetPropertyInt64(ctx, obj, k1, &val);
|
||||||
|
if (present < 0)
|
||||||
|
goto exception;
|
||||||
|
}
|
||||||
if (present) {
|
if (present) {
|
||||||
index_val = JS_NewInt64(ctx, k1);
|
index_val = JS_NewInt64(ctx, k1);
|
||||||
if (JS_IsException(index_val))
|
if (JS_IsException(index_val))
|
||||||
|
@ -38829,27 +38957,64 @@ static JSValue js_array_push(JSContext *ctx, JSValueConst this_val,
|
||||||
int64_t len, from, newLen;
|
int64_t len, from, newLen;
|
||||||
|
|
||||||
obj = JS_ToObject(ctx, this_val);
|
obj = JS_ToObject(ctx, this_val);
|
||||||
if (js_get_length64(ctx, &len, obj))
|
|
||||||
goto exception;
|
|
||||||
newLen = len + argc;
|
|
||||||
if (newLen > MAX_SAFE_INTEGER) {
|
|
||||||
JS_ThrowTypeError(ctx, "Array loo long");
|
|
||||||
goto exception;
|
|
||||||
}
|
|
||||||
from = len;
|
|
||||||
if (unshift && argc > 0) {
|
|
||||||
if (JS_CopySubArray(ctx, obj, argc, 0, len, -1))
|
|
||||||
goto exception;
|
|
||||||
from = 0;
|
|
||||||
}
|
|
||||||
for(i = 0; i < argc; i++) {
|
|
||||||
if (JS_SetPropertyInt64(ctx, obj, from + i,
|
|
||||||
JS_DupValue(ctx, argv[i])) < 0)
|
|
||||||
goto exception;
|
|
||||||
}
|
|
||||||
if (JS_SetProperty(ctx, obj, JS_ATOM_length, JS_NewInt64(ctx, newLen)) < 0)
|
|
||||||
goto exception;
|
|
||||||
|
|
||||||
|
if (JS_VALUE_GET_TAG(obj) == JS_TAG_OBJECT) {
|
||||||
|
JSObject *p = JS_VALUE_GET_OBJ(obj);
|
||||||
|
if (p->class_id != JS_CLASS_ARRAY ||
|
||||||
|
!p->fast_array || !p->extensible)
|
||||||
|
goto generic_case;
|
||||||
|
/* length must be writable */
|
||||||
|
if (unlikely(!(get_shape_prop(p->shape)->flags & JS_PROP_WRITABLE)))
|
||||||
|
goto generic_case;
|
||||||
|
/* check the length */
|
||||||
|
if (unlikely(JS_VALUE_GET_TAG(p->prop[0].u.value) != JS_TAG_INT))
|
||||||
|
goto generic_case;
|
||||||
|
len = JS_VALUE_GET_INT(p->prop[0].u.value);
|
||||||
|
/* we don't support holes */
|
||||||
|
if (unlikely(len != p->u.array.count))
|
||||||
|
goto generic_case;
|
||||||
|
newLen = len + argc;
|
||||||
|
if (unlikely(newLen > INT32_MAX))
|
||||||
|
goto generic_case;
|
||||||
|
if (newLen > p->u.array.u1.size) {
|
||||||
|
if (expand_fast_array(ctx, p, newLen))
|
||||||
|
goto exception;
|
||||||
|
}
|
||||||
|
if (unshift && argc > 0) {
|
||||||
|
memmove(p->u.array.u.values + argc, p->u.array.u.values,
|
||||||
|
len * sizeof(p->u.array.u.values[0]));
|
||||||
|
from = 0;
|
||||||
|
} else {
|
||||||
|
from = len;
|
||||||
|
}
|
||||||
|
for(i = 0; i < argc; i++) {
|
||||||
|
p->u.array.u.values[from + i] = JS_DupValue(ctx, argv[i]);
|
||||||
|
}
|
||||||
|
p->u.array.count = newLen;
|
||||||
|
p->prop[0].u.value = JS_NewInt32(ctx, newLen);
|
||||||
|
} else {
|
||||||
|
generic_case:
|
||||||
|
if (js_get_length64(ctx, &len, obj))
|
||||||
|
goto exception;
|
||||||
|
newLen = len + argc;
|
||||||
|
if (newLen > MAX_SAFE_INTEGER) {
|
||||||
|
JS_ThrowTypeError(ctx, "Array loo long");
|
||||||
|
goto exception;
|
||||||
|
}
|
||||||
|
from = len;
|
||||||
|
if (unshift && argc > 0) {
|
||||||
|
if (JS_CopySubArray(ctx, obj, argc, 0, len, -1))
|
||||||
|
goto exception;
|
||||||
|
from = 0;
|
||||||
|
}
|
||||||
|
for(i = 0; i < argc; i++) {
|
||||||
|
if (JS_SetPropertyInt64(ctx, obj, from + i,
|
||||||
|
JS_DupValue(ctx, argv[i])) < 0)
|
||||||
|
goto exception;
|
||||||
|
}
|
||||||
|
if (JS_SetProperty(ctx, obj, JS_ATOM_length, JS_NewInt64(ctx, newLen)) < 0)
|
||||||
|
goto exception;
|
||||||
|
}
|
||||||
JS_FreeValue(ctx, obj);
|
JS_FreeValue(ctx, obj);
|
||||||
return JS_NewInt64(ctx, newLen);
|
return JS_NewInt64(ctx, newLen);
|
||||||
|
|
||||||
|
@ -39079,6 +39244,11 @@ static int64_t JS_FlattenIntoArray(JSContext *ctx, JSValueConst target,
|
||||||
int64_t sourceIndex, elementLen;
|
int64_t sourceIndex, elementLen;
|
||||||
int present, is_array;
|
int present, is_array;
|
||||||
|
|
||||||
|
if (js_check_stack_overflow(ctx->rt, 0)) {
|
||||||
|
JS_ThrowStackOverflow(ctx);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
for (sourceIndex = 0; sourceIndex < sourceLen; sourceIndex++) {
|
for (sourceIndex = 0; sourceIndex < sourceLen; sourceIndex++) {
|
||||||
present = JS_TryGetPropertyInt64(ctx, source, sourceIndex, &element);
|
present = JS_TryGetPropertyInt64(ctx, source, sourceIndex, &element);
|
||||||
if (present < 0)
|
if (present < 0)
|
||||||
|
@ -41816,7 +41986,7 @@ static JSValue js___date_clock(JSContext *ctx, JSValueConst this_val,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* OS dependent. d = argv[0] is in ms from 1970. Return the difference
|
/* OS dependent. d = argv[0] is in ms from 1970. Return the difference
|
||||||
between local time and UTC time 'd' in minutes */
|
between UTC time and local time 'd' in minutes */
|
||||||
static int getTimezoneOffset(int64_t time) {
|
static int getTimezoneOffset(int64_t time) {
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
/* XXX: TODO */
|
/* XXX: TODO */
|
||||||
|
@ -44165,7 +44335,7 @@ static JSValue js_reflect_set(JSContext *ctx, JSValueConst this_val,
|
||||||
atom = JS_ValueToAtom(ctx, prop);
|
atom = JS_ValueToAtom(ctx, prop);
|
||||||
if (unlikely(atom == JS_ATOM_NULL))
|
if (unlikely(atom == JS_ATOM_NULL))
|
||||||
return JS_EXCEPTION;
|
return JS_EXCEPTION;
|
||||||
ret = JS_SetPropertyGeneric(ctx, JS_VALUE_GET_OBJ(obj), atom,
|
ret = JS_SetPropertyGeneric(ctx, obj, atom,
|
||||||
JS_DupValue(ctx, val), receiver, 0);
|
JS_DupValue(ctx, val), receiver, 0);
|
||||||
JS_FreeAtom(ctx, atom);
|
JS_FreeAtom(ctx, atom);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
|
@ -44513,7 +44683,7 @@ static int js_proxy_set(JSContext *ctx, JSValueConst obj, JSAtom atom,
|
||||||
if (!s)
|
if (!s)
|
||||||
return -1;
|
return -1;
|
||||||
if (JS_IsUndefined(method)) {
|
if (JS_IsUndefined(method)) {
|
||||||
return JS_SetPropertyGeneric(ctx, JS_VALUE_GET_OBJ(s->target), atom,
|
return JS_SetPropertyGeneric(ctx, s->target, atom,
|
||||||
JS_DupValue(ctx, value), receiver,
|
JS_DupValue(ctx, value), receiver,
|
||||||
flags);
|
flags);
|
||||||
}
|
}
|
||||||
|
@ -48134,24 +48304,22 @@ static void string_skip_non_spaces(JSString *sp, int *pp) {
|
||||||
*pp += 1;
|
*pp += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* parse a numeric field */
|
/* parse a numeric field with an optional sign if accept_sign is TRUE */
|
||||||
static int string_get_field(JSString *sp, int *pp, int64_t *pval) {
|
static int string_get_digits(JSString *sp, int *pp, int64_t *pval) {
|
||||||
int64_t v = 0;
|
int64_t v = 0;
|
||||||
int c, p = *pp;
|
int c, p = *pp, p_start;
|
||||||
|
|
||||||
/* skip non digits, should only skip spaces? */
|
|
||||||
while (p < sp->len) {
|
|
||||||
c = string_get(sp, p);
|
|
||||||
if (c >= '0' && c <= '9')
|
|
||||||
break;
|
|
||||||
p++;
|
|
||||||
}
|
|
||||||
if (p >= sp->len)
|
if (p >= sp->len)
|
||||||
return -1;
|
return -1;
|
||||||
|
p_start = p;
|
||||||
while (p < sp->len) {
|
while (p < sp->len) {
|
||||||
c = string_get(sp, p);
|
c = string_get(sp, p);
|
||||||
if (!(c >= '0' && c <= '9'))
|
if (!(c >= '0' && c <= '9')) {
|
||||||
break;
|
if (p == p_start)
|
||||||
|
return -1;
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
v = v * 10 + c - '0';
|
v = v * 10 + c - '0';
|
||||||
p++;
|
p++;
|
||||||
}
|
}
|
||||||
|
@ -48160,8 +48328,25 @@ static int string_get_field(JSString *sp, int *pp, int64_t *pval) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int string_get_signed_digits(JSString *sp, int *pp, int64_t *pval) {
|
||||||
|
int res, sgn, p = *pp;
|
||||||
|
|
||||||
|
if (p >= sp->len)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
sgn = string_get(sp, p);
|
||||||
|
if (sgn == '-' || sgn == '+')
|
||||||
|
p++;
|
||||||
|
|
||||||
|
res = string_get_digits(sp, &p, pval);
|
||||||
|
if (res == 0 && sgn == '-')
|
||||||
|
*pval = -*pval;
|
||||||
|
*pp = p;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
/* parse a fixed width numeric field */
|
/* parse a fixed width numeric field */
|
||||||
static int string_get_digits(JSString *sp, int *pp, int n, int64_t *pval) {
|
static int string_get_fixed_width_digits(JSString *sp, int *pp, int n, int64_t *pval) {
|
||||||
int64_t v = 0;
|
int64_t v = 0;
|
||||||
int i, c, p = *pp;
|
int i, c, p = *pp;
|
||||||
|
|
||||||
|
@ -48179,23 +48364,32 @@ static int string_get_digits(JSString *sp, int *pp, int n, int64_t *pval) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* parse a signed numeric field */
|
static int string_get_milliseconds(JSString *sp, int *pp, int64_t *pval) {
|
||||||
static int string_get_signed_field(JSString *sp, int *pp, int64_t *pval) {
|
/* parse milliseconds as a fractional part, round to nearest */
|
||||||
int sgn, res;
|
/* XXX: the spec does not indicate which rounding should be used */
|
||||||
|
int mul = 1000, ms = 0, p = *pp, c, p_start;
|
||||||
if (*pp >= sp->len)
|
if (p >= sp->len)
|
||||||
return -1;
|
return -1;
|
||||||
|
p_start = p;
|
||||||
sgn = string_get(sp, *pp);
|
while (p < sp->len) {
|
||||||
if (sgn == '-' || sgn == '+')
|
c = string_get(sp, p);
|
||||||
*pp += 1;
|
if (!(c >= '0' && c <= '9')) {
|
||||||
|
if (p == p_start)
|
||||||
res = string_get_field(sp, pp, pval);
|
return -1;
|
||||||
if (res == 0 && sgn == '-')
|
else
|
||||||
*pval = -*pval;
|
break;
|
||||||
return res;
|
}
|
||||||
|
if (mul == 1 && c >= '5')
|
||||||
|
ms += 1;
|
||||||
|
ms += (c - '0') * (mul /= 10);
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
*pval = ms;
|
||||||
|
*pp = p;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int find_abbrev(JSString *sp, int p, const char *list, int count) {
|
static int find_abbrev(JSString *sp, int p, const char *list, int count) {
|
||||||
int n, i;
|
int n, i;
|
||||||
|
|
||||||
|
@ -48234,7 +48428,7 @@ static JSValue js_Date_parse(JSContext *ctx, JSValueConst this_val,
|
||||||
double fields1[7];
|
double fields1[7];
|
||||||
int64_t tz, hh, mm;
|
int64_t tz, hh, mm;
|
||||||
double d;
|
double d;
|
||||||
int p, i, c, sgn;
|
int p, i, c, sgn, l;
|
||||||
JSString *sp;
|
JSString *sp;
|
||||||
BOOL is_local;
|
BOOL is_local;
|
||||||
|
|
||||||
|
@ -48249,50 +48443,74 @@ static JSValue js_Date_parse(JSContext *ctx, JSValueConst this_val,
|
||||||
if (p < sp->len && (((c = string_get(sp, p)) >= '0' && c <= '9') || c == '+' || c == '-')) {
|
if (p < sp->len && (((c = string_get(sp, p)) >= '0' && c <= '9') || c == '+' || c == '-')) {
|
||||||
/* ISO format */
|
/* ISO format */
|
||||||
/* year field can be negative */
|
/* year field can be negative */
|
||||||
/* XXX: could be stricter */
|
if (string_get_signed_digits(sp, &p, &fields[0]))
|
||||||
if (string_get_signed_field(sp, &p, &fields[0]))
|
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
is_local = TRUE;
|
for (i = 1; i < 7; i++) {
|
||||||
for (i = 1; i < 6; i++) {
|
if (p >= sp->len)
|
||||||
if (string_get_field(sp, &p, &fields[i]))
|
break;
|
||||||
|
switch(i) {
|
||||||
|
case 1:
|
||||||
|
case 2:
|
||||||
|
c = '-';
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
c = 'T';
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
case 5:
|
||||||
|
c = ':';
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
c = '.';
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
if (i <= 3) {
|
|
||||||
/* no time: UTC by default */
|
|
||||||
is_local = FALSE;
|
|
||||||
} else if (i == 6 && p < sp->len && string_get(sp, p) == '.') {
|
|
||||||
/* parse milliseconds as a fractional part, round to nearest */
|
|
||||||
/* XXX: the spec does not indicate which rounding should be used */
|
|
||||||
int mul = 1000, ms = 0;
|
|
||||||
while (++p < sp->len) {
|
|
||||||
int c = string_get(sp, p);
|
|
||||||
if (!(c >= '0' && c <= '9'))
|
|
||||||
break;
|
|
||||||
if (mul == 1 && c >= '5')
|
|
||||||
ms += 1;
|
|
||||||
ms += (c - '0') * (mul /= 10);
|
|
||||||
}
|
}
|
||||||
fields[6] = ms;
|
if (string_get(sp, p) != c)
|
||||||
|
break;
|
||||||
|
p++;
|
||||||
|
if (i == 6) {
|
||||||
|
if (string_get_milliseconds(sp, &p, &fields[i]))
|
||||||
|
goto done;
|
||||||
|
} else {
|
||||||
|
if (string_get_digits(sp, &p, &fields[i]))
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
/* no time: UTC by default */
|
||||||
|
is_local = (i > 3);
|
||||||
fields[1] -= 1;
|
fields[1] -= 1;
|
||||||
|
|
||||||
/* parse the time zone offset if present: [+-]HH:mm */
|
/* parse the time zone offset if present: [+-]HH:mm or [+-]HHmm */
|
||||||
tz = 0;
|
tz = 0;
|
||||||
if (p < sp->len) {
|
if (p < sp->len) {
|
||||||
sgn = string_get(sp, p);
|
sgn = string_get(sp, p);
|
||||||
if (sgn == '+' || sgn == '-') {
|
if (sgn == '+' || sgn == '-') {
|
||||||
if (string_get_field(sp, &p, &hh))
|
p++;
|
||||||
|
l = sp->len - p;
|
||||||
|
if (l != 4 && l != 5)
|
||||||
goto done;
|
goto done;
|
||||||
if (string_get_field(sp, &p, &mm))
|
if (string_get_fixed_width_digits(sp, &p, 2, &hh))
|
||||||
|
goto done;
|
||||||
|
if (l == 5) {
|
||||||
|
if (string_get(sp, p) != ':')
|
||||||
|
goto done;
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
if (string_get_fixed_width_digits(sp, &p, 2, &mm))
|
||||||
goto done;
|
goto done;
|
||||||
tz = hh * 60 + mm;
|
tz = hh * 60 + mm;
|
||||||
if (sgn == '-')
|
if (sgn == '-')
|
||||||
tz = -tz;
|
tz = -tz;
|
||||||
is_local = FALSE;
|
is_local = FALSE;
|
||||||
} else if (sgn == 'Z') {
|
} else if (sgn == 'Z') {
|
||||||
|
p++;
|
||||||
is_local = FALSE;
|
is_local = FALSE;
|
||||||
|
} else {
|
||||||
|
goto done;
|
||||||
}
|
}
|
||||||
|
/* error if extraneous characters */
|
||||||
|
if (p != sp->len)
|
||||||
|
goto done;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* toString or toUTCString format */
|
/* toString or toUTCString format */
|
||||||
|
@ -48304,7 +48522,7 @@ static JSValue js_Date_parse(JSContext *ctx, JSValueConst this_val,
|
||||||
c = string_get(sp, p);
|
c = string_get(sp, p);
|
||||||
if (c >= '0' && c <= '9') {
|
if (c >= '0' && c <= '9') {
|
||||||
/* day of month first */
|
/* day of month first */
|
||||||
if (string_get_field(sp, &p, &fields[2]))
|
if (string_get_digits(sp, &p, &fields[2]))
|
||||||
goto done;
|
goto done;
|
||||||
if (string_get_month(sp, &p, &fields[1]))
|
if (string_get_month(sp, &p, &fields[1]))
|
||||||
goto done;
|
goto done;
|
||||||
|
@ -48312,16 +48530,26 @@ static JSValue js_Date_parse(JSContext *ctx, JSValueConst this_val,
|
||||||
/* month first */
|
/* month first */
|
||||||
if (string_get_month(sp, &p, &fields[1]))
|
if (string_get_month(sp, &p, &fields[1]))
|
||||||
goto done;
|
goto done;
|
||||||
if (string_get_field(sp, &p, &fields[2]))
|
string_skip_spaces(sp, &p);
|
||||||
|
if (string_get_digits(sp, &p, &fields[2]))
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
/* year */
|
||||||
string_skip_spaces(sp, &p);
|
string_skip_spaces(sp, &p);
|
||||||
if (string_get_signed_field(sp, &p, &fields[0]))
|
if (string_get_signed_digits(sp, &p, &fields[0]))
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
/* hour, min, seconds */
|
/* hour, min, seconds */
|
||||||
|
string_skip_spaces(sp, &p);
|
||||||
for(i = 0; i < 3; i++) {
|
for(i = 0; i < 3; i++) {
|
||||||
if (string_get_field(sp, &p, &fields[3 + i]))
|
if (i == 1 || i == 2) {
|
||||||
|
if (p >= sp->len)
|
||||||
|
goto done;
|
||||||
|
if (string_get(sp, p) != ':')
|
||||||
|
goto done;
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
if (string_get_digits(sp, &p, &fields[3 + i]))
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
// XXX: parse optional milliseconds?
|
// XXX: parse optional milliseconds?
|
||||||
|
@ -48333,9 +48561,9 @@ static JSValue js_Date_parse(JSContext *ctx, JSValueConst this_val,
|
||||||
sgn = string_get(sp, p);
|
sgn = string_get(sp, p);
|
||||||
if (sgn == '+' || sgn == '-') {
|
if (sgn == '+' || sgn == '-') {
|
||||||
p++;
|
p++;
|
||||||
if (string_get_digits(sp, &p, 2, &hh))
|
if (string_get_fixed_width_digits(sp, &p, 2, &hh))
|
||||||
goto done;
|
goto done;
|
||||||
if (string_get_digits(sp, &p, 2, &mm))
|
if (string_get_fixed_width_digits(sp, &p, 2, &mm))
|
||||||
goto done;
|
goto done;
|
||||||
tz = hh * 60 + mm;
|
tz = hh * 60 + mm;
|
||||||
if (sgn == '-')
|
if (sgn == '-')
|
||||||
|
@ -51886,9 +52114,15 @@ static JSValue js_typed_array_indexOf(JSContext *ctx, JSValueConst this_val,
|
||||||
inc = 1;
|
inc = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (validate_typed_array(ctx, this_val))
|
|
||||||
goto exception;
|
|
||||||
p = JS_VALUE_GET_OBJ(this_val);
|
p = JS_VALUE_GET_OBJ(this_val);
|
||||||
|
/* if the array was detached, no need to go further (but no
|
||||||
|
exception is raised) */
|
||||||
|
if (typed_array_is_detached(ctx, p)) {
|
||||||
|
/* "includes" scans all the properties, so "undefined" can match */
|
||||||
|
if (special == special_includes && JS_IsUndefined(argv[0]) && len > 0)
|
||||||
|
res = 0;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
is_bigint = 0;
|
is_bigint = 0;
|
||||||
is_int = 0; /* avoid warning */
|
is_int = 0; /* avoid warning */
|
||||||
|
@ -51925,7 +52159,6 @@ static JSValue js_typed_array_indexOf(JSContext *ctx, JSValueConst this_val,
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
p = JS_VALUE_GET_OBJ(this_val);
|
|
||||||
switch (p->class_id) {
|
switch (p->class_id) {
|
||||||
case JS_CLASS_INT8_ARRAY:
|
case JS_CLASS_INT8_ARRAY:
|
||||||
if (is_int && (int8_t)v64 == v64)
|
if (is_int && (int8_t)v64 == v64)
|
||||||
|
@ -52114,13 +52347,16 @@ static JSValue js_typed_array_join(JSContext *ctx, JSValueConst this_val,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
el = JS_GetPropertyUint32(ctx, this_val, i);
|
el = JS_GetPropertyUint32(ctx, this_val, i);
|
||||||
if (JS_IsException(el))
|
/* Can return undefined for example if the typed array is detached */
|
||||||
goto fail;
|
if (!JS_IsNull(el) && !JS_IsUndefined(el)) {
|
||||||
if (toLocaleString) {
|
if (JS_IsException(el))
|
||||||
el = JS_ToLocaleStringFree(ctx, el);
|
goto fail;
|
||||||
|
if (toLocaleString) {
|
||||||
|
el = JS_ToLocaleStringFree(ctx, el);
|
||||||
|
}
|
||||||
|
if (string_buffer_concat_value_free(b, el))
|
||||||
|
goto fail;
|
||||||
}
|
}
|
||||||
if (string_buffer_concat_value_free(b, el))
|
|
||||||
goto fail;
|
|
||||||
}
|
}
|
||||||
JS_FreeValue(ctx, sep);
|
JS_FreeValue(ctx, sep);
|
||||||
return string_buffer_end(b);
|
return string_buffer_end(b);
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
/*
|
/*
|
||||||
* QuickJS Javascript Engine
|
* QuickJS Javascript Engine
|
||||||
*
|
*
|
||||||
* Copyright (c) 2017-2020 Fabrice Bellard
|
* Copyright (c) 2017-2021 Fabrice Bellard
|
||||||
* Copyright (c) 2017-2020 Charlie Gordon
|
* Copyright (c) 2017-2021 Charlie Gordon
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
@ -333,7 +333,11 @@ JSRuntime *JS_NewRuntime(void);
|
||||||
void JS_SetRuntimeInfo(JSRuntime *rt, const char *info);
|
void JS_SetRuntimeInfo(JSRuntime *rt, const char *info);
|
||||||
void JS_SetMemoryLimit(JSRuntime *rt, size_t limit);
|
void JS_SetMemoryLimit(JSRuntime *rt, size_t limit);
|
||||||
void JS_SetGCThreshold(JSRuntime *rt, size_t gc_threshold);
|
void JS_SetGCThreshold(JSRuntime *rt, size_t gc_threshold);
|
||||||
|
/* use 0 to disable maximum stack size check */
|
||||||
void JS_SetMaxStackSize(JSRuntime *rt, size_t stack_size);
|
void JS_SetMaxStackSize(JSRuntime *rt, size_t stack_size);
|
||||||
|
/* should be called when changing thread to update the stack top value
|
||||||
|
used to check stack overflow. */
|
||||||
|
void JS_UpdateStackTop(JSRuntime *rt);
|
||||||
JSRuntime *JS_NewRuntime2(const JSMallocFunctions *mf, void *opaque);
|
JSRuntime *JS_NewRuntime2(const JSMallocFunctions *mf, void *opaque);
|
||||||
void JS_FreeRuntime(JSRuntime *rt);
|
void JS_FreeRuntime(JSRuntime *rt);
|
||||||
void *JS_GetRuntimeOpaque(JSRuntime *rt);
|
void *JS_GetRuntimeOpaque(JSRuntime *rt);
|
||||||
|
|
|
@ -131,7 +131,8 @@ outdir="/tmp/${d}"
|
||||||
rm -rf $outdir
|
rm -rf $outdir
|
||||||
mkdir -p $outdir $outdir/doc $outdir/tests $outdir/examples
|
mkdir -p $outdir $outdir/doc $outdir/tests $outdir/examples
|
||||||
|
|
||||||
cp Makefile VERSION TODO Changelog readme.txt release.sh unicode_download.sh \
|
cp Makefile VERSION TODO Changelog readme.txt LICENSE \
|
||||||
|
release.sh unicode_download.sh \
|
||||||
qjs.c qjsc.c qjscalc.js repl.js \
|
qjs.c qjsc.c qjscalc.js repl.js \
|
||||||
quickjs.c quickjs.h quickjs-atom.h \
|
quickjs.c quickjs.h quickjs-atom.h \
|
||||||
quickjs-libc.c quickjs-libc.h quickjs-opcode.h \
|
quickjs-libc.c quickjs-libc.h quickjs-opcode.h \
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
/*
|
/*
|
||||||
* ECMA Test 262 Runner for QuickJS
|
* ECMA Test 262 Runner for QuickJS
|
||||||
*
|
*
|
||||||
* Copyright (c) 2017-2020 Fabrice Bellard
|
* Copyright (c) 2017-2021 Fabrice Bellard
|
||||||
* Copyright (c) 2017-2020 Charlie Gordon
|
* Copyright (c) 2017-2021 Charlie Gordon
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|
|
@ -51,10 +51,10 @@ testdir=test262/test
|
||||||
AggregateError
|
AggregateError
|
||||||
align-detached-buffer-semantics-with-web-reality
|
align-detached-buffer-semantics-with-web-reality
|
||||||
arbitrary-module-namespace-names=skip
|
arbitrary-module-namespace-names=skip
|
||||||
|
Array.prototype.at=skip
|
||||||
Array.prototype.flat
|
Array.prototype.flat
|
||||||
Array.prototype.flatMap
|
Array.prototype.flatMap
|
||||||
Array.prototype.flatten
|
Array.prototype.flatten
|
||||||
Array.prototype.item=skip
|
|
||||||
Array.prototype.values
|
Array.prototype.values
|
||||||
ArrayBuffer
|
ArrayBuffer
|
||||||
arrow-function
|
arrow-function
|
||||||
|
@ -141,7 +141,7 @@ string-trimming
|
||||||
String.fromCodePoint
|
String.fromCodePoint
|
||||||
String.prototype.endsWith
|
String.prototype.endsWith
|
||||||
String.prototype.includes
|
String.prototype.includes
|
||||||
String.prototype.item=skip
|
String.prototype.at=skip
|
||||||
String.prototype.matchAll
|
String.prototype.matchAll
|
||||||
String.prototype.replaceAll
|
String.prototype.replaceAll
|
||||||
String.prototype.trimEnd
|
String.prototype.trimEnd
|
||||||
|
@ -166,7 +166,7 @@ tail-call-optimization=skip
|
||||||
template
|
template
|
||||||
top-level-await=skip
|
top-level-await=skip
|
||||||
TypedArray
|
TypedArray
|
||||||
TypedArray.prototype.item=skip
|
TypedArray.prototype.at=skip
|
||||||
u180e
|
u180e
|
||||||
Uint16Array
|
Uint16Array
|
||||||
Uint32Array
|
Uint32Array
|
||||||
|
|
|
@ -2,50 +2,34 @@ test262/test/built-ins/Function/internals/Construct/derived-this-uninitialized-r
|
||||||
test262/test/built-ins/Function/internals/Construct/derived-this-uninitialized-realm.js:20: strict mode: Test262Error: Expected a ReferenceError but got a ReferenceError
|
test262/test/built-ins/Function/internals/Construct/derived-this-uninitialized-realm.js:20: strict mode: Test262Error: Expected a ReferenceError but got a ReferenceError
|
||||||
test262/test/built-ins/RegExp/named-groups/non-unicode-property-names-valid.js:46: SyntaxError: invalid group name
|
test262/test/built-ins/RegExp/named-groups/non-unicode-property-names-valid.js:46: SyntaxError: invalid group name
|
||||||
test262/test/built-ins/RegExp/named-groups/non-unicode-property-names-valid.js:46: strict mode: SyntaxError: invalid group name
|
test262/test/built-ins/RegExp/named-groups/non-unicode-property-names-valid.js:46: strict mode: SyntaxError: invalid group name
|
||||||
test262/test/built-ins/TypedArray/prototype/every/BigInt/callbackfn-detachbuffer.js:28: Test262Error: Expected SameValue(«1», «2») to be true (Testing with BigInt64Array.)
|
test262/test/built-ins/TypedArrayConstructors/internals/DefineOwnProperty/BigInt/detached-buffer.js:46: Test262Error: (Testing with BigInt64Array.)
|
||||||
test262/test/built-ins/TypedArray/prototype/every/BigInt/callbackfn-detachbuffer.js:28: strict mode: Test262Error: Expected SameValue(«1», «2») to be true (Testing with BigInt64Array.)
|
test262/test/built-ins/TypedArrayConstructors/internals/DefineOwnProperty/BigInt/detached-buffer.js:46: strict mode: Test262Error: (Testing with BigInt64Array.)
|
||||||
test262/test/built-ins/TypedArray/prototype/every/callbackfn-detachbuffer.js:28: Test262Error: Expected SameValue(«1», «2») to be true (Testing with Float64Array.)
|
test262/test/built-ins/TypedArrayConstructors/internals/DefineOwnProperty/detached-buffer.js:47: Test262Error: (Testing with Float64Array.)
|
||||||
test262/test/built-ins/TypedArray/prototype/every/callbackfn-detachbuffer.js:28: strict mode: Test262Error: Expected SameValue(«1», «2») to be true (Testing with Float64Array.)
|
test262/test/built-ins/TypedArrayConstructors/internals/DefineOwnProperty/detached-buffer.js:47: strict mode: Test262Error: (Testing with Float64Array.)
|
||||||
test262/test/built-ins/TypedArray/prototype/filter/BigInt/callbackfn-detachbuffer.js:20: Test262Error: Expected SameValue(«1», «2») to be true (Testing with BigInt64Array.)
|
test262/test/built-ins/TypedArrayConstructors/internals/Set/BigInt/detached-buffer-realm.js:37: strict mode: TypeError: out-of-bound numeric index (Testing with BigInt64Array.)
|
||||||
test262/test/built-ins/TypedArray/prototype/filter/BigInt/callbackfn-detachbuffer.js:20: strict mode: Test262Error: Expected SameValue(«1», «2») to be true (Testing with BigInt64Array.)
|
|
||||||
test262/test/built-ins/TypedArray/prototype/filter/callbackfn-detachbuffer.js:20: Test262Error: Expected SameValue(«1», «2») to be true (Testing with Float64Array.)
|
|
||||||
test262/test/built-ins/TypedArray/prototype/filter/callbackfn-detachbuffer.js:20: strict mode: Test262Error: Expected SameValue(«1», «2») to be true (Testing with Float64Array.)
|
|
||||||
test262/test/built-ins/TypedArray/prototype/findIndex/BigInt/predicate-may-detach-buffer.js:36: Test262Error: throws a TypeError getting a value from the detached buffer Expected a TypeError to be thrown but no exception was thrown at all (Testing with BigInt64Array.)
|
|
||||||
test262/test/built-ins/TypedArray/prototype/findIndex/BigInt/predicate-may-detach-buffer.js:36: strict mode: Test262Error: throws a TypeError getting a value from the detached buffer Expected a TypeError to be thrown but no exception was thrown at all (Testing with BigInt64Array.)
|
|
||||||
test262/test/built-ins/TypedArray/prototype/forEach/BigInt/callbackfn-detachbuffer.js:28: Test262Error: Expected SameValue(«1», «2») to be true (Testing with BigInt64Array.)
|
|
||||||
test262/test/built-ins/TypedArray/prototype/forEach/BigInt/callbackfn-detachbuffer.js:28: strict mode: Test262Error: Expected SameValue(«1», «2») to be true (Testing with BigInt64Array.)
|
|
||||||
test262/test/built-ins/TypedArray/prototype/forEach/callbackfn-detachbuffer.js:28: Test262Error: Expected SameValue(«1», «2») to be true (Testing with Float64Array.)
|
|
||||||
test262/test/built-ins/TypedArray/prototype/forEach/callbackfn-detachbuffer.js:28: strict mode: Test262Error: Expected SameValue(«1», «2») to be true (Testing with Float64Array.)
|
|
||||||
test262/test/built-ins/TypedArray/prototype/map/BigInt/callbackfn-detachbuffer.js:20: Test262Error: Expected SameValue(«1», «2») to be true (Testing with BigInt64Array.)
|
|
||||||
test262/test/built-ins/TypedArray/prototype/map/BigInt/callbackfn-detachbuffer.js:20: strict mode: Test262Error: Expected SameValue(«1», «2») to be true (Testing with BigInt64Array.)
|
|
||||||
test262/test/built-ins/TypedArray/prototype/map/callbackfn-detachbuffer.js:20: Test262Error: Expected SameValue(«1», «2») to be true (Testing with Float64Array.)
|
|
||||||
test262/test/built-ins/TypedArray/prototype/map/callbackfn-detachbuffer.js:20: strict mode: Test262Error: Expected SameValue(«1», «2») to be true (Testing with Float64Array.)
|
|
||||||
test262/test/built-ins/TypedArray/prototype/reduce/BigInt/callbackfn-detachbuffer.js:29: Test262Error: Expected SameValue(«1», «2») to be true (Testing with BigInt64Array.)
|
|
||||||
test262/test/built-ins/TypedArray/prototype/reduce/BigInt/callbackfn-detachbuffer.js:29: strict mode: Test262Error: Expected SameValue(«1», «2») to be true (Testing with BigInt64Array.)
|
|
||||||
test262/test/built-ins/TypedArray/prototype/reduce/callbackfn-detachbuffer.js:29: Test262Error: Expected SameValue(«1», «2») to be true (Testing with Float64Array.)
|
|
||||||
test262/test/built-ins/TypedArray/prototype/reduce/callbackfn-detachbuffer.js:29: strict mode: Test262Error: Expected SameValue(«1», «2») to be true (Testing with Float64Array.)
|
|
||||||
test262/test/built-ins/TypedArray/prototype/reduceRight/BigInt/callbackfn-detachbuffer.js:29: Test262Error: Expected SameValue(«1», «2») to be true (Testing with BigInt64Array.)
|
|
||||||
test262/test/built-ins/TypedArray/prototype/reduceRight/BigInt/callbackfn-detachbuffer.js:29: strict mode: Test262Error: Expected SameValue(«1», «2») to be true (Testing with BigInt64Array.)
|
|
||||||
test262/test/built-ins/TypedArray/prototype/reduceRight/callbackfn-detachbuffer.js:29: Test262Error: Expected SameValue(«1», «2») to be true (Testing with Float64Array.)
|
|
||||||
test262/test/built-ins/TypedArray/prototype/reduceRight/callbackfn-detachbuffer.js:29: strict mode: Test262Error: Expected SameValue(«1», «2») to be true (Testing with Float64Array.)
|
|
||||||
test262/test/built-ins/TypedArray/prototype/some/BigInt/callbackfn-detachbuffer.js:28: Test262Error: Expected SameValue(«1», «2») to be true (Testing with BigInt64Array.)
|
|
||||||
test262/test/built-ins/TypedArray/prototype/some/BigInt/callbackfn-detachbuffer.js:28: strict mode: Test262Error: Expected SameValue(«1», «2») to be true (Testing with BigInt64Array.)
|
|
||||||
test262/test/built-ins/TypedArray/prototype/some/callbackfn-detachbuffer.js:28: Test262Error: Expected SameValue(«1», «2») to be true (Testing with Float64Array.)
|
|
||||||
test262/test/built-ins/TypedArray/prototype/some/callbackfn-detachbuffer.js:28: strict mode: Test262Error: Expected SameValue(«1», «2») to be true (Testing with Float64Array.)
|
|
||||||
test262/test/built-ins/TypedArrayConstructors/internals/DefineOwnProperty/BigInt/detached-buffer.js:37: Test262Error: (Testing with BigInt64Array.)
|
|
||||||
test262/test/built-ins/TypedArrayConstructors/internals/DefineOwnProperty/BigInt/detached-buffer.js:37: strict mode: Test262Error: (Testing with BigInt64Array.)
|
|
||||||
test262/test/built-ins/TypedArrayConstructors/internals/DefineOwnProperty/detached-buffer.js:38: Test262Error: (Testing with Float64Array.)
|
|
||||||
test262/test/built-ins/TypedArrayConstructors/internals/DefineOwnProperty/detached-buffer.js:38: strict mode: Test262Error: (Testing with Float64Array.)
|
|
||||||
test262/test/built-ins/TypedArrayConstructors/internals/GetOwnProperty/BigInt/index-prop-desc.js:21: Test262Error: Expected SameValue(«43», «42») to be true (Testing with BigInt64Array.)
|
|
||||||
test262/test/built-ins/TypedArrayConstructors/internals/GetOwnProperty/BigInt/index-prop-desc.js:21: strict mode: Test262Error: Expected SameValue(«43», «42») to be true (Testing with BigInt64Array.)
|
|
||||||
test262/test/built-ins/TypedArrayConstructors/internals/GetOwnProperty/index-prop-desc.js:22: Test262Error: Expected SameValue(«43», «42») to be true (Testing with Float64Array.)
|
|
||||||
test262/test/built-ins/TypedArrayConstructors/internals/GetOwnProperty/index-prop-desc.js:22: strict mode: Test262Error: Expected SameValue(«43», «42») to be true (Testing with Float64Array.)
|
|
||||||
test262/test/built-ins/TypedArrayConstructors/internals/Set/BigInt/detached-buffer-realm.js:36: strict mode: TypeError: out-of-bound numeric index (Testing with BigInt64Array.)
|
|
||||||
test262/test/built-ins/TypedArrayConstructors/internals/Set/BigInt/detached-buffer.js:34: TypeError: cannot convert bigint to number (Testing with BigInt64Array.)
|
test262/test/built-ins/TypedArrayConstructors/internals/Set/BigInt/detached-buffer.js:34: TypeError: cannot convert bigint to number (Testing with BigInt64Array.)
|
||||||
test262/test/built-ins/TypedArrayConstructors/internals/Set/BigInt/detached-buffer.js:32: strict mode: TypeError: out-of-bound numeric index (Testing with BigInt64Array.)
|
test262/test/built-ins/TypedArrayConstructors/internals/Set/BigInt/detached-buffer.js:32: strict mode: TypeError: out-of-bound numeric index (Testing with BigInt64Array.)
|
||||||
test262/test/built-ins/TypedArrayConstructors/internals/Set/detached-buffer-realm.js:36: strict mode: TypeError: out-of-bound numeric index (Testing with Float64Array.)
|
test262/test/built-ins/TypedArrayConstructors/internals/Set/BigInt/key-is-minus-zero.js:20: Test262Error: Reflect.set("new TA([42n])", "-0", 1n) must return true Expected SameValue(«false», «true») to be true (Testing with BigInt64Array.)
|
||||||
|
test262/test/built-ins/TypedArrayConstructors/internals/Set/BigInt/key-is-minus-zero.js:20: strict mode: Test262Error: Reflect.set("new TA([42n])", "-0", 1n) must return true Expected SameValue(«false», «true») to be true (Testing with BigInt64Array.)
|
||||||
|
test262/test/built-ins/TypedArrayConstructors/internals/Set/BigInt/key-is-not-integer.js:21: Test262Error: Reflect.set("new TA([42n])", "1.1", 1n) must return true Expected SameValue(«false», «true») to be true (Testing with BigInt64Array.)
|
||||||
|
test262/test/built-ins/TypedArrayConstructors/internals/Set/BigInt/key-is-not-integer.js:21: strict mode: Test262Error: Reflect.set("new TA([42n])", "1.1", 1n) must return true Expected SameValue(«false», «true») to be true (Testing with BigInt64Array.)
|
||||||
|
test262/test/built-ins/TypedArrayConstructors/internals/Set/BigInt/key-is-out-of-bounds.js:27: Test262Error: Reflect.set("new TA([42n])", "-1", 1n) must return false Expected SameValue(«false», «true») to be true (Testing with BigInt64Array.)
|
||||||
|
test262/test/built-ins/TypedArrayConstructors/internals/Set/BigInt/key-is-out-of-bounds.js:27: strict mode: Test262Error: Reflect.set("new TA([42n])", "-1", 1n) must return false Expected SameValue(«false», «true») to be true (Testing with BigInt64Array.)
|
||||||
|
test262/test/built-ins/TypedArrayConstructors/internals/Set/BigInt/tonumber-value-detached-buffer.js:24: Test262Error: Expected SameValue(«false», «true») to be true (Testing with BigInt64Array.)
|
||||||
|
test262/test/built-ins/TypedArrayConstructors/internals/Set/BigInt/tonumber-value-detached-buffer.js:24: strict mode: Test262Error: Expected SameValue(«false», «true») to be true (Testing with BigInt64Array.)
|
||||||
|
test262/test/built-ins/TypedArrayConstructors/internals/Set/detached-buffer-realm.js:37: strict mode: TypeError: out-of-bound numeric index (Testing with Float64Array.)
|
||||||
test262/test/built-ins/TypedArrayConstructors/internals/Set/detached-buffer.js:32: strict mode: TypeError: out-of-bound numeric index (Testing with Float64Array.)
|
test262/test/built-ins/TypedArrayConstructors/internals/Set/detached-buffer.js:32: strict mode: TypeError: out-of-bound numeric index (Testing with Float64Array.)
|
||||||
|
test262/test/built-ins/TypedArrayConstructors/internals/Set/key-is-minus-zero.js:22: Test262Error: Reflect.set(sample, "-0", 1) must return true Expected SameValue(«false», «true») to be true (Testing with Float64Array.)
|
||||||
|
test262/test/built-ins/TypedArrayConstructors/internals/Set/key-is-minus-zero.js:22: strict mode: Test262Error: Reflect.set(sample, "-0", 1) must return true Expected SameValue(«false», «true») to be true (Testing with Float64Array.)
|
||||||
|
test262/test/built-ins/TypedArrayConstructors/internals/Set/key-is-not-integer.js:22: Test262Error: Reflect.set(sample, "1.1", 1) must return true Expected SameValue(«false», «true») to be true (Testing with Float64Array.)
|
||||||
|
test262/test/built-ins/TypedArrayConstructors/internals/Set/key-is-not-integer.js:22: strict mode: Test262Error: Reflect.set(sample, "1.1", 1) must return true Expected SameValue(«false», «true») to be true (Testing with Float64Array.)
|
||||||
|
test262/test/built-ins/TypedArrayConstructors/internals/Set/key-is-out-of-bounds.js:22: Test262Error: Reflect.set(sample, "-1", 1) must return true Expected SameValue(«false», «true») to be true (Testing with Float64Array.)
|
||||||
|
test262/test/built-ins/TypedArrayConstructors/internals/Set/key-is-out-of-bounds.js:22: strict mode: Test262Error: Reflect.set(sample, "-1", 1) must return true Expected SameValue(«false», «true») to be true (Testing with Float64Array.)
|
||||||
|
test262/test/built-ins/TypedArrayConstructors/internals/Set/tonumber-value-detached-buffer.js:39: Test262Error: Expected SameValue(«false», «true») to be true (Testing with Float64Array.)
|
||||||
|
test262/test/built-ins/TypedArrayConstructors/internals/Set/tonumber-value-detached-buffer.js:39: strict mode: Test262Error: Expected SameValue(«false», «true») to be true (Testing with Float64Array.)
|
||||||
test262/test/language/expressions/dynamic-import/usage-from-eval.js:26: TypeError: $DONE() not called
|
test262/test/language/expressions/dynamic-import/usage-from-eval.js:26: TypeError: $DONE() not called
|
||||||
test262/test/language/expressions/dynamic-import/usage-from-eval.js:26: strict mode: TypeError: $DONE() not called
|
test262/test/language/expressions/dynamic-import/usage-from-eval.js:26: strict mode: TypeError: $DONE() not called
|
||||||
test262/test/language/expressions/optional-chaining/optional-call-preserves-this.js:21: TypeError: cannot read property 'c' of undefined
|
test262/test/language/expressions/optional-chaining/optional-call-preserves-this.js:21: TypeError: cannot read property 'c' of undefined
|
||||||
test262/test/language/expressions/optional-chaining/optional-call-preserves-this.js:15: strict mode: TypeError: cannot read property '_b' of undefined
|
test262/test/language/expressions/optional-chaining/optional-call-preserves-this.js:15: strict mode: TypeError: cannot read property '_b' of undefined
|
||||||
|
test262/test/language/statements/for-of/head-lhs-async-invalid.js:14: unexpected error type: Test262: This statement should not be evaluated.
|
||||||
|
test262/test/language/statements/for-of/head-lhs-async-invalid.js:14: strict mode: unexpected error type: Test262: This statement should not be evaluated.
|
||||||
|
|
|
@ -399,7 +399,7 @@ function test_eval()
|
||||||
|
|
||||||
function test_typed_array()
|
function test_typed_array()
|
||||||
{
|
{
|
||||||
var buffer, a, i;
|
var buffer, a, i, str;
|
||||||
|
|
||||||
a = new Uint8Array(4);
|
a = new Uint8Array(4);
|
||||||
assert(a.length, 4);
|
assert(a.length, 4);
|
||||||
|
@ -439,7 +439,12 @@ function test_typed_array()
|
||||||
|
|
||||||
a = new Uint8Array(buffer);
|
a = new Uint8Array(buffer);
|
||||||
|
|
||||||
assert(a.toString(), "0,0,255,255,0,0,0,0,0,0,128,63,255,255,255,255");
|
str = a.toString();
|
||||||
|
/* test little and big endian cases */
|
||||||
|
if (str !== "0,0,255,255,0,0,0,0,0,0,128,63,255,255,255,255" &&
|
||||||
|
str !== "0,0,255,255,0,0,0,0,63,128,0,0,255,255,255,255") {
|
||||||
|
assert(false);
|
||||||
|
}
|
||||||
|
|
||||||
assert(a.buffer, buffer);
|
assert(a.buffer, buffer);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue