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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }