Mercurial > molko
annotate src/libmlk-core-js/core/js-state.c @ 378:460c78706989
misc: update copyright years
author | David Demelier <markand@malikania.fr> |
---|---|
date | Sun, 02 Jan 2022 10:22:48 +0100 |
parents | 3c378be73844 |
children |
rev | line source |
---|---|
346
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1 /* |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
2 * js-state.c -- core state binding |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
3 * |
378
460c78706989
misc: update copyright years
David Demelier <markand@malikania.fr>
parents:
372
diff
changeset
|
4 * Copyright (c) 2020-2022 David Demelier <markand@malikania.fr> |
346
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
5 * |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
6 * Permission to use, copy, modify, and/or distribute this software for any |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
7 * purpose with or without fee is hereby granted, provided that the above |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
8 * copyright notice and this permission notice appear in all copies. |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
9 * |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
17 */ |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
18 |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
19 #include <assert.h> |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
20 #include <stdlib.h> |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
21 |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
22 #include <core/alloc.h> |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
23 #include <core/state.h> |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
24 |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
25 #include "js-event.h" |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
26 #include "js-state.h" |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
27 |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
28 #define SIGNATURE DUK_HIDDEN_SYMBOL("Mlk.State") |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
29 |
372
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
30 static inline duk_context * |
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
31 callable(struct js_state *data, const char *prop) |
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
32 { |
355
3b2eed504c61
js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents:
346
diff
changeset
|
33 duk_context *ctx; |
346
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
34 |
372
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
35 if (!data->ptr) |
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
36 return NULL; |
355
3b2eed504c61
js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents:
346
diff
changeset
|
37 |
372
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
38 duk_push_heapptr(data->ctx, data->ptr); |
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
39 duk_get_prop_string(data->ctx, -1, prop); |
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
40 duk_pull(data->ctx, -2); |
355
3b2eed504c61
js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents:
346
diff
changeset
|
41 |
372
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
42 if (duk_is_callable(data->ctx, -2)) |
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
43 ctx = data->ctx; |
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
44 else { |
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
45 ctx = NULL; |
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
46 duk_pop_n(data->ctx, 2); |
355
3b2eed504c61
js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents:
346
diff
changeset
|
47 } |
3b2eed504c61
js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents:
346
diff
changeset
|
48 |
372
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
49 return ctx; |
355
3b2eed504c61
js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents:
346
diff
changeset
|
50 } |
346
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
51 |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
52 static void |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
53 start(struct state *state) |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
54 { |
355
3b2eed504c61
js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents:
346
diff
changeset
|
55 duk_context *ctx; |
3b2eed504c61
js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents:
346
diff
changeset
|
56 |
372
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
57 if ((ctx = callable(state->data, "start"))) { |
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
58 duk_call_method(ctx, 0); |
355
3b2eed504c61
js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents:
346
diff
changeset
|
59 duk_pop(ctx); |
3b2eed504c61
js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents:
346
diff
changeset
|
60 } |
346
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
61 } |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
62 |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
63 static void |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
64 handle(struct state *state, const union event *ev) |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
65 { |
355
3b2eed504c61
js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents:
346
diff
changeset
|
66 duk_context *ctx; |
3b2eed504c61
js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents:
346
diff
changeset
|
67 |
372
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
68 if ((ctx = callable(state->data, "handle"))) { |
355
3b2eed504c61
js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents:
346
diff
changeset
|
69 js_event_push(ctx, ev); |
372
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
70 duk_call_method(ctx, 1); |
355
3b2eed504c61
js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents:
346
diff
changeset
|
71 duk_pop(ctx); |
3b2eed504c61
js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents:
346
diff
changeset
|
72 } |
346
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
73 } |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
74 |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
75 static void |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
76 update(struct state *state, unsigned int ticks) |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
77 { |
355
3b2eed504c61
js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents:
346
diff
changeset
|
78 duk_context *ctx; |
3b2eed504c61
js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents:
346
diff
changeset
|
79 |
372
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
80 if ((ctx = callable(state->data, "update"))) { |
355
3b2eed504c61
js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents:
346
diff
changeset
|
81 duk_push_uint(ctx, ticks); |
372
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
82 duk_call_method(ctx, 1); |
355
3b2eed504c61
js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents:
346
diff
changeset
|
83 duk_pop(ctx); |
3b2eed504c61
js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents:
346
diff
changeset
|
84 } |
346
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
85 } |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
86 |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
87 static void |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
88 draw(struct state *state) |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
89 { |
355
3b2eed504c61
js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents:
346
diff
changeset
|
90 duk_context *ctx; |
3b2eed504c61
js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents:
346
diff
changeset
|
91 |
372
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
92 if ((ctx = callable(state->data, "draw"))) { |
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
93 duk_call_method(ctx, 0); |
355
3b2eed504c61
js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents:
346
diff
changeset
|
94 duk_pop(ctx); |
3b2eed504c61
js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents:
346
diff
changeset
|
95 } |
346
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
96 } |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
97 |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
98 static void |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
99 suspend(struct state *state) |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
100 { |
355
3b2eed504c61
js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents:
346
diff
changeset
|
101 duk_context *ctx; |
3b2eed504c61
js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents:
346
diff
changeset
|
102 |
372
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
103 if ((ctx = callable(state->data, "suspend"))) { |
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
104 duk_call_method(ctx, 0); |
355
3b2eed504c61
js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents:
346
diff
changeset
|
105 duk_pop(ctx); |
3b2eed504c61
js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents:
346
diff
changeset
|
106 } |
346
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
107 } |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
108 |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
109 static void |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
110 resume(struct state *state) |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
111 { |
355
3b2eed504c61
js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents:
346
diff
changeset
|
112 duk_context *ctx; |
3b2eed504c61
js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents:
346
diff
changeset
|
113 |
372
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
114 if ((ctx = callable(state->data, "resume"))) { |
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
115 duk_call_method(ctx, 0); |
355
3b2eed504c61
js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents:
346
diff
changeset
|
116 duk_pop(ctx); |
3b2eed504c61
js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents:
346
diff
changeset
|
117 } |
346
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
118 } |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
119 |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
120 static void |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
121 end(struct state *state) |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
122 { |
355
3b2eed504c61
js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents:
346
diff
changeset
|
123 duk_context *ctx; |
3b2eed504c61
js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents:
346
diff
changeset
|
124 |
372
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
125 if ((ctx = callable(state->data, "end"))) { |
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
126 duk_call_method(ctx, 0); |
355
3b2eed504c61
js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents:
346
diff
changeset
|
127 duk_pop(ctx); |
3b2eed504c61
js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents:
346
diff
changeset
|
128 } |
346
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
129 } |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
130 |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
131 static void |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
132 finish(struct state *state) |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
133 { |
372
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
134 struct js_state *data = state->data; |
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
135 |
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
136 /* I must not be called anymore. */ |
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
137 data->ptr = NULL; |
355
3b2eed504c61
js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents:
346
diff
changeset
|
138 |
372
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
139 /* Remove myself from parent stack if any. */ |
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
140 if (data->parent) { |
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
141 duk_push_heapptr(data->ctx, data->parent); |
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
142 duk_push_sprintf(data->ctx, "%p", data); |
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
143 duk_del_prop(data->ctx, -2); |
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
144 duk_pop(data->ctx); |
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
145 data->parent = NULL; |
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
146 } |
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
147 |
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
148 if (--data->refc == 0) |
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
149 free(data); |
346
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
150 } |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
151 |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
152 static duk_ret_t |
355
3b2eed504c61
js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents:
346
diff
changeset
|
153 State_constructor(duk_context *ctx) |
346
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
154 { |
372
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
155 struct js_state *data; |
346
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
156 |
372
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
157 data = alloc_new0(sizeof (*data)); |
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
158 data->ctx = ctx; |
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
159 data->refc = 1; |
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
160 data->st.data = data; |
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
161 data->st.start = start; |
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
162 data->st.handle = handle; |
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
163 data->st.update = update; |
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
164 data->st.draw = draw; |
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
165 data->st.suspend = suspend; |
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
166 data->st.resume = resume; |
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
167 data->st.end = end; |
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
168 data->st.finish = finish; |
346
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
169 |
355
3b2eed504c61
js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents:
346
diff
changeset
|
170 duk_push_this(ctx); |
372
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
171 data->ptr = duk_get_heapptr(ctx, -1); |
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
172 duk_push_pointer(ctx, data); |
355
3b2eed504c61
js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents:
346
diff
changeset
|
173 duk_put_prop_string(ctx, -2, SIGNATURE); |
3b2eed504c61
js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents:
346
diff
changeset
|
174 duk_pop(ctx); |
346
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
175 |
355
3b2eed504c61
js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents:
346
diff
changeset
|
176 return 0; |
346
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
177 } |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
178 |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
179 static duk_ret_t |
355
3b2eed504c61
js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents:
346
diff
changeset
|
180 State_destructor(duk_context *ctx) |
346
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
181 { |
372
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
182 struct js_state *data; |
346
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
183 |
355
3b2eed504c61
js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents:
346
diff
changeset
|
184 duk_get_prop_string(ctx, 0, SIGNATURE); |
346
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
185 |
372
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
186 if ((data = duk_to_pointer(ctx, -1))) |
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
187 state_finish(&data->st); |
346
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
188 |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
189 duk_pop(ctx); |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
190 |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
191 return 0; |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
192 } |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
193 |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
194 void |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
195 js_state_bind(duk_context *ctx) |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
196 { |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
197 assert(ctx); |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
198 |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
199 duk_push_c_function(ctx, State_constructor, 1); |
355
3b2eed504c61
js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents:
346
diff
changeset
|
200 duk_push_object(ctx); |
3b2eed504c61
js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents:
346
diff
changeset
|
201 duk_push_c_function(ctx, State_destructor, 1); |
3b2eed504c61
js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents:
346
diff
changeset
|
202 duk_set_finalizer(ctx, -2); |
3b2eed504c61
js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents:
346
diff
changeset
|
203 duk_put_prop_string(ctx, -2, "prototype"); |
346
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
204 duk_put_global_string(ctx, "State"); |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
205 } |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
206 |
372
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
207 struct js_state * |
346
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
208 js_state_require(duk_context *ctx, duk_idx_t idx) |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
209 { |
372
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
210 struct js_state *data = NULL; |
346
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
211 |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
212 if (duk_is_object(ctx, idx)) { |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
213 duk_get_prop_string(ctx, idx, SIGNATURE); |
372
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
214 data = duk_to_pointer(ctx, -1); |
346
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
215 duk_pop(ctx); |
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
216 } |
361
39f5d932941a
misc: fix some warnings
David Demelier <markand@malikania.fr>
parents:
355
diff
changeset
|
217 |
372
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
218 if (!data) |
361
39f5d932941a
misc: fix some warnings
David Demelier <markand@malikania.fr>
parents:
355
diff
changeset
|
219 return (void)duk_error(ctx, DUK_ERR_TYPE_ERROR, "not a State object"), NULL; |
346
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
220 |
372
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
221 data->refc++; |
355
3b2eed504c61
js: simplify game/state mechanism
David Demelier <markand@malikania.fr>
parents:
346
diff
changeset
|
222 |
372
3c378be73844
js: try another approach to shared ownership
David Demelier <markand@malikania.fr>
parents:
363
diff
changeset
|
223 return data; |
346
323d13f49233
js: add state and game bindings
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
224 } |