}
-njs_ret_t
-njs_value_to_string(njs_vm_t *vm, njs_value_t *dst, const njs_value_t *src)
-{
- njs_ret_t ret;
- njs_param_t param;
- njs_object_prop_t *prop;
- const njs_value_t *value;
- nxt_lvlhsh_query_t lhq;
-
- switch (src->type) {
-
- case NJS_NULL:
- value = &njs_string_null;
- break;
-
- case NJS_VOID:
- value = &njs_string_void;
- break;
-
- case NJS_BOOLEAN:
- value = njs_is_true(src) ? &njs_string_true : &njs_string_false;
- break;
-
- case NJS_NUMBER:
- return njs_number_to_string(vm, dst, src);
-
- case NJS_STRING:
- /* GC: njs_retain(src); */
- value = src;
- break;
-
- case NJS_OBJECT:
- case NJS_ARRAY:
- case NJS_FUNCTION:
- case NJS_REGEXP:
- lhq.key_hash = NJS_TO_STRING_HASH;
- lhq.key.len = sizeof("toString") - 1;
- lhq.key.data = (u_char *) "toString";
-
- prop = njs_object_property(vm, &src->data.u.array->object, &lhq);
-
- if (nxt_fast_path(prop != NULL)) {
- param.this = (njs_value_t *) src;
- param.args = NULL;
- param.nargs = 0;
- param.retval = (njs_index_t) dst;
-
- ret = njs_function_apply(vm, &prop->value, ¶m);
- if (nxt_fast_path(ret == 0)) {
- *dst = vm->retval;
- return ret;
- }
- }
-
- return NXT_ERROR;
-
- /*
- * TODO:
- * function, regexp: find "toString()" in prototype chain:
- * function: full function text.
- * regex: full regexp text like "/regexp/gim".
- */
-
- case NJS_EXTERNAL:
- value = &njs_string_native;
- break;
-
- default: /* NJS_INVALID */
- return NXT_ERROR;
- }
-
- *dst = *value;
-
- return NXT_OK;
-}
-
-
double
njs_string_to_number(njs_value_t *value)
{
uint32_t offset);
njs_ret_t njs_primitive_value_to_string(njs_vm_t *vm, njs_value_t *dst,
const njs_value_t *src);
-njs_ret_t njs_value_to_string(njs_vm_t *vm, njs_value_t *dst,
- const njs_value_t *src);
double njs_string_to_number(njs_value_t *value);
njs_index_t njs_value_index(njs_vm_t *vm, njs_parser_t *parser,
}
-nxt_int_t
-njs_value_string(njs_vm_t *vm, nxt_str_t *retval, njs_value_t *value,
- njs_value_t **tmp)
-{
- size_t size;
- nxt_int_t ret;
- njs_value_t *val;
-
- val = value;
- *tmp = NULL;
-
- if (!njs_is_string(val)) {
- val = nxt_mem_cache_alloc(vm->mem_cache_pool, sizeof(njs_value_t));
- if (nxt_slow_path(val == NULL)) {
- return NXT_ERROR;
- }
-
- ret = njs_value_to_string(vm, val, value);
- if (nxt_slow_path(ret != NXT_OK)) {
- /* TODO: njs_free(vm, val); */
- return ret;
- }
-
- *tmp = val;
- }
-
- size = val->short_string.size;
-
- if (size != NJS_STRING_LONG) {
- retval->len = size;
- retval->data = val->short_string.start;
-
- } else {
- njs_retain(val);
- retval->len = val->data.string_size;
- retval->data = val->data.u.string->start;
- }
-
- return NXT_OK;
-}
-
-
nxt_int_t
njs_value_string_copy(njs_vm_t *vm, nxt_str_t *retval, njs_value_t *value,
uintptr_t *next)
NXT_EXPORT void *njs_value_data(njs_value_t *value);
NXT_EXPORT nxt_uint_t njs_vm_is_reentrant(njs_vm_t *vm);
-NXT_EXPORT nxt_int_t njs_value_string(njs_vm_t *vm, nxt_str_t *retval,
- njs_value_t *value, njs_value_t **tmp);
NXT_EXPORT nxt_int_t njs_value_string_copy(njs_vm_t *vm, nxt_str_t *retval,
njs_value_t *value, uintptr_t *next);