[njs] Added own constructors to prototypes of built-in objects.
Valentin Bartenev
vbart at nginx.com
Mon May 6 17:48:46 UTC 2019
details: https://hg.nginx.org/njs/rev/f876e5d1be41
branches:
changeset: 951:f876e5d1be41
user: Valentin Bartenev <vbart at nginx.com>
date: Mon May 06 20:26:58 2019 +0300
description:
Added own constructors to prototypes of built-in objects.
diffstat:
njs/njs_array.c | 6 ++++++
njs/njs_boolean.c | 6 ++++++
njs/njs_date.c | 6 ++++++
njs/njs_error.c | 42 ++++++++++++++++++++++++++++++++++++++++++
njs/njs_function.c | 6 ++++++
njs/njs_number.c | 6 ++++++
njs/njs_object.c | 2 +-
njs/njs_object.h | 2 ++
njs/njs_regexp.c | 6 ++++++
njs/njs_string.c | 6 ++++++
njs/test/njs_unit_test.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
11 files changed, 132 insertions(+), 1 deletions(-)
diffs (348 lines):
diff -r e9de8a5d423c -r f876e5d1be41 njs/njs_array.c
--- a/njs/njs_array.c Mon May 06 19:42:06 2019 +0300
+++ b/njs/njs_array.c Mon May 06 20:26:58 2019 +0300
@@ -2245,6 +2245,12 @@ static const njs_object_prop_t njs_arra
},
{
+ .type = NJS_PROPERTY_HANDLER,
+ .name = njs_string("constructor"),
+ .value = njs_prop_handler(njs_object_prototype_create_constructor),
+ },
+
+ {
.type = NJS_METHOD,
.name = njs_string("slice"),
.value = njs_native_function(njs_array_prototype_slice,
diff -r e9de8a5d423c -r f876e5d1be41 njs/njs_boolean.c
--- a/njs/njs_boolean.c Mon May 06 19:42:06 2019 +0300
+++ b/njs/njs_boolean.c Mon May 06 20:26:58 2019 +0300
@@ -132,6 +132,12 @@ static const njs_object_prop_t njs_bool
},
{
+ .type = NJS_PROPERTY_HANDLER,
+ .name = njs_string("constructor"),
+ .value = njs_prop_handler(njs_object_prototype_create_constructor),
+ },
+
+ {
.type = NJS_METHOD,
.name = njs_string("valueOf"),
.value = njs_native_function(njs_boolean_prototype_value_of, 0, 0),
diff -r e9de8a5d423c -r f876e5d1be41 njs/njs_date.c
--- a/njs/njs_date.c Mon May 06 19:42:06 2019 +0300
+++ b/njs/njs_date.c Mon May 06 20:26:58 2019 +0300
@@ -1942,6 +1942,12 @@ static const njs_object_prop_t njs_date
},
{
+ .type = NJS_PROPERTY_HANDLER,
+ .name = njs_string("constructor"),
+ .value = njs_prop_handler(njs_object_prototype_create_constructor),
+ },
+
+ {
.type = NJS_METHOD,
.name = njs_string("valueOf"),
.value = njs_native_function(njs_date_prototype_value_of, 0,
diff -r e9de8a5d423c -r f876e5d1be41 njs/njs_error.c
--- a/njs/njs_error.c Mon May 06 19:42:06 2019 +0300
+++ b/njs/njs_error.c Mon May 06 20:26:58 2019 +0300
@@ -680,6 +680,12 @@ static const njs_object_prop_t njs_erro
},
{
+ .type = NJS_PROPERTY_HANDLER,
+ .name = njs_string("constructor"),
+ .value = njs_prop_handler(njs_object_prototype_create_constructor),
+ },
+
+ {
.type = NJS_PROPERTY,
.name = njs_string("message"),
.value = njs_string(""),
@@ -713,6 +719,12 @@ static const njs_object_prop_t njs_eval
.name = njs_string("name"),
.value = njs_string("EvalError"),
},
+
+ {
+ .type = NJS_PROPERTY_HANDLER,
+ .name = njs_string("constructor"),
+ .value = njs_prop_handler(njs_object_prototype_create_constructor),
+ },
};
@@ -774,6 +786,12 @@ static const njs_object_prop_t njs_rang
.name = njs_string("name"),
.value = njs_string("RangeError"),
},
+
+ {
+ .type = NJS_PROPERTY_HANDLER,
+ .name = njs_string("constructor"),
+ .value = njs_prop_handler(njs_object_prototype_create_constructor),
+ },
};
@@ -791,6 +809,12 @@ static const njs_object_prop_t njs_refe
.name = njs_string("name"),
.value = njs_string("ReferenceError"),
},
+
+ {
+ .type = NJS_PROPERTY_HANDLER,
+ .name = njs_string("constructor"),
+ .value = njs_prop_handler(njs_object_prototype_create_constructor),
+ },
};
@@ -808,6 +832,12 @@ static const njs_object_prop_t njs_synt
.name = njs_string("name"),
.value = njs_string("SyntaxError"),
},
+
+ {
+ .type = NJS_PROPERTY_HANDLER,
+ .name = njs_string("constructor"),
+ .value = njs_prop_handler(njs_object_prototype_create_constructor),
+ },
};
@@ -825,6 +855,12 @@ static const njs_object_prop_t njs_type
.name = njs_string("name"),
.value = njs_string("TypeError"),
},
+
+ {
+ .type = NJS_PROPERTY_HANDLER,
+ .name = njs_string("constructor"),
+ .value = njs_prop_handler(njs_object_prototype_create_constructor),
+ },
};
@@ -838,6 +874,12 @@ const njs_object_init_t njs_type_error_
static const njs_object_prop_t njs_uri_error_prototype_properties[] =
{
{
+ .type = NJS_PROPERTY_HANDLER,
+ .name = njs_string("constructor"),
+ .value = njs_prop_handler(njs_object_prototype_create_constructor),
+ },
+
+ {
.type = NJS_PROPERTY,
.name = njs_string("name"),
.value = njs_string("URIError"),
diff -r e9de8a5d423c -r f876e5d1be41 njs/njs_function.c
--- a/njs/njs_function.c Mon May 06 19:42:06 2019 +0300
+++ b/njs/njs_function.c Mon May 06 20:26:58 2019 +0300
@@ -1186,6 +1186,12 @@ static const njs_object_prop_t njs_func
},
{
+ .type = NJS_PROPERTY_HANDLER,
+ .name = njs_string("constructor"),
+ .value = njs_prop_handler(njs_object_prototype_create_constructor),
+ },
+
+ {
.type = NJS_METHOD,
.name = njs_string("call"),
.value = njs_native_function(njs_function_prototype_call, 0, 0),
diff -r e9de8a5d423c -r f876e5d1be41 njs/njs_number.c
--- a/njs/njs_number.c Mon May 06 19:42:06 2019 +0300
+++ b/njs/njs_number.c Mon May 06 20:26:58 2019 +0300
@@ -645,6 +645,12 @@ static const njs_object_prop_t njs_numb
},
{
+ .type = NJS_PROPERTY_HANDLER,
+ .name = njs_string("constructor"),
+ .value = njs_prop_handler(njs_object_prototype_create_constructor),
+ },
+
+ {
.type = NJS_METHOD,
.name = njs_string("valueOf"),
.value = njs_native_function(njs_number_prototype_value_of, 0, 0),
diff -r e9de8a5d423c -r f876e5d1be41 njs/njs_object.c
--- a/njs/njs_object.c Mon May 06 19:42:06 2019 +0300
+++ b/njs/njs_object.c Mon May 06 20:26:58 2019 +0300
@@ -2869,7 +2869,7 @@ njs_object_prototype_proto(njs_vm_t *vm,
* "constructor" getter. The properties are set to appropriate function.
*/
-static njs_ret_t
+njs_ret_t
njs_object_prototype_create_constructor(njs_vm_t *vm, njs_value_t *value,
njs_value_t *setval, njs_value_t *retval)
{
diff -r e9de8a5d423c -r f876e5d1be41 njs/njs_object.h
--- a/njs/njs_object.h Mon May 06 19:42:06 2019 +0300
+++ b/njs/njs_object.h Mon May 06 20:26:58 2019 +0300
@@ -103,6 +103,8 @@ njs_value_t *njs_property_prototype_crea
njs_object_t *prototype);
njs_ret_t njs_object_prototype_proto(njs_vm_t *vm, njs_value_t *value,
njs_value_t *setval, njs_value_t *retval);
+njs_ret_t njs_object_prototype_create_constructor(njs_vm_t *vm,
+ njs_value_t *value, njs_value_t *setval, njs_value_t *retval);
njs_value_t *njs_property_constructor_create(njs_vm_t *vm, nxt_lvlhsh_t *hash,
njs_value_t *constructor);
njs_ret_t njs_object_prototype_to_string(njs_vm_t *vm, njs_value_t *args,
diff -r e9de8a5d423c -r f876e5d1be41 njs/njs_regexp.c
--- a/njs/njs_regexp.c Mon May 06 19:42:06 2019 +0300
+++ b/njs/njs_regexp.c Mon May 06 20:26:58 2019 +0300
@@ -1015,6 +1015,12 @@ static const njs_object_prop_t njs_rege
{
{
.type = NJS_PROPERTY_HANDLER,
+ .name = njs_string("constructor"),
+ .value = njs_prop_handler(njs_object_prototype_create_constructor),
+ },
+
+ {
+ .type = NJS_PROPERTY_HANDLER,
.name = njs_string("lastIndex"),
.value = njs_prop_handler(njs_regexp_prototype_last_index),
},
diff -r e9de8a5d423c -r f876e5d1be41 njs/njs_string.c
--- a/njs/njs_string.c Mon May 06 19:42:06 2019 +0300
+++ b/njs/njs_string.c Mon May 06 20:26:58 2019 +0300
@@ -3787,6 +3787,12 @@ static const njs_object_prop_t njs_stri
},
{
+ .type = NJS_PROPERTY_HANDLER,
+ .name = njs_string("constructor"),
+ .value = njs_prop_handler(njs_object_prototype_create_constructor),
+ },
+
+ {
.type = NJS_METHOD,
.name = njs_string("valueOf"),
.value = njs_native_function(njs_string_prototype_value_of, 0, 0),
diff -r e9de8a5d423c -r f876e5d1be41 njs/test/njs_unit_test.c
--- a/njs/test/njs_unit_test.c Mon May 06 19:42:06 2019 +0300
+++ b/njs/test/njs_unit_test.c Mon May 06 20:26:58 2019 +0300
@@ -7258,6 +7258,9 @@ static njs_unit_test_t njs_test[] =
{ nxt_string("Error.prototype.constructor == Error"),
nxt_string("true") },
+ { nxt_string("Error.prototype.hasOwnProperty('constructor')"),
+ nxt_string("true") },
+
{ nxt_string("Error().__proto__ == Error.prototype"),
nxt_string("true") },
@@ -7401,6 +7404,24 @@ static njs_unit_test_t njs_test[] =
{ nxt_string("URIError.prototype.constructor == URIError"),
nxt_string("true") },
+ { nxt_string("EvalError.prototype.hasOwnProperty('constructor')"),
+ nxt_string("true") },
+
+ { nxt_string("RangeError.prototype.hasOwnProperty('constructor')"),
+ nxt_string("true") },
+
+ { nxt_string("ReferenceError.prototype.hasOwnProperty('constructor')"),
+ nxt_string("true") },
+
+ { nxt_string("SyntaxError.prototype.hasOwnProperty('constructor')"),
+ nxt_string("true") },
+
+ { nxt_string("TypeError.prototype.hasOwnProperty('constructor')"),
+ nxt_string("true") },
+
+ { nxt_string("URIError.prototype.hasOwnProperty('constructor')"),
+ nxt_string("true") },
+
{ nxt_string("EvalError().__proto__ == EvalError.prototype"),
nxt_string("true") },
@@ -8006,6 +8027,9 @@ static njs_unit_test_t njs_test[] =
{ nxt_string("Object.prototype.constructor === Object"),
nxt_string("true") },
+ { nxt_string("Object.prototype.hasOwnProperty('constructor')"),
+ nxt_string("true") },
+
{ nxt_string("Object.prototype.__proto__ === null"),
nxt_string("true") },
@@ -8174,6 +8198,9 @@ static njs_unit_test_t njs_test[] =
{ nxt_string("Array.prototype.constructor === Array"),
nxt_string("true") },
+ { nxt_string("Array.prototype.hasOwnProperty('constructor')"),
+ nxt_string("true") },
+
{ nxt_string("Array.prototype.__proto__ === Object.prototype"),
nxt_string("true") },
@@ -8252,6 +8279,9 @@ static njs_unit_test_t njs_test[] =
{ nxt_string("Boolean.prototype.constructor === Boolean"),
nxt_string("true") },
+ { nxt_string("Boolean.prototype.hasOwnProperty('constructor')"),
+ nxt_string("true") },
+
{ nxt_string("Boolean.prototype.__proto__ === Object.prototype"),
nxt_string("true") },
@@ -8362,6 +8392,9 @@ static njs_unit_test_t njs_test[] =
{ nxt_string("Number.prototype.constructor === Number"),
nxt_string("true") },
+ { nxt_string("Number.prototype.hasOwnProperty('constructor')"),
+ nxt_string("true") },
+
{ nxt_string("Number.prototype.__proto__ === Object.prototype"),
nxt_string("true") },
@@ -8576,6 +8609,9 @@ static njs_unit_test_t njs_test[] =
{ nxt_string("String.prototype.constructor === String"),
nxt_string("true") },
+ { nxt_string("String.prototype.hasOwnProperty('constructor')"),
+ nxt_string("true") },
+
{ nxt_string("String.prototype.__proto__ === Object.prototype"),
nxt_string("true") },
@@ -8612,6 +8648,9 @@ static njs_unit_test_t njs_test[] =
{ nxt_string("Function.prototype.constructor === Function"),
nxt_string("true") },
+ { nxt_string("Function.prototype.hasOwnProperty('constructor')"),
+ nxt_string("true") },
+
{ nxt_string("Function.prototype.__proto__ === Object.prototype"),
nxt_string("true") },
@@ -8654,6 +8693,9 @@ static njs_unit_test_t njs_test[] =
{ nxt_string("RegExp.prototype.constructor === RegExp"),
nxt_string("true") },
+ { nxt_string("RegExp.prototype.hasOwnProperty('constructor')"),
+ nxt_string("true") },
+
{ nxt_string("RegExp.prototype.__proto__ === Object.prototype"),
nxt_string("true") },
@@ -10049,6 +10091,9 @@ static njs_unit_test_t njs_test[] =
{ nxt_string("Date.prototype.constructor === Date"),
nxt_string("true") },
+ { nxt_string("Date.prototype.hasOwnProperty('constructor')"),
+ nxt_string("true") },
+
{ nxt_string("Date.prototype.__proto__ === Object.prototype"),
nxt_string("true") },
More information about the nginx-devel
mailing list