annotate molko-js/src/js-clock.c @ 205:6b29e487da13

js: enable Molko.Music API
author David Demelier <markand@malikania.fr>
date Tue, 10 Nov 2020 10:10:56 +0100
parents dd77bfb38df2
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
189
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * js-clock.c -- track elapsed time (Javascript bindings)
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2020 David Demelier <markand@malikania.fr>
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #include <assert.h>
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 #include <stdlib.h>
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
21
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 #include <duktape.h>
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
23
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 #include <core/alloc.h>
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 #include <core/clock.h>
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
26
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 #include "js.h"
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 #include "js-window.h"
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
29
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 #define SYMBOL DUK_HIDDEN_SYMBOL("molko::clock")
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
31
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 static struct clock *
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 js_clock_this(duk_context *ctx)
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 {
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 struct clock *clock;
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
36
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
37 duk_push_this(ctx);
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 duk_get_prop_string(ctx, -1, SYMBOL);
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
39 clock = duk_to_pointer(ctx, -1);
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 duk_pop_n(ctx, 2);
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
41
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 if (!clock)
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 duk_error(ctx, DUK_ERR_TYPE_ERROR, "Not a Clock object");
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
44
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 return clock;
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 }
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
47
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
48 static duk_ret_t
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 js_clock_getElapsed(duk_context *ctx)
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 {
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 duk_push_uint(ctx, clock_elapsed(js_clock_this(ctx)));
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
52
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 return 1;
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 }
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
55
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 static duk_ret_t
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 js_clock_new(duk_context *ctx)
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 {
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 if (!duk_is_constructor_call(ctx))
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 duk_error(ctx, DUK_ERR_TYPE_ERROR, "Clock must be new-constructed");
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
61
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 duk_push_this(ctx);
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 duk_push_pointer(ctx, alloc_zero(1, sizeof (struct clock)));
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 duk_put_prop_string(ctx, -2, SYMBOL);
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 duk_push_string(ctx, "elapsed");
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 duk_push_c_function(ctx, js_clock_getElapsed, 0);
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 duk_def_prop(ctx, -3, DUK_DEFPROP_HAVE_GETTER);
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 duk_pop(ctx);
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
69
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
70 return 0;
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 }
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
72
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 static duk_ret_t
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 js_clock_start(duk_context *ctx)
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 {
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 clock_start(js_clock_this(ctx));
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
77
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 return 0;
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
79 }
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
80
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 static duk_ret_t
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 js_clock_finish(duk_context *ctx)
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 {
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 duk_get_prop_string(ctx, 0, SYMBOL);
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 free(duk_to_pointer(ctx, -1));
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 duk_pop(ctx);
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 duk_del_prop_string(ctx, 0, SYMBOL);
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
88
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 return 0;
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
90 }
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
91
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
92 static const duk_function_list_entry methods[] = {
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 { "start", js_clock_start, 0 },
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
94 { NULL, NULL, 0 }
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 };
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
96
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
97 void
200
dd77bfb38df2 js: cleanup API
David Demelier <markand@malikania.fr>
parents: 189
diff changeset
98 js_clock_load(duk_context *ctx)
189
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 {
200
dd77bfb38df2 js: cleanup API
David Demelier <markand@malikania.fr>
parents: 189
diff changeset
100 assert(ctx);
189
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
101
200
dd77bfb38df2 js: cleanup API
David Demelier <markand@malikania.fr>
parents: 189
diff changeset
102 duk_push_global_object(ctx);
dd77bfb38df2 js: cleanup API
David Demelier <markand@malikania.fr>
parents: 189
diff changeset
103 duk_get_prop_string(ctx, -1, "Molko");
dd77bfb38df2 js: cleanup API
David Demelier <markand@malikania.fr>
parents: 189
diff changeset
104 duk_push_c_function(ctx, js_clock_new, 0);
dd77bfb38df2 js: cleanup API
David Demelier <markand@malikania.fr>
parents: 189
diff changeset
105 duk_push_object(ctx);
dd77bfb38df2 js: cleanup API
David Demelier <markand@malikania.fr>
parents: 189
diff changeset
106 duk_put_function_list(ctx, -1, methods);
dd77bfb38df2 js: cleanup API
David Demelier <markand@malikania.fr>
parents: 189
diff changeset
107 duk_push_c_function(ctx, js_clock_finish, 1);
dd77bfb38df2 js: cleanup API
David Demelier <markand@malikania.fr>
parents: 189
diff changeset
108 duk_set_finalizer(ctx, -2);
dd77bfb38df2 js: cleanup API
David Demelier <markand@malikania.fr>
parents: 189
diff changeset
109 duk_put_prop_string(ctx, -2, "prototype");
dd77bfb38df2 js: cleanup API
David Demelier <markand@malikania.fr>
parents: 189
diff changeset
110 duk_put_prop_string(ctx, -2, "Clock");
dd77bfb38df2 js: cleanup API
David Demelier <markand@malikania.fr>
parents: 189
diff changeset
111 duk_pop_n(ctx, 2);
189
a5436e15898d molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
112 }