annotate modules/js/js.h @ 486:7ee8da32da98

Unify all in modules/
author David Demelier <markand@malikania.fr>
date Fri, 13 Nov 2015 09:26:46 +0100
parents
children 758a10c6875c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
486
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * js.h -- JavaScript C++14 wrapper for Duktape
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2013-2015 David Demelier <markand@malikania.fr>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #ifndef _JS_H_
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 #define _JS_H_
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
21
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 * @file js.h
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 * @brief Bring JavaScript using Duktape
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 * This file provides usual Duktape function renamed and placed into `js` namespace. It also replaces error
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 * code with exceptions when possible.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
29 * For convenience, this file also provides templated functions, overloads and much more.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
31
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 #include <functional>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 #include <memory>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 #include <string>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 #include <type_traits>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 #include <unordered_map>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
37 #include <utility>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 #include <vector>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
39
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 #include <duktape.h>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
41
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 * Duktape C++ namespace wrapper.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 namespace js {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
46
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 class Context;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
48
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 * Typedef for readability.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
52 using ContextPtr = duk_context *;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
53
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 /*
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 * Basic types to manipulate with the stack
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 * ------------------------------------------------------------------
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 * The following types can be used in some of the operations like Context::push or Context::is, they are defined
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 * usually as empty classes to determine the appropriate action to execute.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 * For example, `ctx.push(js::Object{})` will push an empty object into the stack.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
63
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 * @class Object
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 * @brief Empty class tag for push() function.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 class Object {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 };
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
70
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 * @class Array
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 * @brief Empty class tag for push() function.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 class Array {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 };
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
77
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
79 * @class Global
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 * @brief Empty class tag to push the global object.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 class Global {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 };
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
84
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 * @class Undefined
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 * @brief Empty class tag to push undefined to the stack.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 class Undefined {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
90 };
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
91
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
92 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 * @class Null
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
94 * @brief Empty class tag to push null to the stack.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
96 class Null {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
97 };
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
98
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
100 * @class This
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 * @brief Empty class tag to push this binding to the stack.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
102 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
103 class This {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
104 };
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
105
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
106 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
107 * @class RawPointer
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
108 * @brief Push a non-managed pointer to Duktape, the pointer will never be deleted.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
109 * @note For a managed pointer with prototype, see Pointer
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
110 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 template <typename T>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
112 class RawPointer {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
113 public:
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
114 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
115 * The pointer to push.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
116 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
117 T *object;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
118 };
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
119
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
120 /*
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
121 * Extended type manipulation
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
122 * ------------------------------------------------------------------
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
123 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
124 * The following types are different as there are no equivalent in the native Duktape API, they are available for
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
125 * convenience.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
126 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
127
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
128 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
129 * @brief Manage shared_ptr from C++ and JavaScript
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
130 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
131 * This class allowed you to push and retrieve shared_ptr from C++ and JavaScript without taking care of ownership
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
132 * and deletion.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
133 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
134 * The only requirement is to have the function `void prototype(Context &ctx)` in your class T.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
135 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
136 template <typename T>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
137 class Shared {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
138 public:
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
139 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
140 * The shared object.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
141 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
142 std::shared_ptr<T> object;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
143 };
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
144
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
145 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
146 * @brief Manage pointers from C++ and JavaScript
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
147 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
148 * This class allowed you to push and retrieve C++ pointers from C++ and JavaScript. The object will be deleted when
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
149 * the JavaScript garbage collectors collect them so never store a pointer created with this.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
150 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
151 * The only requirement is to have the function `void prototype(Context &ctx)` in your class T.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
152 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
153 template <typename T>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
154 class Pointer {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
155 public:
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
156 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
157 * The object.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
158 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
159 T *object{nullptr};
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
160 };
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
161
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
162 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
163 * @class Function
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
164 * @brief Duktape/C function definition.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
165 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
166 * This class wraps the std::function as a Duktape/C function by storing a copied pointer.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
167 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
168 class Function {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
169 public:
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
170 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
171 * The function pointer, must not be null.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
172 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
173 std::function<int (Context &)> function;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
174
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
175 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
176 * Number of args that the function takes
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
177 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
178 int nargs{0};
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
179 };
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
180
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
181 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
182 * Map of functions to set on an object.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
183 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
184 using FunctionMap = std::unordered_map<std::string, Function>;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
185
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
186 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
187 * Map of string to type, ideal for setting constants like enums.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
188 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
189 template <typename Type>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
190 using Map = std::unordered_map<std::string, Type>;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
191
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
192 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
193 * @class ErrorInfo
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
194 * @brief Error description.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
195 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
196 * This class fills the fields got in an Error object.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
197 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
198 class ErrorInfo : public std::exception {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
199 public:
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
200 std::string name; //!< name of error
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
201 std::string message; //!< error message
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
202 std::string stack; //!< stack if available
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
203 std::string fileName; //!< filename if applicable
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
204 int lineNumber{0}; //!< line number if applicable
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
205
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
206 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
207 * Get the error message. This effectively returns message field.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
208 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
209 * @return the message
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
210 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
211 const char *what() const noexcept override
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
212 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
213 return message.c_str();
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
214 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
215 };
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
216
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
217 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
218 * @class TypeInfo
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
219 * @brief Type information to implement new types in JavaScript's context.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
220 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
221 * This class depending on your needs may have the following functions:
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
222 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
223 * - `static void construct(Context &ctx, Type value)`
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
224 * - `static Type get(Context &ctx, int index)`
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
225 * - `static bool is(Context &ctx, int index)`
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
226 * - `static Type optional(Context &ctx, int index, Type defaultValue)`
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
227 * - `static void push(Context &ctx, Type value)`
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
228 * - `static Type require(Context &ctx, int index)`
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
229 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
230 * The `construct` function is used in Context::construct to build a new value as this (e.g. constructors).
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
231 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
232 * The `get` function is used in Context::get, Context::getProperty, Context::getGlobal to retrieve a value from the
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
233 * stack.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
234 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
235 * The `is` function is used in Context::is to check if the value on the stack is of type `Type`.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
236 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
237 * The `optional` function is used in Context::optional to get a value or a replacement if not applicable.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
238 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
239 * The `push` function is used in Context::push to usually create a new value on the stack but some specializations
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
240 * may not (e.g. FunctionMap).
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
241 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
242 * The `require` function is used in Context::require to get a value from the stack or raise a JavaScript exception if
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
243 * not applicable.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
244 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
245 * This class is fully specialized for: `bool`, `const char *`, `double`, `int`, `std::string`.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
246 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
247 * It is also partially specialized for : `Global`, `Object`, `Array`, `Undefined`, `Null`, `std::vector<Type>`.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
248 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
249 template <typename Type>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
250 class TypeInfo {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
251 };
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
252
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
253 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
254 * @class File
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
255 * @brief Evaluate script from file.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
256 * @see Context::eval
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
257 * @see Context::peval
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
258 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
259 class File {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
260 public:
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
261 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
262 * Path to the file.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
263 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
264 std::string path;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
265
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
266 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
267 * Evaluate the file.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
268 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
269 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
270 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
271 inline void eval(duk_context *ctx)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
272 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
273 duk_eval_file(ctx, path.c_str());
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
274 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
275
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
276 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
277 * Evaluate in protected mode the file.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
278 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
279 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
280 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
281 inline int peval(duk_context *ctx)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
282 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
283 return duk_peval_file(ctx, path.c_str());
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
284 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
285 };
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
286
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
287 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
288 * @class Script
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
289 * @brief Evaluate script from raw text.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
290 * @see Context::eval
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
291 * @see Context::peval
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
292 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
293 class Script {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
294 public:
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
295 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
296 * The script content.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
297 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
298 std::string text;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
299
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
300 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
301 * Evaluate the script.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
302 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
303 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
304 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
305 inline void eval(duk_context *ctx)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
306 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
307 duk_eval_string(ctx, text.c_str());
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
308 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
309
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
310 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
311 * Evaluate in protected mode the script.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
312 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
313 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
314 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
315 inline int peval(duk_context *ctx)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
316 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
317 return duk_peval_string(ctx, text.c_str());
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
318 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
319 };
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
320
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
321 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
322 * @class Context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
323 * @brief RAII based Duktape handler.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
324 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
325 * This class is implicitly convertible to duk_context for convenience.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
326 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
327 class Context {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
328 private:
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
329 using Deleter = void (*)(duk_context *);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
330 using Handle = std::unique_ptr<duk_context, Deleter>;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
331
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
332 Handle m_handle;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
333
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
334 /* Move and copy forbidden */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
335 Context(const Context &) = delete;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
336 Context &operator=(const Context &) = delete;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
337 Context(const Context &&) = delete;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
338 Context &operator=(const Context &&) = delete;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
339
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
340 public:
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
341 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
342 * Create default context.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
343 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
344 inline Context()
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
345 : m_handle{duk_create_heap_default(), duk_destroy_heap}
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
346 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
347 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
348
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
349 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
350 * Create borrowed context that will not be deleted.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
351 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
352 * @param ctx the pointer to duk_context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
353 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
354 inline Context(ContextPtr ctx) noexcept
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
355 : m_handle{ctx, [] (ContextPtr) {}}
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
356 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
357 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
358
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
359 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
360 * Convert the context to the native Duktape/C type.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
361 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
362 * @return the duk_context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
363 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
364 inline operator duk_context *() noexcept
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
365 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
366 return m_handle.get();
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
367 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
368
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
369 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
370 * Convert the context to the native Duktape/C type.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
371 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
372 * @return the duk_context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
373 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
374 inline operator duk_context *() const noexcept
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
375 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
376 return m_handle.get();
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
377 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
378
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
379 /*
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
380 * Basic functions
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
381 * ----------------------------------------------------------
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
382 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
383 * The following functions are just standard wrappers around the native Duktape C functions, they are
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
384 * defined with the same signature except that for convenience some parameters have default sane values.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
385 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
386
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
387 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
388 * Call the object at the top of the stack.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
389 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
390 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
391 * @param nargs the number of arguments
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
392 * @note Non-protected
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
393 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
394 inline void call(unsigned nargs = 0)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
395 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
396 duk_call(m_handle.get(), nargs);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
397 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
398
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
399 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
400 * Copy a value from from to to, overwriting the previous value. If either index is invalid, throws an error.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
401 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
402 * @param from the from index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
403 * @param to the destination
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
404 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
405 inline void copy(int from, int to)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
406 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
407 duk_copy(m_handle.get(), from, to);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
408 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
409
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
410 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
411 * Define a property.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
412 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
413 * @param index the object index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
414 * @param flags the flags
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
415 * @note Wrapper of duk_def_prop
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
416 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
417 inline void defineProperty(int index, int flags)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
418 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
419 duk_def_prop(m_handle.get(), index, flags);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
420 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
421
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
422 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
423 * Delete a property.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
424 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
425 * @param index the object index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
426 * @return true if deleted
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
427 * @note Wrapper of duk_del_prop
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
428 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
429 inline bool deleteProperty(int index)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
430 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
431 return duk_del_prop(m_handle.get(), index);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
432 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
433
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
434 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
435 * Delete a property by index.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
436 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
437 * @param index the object index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
438 * @param position the property index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
439 * @return true if deleted
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
440 * @note Wrapper of duk_del_prop_index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
441 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
442 inline bool deleteProperty(int index, int position)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
443 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
444 return duk_del_prop_index(m_handle.get(), index, position);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
445 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
446
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
447 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
448 * Delete a property by name.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
449 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
450 * @param index the object index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
451 * @param name the property name
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
452 * @return true if deleted
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
453 * @note Wrapper of duk_del_prop_string
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
454 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
455 inline bool deleteProperty(int index, const std::string &name)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
456 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
457 return duk_del_prop_string(m_handle.get(), index, name.c_str());
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
458 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
459
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
460 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
461 * Push a duplicate of value at from_index to the stack. If from_index is invalid, throws an error.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
462 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
463 * @param index the value to copy
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
464 * @note Wrapper of duk_dup
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
465 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
466 inline void dup(int index = -1)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
467 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
468 duk_dup(m_handle.get(), index);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
469 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
470
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
471 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
472 * Evaluate a non-protected chunk that is at the top of the stack.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
473 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
474 inline void eval()
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
475 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
476 duk_eval(m_handle.get());
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
477 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
478
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
479 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
480 * Check if the object as a property.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
481 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
482 * @param index the object index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
483 * @return true if has
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
484 * @note Wrapper of duk_has_prop
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
485 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
486 inline bool hasProperty(int index)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
487 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
488 return duk_has_prop(m_handle.get(), index);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
489 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
490
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
491 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
492 * Check if the object as a property by index.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
493 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
494 * @param index the object index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
495 * @param position the property index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
496 * @return true if has
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
497 * @note Wrapper of duk_has_prop_index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
498 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
499 inline bool hasProperty(int index, int position)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
500 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
501 return duk_has_prop_index(m_handle.get(), index, position);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
502 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
503
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
504 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
505 * Check if the object as a property by string
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
506 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
507 * @param index the object index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
508 * @param name the property name
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
509 * @return true if has
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
510 * @note Wrapper of duk_has_prop_string
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
511 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
512 inline bool hasProperty(int index, const std::string &name)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
513 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
514 return duk_has_prop_string(m_handle.get(), index, name.c_str());
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
515 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
516
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
517 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
518 * Check if idx1 is an instance of idx2.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
519 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
520 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
521 * @param idx1 the value to test
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
522 * @param idx2 the instance requested
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
523 * @return true if idx1 is instance of idx2
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
524 * @note Wrapper of duk_instanceof
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
525 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
526 inline bool instanceof(int idx1, int idx2)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
527 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
528 return duk_instanceof(m_handle.get(), idx1, idx2);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
529 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
530
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
531 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
532 * Insert a value at to with a value popped from the stack top. The previous value at to and any values above
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
533 * it are moved up the stack by a step. If to is an invalid index, throws an error.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
534 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
535 * @note Negative indices are evaluated prior to popping the value at the stack top
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
536 * @param to the destination
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
537 * @note Wrapper of duk_insert
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
538 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
539 inline void insert(int to)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
540 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
541 duk_insert(m_handle.get(), to);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
542 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
543
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
544 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
545 * Pop a certain number of values from the top of the stack.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
546 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
547 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
548 * @param count the number of values to pop
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
549 * @note Wrapper of duk_pop_n
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
550 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
551 inline void pop(unsigned count = 1)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
552 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
553 duk_pop_n(m_handle.get(), count);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
554 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
555
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
556 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
557 * Remove value at index. Elements above index are shifted down the stack by a step. If to is an invalid index,
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
558 * throws an error.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
559 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
560 * @param index the value to remove
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
561 * @note Wrapper of duk_remove
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
562 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
563 inline void remove(int index)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
564 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
565 duk_remove(m_handle.get(), index);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
566 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
567
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
568 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
569 * Replace value at to_index with a value popped from the stack top. If to_index is an invalid index,
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
570 * throws an error.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
571 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
572 * @param index the value to replace by the value at the top of the stack
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
573 * @note Negative indices are evaluated prior to popping the value at the stack top.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
574 * @note Wrapper of duk_replace
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
575 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
576 inline void replace(int index)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
577 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
578 duk_replace(m_handle.get(), index);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
579 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
580
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
581 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
582 * Swap values at indices index1 and index2. If the indices are the same, the call is a no-op. If either index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
583 * is invalid, throws an error.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
584 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
585 * @param index1 the first index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
586 * @param index2 the second index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
587 * @note Wrapper of duk_swap
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
588 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
589 inline void swap(int index1, int index2)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
590 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
591 duk_swap(m_handle.get(), index1, index2);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
592 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
593
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
594 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
595 * Get the current stack size.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
596 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
597 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
598 * @return the stack size
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
599 * @note Wrapper of duk_get_top
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
600 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
601 inline int top() noexcept
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
602 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
603 return duk_get_top(m_handle.get());
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
604 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
605
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
606 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
607 * Get the type of the value at the specified index.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
608 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
609 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
610 * @param index the idnex
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
611 * @return the type
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
612 * @note Wrapper of duk_get_type
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
613 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
614 inline int type(int index) noexcept
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
615 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
616 return duk_get_type(m_handle.get(), index);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
617 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
618
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
619 /*
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
620 * Extended native functions
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
621 * ----------------------------------------------------------
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
622 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
623 * The following functions have different behaviour than the original native Duktape C functions, see their
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
624 * descriptions for more information
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
625 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
626
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
627 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
628 * Call in protected mode the object at the top of the stack.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
629 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
630 * @param nargs the number of arguments
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
631 * @throw ErrorInfo on errors
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
632 * @note Wrapper of duk_pcall
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
633 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
634 void pcall(unsigned nargs = 0);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
635
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
636 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
637 * Evaluate a non-protected source.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
638 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
639 * @param source the source
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
640 * @see File
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
641 * @see Script
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
642 * @note Wrapper of duk_eval
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
643 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
644 template <typename Source>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
645 inline void eval(Source &&source)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
646 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
647 source.eval(m_handle.get());
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
648 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
649
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
650 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
651 * Evaluate a protected chunk that is at the top of the stack.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
652 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
653 * @throw ErrorInfo the error
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
654 * @note Wrapper of duk_peval
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
655 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
656 void peval();
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
657
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
658 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
659 * Evaluate a protected source.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
660 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
661 * @param source the source
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
662 * @see File
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
663 * @see Script
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
664 * @throw ErrorInfo on failure
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
665 * @note Wrapper of duk_peval
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
666 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
667 template <typename Source>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
668 inline void peval(Source &&source)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
669 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
670 if (source.peval(m_handle.get()) != 0) {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
671 ErrorInfo info = error(-1);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
672 duk_pop(m_handle.get());
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
673
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
674 throw info;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
675 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
676 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
677
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
678 /*
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
679 * Push / Get / Require / Is / Optional
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
680 * ----------------------------------------------------------
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
681 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
682 * The following functions are used to push, get or check values from the stack. They use specialization
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
683 * of TypeInfo class.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
684 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
685
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
686 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
687 * Push a value into the stack. Calls TypeInfo<T>::push(*this, value);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
688 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
689 * @param value the value to forward
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
690 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
691 template <typename Type>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
692 inline void push(Type &&value)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
693 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
694 TypeInfo<std::decay_t<Type>>::push(*this, std::forward<Type>(value));
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
695 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
696
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
697 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
698 * Generic template function to get a value from the stack.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
699 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
700 * @param index the index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
701 * @return the value
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
702 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
703 template <typename Type>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
704 inline auto get(int index) -> decltype(TypeInfo<Type>::get(*this, 0))
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
705 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
706 return TypeInfo<Type>::get(*this, index);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
707 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
708
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
709 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
710 * Require a type at the specified index.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
711 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
712 * @param index the index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
713 * @return the value
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
714 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
715 template <typename Type>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
716 inline auto require(int index) -> decltype(TypeInfo<Type>::require(*this, 0))
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
717 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
718 return TypeInfo<Type>::require(*this, index);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
719 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
720
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
721 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
722 * Check if a value is a type of T.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
723 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
724 * The TypeInfo<T> must have `static bool is(ContextPtr ptr, int index)`.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
725 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
726 * @param index the value index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
727 * @return true if is the type
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
728 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
729 template <typename T>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
730 inline bool is(int index)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
731 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
732 return TypeInfo<T>::is(*this, index);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
733 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
734
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
735 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
736 * Get an optional value from the stack, if the value is not available of not the correct type,
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
737 * return defaultValue instead.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
738 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
739 * The TypeInfo<T> must have `static T optional(Context &, int index, T &&defaultValue)`.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
740 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
741 * @param index the value index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
742 * @param defaultValue the value replacement
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
743 * @return the value or defaultValue
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
744 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
745 template <typename Type>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
746 inline auto optional(int index, Type &&defaultValue)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
747 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
748 return TypeInfo<std::decay_t<Type>>::optional(*this, index, std::forward<Type>(defaultValue));
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
749 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
750
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
751 /*
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
752 * Properties management
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
753 * ----------------------------------------------------------
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
754 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
755 * The following functions are used to read or set properties on objects or globals also using TypeInfo.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
756 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
757
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
758 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
759 * Get the property `name' as value from the object at the specified index.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
760 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
761 * @param index the object index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
762 * @param name the property name
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
763 * @return the value
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
764 * @note The stack is unchanged
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
765 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
766 template <typename Type, typename std::enable_if_t<!std::is_void<Type>::value> * = nullptr>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
767 inline auto getProperty(int index, const std::string &name) -> decltype(get<Type>(0))
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
768 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
769 duk_get_prop_string(m_handle.get(), index, name.c_str());
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
770 decltype(get<Type>(0)) value = get<Type>(-1);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
771 duk_pop(m_handle.get());
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
772
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
773 return value;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
774 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
775
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
776 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
777 * Get a property by index, for arrays.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
778 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
779 * @param index the object index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
780 * @param position the position int the object
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
781 * @return the value
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
782 * @note The stack is unchanged
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
783 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
784 template <typename Type, typename std::enable_if_t<!std::is_void<Type>::value> * = nullptr>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
785 inline auto getProperty(int index, int position) -> decltype(get<Type>(0))
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
786 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
787 duk_get_prop_index(m_handle.get(), index, position);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
788 decltype(get<Type>(0)) value = get<Type>(-1);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
789 duk_pop(m_handle.get());
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
790
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
791 return value;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
792 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
793
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
794 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
795 * Get the property `name' and push it to the stack from the object at the specified index.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
796 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
797 * @param index the object index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
798 * @param name the property name
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
799 * @note The stack contains the property value
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
800 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
801 template <typename Type, typename std::enable_if_t<std::is_void<Type>::value> * = nullptr>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
802 inline void getProperty(int index, const std::string &name)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
803 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
804 duk_get_prop_string(m_handle.get(), index, name.c_str());
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
805 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
806
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
807 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
808 * Get the property by index and push it to the stack from the object at the specified index.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
809 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
810 * @param index the object index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
811 * @param position the position in the object
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
812 * @note The stack contains the property value
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
813 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
814 template <typename Type, typename std::enable_if_t<std::is_void<Type>::value> * = nullptr>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
815 inline void getProperty(int index, int position)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
816 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
817 duk_get_prop_index(m_handle.get(), index, position);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
818 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
819
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
820 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
821 * Get an optional property `name` from the object at the specified index.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
822 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
823 * @param index the object index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
824 * @param name the property name
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
825 * @param def the default value
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
826 * @return the value or def
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
827 * @note The stack is unchanged
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
828 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
829 template <typename Type, typename DefaultValue>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
830 inline auto optionalProperty(int index, const std::string &name, DefaultValue &&def) -> decltype(optional<Type>(0, std::forward<DefaultValue>(def)))
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
831 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
832 duk_get_prop_string(m_handle.get(), index, name.c_str());
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
833 decltype(optional<Type>(0, std::forward<DefaultValue>(def))) value = optional<Type>(-1, std::forward<DefaultValue>(def));
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
834 duk_pop(m_handle.get());
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
835
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
836 return value;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
837 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
838
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
839 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
840 * Get an optional property by index, for arrays
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
841 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
842 * @param index the object index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
843 * @param position the position int the object
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
844 * @param def the default value
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
845 * @return the value or def
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
846 * @note The stack is unchanged
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
847 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
848 template <typename Type, typename DefaultValue>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
849 inline auto optionalProperty(int index, int position, DefaultValue &&def) -> decltype(optional<Type>(0, std::forward<DefaultValue>(def)))
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
850 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
851 duk_get_prop_index(m_handle.get(), index, position);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
852 decltype(optional<Type>(0, std::forward<DefaultValue>(def))) value = optional<Type>(-1, std::forward<DefaultValue>(def));
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
853 duk_pop(m_handle.get());
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
854
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
855 return value;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
856 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
857
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
858 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
859 * Set a property to the object at the specified index.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
860 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
861 * @param index the object index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
862 * @param name the property name
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
863 * @param value the value to forward
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
864 * @note The stack is unchanged
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
865 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
866 template <typename Type>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
867 void putProperty(int index, const std::string &name, Type &&value)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
868 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
869 index = duk_normalize_index(m_handle.get(), index);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
870
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
871 push(std::forward<Type>(value));
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
872 duk_put_prop_string(m_handle.get(), index, name.c_str());
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
873 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
874
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
875 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
876 * Set a property by index, for arrays.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
877 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
878 * @param index the object index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
879 * @param position the position in the object
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
880 * @param value the value to forward
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
881 * @note The stack is unchanged
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
882 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
883 template <typename Type>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
884 void putProperty(int index, int position, Type &&value)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
885 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
886 index = duk_normalize_index(m_handle.get(), index);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
887
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
888 push(std::forward<Type>(value));
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
889 duk_put_prop_index(m_handle.get(), index, position);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
890 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
891
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
892 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
893 * Put the value that is at the top of the stack as property to the object.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
894 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
895 * @param index the object index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
896 * @param name the property name
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
897 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
898 inline void putProperty(int index, const std::string &name)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
899 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
900 duk_put_prop_string(m_handle.get(), index, name.c_str());
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
901 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
902
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
903 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
904 * Put the value that is at the top of the stack to the object as index.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
905 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
906 * @param index the object index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
907 * @param position the position in the object
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
908 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
909 inline void putProperty(int index, int position)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
910 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
911 duk_put_prop_index(m_handle.get(), index, position);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
912 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
913
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
914 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
915 * Get a global value.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
916 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
917 * @param name the name of the global variable
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
918 * @return the value
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
919 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
920 template <typename Type>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
921 inline auto getGlobal(const std::string &name, std::enable_if_t<!std::is_void<Type>::value> * = nullptr) -> decltype(get<Type>(0))
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
922 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
923 duk_get_global_string(m_handle.get(), name.c_str());
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
924 decltype(get<Type>(0)) value = get<Type>(-1);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
925 duk_pop(m_handle.get());
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
926
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
927 return value;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
928 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
929
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
930 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
931 * Overload that push the value at the top of the stack instead of returning it.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
932 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
933 template <typename Type>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
934 inline void getGlobal(const std::string &name, std::enable_if_t<std::is_void<Type>::value> * = nullptr) noexcept
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
935 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
936 duk_get_global_string(m_handle.get(), name.c_str());
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
937 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
938
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
939 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
940 * Set a global variable.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
941 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
942 * @param name the name of the global variable
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
943 * @param type the value to set
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
944 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
945 template <typename Type>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
946 inline void putGlobal(const std::string &name, Type&& type)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
947 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
948 push(std::forward<Type>(type));
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
949 duk_put_global_string(m_handle.get(), name.c_str());
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
950 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
951
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
952 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
953 * Put the value at the top of the stack as global property.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
954 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
955 * @param name the property name
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
956 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
957 inline void putGlobal(const std::string &name)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
958 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
959 duk_put_global_string(m_handle.get(), name.c_str());
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
960 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
961
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
962 /*
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
963 * Extra functions
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
964 * ----------------------------------------------------------
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
965 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
966 * The following functions are implemented for convenience and do not exists in the native Duktape API.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
967 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
968
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
969 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
970 * Get the error object when a JavaScript error has been thrown (e.g. eval failure).
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
971 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
972 * @param index the index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
973 * @return the information
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
974 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
975 ErrorInfo error(int index);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
976
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
977 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
978 * Enumerate an object or an array at the specified index.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
979 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
980 * @param index the object or array index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
981 * @param flags the optional flags to pass to duk_enum
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
982 * @param getvalue set to true if you want to extract the value
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
983 * @param func the function to call for each properties
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
984 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
985 template <typename Func>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
986 void enumerate(int index, duk_uint_t flags, duk_bool_t getvalue, Func&& func)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
987 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
988 duk_enum(m_handle.get(), index, flags);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
989
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
990 while (duk_next(m_handle.get(), -1, getvalue)) {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
991 func(*this);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
992 duk_pop_n(m_handle.get(), 1 + (getvalue ? 1 : 0));
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
993 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
994
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
995 duk_pop(m_handle.get());
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
996 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
997
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
998 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
999 * Return the this binding of the current function.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1000 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1001 * @return the this binding as the template given
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1002 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1003 template <typename T>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1004 inline auto self() -> decltype(TypeInfo<T>::get(*this, 0))
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1005 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1006 duk_push_this(m_handle.get());
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1007 decltype(TypeInfo<T>::get(*this, 0)) value = TypeInfo<T>::get(*this, -1);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1008 duk_pop(m_handle.get());
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1009
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1010 return value;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1011 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1012
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1013 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1014 * Throw an ECMAScript exception.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1015 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1016 * @param ex the exception
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1017 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1018 template <typename Exception>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1019 void raise(const Exception &ex)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1020 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1021 ex.create(m_handle.get());
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1022
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1023 duk_push_string(m_handle.get(), ex.name().c_str());
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1024 duk_put_prop_string(m_handle.get(), -2, "name");
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1025 duk_throw(m_handle.get());
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1026 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1027
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1028 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1029 * Construct the object in place, setting value as this binding.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1030 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1031 * The TypeInfo<T> must have the following requirements:
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1032 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1033 * - static void construct(Context &, T): must update this with the value and keep the stack unchanged
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1034 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1035 * @param value the value to forward
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1036 * @see self
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1037 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1038 template <typename T>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1039 inline void construct(T &&value)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1040 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1041 TypeInfo<std::decay_t<T>>::construct(*this, std::forward<T>(value));
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1042 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1043 };
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1044
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1045 /* ------------------------------------------------------------------
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1046 * Exception handling
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1047 * ------------------------------------------------------------------ */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1048
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1049 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1050 * @class Error
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1051 * @brief Base ECMAScript error class.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1052 * @warning Override the function create for your own exceptions
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1053 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1054 class Error {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1055 protected:
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1056 std::string m_name; //!< Name of exception (e.g RangeError)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1057 std::string m_message; //!< The message
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1058
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1059 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1060 * Constructor with a type of error specified, specially designed for derived errors.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1061 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1062 * @param name the error name (e.g RangeError)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1063 * @param message the message
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1064 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1065 inline Error(std::string name, std::string message) noexcept
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1066 : m_name{std::move(name)}
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1067 , m_message{std::move(message)}
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1068 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1069 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1070
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1071 public:
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1072 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1073 * Constructor with a message.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1074 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1075 * @param message the message
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1076 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1077 inline Error(std::string message) noexcept
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1078 : m_name{"Error"}
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1079 , m_message{std::move(message)}
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1080 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1081 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1082
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1083 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1084 * Get the error type (e.g RangeError).
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1085 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1086 * @return the name
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1087 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1088 inline const std::string &name() const noexcept
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1089 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1090 return m_name;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1091 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1092
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1093 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1094 * Create the exception on the stack.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1095 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1096 * @note the default implementation search for the global variables
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1097 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1098 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1099 virtual void create(ContextPtr ctx) const noexcept
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1100 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1101 duk_get_global_string(ctx, m_name.c_str());
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1102 duk_push_string(ctx, m_message.c_str());
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1103 duk_new(ctx, 1);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1104 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1105 };
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1106
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1107 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1108 * @class EvalError
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1109 * @brief Error in eval() function.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1110 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1111 class EvalError : public Error {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1112 public:
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1113 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1114 * Construct an EvalError.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1115 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1116 * @param message the message
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1117 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1118 inline EvalError(std::string message) noexcept
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1119 : Error{"EvalError", std::move(message)}
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1120 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1121 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1122 };
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1123
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1124 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1125 * @class RangeError
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1126 * @brief Value is out of range.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1127 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1128 class RangeError : public Error {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1129 public:
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1130 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1131 * Construct an RangeError.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1132 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1133 * @param message the message
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1134 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1135 inline RangeError(std::string message) noexcept
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1136 : Error{"RangeError", std::move(message)}
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1137 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1138 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1139 };
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1140
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1141 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1142 * @class ReferenceError
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1143 * @brief Trying to use a variable that does not exist.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1144 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1145 class ReferenceError : public Error {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1146 public:
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1147 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1148 * Construct an ReferenceError.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1149 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1150 * @param message the message
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1151 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1152 inline ReferenceError(std::string message) noexcept
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1153 : Error{"ReferenceError", std::move(message)}
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1154 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1155 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1156 };
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1157
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1158 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1159 * @class SyntaxError
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1160 * @brief Syntax error in the script.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1161 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1162 class SyntaxError : public Error {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1163 public:
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1164 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1165 * Construct an SyntaxError.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1166 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1167 * @param message the message
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1168 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1169 inline SyntaxError(std::string message) noexcept
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1170 : Error{"SyntaxError", std::move(message)}
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1171 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1172 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1173 };
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1174
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1175 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1176 * @class TypeError
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1177 * @brief Invalid type given.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1178 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1179 class TypeError : public Error {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1180 public:
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1181 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1182 * Construct an TypeError.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1183 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1184 * @param message the message
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1185 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1186 inline TypeError(std::string message) noexcept
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1187 : Error{"TypeError", std::move(message)}
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1188 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1189 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1190 };
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1191
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1192 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1193 * @class URIError
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1194 * @brief URI manipulation failure.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1195 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1196 class URIError : public Error {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1197 public:
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1198 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1199 * Construct an URIError.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1200 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1201 * @param message the message
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1202 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1203 inline URIError(std::string message) noexcept
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1204 : Error{"URIError", std::move(message)}
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1205 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1206 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1207 };
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1208
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1209 /* ------------------------------------------------------------------
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1210 * Standard overloads for TypeInfo<T>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1211 * ------------------------------------------------------------------ */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1212
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1213 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1214 * @class TypeInfo<int>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1215 * @brief Default implementation for int.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1216 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1217 * Provides: get, is, optional, push, require.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1218 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1219 template <>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1220 class TypeInfo<int> {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1221 public:
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1222 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1223 * Get an integer, return 0 if not an integer.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1224 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1225 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1226 * @param index the index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1227 * @return the integer
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1228 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1229 static inline int get(Context &ctx, int index)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1230 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1231 return duk_get_int(ctx, index);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1232 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1233
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1234 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1235 * Check if value is an integer.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1236 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1237 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1238 * @param index the index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1239 * @return true if integer
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1240 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1241 static inline bool is(Context &ctx, int index)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1242 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1243 return duk_is_number(ctx, index);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1244 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1245
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1246 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1247 * Get an integer, return defaultValue if the value is not an integer.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1248 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1249 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1250 * @param index the index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1251 * @param defaultValue the defaultValue
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1252 * @return the integer or defaultValue
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1253 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1254 static inline int optional(Context &ctx, int index, int defaultValue)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1255 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1256 if (!duk_is_number(ctx, index)) {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1257 return defaultValue;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1258 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1259
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1260 return duk_get_int(ctx, index);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1261 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1262
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1263 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1264 * Push an integer.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1265 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1266 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1267 * @param value the value
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1268 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1269 static inline void push(Context &ctx, int value)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1270 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1271 duk_push_int(ctx, value);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1272 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1273
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1274 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1275 * Require an integer, throws a JavaScript exception if not an integer.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1276 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1277 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1278 * @param index the index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1279 * @return the integer
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1280 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1281 static inline int require(Context &ctx, int index)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1282 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1283 return duk_require_int(ctx, index);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1284 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1285 };
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1286
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1287 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1288 * @class TypeInfo<bool>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1289 * @brief Default implementation for bool.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1290 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1291 * Provides: get, is, optional, push, require.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1292 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1293 template <>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1294 class TypeInfo<bool> {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1295 public:
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1296 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1297 * Get a boolean, return 0 if not a boolean.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1298 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1299 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1300 * @param index the index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1301 * @return the boolean
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1302 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1303 static inline bool get(Context &ctx, int index)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1304 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1305 return duk_get_boolean(ctx, index);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1306 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1307
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1308 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1309 * Check if value is a boolean.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1310 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1311 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1312 * @param index the index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1313 * @return true if boolean
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1314 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1315 static inline bool is(Context &ctx, int index)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1316 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1317 return duk_is_boolean(ctx, index);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1318 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1319
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1320 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1321 * Get a bool, return defaultValue if the value is not a boolean.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1322 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1323 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1324 * @param index the index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1325 * @param defaultValue the defaultValue
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1326 * @return the boolean or defaultValue
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1327 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1328 static inline bool optional(Context &ctx, int index, bool defaultValue)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1329 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1330 if (!duk_is_boolean(ctx, index)) {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1331 return defaultValue;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1332 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1333
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1334 return duk_get_boolean(ctx, index);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1335 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1336
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1337 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1338 * Push a boolean.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1339 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1340 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1341 * @param value the value
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1342 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1343 static inline void push(Context &ctx, bool value)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1344 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1345 duk_push_boolean(ctx, value);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1346 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1347
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1348 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1349 * Require a boolean, throws a JavaScript exception if not a boolean.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1350 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1351 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1352 * @param index the index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1353 * @return the boolean
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1354 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1355 static inline bool require(Context &ctx, int index)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1356 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1357 return duk_require_boolean(ctx, index);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1358 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1359 };
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1360
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1361 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1362 * @class TypeInfo<double>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1363 * @brief Default implementation for double.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1364 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1365 * Provides: get, is, optional, push, require.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1366 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1367 template <>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1368 class TypeInfo<double> {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1369 public:
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1370 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1371 * Get a double, return 0 if not a double.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1372 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1373 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1374 * @param index the index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1375 * @return the double
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1376 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1377 static inline double get(Context &ctx, int index)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1378 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1379 return duk_get_number(ctx, index);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1380 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1381
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1382 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1383 * Check if value is a double.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1384 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1385 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1386 * @param index the index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1387 * @return true if double
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1388 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1389 static inline bool is(Context &ctx, int index)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1390 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1391 return duk_is_number(ctx, index);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1392 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1393
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1394 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1395 * Get a double, return defaultValue if the value is not a double.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1396 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1397 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1398 * @param index the index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1399 * @param defaultValue the defaultValue
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1400 * @return the double or defaultValue
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1401 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1402 static inline double optional(Context &ctx, int index, double defaultValue)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1403 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1404 if (!duk_is_number(ctx, index)) {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1405 return defaultValue;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1406 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1407
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1408 return duk_get_number(ctx, index);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1409 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1410
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1411 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1412 * Push a double.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1413 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1414 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1415 * @param value the value
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1416 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1417 static inline void push(Context &ctx, double value)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1418 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1419 duk_push_number(ctx, value);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1420 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1421
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1422 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1423 * Require a double, throws a JavaScript exception if not a double.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1424 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1425 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1426 * @param index the index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1427 * @return the double
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1428 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1429 static inline double require(Context &ctx, int index)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1430 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1431 return duk_require_number(ctx, index);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1432 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1433 };
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1434
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1435 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1436 * @class TypeInfo<std::string>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1437 * @brief Default implementation for std::string.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1438 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1439 * Provides: get, is, optional, push, require.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1440 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1441 * Note: the functions allows embedded '\0'.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1442 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1443 template <>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1444 class TypeInfo<std::string> {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1445 public:
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1446 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1447 * Get a string, return 0 if not a string.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1448 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1449 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1450 * @param index the index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1451 * @return the string
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1452 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1453 static inline std::string get(Context &ctx, int index)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1454 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1455 duk_size_t size;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1456 const char *text = duk_get_lstring(ctx, index, &size);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1457
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1458 return std::string{text, size};
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1459 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1460
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1461 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1462 * Check if value is a string.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1463 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1464 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1465 * @param index the index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1466 * @return true if string
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1467 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1468 static inline bool is(Context &ctx, int index)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1469 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1470 return duk_is_string(ctx, index);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1471 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1472
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1473 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1474 * Get a string, return defaultValue if the value is not an string.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1475 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1476 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1477 * @param index the index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1478 * @param defaultValue the defaultValue
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1479 * @return the string or defaultValue
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1480 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1481 static inline std::string optional(Context &ctx, int index, std::string defaultValue)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1482 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1483 if (!duk_is_string(ctx, index)) {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1484 return defaultValue;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1485 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1486
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1487 return get(ctx, index);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1488 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1489
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1490 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1491 * Push a string.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1492 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1493 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1494 * @param value the value
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1495 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1496 static inline void push(Context &ctx, const std::string &value)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1497 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1498 duk_push_lstring(ctx, value.c_str(), value.length());
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1499 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1500
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1501 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1502 * Require a string, throws a JavaScript exception if not a string.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1503 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1504 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1505 * @param index the index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1506 * @return the string
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1507 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1508 static inline std::string require(Context &ctx, int index)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1509 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1510 duk_size_t size;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1511 const char *text = duk_require_lstring(ctx, index, &size);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1512
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1513 return std::string{text, size};
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1514 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1515 };
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1516
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1517 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1518 * @class TypeInfo<const char *>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1519 * @brief Default implementation for const char literals.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1520 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1521 * Provides: get, is, optional, push, require.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1522 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1523 template <>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1524 class TypeInfo<const char *> {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1525 public:
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1526 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1527 * Get a string, return 0 if not a string.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1528 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1529 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1530 * @param index the index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1531 * @return the string
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1532 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1533 static inline const char *get(Context &ctx, int index)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1534 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1535 return duk_get_string(ctx, index);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1536 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1537
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1538 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1539 * Check if value is a string.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1540 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1541 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1542 * @param index the index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1543 * @return true if string
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1544 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1545 static inline bool is(Context &ctx, int index)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1546 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1547 return duk_is_string(ctx, index);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1548 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1549
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1550 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1551 * Get an integer, return defaultValue if the value is not an integer.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1552 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1553 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1554 * @param index the index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1555 * @param defaultValue the defaultValue
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1556 * @return the integer or defaultValue
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1557 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1558 static inline const char *optional(Context &ctx, int index, const char *defaultValue)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1559 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1560 if (!duk_is_string(ctx, index)) {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1561 return defaultValue;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1562 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1563
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1564 return duk_get_string(ctx, index);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1565 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1566
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1567 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1568 * Push a string.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1569 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1570 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1571 * @param value the value
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1572 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1573 static inline void push(Context &ctx, const char *value)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1574 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1575 duk_push_string(ctx, value);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1576 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1577
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1578 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1579 * Require a string, throws a JavaScript exception if not a string.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1580 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1581 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1582 * @param index the index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1583 * @return the string
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1584 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1585 static inline const char *require(Context &ctx, int index)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1586 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1587 return duk_require_string(ctx, index);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1588 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1589 };
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1590
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1591 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1592 * @brief Implementation for non-managed pointers.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1593 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1594 * Provides: get, is, optional, push, require.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1595 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1596 template <typename T>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1597 class TypeInfo<RawPointer<T>> {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1598 public:
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1599 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1600 * Get a pointer, return nullptr if not a pointer.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1601 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1602 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1603 * @param index the index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1604 * @return the pointer
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1605 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1606 static inline T *get(Context &ctx, int index)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1607 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1608 return static_cast<T *>(duk_to_pointer(ctx, index));
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1609 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1610
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1611 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1612 * Check if value is a pointer.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1613 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1614 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1615 * @param index the index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1616 * @return true if pointer
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1617 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1618 static inline bool is(Context &ctx, int index)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1619 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1620 return duk_is_pointer(ctx, index);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1621 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1622
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1623 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1624 * Get a pointer, return defaultValue if the value is not a pointer.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1625 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1626 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1627 * @param index the index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1628 * @param defaultValue the defaultValue
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1629 * @return the pointer or defaultValue
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1630 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1631 static inline T *optional(Context &ctx, int index, RawPointer<T> defaultValue)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1632 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1633 if (!duk_is_pointer(ctx, index)) {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1634 return defaultValue.object;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1635 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1636
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1637 return static_cast<T *>(duk_to_pointer(ctx, index));
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1638 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1639
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1640 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1641 * Push a pointer.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1642 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1643 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1644 * @param value the value
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1645 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1646 static inline void push(Context &ctx, const RawPointer<T> &value)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1647 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1648 duk_push_pointer(ctx, value.object);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1649 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1650
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1651 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1652 * Require a pointer, throws a JavaScript exception if not a pointer.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1653 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1654 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1655 * @param index the index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1656 * @return the pointer
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1657 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1658 static inline T *require(Context &ctx, int index)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1659 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1660 return static_cast<T *>(duk_require_pointer(ctx, index));
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1661 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1662 };
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1663
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1664 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1665 * @class TypeInfo<Function>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1666 * @brief Push C++ function to the stack.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1667 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1668 * Provides: push.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1669 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1670 * This implementation push a Duktape/C function that is wrapped as C++ for convenience.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1671 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1672 template <>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1673 class TypeInfo<Function> {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1674 public:
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1675 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1676 * Push the C++ function, it is wrapped as Duktape/C function and allocated on the heap by moving the
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1677 * std::function.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1678 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1679 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1680 * @param fn the function
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1681 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1682 static void push(Context &ctx, Function fn);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1683 };
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1684
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1685 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1686 * @class TypeInfo<FunctionMap>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1687 * @brief Put the functions to the object at the top of the stack.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1688 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1689 * Provides: push.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1690 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1691 template <>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1692 class TypeInfo<FunctionMap> {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1693 public:
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1694 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1695 * Push a map of function to the object at the top of the stack.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1696 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1697 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1698 * @param map the map of function
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1699 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1700 static inline void push(Context &ctx, const FunctionMap &map)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1701 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1702 for (const auto &entry : map) {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1703 ctx.putProperty(-1, entry.first, entry.second);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1704 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1705 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1706 };
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1707
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1708 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1709 * @class TypeInfo<Object>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1710 * @brief Push empty object to the stack.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1711 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1712 * Provides: is, push.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1713 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1714 template <>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1715 class TypeInfo<Object> {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1716 public:
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1717 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1718 * Check if value is an object.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1719 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1720 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1721 * @param index the index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1722 * @return true if object
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1723 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1724 static inline bool is(Context &ctx, int index)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1725 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1726 return duk_is_object(ctx, index);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1727 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1728
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1729 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1730 * Create an empty object on the stack.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1731 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1732 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1733 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1734 static inline void push(Context &ctx, const Object &)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1735 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1736 duk_push_object(ctx);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1737 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1738 };
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1739
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1740 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1741 * @class TypeInfo<Array>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1742 * @brief Push empty array to the stack.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1743 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1744 * Provides: is, push.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1745 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1746 template <>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1747 class TypeInfo<Array> {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1748 public:
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1749 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1750 * Check if value is a array.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1751 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1752 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1753 * @param index the index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1754 * @return true if array
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1755 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1756 static inline bool is(Context &ctx, int index)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1757 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1758 return duk_is_array(ctx, index);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1759 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1760
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1761 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1762 * Create an empty array on the stack.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1763 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1764 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1765 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1766 static inline void push(Context &ctx, const Array &)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1767 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1768 duk_push_array(ctx);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1769 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1770 };
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1771
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1772 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1773 * @class TypeInfo<Undefined>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1774 * @brief Push undefined value to the stack.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1775 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1776 * Provides: is, push.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1777 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1778 template <>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1779 class TypeInfo<Undefined> {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1780 public:
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1781 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1782 * Check if value is undefined.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1783 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1784 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1785 * @param index the index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1786 * @return true if undefined
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1787 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1788 static inline bool is(Context &ctx, int index)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1789 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1790 return duk_is_undefined(ctx, index);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1791 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1792
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1793 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1794 * Push undefined value on the stack.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1795 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1796 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1797 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1798 static inline void push(Context &ctx, const Undefined &)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1799 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1800 duk_push_undefined(ctx);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1801 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1802 };
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1803
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1804 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1805 * @class TypeInfo<Null>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1806 * @brief Push null value to the stack.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1807 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1808 * Provides: is, push.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1809 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1810 template <>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1811 class TypeInfo<Null> {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1812 public:
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1813 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1814 * Check if value is null.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1815 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1816 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1817 * @param index the index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1818 * @return true if null
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1819 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1820 static inline bool is(Context &ctx, int index)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1821 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1822 return duk_is_null(ctx, index);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1823 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1824
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1825 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1826 * Push null value on the stack.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1827 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1828 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1829 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1830 static inline void push(Context &ctx, const Null &)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1831 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1832 duk_push_null(ctx);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1833 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1834 };
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1835
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1836 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1837 * @brief Push this binding into the stack.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1838 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1839 * Provides: push.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1840 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1841 template <>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1842 class TypeInfo<This> {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1843 public:
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1844 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1845 * Push this function into the stack.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1846 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1847 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1848 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1849 static inline void push(Context &ctx, const This &)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1850 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1851 duk_push_this(ctx);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1852 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1853 };
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1854
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1855 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1856 * @class TypeInfo<Global>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1857 * @brief Push the global object to the stack.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1858 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1859 * Provides: push.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1860 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1861 template <>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1862 class TypeInfo<Global> {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1863 public:
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1864 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1865 * Push the global object into the stack.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1866 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1867 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1868 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1869 static inline void push(Context &ctx, const Global &)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1870 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1871 duk_push_global_object(ctx);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1872 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1873 };
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1874
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1875 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1876 * @brief Push a map of key-value pair as objects.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1877 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1878 * Provides: push.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1879 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1880 * This class is convenient for settings constants such as enums, string and such.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1881 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1882 template <typename T>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1883 class TypeInfo<std::unordered_map<std::string, T>> {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1884 public:
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1885 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1886 * Put all values from the map as properties to the object at the top of the stack.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1887 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1888 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1889 * @param map the values
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1890 * @note You need an object at the top of the stack before calling this function
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1891 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1892 static void push(Context &ctx, const std::unordered_map<std::string, T> &map)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1893 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1894 for (const auto &pair : map) {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1895 TypeInfo<T>::push(ctx, pair.second);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1896 duk_put_prop_string(ctx, -2, pair.first.c_str());
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1897 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1898 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1899 };
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1900
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1901 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1902 * @brief Push or get vectors as JavaScript arrays.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1903 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1904 * Provides: get, push.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1905 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1906 template <typename T>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1907 class TypeInfo<std::vector<T>> {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1908 public:
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1909 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1910 * Get an array from the stack.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1911 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1912 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1913 * @param index the array index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1914 * @return the array or empty array if the value is not an array
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1915 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1916 static std::vector<T> get(Context &ctx, int index)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1917 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1918 std::vector<T> result;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1919
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1920 if (!duk_is_array(ctx, -1)) {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1921 return result;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1922 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1923
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1924 int total = duk_get_length(ctx, index);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1925 for (int i = 0; i < total; ++i) {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1926 result.push_back(ctx.getProperty<T>(index, i));
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1927 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1928
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1929 return result;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1930 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1931
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1932 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1933 * Create an array with the specified values.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1934 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1935 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1936 * @param array the values
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1937 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1938 static void push(Context &ctx, const std::vector<T> &array)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1939 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1940 duk_push_array(ctx);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1941
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1942 int i = 0;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1943 for (const auto &v : array) {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1944 TypeInfo<T>::push(ctx, v);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1945 duk_put_prop_index(ctx, -2, i++);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1946 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1947 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1948 };
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1949
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1950 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1951 * @brief Implementation of managed shared_ptr
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1952 * @see Shared
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1953 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1954 template <typename T>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1955 class TypeInfo<Shared<T>> {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1956 private:
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1957 static void apply(Context &ctx, std::shared_ptr<T> value)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1958 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1959 duk_push_boolean(ctx, false);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1960 duk_put_prop_string(ctx, -2, "\xff""\xff""js-deleted");
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1961 duk_push_pointer(ctx, new std::shared_ptr<T>(value));
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1962 duk_put_prop_string(ctx, -2, "\xff""\xff""js-shared-ptr");
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1963 duk_push_c_function(ctx, [] (duk_context *ctx) -> duk_ret_t {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1964 duk_get_prop_string(ctx, 0, "\xff""\xff""js-deleted");
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1965
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1966 if (!duk_to_boolean(ctx, -1)) {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1967 duk_push_boolean(ctx, true);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1968 duk_put_prop_string(ctx, 0, "\xff""\xff""js-deleted");
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1969 duk_get_prop_string(ctx, 0, "\xff""\xff""js-shared-ptr");
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1970 delete static_cast<std::shared_ptr<T> *>(duk_to_pointer(ctx, -1));
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1971 duk_pop(ctx);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1972 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1973
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1974 duk_pop(ctx);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1975
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1976 return 0;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1977 }, 1);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1978 duk_set_finalizer(ctx, -2);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1979 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1980
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1981 public:
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1982 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1983 * Construct the shared_ptr as this.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1984 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1985 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1986 * @param value the value
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1987 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1988 static void construct(Context &ctx, Shared<T> value)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1989 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1990 duk_push_this(ctx);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1991 apply(ctx, std::move(value.object));
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1992 duk_pop(ctx);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1993 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1994
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1995 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1996 * Push a managed shared_ptr as object.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1997 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1998 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
1999 * @param value the value
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2000 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2001 static void push(Context &ctx, Shared<T> value)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2002 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2003 duk_push_object(ctx);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2004 apply(ctx, value.object);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2005 value.object->prototype(ctx);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2006 duk_set_prototype(ctx, -2);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2007 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2008
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2009 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2010 * Get a managed shared_ptr from the stack.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2011 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2012 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2013 * @param index the object index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2014 * @return the shared_ptr
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2015 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2016 static std::shared_ptr<T> get(Context &ctx, int index)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2017 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2018 duk_get_prop_string(ctx, index, "\xff""\xff""js-shared-ptr");
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2019 std::shared_ptr<T> value = *static_cast<std::shared_ptr<T> *>(duk_to_pointer(ctx, -1));
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2020 duk_pop(ctx);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2021
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2022 return value;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2023 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2024 };
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2025
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2026 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2027 * @brief Implementation of managed pointers
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2028 * @see Pointer
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2029 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2030 template <typename T>
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2031 class TypeInfo<Pointer<T>> {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2032 private:
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2033 static void apply(Context &ctx, T *value)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2034 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2035 duk_push_boolean(ctx, false);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2036 duk_put_prop_string(ctx, -2, "\xff""\xff""js-deleted");
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2037 duk_push_pointer(ctx, value);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2038 duk_put_prop_string(ctx, -2, "\xff""\xff""js-ptr");
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2039 duk_push_c_function(ctx, [] (duk_context *ctx) -> duk_ret_t {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2040 duk_get_prop_string(ctx, 0, "\xff""\xff""js-deleted");
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2041
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2042 if (!duk_to_boolean(ctx, -1)) {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2043 duk_push_boolean(ctx, true);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2044 duk_put_prop_string(ctx, 0, "\xff""\xff""js-deleted");
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2045 duk_get_prop_string(ctx, 0, "\xff""\xff""js-ptr");
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2046 delete static_cast<T *>(duk_to_pointer(ctx, -1));
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2047 duk_pop(ctx);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2048 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2049
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2050 duk_pop(ctx);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2051
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2052 return 0;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2053 }, 1);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2054 duk_set_finalizer(ctx, -2);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2055 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2056
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2057 public:
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2058 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2059 * Construct the pointer as this.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2060 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2061 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2062 * @param value the value
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2063 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2064 static void construct(Context &ctx, Pointer<T> value)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2065 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2066 duk_push_this(ctx);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2067 apply(ctx, value.object);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2068 duk_pop(ctx);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2069 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2070
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2071 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2072 * Push a managed pointer as object.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2073 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2074 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2075 * @param value the value
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2076 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2077 static void push(Context &ctx, Pointer<T> value)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2078 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2079 duk_push_object(ctx);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2080 apply(ctx, value.object);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2081 value.object->prototype(ctx);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2082 duk_set_prototype(ctx, -2);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2083 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2084
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2085 /**
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2086 * Get a managed pointer from the stack.
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2087 *
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2088 * @param ctx the context
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2089 * @param index the object index
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2090 * @return the pointer
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2091 * @warning Do not store the pointer into the C++ side, the object can be deleted at any time
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2092 */
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2093 static T *get(Context &ctx, int index)
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2094 {
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2095 duk_get_prop_string(ctx, index, "\xff""\xff""js-ptr");
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2096 T *value = static_cast<T *>(duk_to_pointer(ctx, -1));
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2097 duk_pop(ctx);
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2098
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2099 return value;
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2100 }
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2101 };
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2102
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2103 } // !js
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2104
7ee8da32da98 Unify all in modules/
David Demelier <markand@malikania.fr>
parents:
diff changeset
2105 #endif // !_JS_H_