#include <fcntl.h>
#include <stdlib.h>
#include <sys/stat.h>
+#include <sys/time.h>
#include <locale.h>
#include <readline.h>
nxt_uint_t nargs, njs_index_t unused);
static njs_ret_t njs_ext_console_help(njs_vm_t *vm, njs_value_t *args,
nxt_uint_t nargs, njs_index_t unused);
+static njs_ret_t njs_ext_console_time(njs_vm_t *vm, njs_value_t *args,
+ nxt_uint_t nargs, njs_index_t unused);
+static njs_ret_t njs_ext_console_time_end(njs_vm_t *vm, njs_value_t *args,
+ nxt_uint_t nargs, njs_index_t unused);
static njs_external_t njs_ext_console[] = {
NULL,
njs_ext_console_help,
0 },
+
+ { nxt_string("time"),
+ NJS_EXTERN_METHOD,
+ NULL,
+ 0,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ njs_ext_console_time,
+ 0 },
+
+ { nxt_string("timeEnd"),
+ NJS_EXTERN_METHOD,
+ NULL,
+ 0,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ njs_ext_console_time_end,
+ 0 },
};
static njs_external_t njs_externals[] = {
static njs_completion_t njs_completion;
+static struct timeval njs_console_time;
+
+
int
main(int argc, char **argv)
{
return NJS_OK;
}
+
+
+static njs_ret_t
+njs_ext_console_time(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
+{
+ if (!njs_value_is_void(njs_arg(args, nargs, 1))) {
+ njs_vm_error(vm, "labels not implemented");
+ return NJS_ERROR;
+ }
+
+ vm->retval = njs_value_void;
+
+ gettimeofday(&njs_console_time, NULL);
+
+ return NJS_OK;
+}
+
+
+static njs_ret_t
+njs_ext_console_time_end(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+ njs_index_t unused)
+{
+ int64_t us, ms;
+ struct timeval tv;
+
+ gettimeofday(&tv, NULL);
+
+ if (!njs_value_is_void(njs_arg(args, nargs, 1))) {
+ njs_vm_error(vm, "labels not implemented");
+ return NJS_ERROR;
+ }
+
+ if (nxt_fast_path(njs_console_time.tv_sec || njs_console_time.tv_usec)) {
+
+ us = ((int64_t) tv.tv_sec - njs_console_time.tv_sec) * 1000000
+ + ((int64_t) tv.tv_usec - njs_console_time.tv_usec);
+
+ ms = us / 1000;
+ us = us % 1000;
+
+ printf("default: %" PRIu64 ".%03" PRIu64 "ms\n", ms, us);
+
+ njs_console_time.tv_sec = 0;
+ njs_console_time.tv_usec = 0;
+
+ } else {
+ printf("Timer \"default\" doesn’t exist.\n");
+ }
+
+ vm->retval = njs_value_void;
+
+ return NJS_OK;
+}
# Global completions, multiple partial match
njs_test {
{"cons\t\t"
- "console*console.help*console.log*const"}
+ "console*console.help*console.time*const"}
}
njs_test {
"console.help()\r\nVM built-in objects:"}
}
+# console.time* functions
+njs_test {
+ {"console.time()\r\n"
+ "console.time()\r\nundefined\r\n>> "}
+ {"console.time(undefined)\r\n"
+ "console.time(undefined)\r\nundefined\r\n>> "}
+ {"console.timeEnd()\r\n"
+ "console.timeEnd()\r\ndefault: *.*ms\r\nundefined\r\n>> "}
+ {"console.time('a')\r\n"
+ "console.time('a')\r\nError: labels not implemented"}
+ {"console.timeEnd('a')\r\n"
+ "console.timeEnd('a')\r\nError: labels not implemented"}
+ {"console.timeEnd()\r\n"
+ "console.timeEnd()\r\nTimer \"default\" doesn’t exist."}
+}
+
njs_test {
{"console.ll()\r\n"
"console.ll()\r\nTypeError: 'll' is not a function"}