Mercurial > molko
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 |
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 | 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 | 100 assert(ctx); |
189
a5436e15898d
molko-js: start Javascript bindings, continue #2503 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
101 |
200 | 102 duk_push_global_object(ctx); |
103 duk_get_prop_string(ctx, -1, "Molko"); | |
104 duk_push_c_function(ctx, js_clock_new, 0); | |
105 duk_push_object(ctx); | |
106 duk_put_function_list(ctx, -1, methods); | |
107 duk_push_c_function(ctx, js_clock_finish, 1); | |
108 duk_set_finalizer(ctx, -2); | |
109 duk_put_prop_string(ctx, -2, "prototype"); | |
110 duk_put_prop_string(ctx, -2, "Clock"); | |
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 } |