blob: dfcc99f34f9e3290a46caa597951cdd490b04c50 [file] [log] [blame]
/*
* Copyright (C) Igor Sysoev
* Copyright (C) NGINX, Inc.
*/
#ifndef _NJS_VARIABLE_H_INCLUDED_
#define _NJS_VARIABLE_H_INCLUDED_
typedef enum {
NJS_VARIABLE_CONST = 0,
NJS_VARIABLE_LET,
NJS_VARIABLE_CATCH,
NJS_VARIABLE_VAR,
NJS_VARIABLE_FUNCTION,
} njs_variable_type_t;
typedef struct {
uintptr_t unique_id;
njs_variable_type_t type:8; /* 3 bits */
njs_bool_t argument;
njs_bool_t arguments_object;
njs_bool_t self;
njs_bool_t init;
njs_bool_t closure;
njs_bool_t function;
njs_parser_scope_t *scope;
njs_parser_scope_t *original;
njs_index_t index;
njs_value_t value;
} njs_variable_t;
typedef enum {
NJS_DECLARATION = 0,
NJS_REFERENCE,
NJS_TYPEOF,
} njs_reference_type_t;
typedef struct {
njs_reference_type_t type;
uintptr_t unique_id;
njs_variable_t *variable;
njs_parser_scope_t *scope;
njs_bool_t not_defined;
} njs_variable_reference_t;
typedef struct {
NJS_RBTREE_NODE (node);
uintptr_t key;
njs_variable_t *variable;
} njs_variable_node_t;
njs_variable_t *njs_variable_add(njs_parser_t *parser,
njs_parser_scope_t *scope, uintptr_t unique_id, njs_variable_type_t type);
njs_variable_t *njs_variable_function_add(njs_parser_t *parser,
njs_parser_scope_t *scope, uintptr_t unique_id, njs_variable_type_t type);
njs_variable_t * njs_label_add(njs_vm_t *vm, njs_parser_scope_t *scope,
uintptr_t unique_id);
njs_variable_t *njs_label_find(njs_vm_t *vm, njs_parser_scope_t *scope,
uintptr_t unique_id);
njs_int_t njs_label_remove(njs_vm_t *vm, njs_parser_scope_t *scope,
uintptr_t unique_id);
njs_variable_t *njs_variable_reference(njs_vm_t *vm, njs_parser_node_t *node);
njs_variable_t *njs_variable_scope_add(njs_parser_t *parser,
njs_parser_scope_t *scope, njs_parser_scope_t *original,
uintptr_t unique_id, njs_variable_type_t type, njs_index_t index);
njs_int_t njs_name_copy(njs_vm_t *vm, njs_str_t *dst, const njs_str_t *src);
njs_inline njs_variable_node_t *
njs_variable_node_alloc(njs_vm_t *vm, njs_variable_t *var, uintptr_t key)
{
njs_variable_node_t *node;
node = njs_mp_zalloc(vm->mem_pool, sizeof(njs_variable_node_t));
if (njs_fast_path(node != NULL)) {
node->key = key;
node->variable = var;
}
return node;
}
njs_inline njs_function_lambda_t *
njs_variable_lambda(njs_variable_t * var)
{
if (njs_is_function(&var->value)) {
/* may be set by generator in njs_generate_function_declaration(). */
return njs_function(&var->value)->u.lambda;
}
return var->value.data.u.lambda;
}
njs_inline void
njs_variable_node_free(njs_vm_t *vm, njs_variable_node_t *node)
{
njs_mp_free(vm->mem_pool, node);
}
#endif /* _NJS_VARIABLE_H_INCLUDED_ */