static void *ngx_http_js_memalign(void *mem, size_t alignment, size_t size);
static void ngx_http_js_free(void *mem, void *p);
-static njs_ret_t ngx_http_js_ext_undefined(njs_vm_t *vm, njs_value_t *value,
- void *obj, uintptr_t data);
static njs_ret_t ngx_http_js_ext_get_string(njs_vm_t *vm, njs_value_t *value,
void *obj, uintptr_t data);
static njs_ret_t ngx_http_js_ext_set_string(njs_vm_t *vm, void *obj,
NJS_EXTERN_OBJECT,
ngx_http_js_ext_response,
nxt_nitems(ngx_http_js_ext_response),
- ngx_http_js_ext_undefined,
+ NULL,
NULL,
NULL,
NULL,
NJS_EXTERN_OBJECT,
ngx_http_js_ext_request,
nxt_nitems(ngx_http_js_ext_request),
- ngx_http_js_ext_undefined,
+ NULL,
NULL,
NULL,
NULL,
}
-static njs_ret_t
-ngx_http_js_ext_undefined(njs_vm_t *vm, njs_value_t *value, void *obj,
- uintptr_t data)
-{
- njs_void_set(value);
-
- return NJS_OK;
-}
-
-
static njs_ret_t
ngx_http_js_ext_get_string(njs_vm_t *vm, njs_value_t *value, void *obj,
uintptr_t data)
vm->retval = njs_value_void;
- ret = ext->get(vm, &vm->retval, vm->external[ext->object], data);
- if (nxt_slow_path(ret != NXT_OK)) {
- return ret;
- }
+ if (ext->get != NULL) {
+ ret = ext->get(vm, &vm->retval, vm->external[ext->object], data);
+ if (nxt_slow_path(ret != NXT_OK)) {
+ return ret;
+ }
- /* The vm->retval is already retained by ext->get(). */
+ /* The vm->retval is already retained by ext->get(). */
+ }
return sizeof(njs_vmcode_prop_get_t);
data = (uintptr_t) &pq.lhq.key;
}
- ret = njs_value_to_ext_string(vm, &s, value);
- if (nxt_slow_path(ret != NXT_OK)) {
- return ret;
- }
+ if (ext->set != NULL) {
+ ret = njs_value_to_ext_string(vm, &s, value);
+ if (nxt_slow_path(ret != NXT_OK)) {
+ return ret;
+ }
- /* TODO retain value if it is string. */
+ /* TODO retain value if it is string. */
- ret = ext->set(vm, vm->external[ext->object], data, &s);
- if (nxt_slow_path(ret != NXT_OK)) {
- return ret;
+ ret = ext->set(vm, vm->external[ext->object], data, &s);
+ if (nxt_slow_path(ret != NXT_OK)) {
+ return ret;
+ }
}
return sizeof(njs_vmcode_prop_set_t);
ret = nxt_lvlhsh_find(&ext->hash, &pq.lhq);
if (ret == NXT_OK) {
- ext = pq.lhq.value;
-
- if ((ext->type & NJS_EXTERN_OBJECT) != 0) {
- retval = &njs_value_true;
- break;
- }
-
- data = ext->data;
+ retval = &njs_value_true;
} else {
data = (uintptr_t) &pq.lhq.key;
- }
- ret = ext->find(vm, vm->external[ext->object], data, 0);
+ if (ext->find != NULL) {
+ ret = ext->find(vm, vm->external[ext->object], data, 0);
- if (nxt_slow_path(ret == NXT_ERROR)) {
- return ret;
- }
+ if (nxt_slow_path(ret == NXT_ERROR)) {
+ return ret;
+ }
- if (ret == NXT_OK) {
- retval = &njs_value_true;
+ if (ret == NXT_OK) {
+ retval = &njs_value_true;
+ }
+ }
}
break;
ext = pq.lhq.value;
if ((ext->type & NJS_EXTERN_OBJECT) != 0) {
- break;
- }
+ data = (uintptr_t) &ext->value;
- data = ext->data;
+ } else {
+ data = ext->data;
+ }
} else {
data = (uintptr_t) &pq.lhq.key;
}
- ret = ext->find(vm, vm->external[ext->object], data, 1);
+ if (ext->find != NULL) {
+ ret = ext->find(vm, vm->external[ext->object], data, 1);
- if (nxt_slow_path(ret == NXT_ERROR)) {
- return ret;
- }
+ if (nxt_slow_path(ret == NXT_ERROR)) {
+ return ret;
+ }
- if (ret == NXT_OK) {
- retval = &njs_value_true;
+ if (ret == NXT_OK) {
+ retval = &njs_value_true;
+ }
}
break;
{ nxt_string("$r.external('YES')"),
nxt_string("АБВ") },
+ { nxt_string("for (p in $r.external);"),
+ nxt_string("undefined") },
+
+ { nxt_string("'uri' in $r"),
+ nxt_string("true") },
+
+ { nxt_string("'one' in $r"),
+ nxt_string("false") },
+
+ { nxt_string("delete $r.uri"),
+ nxt_string("false") },
+
+ { nxt_string("delete $r.one"),
+ nxt_string("false") },
+
#if 0
{ nxt_string("$r.external.call($r, 'YES')"),
nxt_string("АБВ") },
{ nxt_string("$r.nonexistent"),
nxt_string("undefined") },
+ { nxt_string("$r.error = 'OK'"),
+ nxt_string("OK") },
+
{ nxt_string("var a = { toString: function() { return 1 } }; a"),
nxt_string("1") },
}
-static njs_ret_t
-njs_unit_test_undefined_external(njs_vm_t *vm, njs_value_t *value, void *obj,
- uintptr_t data)
-{
- njs_void_set(value);
-
- return NJS_OK;
-}
-
-
static njs_external_t njs_unit_test_r_external[] = {
{ nxt_string("uri"),
NJS_EXTERN_OBJECT,
njs_unit_test_r_external,
nxt_nitems(njs_unit_test_r_external),
- njs_unit_test_undefined_external,
+ NULL,
NULL,
NULL,
NULL,