njs_array_realloc(njs_vm_t *vm, njs_array_t *array, uint32_t prepend,
uint32_t size)
{
- nxt_uint_t n;
+ nxt_uint_t n;
njs_value_t *value;
if (size != array->size) {
static const njs_object_prop_t njs_array_function_properties[] =
{
+ /* Array.name == "Array". */
{ njs_string("Array"),
njs_string("name"),
NJS_PROPERTY, 0, 0, 0, },
+ /* Array.length == 1. */
{ njs_value(NJS_NUMBER, 1, 1.0),
njs_string("length"),
NJS_PROPERTY, 0, 0, 0, },
+ /* Array.prototype. */
{ njs_getter(njs_object_prototype_create_prototype),
njs_string("prototype"),
NJS_NATIVE_GETTER, 0, 0, 0, },
{
size_t length;
uintptr_t nargs;
- nxt_uint_t i;
+ nxt_uint_t i;
njs_value_t *object, *args, *value;
njs_array_t *array;
static njs_ret_t
njs_array_prototype_some(njs_vm_t *vm, njs_param_t *param)
{
- nxt_int_t n;
uintptr_t nargs;
+ nxt_int_t n;
njs_param_t p;
njs_array_t *array;
njs_value_t *object, *args, *func, arguments[3];
static njs_ret_t
njs_array_prototype_every(njs_vm_t *vm, njs_param_t *param)
{
- nxt_int_t n;
uintptr_t nargs;
+ nxt_int_t n;
njs_param_t p;
njs_array_t *array;
njs_value_t *object, *args, *func, arguments[3];
njs_disassembler(u_char *start, u_char *end, nxt_str_t *text)
{
u_char *p;
- nxt_uint_t n;
- nxt_str_t *name;
+ nxt_uint_t n;
+ nxt_str_t *name;
njs_vmcode_1addr_t *code1;
njs_vmcode_2addr_t *code2;
njs_vmcode_3addr_t *code3;
njs_code_name_t *code_name;
njs_vmcode_operation_t operation;
- static nxt_str_t unknown = nxt_string("UNKOWN");
+ static nxt_str_t unknown = nxt_string("UNKOWN");
(void) name;
(void) code1;
njs_external_t *external, nxt_uint_t n)
{
nxt_int_t ret;
- njs_extern_t *ext;
+ njs_extern_t *ext;
nxt_lvlhsh_query_t lhq;
do {
static const njs_object_prop_t njs_function_function_properties[] =
{
+ /* Function.name == "Function". */
{ njs_string("Function"),
njs_string("name"),
NJS_PROPERTY, 0, 0, 0, },
- { njs_value(NJS_NUMBER, 0, 0.0),
+ /* Function.length == 1. */
+ { njs_value(NJS_NUMBER, 0, 1.0),
njs_string("length"),
NJS_PROPERTY, 0, 0, 0, },
+ /* Function.prototype. */
{ njs_getter(njs_object_prototype_create_prototype),
njs_string("prototype"),
NJS_NATIVE_GETTER, 0, 0, 0, },
njs_parser_node_t *node)
{
u_char *start;
- nxt_int_t ret;
+ nxt_int_t ret;
njs_ret_t *label;
njs_vmcode_jump_t *jump;
njs_vmcode_cond_jump_t *cond_jump;
njs_generate_function_call(njs_vm_t *vm, njs_parser_t *parser,
njs_parser_node_t *node)
{
- nxt_int_t ret;
uintptr_t nargs;
+ nxt_int_t ret;
njs_index_t retval, index, name;
njs_parser_node_t *arg;
njs_vmcode_call_t *call;
njs_generate_method_call(njs_vm_t *vm, njs_parser_t *parser,
njs_parser_node_t *node)
{
- nxt_int_t ret;
uintptr_t nargs;
+ nxt_int_t ret;
njs_index_t retval, index;
njs_parser_node_t *arg, *prop;
njs_vmcode_call_t *call;
static njs_token_t njs_lexer_next_token(njs_lexer_t *lexer);
static njs_token_t njs_lexer_word(njs_lexer_t *lexer, u_char c);
-static njs_token_t njs_lexer_string(njs_lexer_t *lexer,
- u_char quote);
+static njs_token_t njs_lexer_string(njs_lexer_t *lexer, u_char quote);
static njs_token_t njs_lexer_number(njs_lexer_t *lexer);
static njs_token_t njs_lexer_multi(njs_lexer_t *lexer,
njs_token_t token, nxt_uint_t n, const njs_lexer_multi_t *multi);
njs_lexer_next_token(njs_lexer_t *lexer)
{
u_char c;
- nxt_uint_t n;
+ nxt_uint_t n;
njs_token_t token;
const njs_lexer_multi_t *multi;
return multi->token;
}
- return njs_lexer_multi(lexer, multi->token,
- multi->count, multi->next);
+ return njs_lexer_multi(lexer, multi->token, multi->count,
+ multi->next);
}
multi++;
typedef struct {
- nxt_str_t name;
+ nxt_str_t name;
njs_token_t token;
double number;
} njs_keyword_t;
nxt_int_t
njs_lexer_keywords_init(nxt_mem_cache_pool_t *mcp, nxt_lvlhsh_t *hash)
{
- nxt_uint_t n;
- nxt_lvlhsh_query_t lhq;
+ nxt_uint_t n;
+ nxt_lvlhsh_query_t lhq;
const njs_keyword_t *keyword;
keyword = njs_keywords;
njs_token_t
njs_lexer_keyword(njs_lexer_t *lexer)
{
- njs_keyword_t *keyword;
+ njs_keyword_t *keyword;
nxt_lvlhsh_query_t lhq;
lhq.key_hash = lexer->key_hash;
static nxt_int_t
njs_parser_test_token(njs_vm_t *vm, njs_parser_t *parser, void *data)
{
- njs_token_t token;
+ njs_token_t token;
token = (njs_token_t) data;
static const njs_object_prop_t njs_number_function_properties[] =
{
+ /* Number.name == "Number". */
{ njs_string("Number"),
njs_string("name"),
NJS_PROPERTY, 0, 0, 0, },
+ /* Number.length == 1. */
{ njs_value(NJS_NUMBER, 1, 1.0),
njs_string("length"),
NJS_PROPERTY, 0, 0, 0, },
+ /* Number.prototype. */
{ njs_getter(njs_object_prototype_create_prototype),
njs_string("prototype"),
NJS_NATIVE_GETTER, 0, 0, 0, },
static njs_ret_t
njs_object_create(njs_vm_t *vm, njs_param_t *param)
{
- njs_value_t *args;
- njs_object_t *obj;
+ njs_value_t *args;
+ njs_object_t *obj;
/* STUB: move to shared create to avoid threads locks. */
static nxt_lvlhsh_t njs_null_proto_shared_hash;
njs_object_prototype_create_prototype(njs_vm_t *vm, njs_value_t *value)
{
int32_t index;
- nxt_int_t ret;
+ nxt_int_t ret;
njs_object_t *prototype;
njs_function_t *function;
njs_object_prop_t *prop;
static const njs_object_prop_t njs_object_function_properties[] =
{
+ /* Object.name == "name". */
{ njs_string("Object"),
njs_string("name"),
NJS_PROPERTY, 0, 0, 0, },
+ /* Object.length == 1. */
+ { njs_value(NJS_NUMBER, 1, 1.0),
+ njs_string("length"),
+ NJS_PROPERTY, 0, 0, 0, },
+
+ /* Object.prototype. */
{ njs_getter(njs_object_prototype_create_prototype),
njs_string("prototype"),
NJS_NATIVE_GETTER, 0, 0, 0, },
+ /* Object.create(). */
{ njs_native_function(njs_object_create, 0),
njs_string("create"),
NJS_METHOD, 0, 0, 0, },
NJS_NATIVE_GETTER,
NJS_NATIVE_SETTER,
NJS_WHITEOUT,
-} njs_ojbect_property_type_t;
+} njs_object_property_type_t;
typedef struct {
njs_value_t value;
njs_value_t name;
- njs_ojbect_property_type_t type:8; /* 3 bits */
+ njs_object_property_type_t type:8; /* 3 bits */
uint8_t enumerable; /* 1 bit */
uint8_t writable; /* 1 bit */
uint8_t configurable; /* 1 bit */
for ( ;; ) {
token = njs_parser_statement(vm, parser, token);
+
if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
if (vm->exception == NULL) {
/* Vector of njs_variable_t. */
nxt_array_t *arguments;
- nxt_lvlhsh_t variables_hash;
- nxt_lvlhsh_t values_hash;
- nxt_lvlhsh_t functions_hash;
+ nxt_lvlhsh_t variables_hash;
+ nxt_lvlhsh_t values_hash;
+ nxt_lvlhsh_t functions_hash;
nxt_array_t *index_cache;
njs_index_t index[NJS_SCOPES - NJS_INDEX_CACHE];
typedef struct {
- njs_token_t token;
- njs_vmcode_operation_t operation;
+ njs_token_t token;
+ njs_vmcode_operation_t operation;
} njs_parser_operation_t;
-typedef struct njs_parser_expression_s
- njs_parser_expression_t;
+typedef struct njs_parser_expression_s njs_parser_expression_t;
struct njs_parser_expression_s {
- njs_token_t (*next)(njs_vm_t *,
- njs_parser_t *,
- const njs_parser_expression_t *,
- njs_token_t);
+ njs_token_t (*next)(njs_vm_t *,
+ njs_parser_t *,
+ const njs_parser_expression_t *,
+ njs_token_t);
const njs_parser_expression_t *expression;
- nxt_uint_t count;
+ nxt_uint_t count;
#if (NXT_SUNC)
/*
static njs_ret_t
njs_regexp_prototype_test(njs_vm_t *vm, njs_param_t *param)
{
- nxt_uint_t n;
njs_ret_t ret;
+ nxt_uint_t n;
njs_value_t val;
const njs_value_t *retval;
njs_string_prop_t string;
njs_regexp_prototype_exec(njs_vm_t *vm, njs_param_t *param)
{
int *captures, ncaptures;
- nxt_uint_t n, utf8;
njs_ret_t ret;
+ nxt_uint_t n, utf8;
njs_regexp_t *regexp;
njs_string_prop_t string;
njs_regexp_pattern_t *pattern;
{
u_char *start;
int32_t size, length;
- nxt_uint_t i, n;
njs_ret_t ret;
+ nxt_uint_t i, n;
njs_array_t *array;
njs_object_prop_t *prop;
nxt_lvlhsh_query_t lhq;
static const njs_object_prop_t njs_regexp_function_properties[] =
{
+ /* RegExp.name == "RegExp". */
{ njs_string("RegExp"),
njs_string("name"),
NJS_PROPERTY, 0, 0, 0, },
+ /* RegExp.length == 2. */
{ njs_value(NJS_NUMBER, 1, 2.0),
njs_string("length"),
NJS_PROPERTY, 0, 0, 0, },
+ /* RegExp.prototype. */
{ njs_getter(njs_object_prototype_create_prototype),
njs_string("prototype"),
NJS_NATIVE_GETTER, 0, 0, 0, },
struct njs_regexp_pattern_s {
- pcre *code[2];
- pcre_extra *extra[2];
- u_char *source;
+ pcre *code[2];
+ pcre_extra *extra[2];
+ u_char *source;
#if (NXT_64BIT)
- uint32_t ncaptures;
- uint8_t global; /* 1 bit */
- uint8_t ignore_case; /* 1 bit */
- uint8_t multiline; /* 1 bit */
+ uint32_t ncaptures;
+ uint8_t global; /* 1 bit */
+ uint8_t ignore_case; /* 1 bit */
+ uint8_t multiline; /* 1 bit */
#else
- uint16_t ncaptures;
- uint8_t global; /* 1 bit */
- uint8_t ignore_case:1;
- uint8_t multiline:1;
+ uint16_t ncaptures;
+ uint8_t global; /* 1 bit */
+ uint8_t ignore_case:1;
+ uint8_t multiline:1;
#endif
};
* Object(),
* Object.__proto__ -> Function_Prototype,
* Object_Prototype.__proto__ -> null,
- * the null value is handled by njs_object_prototype_get_prototype(),
+ * the null value is handled by njs_object_prototype_get_proto(),
*
* Array(),
* Array.__proto__ -> Function_Prototype,
#include <string.h>
-static nxt_noinline njs_ret_t njs_string_index_of(njs_vm_t *vm, njs_value_t *src,
- njs_value_t *search_string, size_t index);
+static nxt_noinline ssize_t njs_string_index_of(njs_vm_t *vm,
+ njs_value_t *src, njs_value_t *search_string, size_t index);
njs_ret_t
nxt_noinline njs_ret_t
njs_string_validate(njs_vm_t *vm, njs_string_prop_t *string, njs_value_t *value)
{
- u_char *start;
- size_t new_size;
- ssize_t size;
- njs_ret_t length;
+ u_char *start;
+ size_t new_size;
+ ssize_t size, length;
size = value->short_string.size;
static const njs_object_prop_t njs_string_function_properties[] =
{
+ /* String.name == "String". */
{ njs_string("String"),
njs_string("name"),
NJS_PROPERTY, 0, 0, 0, },
+ /* String.length == 1. */
{ njs_value(NJS_NUMBER, 1, 1.0),
njs_string("length"),
NJS_PROPERTY, 0, 0, 0, },
+ /* String.prototype. */
{ njs_getter(njs_object_prototype_create_prototype),
njs_string("prototype"),
NJS_NATIVE_GETTER, 0, 0, 0, },
}
if ((size_t) length == string.size) {
- return njs_string_create(vm, &vm->retval, string.start,
- length, length);
+ return njs_string_create(vm, &vm->retval, string.start, length, length);
}
/* length != string.size */
nxt_int_t
njs_string_cmp(const njs_value_t *v1, const njs_value_t *v2)
{
- nxt_int_t ret;
size_t size, size1, size2;
+ nxt_int_t ret;
const u_char *start1, *start2;
size1 = v1->short_string.size;
u_char *p, *start;
size_t size, length, mask;
uintptr_t nargs;
- nxt_uint_t i;
njs_ret_t ret;
+ nxt_uint_t i;
njs_value_t *object, *args, *values;
njs_string_prop_t string;
njs_string_prototype_char_code_at(njs_vm_t *vm, njs_param_t *param)
{
double num;
- ssize_t index;
+ ssize_t index, length;
uint32_t code;
- njs_ret_t length;
const u_char *start, *end;
njs_string_prop_t string;
static njs_ret_t
njs_string_prototype_index_of(njs_vm_t *vm, njs_param_t *param)
{
- ssize_t start;
+ ssize_t start, index;
uintptr_t nargs;
- njs_ret_t index;
njs_value_t *args;
index = -1;
static njs_ret_t
njs_string_prototype_last_index_of(njs_vm_t *vm, njs_param_t *param)
{
+ ssize_t ret, index, last;
uintptr_t nargs;
- njs_ret_t ret, index, last;
njs_value_t *args;
index = -1;
}
-static nxt_noinline njs_ret_t
+static nxt_noinline ssize_t
njs_string_index_of(njs_vm_t *vm, njs_value_t *src, njs_value_t *search_string,
size_t index)
{
- njs_ret_t length;
+ size_t length;
const u_char *p, *end;
njs_string_prop_t string, search;
length = njs_string_prop(&string, src);
- if (index < (size_t) length) {
+ if (index < length) {
p = string.start;
end = p + string.size;
- if (string.size == (size_t) length) {
+ if (string.size == length) {
/* Byte or ASCII string. */
p += index;
static njs_ret_t
njs_string_prototype_search(njs_vm_t *vm, njs_param_t *param)
{
- nxt_int_t index;
- nxt_uint_t n;
- njs_ret_t ret;
+ int ret;
+ nxt_int_t index;
+ nxt_uint_t n;
njs_string_prop_t string;
njs_regexp_pattern_t *pattern;
int captures[3];
{
u_char *start;
int32_t size, length;
- nxt_uint_t n, utf8;
njs_ret_t ret;
+ nxt_uint_t n, utf8;
njs_value_t *args;
njs_array_t *array;
njs_regexp_t *regexp;
{
double num;
size_t size;
- nxt_bool_t minus;
+ nxt_bool_t minus;
const u_char *p, *end;
size = value->short_string.size;
njs_variable_t *
njs_parser_variable(njs_vm_t *vm, njs_parser_t *parser, nxt_uint_t *level)
{
- nxt_int_t ret;
- nxt_uint_t n;
- njs_parser_t *scope;
- njs_variable_t *var;
- nxt_lvlhsh_query_t lhq;
+ nxt_int_t ret;
+ nxt_uint_t n;
+ njs_parser_t *scope;
+ njs_variable_t *var;
+ nxt_lvlhsh_query_t lhq;
level = 0;
vmcode = (njs_vmcode_generic_t *) vm->current;
/*
- * The first operand index is passed as the value2 to
+ * The first operand is passed as is in value2 to
* njs_vmcode_jump(),
* njs_vmcode_if_true_jump(),
* njs_vmcode_if_false_jump(),
njs_vmcode_property_set(njs_vm_t *vm, njs_value_t *object,
njs_value_t *property)
{
- nxt_str_t s;
uintptr_t data;
+ nxt_str_t s;
njs_ret_t ret;
njs_value_t *p, *value;
njs_extern_t *ext;
njs_ret_t
njs_vmcode_property_each(njs_vm_t *vm, njs_value_t *object, njs_value_t *each)
{
- nxt_uint_t n;
njs_ret_t ret;
+ nxt_uint_t n;
njs_array_t *array;
njs_extern_t *ext;
njs_object_prop_t *prop;
njs_value_t *constructor)
{
nxt_int_t ret;
- njs_value_t *value;
- njs_object_t *prototype, *proto;
- njs_object_prop_t *prop;
- const njs_value_t *retval;
+ njs_value_t *value;
+ njs_object_t *prototype, *proto;
+ njs_object_prop_t *prop;
+ const njs_value_t *retval;
nxt_lvlhsh_query_t lhq;
/* TODO: test constructor is function or native: TypeError. */
/*
- * A hint value is 0 for numbers and 1 for strings. The value chooses method
- * calls order specified by ECMAScript 5.1: "valueOf", "toString" for numbers
- * and "toString", "valueOf" for strings.
+ * A hint value is 0 for numbers and 1 for strings. The value chooses
+ * method calls order specified by ECMAScript 5.1: "valueOf", "toString"
+ * for numbers and "toString", "valueOf" for strings.
*/
nxt_noinline njs_ret_t
* and the data.u.string field points to a long string.
*
* The number of the string types is limited to 2 types to minimize
- * overhead of processing string fields. It also is possible to add
+ * overhead of processing string fields. It is also possible to add
* strings with size from 14 to 254 which size and length are stored in
* the string_size and string_length byte wide fields. This will lessen
* the maximum size of short string to 13.
NJS_SCOPE_PARENT_CLOSURE,
} njs_scope_t;
+
#define NJS_SCOPES (NJS_SCOPE_PARENT_CLOSURE + 1)
#define NJS_SCOPE_SHIFT 4
nxt_int_t
njs_vm_compile(njs_vm_t *vm, u_char **start, u_char *end)
{
- nxt_int_t ret;
- nxt_lvlhsh_t keywords_hash;
+ nxt_int_t ret;
njs_lexer_t *lexer;
njs_parser_t *parser;
+ nxt_lvlhsh_t keywords_hash;
njs_parser_node_t *node;
parser = nxt_mem_cache_zalloc(vm->mem_cache_pool, sizeof(njs_parser_t));
static njs_unit_test_t njs_test[] =
{
- { nxt_string("0 == '000'"),
- nxt_string("true") },
-
{ nxt_string("999999999999999999999"),
nxt_string("1e+21") },
{ nxt_string("({}) == false"),
nxt_string("false") },
- { nxt_string("var a = { valueOf: function() { return 5 } }; a == 5"),
+ { nxt_string("var a = { valueOf: function() { return 5 } }; a == 5"),
nxt_string("true") },
{ nxt_string("var a = { valueOf: function() { return '5' } }; a == 5"),
{ nxt_string("null < ({})"),
nxt_string("false") },
- { nxt_string("var a = { valueOf: function() { return 1 } }; null < a"),
+ { nxt_string("var a = { valueOf: function() { return 1 } } null < a"),
nxt_string("true") },
- { nxt_string("var a = { valueOf: function() { return 'null' } }; null < a"),
+ { nxt_string("var a = { valueOf: function() { return 'null' } } null < a"),
nxt_string("false") },
- { nxt_string("var a = { valueOf: function() { return '1' } }; null < a"),
+ { nxt_string("var a = { valueOf: function() { return '1' } } null < a"),
nxt_string("true") },
/**/
{ nxt_string("var a = { valueOf: function() { return [1] } }; ++a"),
nxt_string("NaN") },
- { nxt_string("var a = { valueOf: function() { return {} } }; ++a"),
+ { nxt_string("var a = { valueOf: function() { return {} } }; ++a"),
nxt_string("NaN") },
/**/
{ nxt_string("var a = { valueOf: function() { return [1] } } a = ++a"),
nxt_string("NaN") },
- { nxt_string("var a = { valueOf: function() { return {} } } a = ++a"),
+ { nxt_string("var a = { valueOf: function() { return {} } } a = ++a"),
nxt_string("NaN") },
/**/
{ nxt_string("var a = {}; a++"),
nxt_string("NaN") },
- { nxt_string("var a = { valueOf: function() { return 1 } } a++"),
+ { nxt_string("var a = { valueOf: function() { return 1 } } a++"),
nxt_string("1") },
- { nxt_string("var a = { valueOf: function() { return '1' } } a++"),
+ { nxt_string("var a = { valueOf: function() { return '1' } } a++"),
nxt_string("1") },
- { nxt_string("var a = { valueOf: function() { return [1] } } a++"),
+ { nxt_string("var a = { valueOf: function() { return [1] } } a++"),
nxt_string("NaN") },
{ nxt_string("var a = { valueOf: function() { return {} } } a++"),
{ nxt_string("var a = { valueOf: function() { return [1] } } a = a++"),
nxt_string("NaN") },
- { nxt_string("var a = { valueOf: function() { return {} } } a = a++"),
+ { nxt_string("var a = { valueOf: function() { return {} } } a = a++"),
nxt_string("NaN") },
/**/
{ nxt_string("var a = {}; a--"),
nxt_string("NaN") },
- { nxt_string("var a = { valueOf: function() { return 1 } } a--"),
+ { nxt_string("var a = { valueOf: function() { return 1 } } a--"),
nxt_string("1") },
- { nxt_string("var a = { valueOf: function() { return '1' } } a--"),
+ { nxt_string("var a = { valueOf: function() { return '1' } } a--"),
nxt_string("1") },
- { nxt_string("var a = { valueOf: function() { return [1] } } a--"),
+ { nxt_string("var a = { valueOf: function() { return [1] } } a--"),
nxt_string("NaN") },
{ nxt_string("var a = { valueOf: function() { return {} } } a--"),
{ nxt_string("var a = { valueOf: function() { return [1] } } a = a--"),
nxt_string("NaN") },
- { nxt_string("var a = { valueOf: function() { return {} } } a = a--"),
+ { nxt_string("var a = { valueOf: function() { return {} } } a = a--"),
nxt_string("NaN") },
/**/
nxt_string("Function") },
{ nxt_string("Function.length"),
- nxt_string("0") },
+ nxt_string("1") },
{ nxt_string("Function.prototype.constructor === Function"),
nxt_string("true") },