Erick / Mbed 2 deprecated ICE-F412

Dependencies:   mbed-rtos mbed

Committer:
jmarkel44
Date:
Tue Jan 24 19:06:45 2017 +0000
Revision:
1:b2e90cda7a5a
Parent:
0:61364762ee0e
Port from IAR F412 project

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jmarkel44 0:61364762ee0e 1 #ifdef V7_MODULE_LINES
jmarkel44 0:61364762ee0e 2 #line 1 "v7/src/license.h"
jmarkel44 0:61364762ee0e 3 #endif
jmarkel44 0:61364762ee0e 4 /*
jmarkel44 0:61364762ee0e 5 * Copyright (c) 2013-2014 Cesanta Software Limited
jmarkel44 0:61364762ee0e 6 * All rights reserved
jmarkel44 0:61364762ee0e 7 *
jmarkel44 0:61364762ee0e 8 * This software is dual-licensed: you can redistribute it and/or modify
jmarkel44 0:61364762ee0e 9 * it under the terms of the GNU General Public License version 2 as
jmarkel44 0:61364762ee0e 10 * published by the Free Software Foundation. For the terms of this
jmarkel44 0:61364762ee0e 11 * license, see <http://www.gnu.org/licenses/>.
jmarkel44 0:61364762ee0e 12 *
jmarkel44 0:61364762ee0e 13 * You are free to use this software under the terms of the GNU General
jmarkel44 0:61364762ee0e 14 * Public License, but WITHOUT ANY WARRANTY; without even the implied
jmarkel44 0:61364762ee0e 15 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
jmarkel44 0:61364762ee0e 16 * See the GNU General Public License for more details.
jmarkel44 0:61364762ee0e 17 *
jmarkel44 0:61364762ee0e 18 * Alternatively, you can license this software under a commercial
jmarkel44 0:61364762ee0e 19 * license, as set out in <https://www.cesanta.com/license>.
jmarkel44 0:61364762ee0e 20 */
jmarkel44 0:61364762ee0e 21
jmarkel44 0:61364762ee0e 22 #ifdef V7_EXPOSE_PRIVATE
jmarkel44 0:61364762ee0e 23 #define V7_PRIVATE
jmarkel44 0:61364762ee0e 24 #define V7_EXTERN extern
jmarkel44 0:61364762ee0e 25 #else
jmarkel44 0:61364762ee0e 26 #define V7_PRIVATE static
jmarkel44 0:61364762ee0e 27 #define V7_EXTERN static
jmarkel44 0:61364762ee0e 28 #endif /* CS_V7_SRC_LICENSE_H_ */
jmarkel44 0:61364762ee0e 29 #ifdef V7_MODULE_LINES
jmarkel44 0:61364762ee0e 30 #line 1 "v7/src/features_profiles.h"
jmarkel44 0:61364762ee0e 31 #endif
jmarkel44 0:61364762ee0e 32 /*
jmarkel44 0:61364762ee0e 33 * Copyright (c) 2014 Cesanta Software Limited
jmarkel44 0:61364762ee0e 34 * All rights reserved
jmarkel44 0:61364762ee0e 35 */
jmarkel44 0:61364762ee0e 36
jmarkel44 0:61364762ee0e 37 #ifndef CS_V7_SRC_FEATURES_PROFILES_H_
jmarkel44 0:61364762ee0e 38 #define CS_V7_SRC_FEATURES_PROFILES_H_
jmarkel44 0:61364762ee0e 39
jmarkel44 0:61364762ee0e 40 #define V7_BUILD_PROFILE_MINIMAL 1
jmarkel44 0:61364762ee0e 41 #define V7_BUILD_PROFILE_MEDIUM 2
jmarkel44 0:61364762ee0e 42 #define V7_BUILD_PROFILE_FULL 3
jmarkel44 0:61364762ee0e 43
jmarkel44 0:61364762ee0e 44 #ifndef V7_BUILD_PROFILE
jmarkel44 0:61364762ee0e 45 #define V7_BUILD_PROFILE V7_BUILD_PROFILE_FULL
jmarkel44 0:61364762ee0e 46 #endif
jmarkel44 0:61364762ee0e 47
jmarkel44 0:61364762ee0e 48 #endif /* CS_V7_SRC_FEATURES_PROFILES_H_ */
jmarkel44 0:61364762ee0e 49 #ifdef V7_MODULE_LINES
jmarkel44 0:61364762ee0e 50 #line 1 "v7/src/features_minimal.h"
jmarkel44 0:61364762ee0e 51 #endif
jmarkel44 0:61364762ee0e 52 /*
jmarkel44 0:61364762ee0e 53 * Copyright (c) 2014 Cesanta Software Limited
jmarkel44 0:61364762ee0e 54 * All rights reserved
jmarkel44 0:61364762ee0e 55 */
jmarkel44 0:61364762ee0e 56
jmarkel44 0:61364762ee0e 57 /* Amalgamated: #include "v7/src/features_profiles.h" */
jmarkel44 0:61364762ee0e 58
jmarkel44 0:61364762ee0e 59 #if V7_BUILD_PROFILE == V7_BUILD_PROFILE_MINIMAL
jmarkel44 0:61364762ee0e 60
jmarkel44 0:61364762ee0e 61 /* This space is intentionally left blank. */
jmarkel44 0:61364762ee0e 62
jmarkel44 0:61364762ee0e 63 #endif /* CS_V7_SRC_FEATURES_MINIMAL_H_ */
jmarkel44 0:61364762ee0e 64 #ifdef V7_MODULE_LINES
jmarkel44 0:61364762ee0e 65 #line 1 "v7/src/features_medium.h"
jmarkel44 0:61364762ee0e 66 #endif
jmarkel44 0:61364762ee0e 67 /*
jmarkel44 0:61364762ee0e 68 * Copyright (c) 2014 Cesanta Software Limited
jmarkel44 0:61364762ee0e 69 * All rights reserved
jmarkel44 0:61364762ee0e 70 */
jmarkel44 0:61364762ee0e 71
jmarkel44 0:61364762ee0e 72 /* Amalgamated: #include "v7/src/features_profiles.h" */
jmarkel44 0:61364762ee0e 73
jmarkel44 0:61364762ee0e 74 #if V7_BUILD_PROFILE == V7_BUILD_PROFILE_MEDIUM
jmarkel44 0:61364762ee0e 75
jmarkel44 0:61364762ee0e 76 #define V7_ENABLE__Date 1
jmarkel44 0:61364762ee0e 77 #define V7_ENABLE__Date__now 1
jmarkel44 0:61364762ee0e 78 #define V7_ENABLE__Date__UTC 1
jmarkel44 0:61364762ee0e 79 #define V7_ENABLE__Math 1
jmarkel44 0:61364762ee0e 80 #define V7_ENABLE__Math__atan2 1
jmarkel44 0:61364762ee0e 81 #define V7_ENABLE__RegExp 1
jmarkel44 0:61364762ee0e 82
jmarkel44 0:61364762ee0e 83 #endif /* CS_V7_SRC_FEATURES_MEDIUM_H_ */
jmarkel44 0:61364762ee0e 84 #ifdef V7_MODULE_LINES
jmarkel44 0:61364762ee0e 85 #line 1 "v7/src/features_full.h"
jmarkel44 0:61364762ee0e 86 #endif
jmarkel44 0:61364762ee0e 87 /*
jmarkel44 0:61364762ee0e 88 * Copyright (c) 2014 Cesanta Software Limited
jmarkel44 0:61364762ee0e 89 * All rights reserved
jmarkel44 0:61364762ee0e 90 */
jmarkel44 0:61364762ee0e 91
jmarkel44 0:61364762ee0e 92 #ifndef CS_V7_SRC_FEATURES_FULL_H_
jmarkel44 0:61364762ee0e 93 #define CS_V7_SRC_FEATURES_FULL_H_
jmarkel44 0:61364762ee0e 94
jmarkel44 0:61364762ee0e 95 /* Amalgamated: #include "v7/src/features_profiles.h" */
jmarkel44 0:61364762ee0e 96
jmarkel44 0:61364762ee0e 97 #if V7_BUILD_PROFILE == V7_BUILD_PROFILE_FULL
jmarkel44 0:61364762ee0e 98 /*
jmarkel44 0:61364762ee0e 99 * DO NOT EDIT.
jmarkel44 0:61364762ee0e 100 * This file is generated by scripts/gen-features-full.pl.
jmarkel44 0:61364762ee0e 101 */
jmarkel44 0:61364762ee0e 102 #ifndef CS_ENABLE_UTF8
jmarkel44 0:61364762ee0e 103 #define CS_ENABLE_UTF8 1
jmarkel44 0:61364762ee0e 104 #endif
jmarkel44 0:61364762ee0e 105
jmarkel44 0:61364762ee0e 106 #define V7_ENABLE__Array__reduce 1
jmarkel44 0:61364762ee0e 107 #define V7_ENABLE__Blob 1
jmarkel44 0:61364762ee0e 108 #define V7_ENABLE__Date 1
jmarkel44 0:61364762ee0e 109 #define V7_ENABLE__Date__UTC 1
jmarkel44 0:61364762ee0e 110 #define V7_ENABLE__Date__getters 1
jmarkel44 0:61364762ee0e 111 #define V7_ENABLE__Date__now 1
jmarkel44 0:61364762ee0e 112 #define V7_ENABLE__Date__parse 1
jmarkel44 0:61364762ee0e 113 #define V7_ENABLE__Date__setters 1
jmarkel44 0:61364762ee0e 114 #define V7_ENABLE__Date__toJSON 1
jmarkel44 0:61364762ee0e 115 #define V7_ENABLE__Date__toLocaleString 1
jmarkel44 0:61364762ee0e 116 #define V7_ENABLE__Date__toString 1
jmarkel44 0:61364762ee0e 117 #define V7_ENABLE__File__list 1
jmarkel44 0:61364762ee0e 118 #define V7_ENABLE__File__require 1
jmarkel44 0:61364762ee0e 119 #define V7_ENABLE__Function__bind 1
jmarkel44 0:61364762ee0e 120 #define V7_ENABLE__Function__call 1
jmarkel44 0:61364762ee0e 121 #define V7_ENABLE__Math 1
jmarkel44 0:61364762ee0e 122 #define V7_ENABLE__Math__abs 1
jmarkel44 0:61364762ee0e 123 #define V7_ENABLE__Math__acos 1
jmarkel44 0:61364762ee0e 124 #define V7_ENABLE__Math__asin 1
jmarkel44 0:61364762ee0e 125 #define V7_ENABLE__Math__atan 1
jmarkel44 0:61364762ee0e 126 #define V7_ENABLE__Math__atan2 1
jmarkel44 0:61364762ee0e 127 #define V7_ENABLE__Math__ceil 1
jmarkel44 0:61364762ee0e 128 #define V7_ENABLE__Math__constants 1
jmarkel44 0:61364762ee0e 129 #define V7_ENABLE__Math__cos 1
jmarkel44 0:61364762ee0e 130 #define V7_ENABLE__Math__exp 1
jmarkel44 0:61364762ee0e 131 #define V7_ENABLE__Math__floor 1
jmarkel44 0:61364762ee0e 132 #define V7_ENABLE__Math__log 1
jmarkel44 0:61364762ee0e 133 #define V7_ENABLE__Math__max 1
jmarkel44 0:61364762ee0e 134 #define V7_ENABLE__Math__min 1
jmarkel44 0:61364762ee0e 135 #define V7_ENABLE__Math__pow 1
jmarkel44 0:61364762ee0e 136 #define V7_ENABLE__Math__random 1
jmarkel44 0:61364762ee0e 137 #define V7_ENABLE__Math__round 1
jmarkel44 0:61364762ee0e 138 #define V7_ENABLE__Math__sin 1
jmarkel44 0:61364762ee0e 139 #define V7_ENABLE__Math__sqrt 1
jmarkel44 0:61364762ee0e 140 #define V7_ENABLE__Math__tan 1
jmarkel44 0:61364762ee0e 141 #define V7_ENABLE__Memory__stats 1
jmarkel44 0:61364762ee0e 142 #define V7_ENABLE__NUMBER__NEGATIVE_INFINITY 1
jmarkel44 0:61364762ee0e 143 #define V7_ENABLE__NUMBER__POSITIVE_INFINITY 1
jmarkel44 0:61364762ee0e 144 #define V7_ENABLE__Object__create 1
jmarkel44 0:61364762ee0e 145 #define V7_ENABLE__Object__defineProperties 1
jmarkel44 0:61364762ee0e 146 #define V7_ENABLE__Object__getOwnPropertyDescriptor 1
jmarkel44 0:61364762ee0e 147 #define V7_ENABLE__Object__getOwnPropertyNames 1
jmarkel44 0:61364762ee0e 148 #define V7_ENABLE__Object__getPrototypeOf 1
jmarkel44 0:61364762ee0e 149 #define V7_ENABLE__Object__hasOwnProperty 1
jmarkel44 0:61364762ee0e 150 #define V7_ENABLE__Object__isExtensible 1
jmarkel44 0:61364762ee0e 151 #define V7_ENABLE__Object__isFrozen 1
jmarkel44 0:61364762ee0e 152 #define V7_ENABLE__Object__isPrototypeOf 1
jmarkel44 0:61364762ee0e 153 #define V7_ENABLE__Object__isSealed 1
jmarkel44 0:61364762ee0e 154 #define V7_ENABLE__Object__keys 1
jmarkel44 0:61364762ee0e 155 #define V7_ENABLE__Object__preventExtensions 1
jmarkel44 0:61364762ee0e 156 #define V7_ENABLE__Object__propertyIsEnumerable 1
jmarkel44 0:61364762ee0e 157 #define V7_ENABLE__Proxy 1
jmarkel44 0:61364762ee0e 158 #define V7_ENABLE__RegExp 1
jmarkel44 0:61364762ee0e 159 #define V7_ENABLE__StackTrace 1
jmarkel44 0:61364762ee0e 160 #define V7_ENABLE__String__localeCompare 1
jmarkel44 0:61364762ee0e 161 #define V7_ENABLE__String__localeLowerCase 1
jmarkel44 0:61364762ee0e 162 #define V7_ENABLE__String__localeUpperCase 1
jmarkel44 0:61364762ee0e 163
jmarkel44 0:61364762ee0e 164 #endif /* V7_BUILD_PROFILE == V7_BUILD_PROFILE_FULL */
jmarkel44 0:61364762ee0e 165
jmarkel44 0:61364762ee0e 166 #endif /* CS_V7_SRC_FEATURES_FULL_H_ */
jmarkel44 0:61364762ee0e 167 #ifdef V7_MODULE_LINES
jmarkel44 0:61364762ee0e 168 #line 1 "v7/src/v7_features.h"
jmarkel44 0:61364762ee0e 169 #endif
jmarkel44 0:61364762ee0e 170 /*
jmarkel44 0:61364762ee0e 171 * Copyright (c) 2014 Cesanta Software Limited
jmarkel44 0:61364762ee0e 172 * All rights reserved
jmarkel44 0:61364762ee0e 173 */
jmarkel44 0:61364762ee0e 174
jmarkel44 0:61364762ee0e 175 #ifndef CS_V7_SRC_V7_FEATURES_H_
jmarkel44 0:61364762ee0e 176 #define CS_V7_SRC_V7_FEATURES_H_
jmarkel44 0:61364762ee0e 177
jmarkel44 0:61364762ee0e 178 /* Only one will actually be used based on V7_BUILD_PROFILE. */
jmarkel44 0:61364762ee0e 179 /* Amalgamated: #include "v7/src/features_minimal.h" */
jmarkel44 0:61364762ee0e 180 /* Amalgamated: #include "v7/src/features_medium.h" */
jmarkel44 0:61364762ee0e 181 /* Amalgamated: #include "v7/src/features_full.h" */
jmarkel44 0:61364762ee0e 182
jmarkel44 0:61364762ee0e 183 #endif /* CS_V7_SRC_V7_FEATURES_H_ */
jmarkel44 0:61364762ee0e 184 #ifdef V7_MODULE_LINES
jmarkel44 0:61364762ee0e 185 #line 1 "v7/src/platform.h"
jmarkel44 0:61364762ee0e 186 #endif
jmarkel44 0:61364762ee0e 187 /*
jmarkel44 0:61364762ee0e 188 * Copyright (c) 2014 Cesanta Software Limited
jmarkel44 0:61364762ee0e 189 * All rights reserved
jmarkel44 0:61364762ee0e 190 */
jmarkel44 0:61364762ee0e 191
jmarkel44 0:61364762ee0e 192 #ifndef CS_V7_SRC_PLATFORM_H_
jmarkel44 0:61364762ee0e 193 #define CS_V7_SRC_PLATFORM_H_
jmarkel44 0:61364762ee0e 194
jmarkel44 0:61364762ee0e 195 #ifdef __arm
jmarkel44 0:61364762ee0e 196 #undef V7_ENABLE__Date
jmarkel44 0:61364762ee0e 197 #define V7_ENABLE__Date 0
jmarkel44 0:61364762ee0e 198 #endif
jmarkel44 0:61364762ee0e 199
jmarkel44 0:61364762ee0e 200 #endif /* CS_V7_SRC_PLATFORM_H_ */
jmarkel44 0:61364762ee0e 201 #ifdef V7_MODULE_LINES
jmarkel44 0:61364762ee0e 202 #line 1 "v7/src/core_public.h"
jmarkel44 0:61364762ee0e 203 #endif
jmarkel44 0:61364762ee0e 204 /*
jmarkel44 0:61364762ee0e 205 * Copyright (c) 2014 Cesanta Software Limited
jmarkel44 0:61364762ee0e 206 * All rights reserved
jmarkel44 0:61364762ee0e 207 */
jmarkel44 0:61364762ee0e 208
jmarkel44 0:61364762ee0e 209 /*
jmarkel44 0:61364762ee0e 210 * === Core
jmarkel44 0:61364762ee0e 211 */
jmarkel44 0:61364762ee0e 212
jmarkel44 0:61364762ee0e 213 #ifndef CS_V7_SRC_CORE_PUBLIC_H_
jmarkel44 0:61364762ee0e 214 #define CS_V7_SRC_CORE_PUBLIC_H_
jmarkel44 0:61364762ee0e 215
jmarkel44 0:61364762ee0e 216 #ifndef _POSIX_C_SOURCE
jmarkel44 0:61364762ee0e 217 #define _POSIX_C_SOURCE 200809L
jmarkel44 0:61364762ee0e 218 #endif
jmarkel44 0:61364762ee0e 219
jmarkel44 0:61364762ee0e 220 /* Amalgamated: #include "v7/src/license.h" */
jmarkel44 0:61364762ee0e 221 /* Amalgamated: #include "v7/src/v7_features.h" */
jmarkel44 0:61364762ee0e 222 /* Amalgamated: #include "v7/src/platform.h" */
jmarkel44 0:61364762ee0e 223
jmarkel44 0:61364762ee0e 224 #include <stddef.h> /* For size_t */
jmarkel44 0:61364762ee0e 225 #include <stdio.h> /* For FILE */
jmarkel44 0:61364762ee0e 226
jmarkel44 0:61364762ee0e 227 #if defined(__cplusplus)
jmarkel44 0:61364762ee0e 228 extern "C" {
jmarkel44 0:61364762ee0e 229 #endif /* __cplusplus */
jmarkel44 0:61364762ee0e 230
jmarkel44 0:61364762ee0e 231 /*
jmarkel44 0:61364762ee0e 232 * TODO(dfrank) : improve amalgamation, so that we'll be able to include
jmarkel44 0:61364762ee0e 233 * files here, and include common/platform.h
jmarkel44 0:61364762ee0e 234 *
jmarkel44 0:61364762ee0e 235 * For now, copy-pasting `WARN_UNUSED_RESULT` here
jmarkel44 0:61364762ee0e 236 */
jmarkel44 0:61364762ee0e 237 #ifdef __GNUC__
jmarkel44 0:61364762ee0e 238 #define WARN_UNUSED_RESULT __attribute__((warn_unused_result))
jmarkel44 0:61364762ee0e 239 #define NOINSTR __attribute__((no_instrument_function))
jmarkel44 0:61364762ee0e 240 #else
jmarkel44 0:61364762ee0e 241 #define WARN_UNUSED_RESULT
jmarkel44 0:61364762ee0e 242 #define NOINSTR
jmarkel44 0:61364762ee0e 243 #endif
jmarkel44 0:61364762ee0e 244
jmarkel44 0:61364762ee0e 245 #define V7_VERSION "1.0"
jmarkel44 0:61364762ee0e 246
jmarkel44 0:61364762ee0e 247 #if (defined(_WIN32) && !defined(__MINGW32__) && !defined(__MINGW64__)) || \
jmarkel44 0:61364762ee0e 248 (defined(_MSC_VER) && _MSC_VER <= 1200)
jmarkel44 0:61364762ee0e 249 #define V7_WINDOWS
jmarkel44 0:61364762ee0e 250 #endif
jmarkel44 0:61364762ee0e 251
jmarkel44 0:61364762ee0e 252 #ifdef V7_WINDOWS
jmarkel44 0:61364762ee0e 253 typedef unsigned __int64 uint64_t;
jmarkel44 0:61364762ee0e 254 #else
jmarkel44 0:61364762ee0e 255 #include <inttypes.h>
jmarkel44 0:61364762ee0e 256 #endif
jmarkel44 0:61364762ee0e 257 /* 64-bit value, used to store JS values */
jmarkel44 0:61364762ee0e 258 typedef uint64_t v7_val_t;
jmarkel44 0:61364762ee0e 259
jmarkel44 0:61364762ee0e 260 /* JavaScript `null` value */
jmarkel44 0:61364762ee0e 261 #define V7_NULL ((uint64_t) 0xfffe << 48)
jmarkel44 0:61364762ee0e 262
jmarkel44 0:61364762ee0e 263 /* JavaScript `undefined` value */
jmarkel44 0:61364762ee0e 264 #define V7_UNDEFINED ((uint64_t) 0xfffd << 48)
jmarkel44 0:61364762ee0e 265
jmarkel44 0:61364762ee0e 266 /* This if-0 is a dirty workaround to force etags to pick `struct v7` */
jmarkel44 0:61364762ee0e 267 #if 0
jmarkel44 0:61364762ee0e 268 /* Opaque structure. V7 engine context. */
jmarkel44 0:61364762ee0e 269 struct v7 {
jmarkel44 0:61364762ee0e 270 /* ... */
jmarkel44 0:61364762ee0e 271 };
jmarkel44 0:61364762ee0e 272 #endif
jmarkel44 0:61364762ee0e 273
jmarkel44 0:61364762ee0e 274 struct v7;
jmarkel44 0:61364762ee0e 275
jmarkel44 0:61364762ee0e 276 /*
jmarkel44 0:61364762ee0e 277 * Code which is returned by some of the v7 functions. If something other than
jmarkel44 0:61364762ee0e 278 * `V7_OK` is returned from some function, the caller function typically should
jmarkel44 0:61364762ee0e 279 * either immediately cleanup and return the code further, or handle the error.
jmarkel44 0:61364762ee0e 280 */
jmarkel44 0:61364762ee0e 281 enum v7_err {
jmarkel44 0:61364762ee0e 282 V7_OK,
jmarkel44 0:61364762ee0e 283 V7_SYNTAX_ERROR,
jmarkel44 0:61364762ee0e 284 V7_EXEC_EXCEPTION,
jmarkel44 0:61364762ee0e 285 V7_AST_TOO_LARGE,
jmarkel44 0:61364762ee0e 286 V7_INTERNAL_ERROR,
jmarkel44 0:61364762ee0e 287 };
jmarkel44 0:61364762ee0e 288
jmarkel44 0:61364762ee0e 289 /* JavaScript -> C call interface */
jmarkel44 0:61364762ee0e 290 WARN_UNUSED_RESULT
jmarkel44 0:61364762ee0e 291 typedef enum v7_err(v7_cfunction_t)(struct v7 *v7, v7_val_t *res);
jmarkel44 0:61364762ee0e 292
jmarkel44 0:61364762ee0e 293 /* Create V7 instance */
jmarkel44 0:61364762ee0e 294 struct v7 *v7_create(void);
jmarkel44 0:61364762ee0e 295
jmarkel44 0:61364762ee0e 296 /*
jmarkel44 0:61364762ee0e 297 * Customizations of initial V7 state; used by `v7_create_opt()`.
jmarkel44 0:61364762ee0e 298 */
jmarkel44 0:61364762ee0e 299 struct v7_create_opts {
jmarkel44 0:61364762ee0e 300 size_t object_arena_size;
jmarkel44 0:61364762ee0e 301 size_t function_arena_size;
jmarkel44 0:61364762ee0e 302 size_t property_arena_size;
jmarkel44 0:61364762ee0e 303 #ifdef V7_STACK_SIZE
jmarkel44 0:61364762ee0e 304 void *c_stack_base;
jmarkel44 0:61364762ee0e 305 #endif
jmarkel44 0:61364762ee0e 306 #ifdef V7_FREEZE
jmarkel44 0:61364762ee0e 307 /* if not NULL, dump JS heap after init */
jmarkel44 0:61364762ee0e 308 char *freeze_file;
jmarkel44 0:61364762ee0e 309 #endif
jmarkel44 0:61364762ee0e 310 };
jmarkel44 0:61364762ee0e 311
jmarkel44 0:61364762ee0e 312 /*
jmarkel44 0:61364762ee0e 313 * Like `v7_create()`, but allows to customize initial v7 state, see `struct
jmarkel44 0:61364762ee0e 314 * v7_create_opts`.
jmarkel44 0:61364762ee0e 315 */
jmarkel44 0:61364762ee0e 316 struct v7 *v7_create_opt(struct v7_create_opts opts);
jmarkel44 0:61364762ee0e 317
jmarkel44 0:61364762ee0e 318 /* Destroy V7 instance */
jmarkel44 0:61364762ee0e 319 void v7_destroy(struct v7 *v7);
jmarkel44 0:61364762ee0e 320
jmarkel44 0:61364762ee0e 321 /* Return root level (`global`) object of the given V7 instance. */
jmarkel44 0:61364762ee0e 322 v7_val_t v7_get_global(struct v7 *v);
jmarkel44 0:61364762ee0e 323
jmarkel44 0:61364762ee0e 324 /* Return current `this` object. */
jmarkel44 0:61364762ee0e 325 v7_val_t v7_get_this(struct v7 *v);
jmarkel44 0:61364762ee0e 326
jmarkel44 0:61364762ee0e 327 /* Return current `arguments` array */
jmarkel44 0:61364762ee0e 328 v7_val_t v7_get_arguments(struct v7 *v);
jmarkel44 0:61364762ee0e 329
jmarkel44 0:61364762ee0e 330 /* Return i-th argument */
jmarkel44 0:61364762ee0e 331 v7_val_t v7_arg(struct v7 *v, unsigned long i);
jmarkel44 0:61364762ee0e 332
jmarkel44 0:61364762ee0e 333 /* Return the length of `arguments` */
jmarkel44 0:61364762ee0e 334 unsigned long v7_argc(struct v7 *v7);
jmarkel44 0:61364762ee0e 335
jmarkel44 0:61364762ee0e 336 /*
jmarkel44 0:61364762ee0e 337 * Tells the GC about a JS value variable/field owned
jmarkel44 0:61364762ee0e 338 * by C code.
jmarkel44 0:61364762ee0e 339 *
jmarkel44 0:61364762ee0e 340 * User C code should own v7_val_t variables
jmarkel44 0:61364762ee0e 341 * if the value's lifetime crosses any invocation
jmarkel44 0:61364762ee0e 342 * to the v7 runtime that creates new objects or new
jmarkel44 0:61364762ee0e 343 * properties and thus can potentially trigger GC.
jmarkel44 0:61364762ee0e 344 *
jmarkel44 0:61364762ee0e 345 * The registration of the variable prevents the GC from mistakenly treat
jmarkel44 0:61364762ee0e 346 * the object as garbage. The GC might be triggered potentially
jmarkel44 0:61364762ee0e 347 * allows the GC to update pointers
jmarkel44 0:61364762ee0e 348 *
jmarkel44 0:61364762ee0e 349 * User code should also explicitly disown the variables with v7_disown once
jmarkel44 0:61364762ee0e 350 * it goes out of scope or the structure containing the v7_val_t field is freed.
jmarkel44 0:61364762ee0e 351 *
jmarkel44 0:61364762ee0e 352 * Example:
jmarkel44 0:61364762ee0e 353 *
jmarkel44 0:61364762ee0e 354 * ```
jmarkel44 0:61364762ee0e 355 * struct v7_val cb;
jmarkel44 0:61364762ee0e 356 * v7_own(v7, &cb);
jmarkel44 0:61364762ee0e 357 * cb = v7_array_get(v7, args, 0);
jmarkel44 0:61364762ee0e 358 * // do something with cb
jmarkel44 0:61364762ee0e 359 * v7_disown(v7, &cb);
jmarkel44 0:61364762ee0e 360 * ```
jmarkel44 0:61364762ee0e 361 */
jmarkel44 0:61364762ee0e 362 void v7_own(struct v7 *v7, v7_val_t *v);
jmarkel44 0:61364762ee0e 363
jmarkel44 0:61364762ee0e 364 /*
jmarkel44 0:61364762ee0e 365 * Returns 1 if value is found, 0 otherwise
jmarkel44 0:61364762ee0e 366 */
jmarkel44 0:61364762ee0e 367 int v7_disown(struct v7 *v7, v7_val_t *v);
jmarkel44 0:61364762ee0e 368
jmarkel44 0:61364762ee0e 369 /*
jmarkel44 0:61364762ee0e 370 * Enable or disable GC.
jmarkel44 0:61364762ee0e 371 *
jmarkel44 0:61364762ee0e 372 * Must be called before invoking v7_exec or v7_apply
jmarkel44 0:61364762ee0e 373 * from within a cfunction unless you know what you're doing.
jmarkel44 0:61364762ee0e 374 *
jmarkel44 0:61364762ee0e 375 * GC is disabled during execution of cfunctions in order to simplify
jmarkel44 0:61364762ee0e 376 * memory management of simple cfunctions.
jmarkel44 0:61364762ee0e 377 * However executing even small snippets of JS code causes a lot of memory
jmarkel44 0:61364762ee0e 378 * pressure. Enabling GC solves that but forces you to take care of the
jmarkel44 0:61364762ee0e 379 * reachability of your temporary V7 v7_val_t variables, as the GC needs
jmarkel44 0:61364762ee0e 380 * to know where they are since objects and strings can be either reclaimed
jmarkel44 0:61364762ee0e 381 * or relocated during a GC pass.
jmarkel44 0:61364762ee0e 382 */
jmarkel44 0:61364762ee0e 383 void v7_set_gc_enabled(struct v7 *v7, int enabled);
jmarkel44 0:61364762ee0e 384
jmarkel44 0:61364762ee0e 385 /*
jmarkel44 0:61364762ee0e 386 * Set an optional C stack limit.
jmarkel44 0:61364762ee0e 387 *
jmarkel44 0:61364762ee0e 388 * It sets a flag that will cause the interpreter
jmarkel44 0:61364762ee0e 389 * to throw an InterruptedError.
jmarkel44 0:61364762ee0e 390 * It's safe to call it from signal handlers and ISRs
jmarkel44 0:61364762ee0e 391 * on single threaded environments.
jmarkel44 0:61364762ee0e 392 */
jmarkel44 0:61364762ee0e 393 void v7_interrupt(struct v7 *v7);
jmarkel44 0:61364762ee0e 394
jmarkel44 0:61364762ee0e 395 /* Returns last parser error message. TODO: rename it to `v7_get_error()` */
jmarkel44 0:61364762ee0e 396 const char *v7_get_parser_error(struct v7 *v7);
jmarkel44 0:61364762ee0e 397
jmarkel44 0:61364762ee0e 398 #if defined(V7_ENABLE_STACK_TRACKING)
jmarkel44 0:61364762ee0e 399 /*
jmarkel44 0:61364762ee0e 400 * Available if only `V7_ENABLE_STACK_TRACKING` is defined.
jmarkel44 0:61364762ee0e 401 *
jmarkel44 0:61364762ee0e 402 * Stack metric id. See `v7_stack_stat()`
jmarkel44 0:61364762ee0e 403 */
jmarkel44 0:61364762ee0e 404 enum v7_stack_stat_what {
jmarkel44 0:61364762ee0e 405 /* max stack size consumed by `i_exec()` */
jmarkel44 0:61364762ee0e 406 V7_STACK_STAT_EXEC,
jmarkel44 0:61364762ee0e 407 /* max stack size consumed by `parse()` (which is called from `i_exec()`) */
jmarkel44 0:61364762ee0e 408 V7_STACK_STAT_PARSER,
jmarkel44 0:61364762ee0e 409
jmarkel44 0:61364762ee0e 410 V7_STACK_STATS_CNT
jmarkel44 0:61364762ee0e 411 };
jmarkel44 0:61364762ee0e 412
jmarkel44 0:61364762ee0e 413 /*
jmarkel44 0:61364762ee0e 414 * Available if only `V7_ENABLE_STACK_TRACKING` is defined.
jmarkel44 0:61364762ee0e 415 *
jmarkel44 0:61364762ee0e 416 * Returns stack metric specified by the metric id `what`. See
jmarkel44 0:61364762ee0e 417 * `v7_stack_stat_clean()`
jmarkel44 0:61364762ee0e 418 */
jmarkel44 0:61364762ee0e 419 int v7_stack_stat(struct v7 *v7, enum v7_stack_stat_what what);
jmarkel44 0:61364762ee0e 420
jmarkel44 0:61364762ee0e 421 /*
jmarkel44 0:61364762ee0e 422 * Available if only `V7_ENABLE_STACK_TRACKING` is defined.
jmarkel44 0:61364762ee0e 423 *
jmarkel44 0:61364762ee0e 424 * Clean all stack statistics gathered so far. See `v7_stack_stat()`
jmarkel44 0:61364762ee0e 425 */
jmarkel44 0:61364762ee0e 426 void v7_stack_stat_clean(struct v7 *v7);
jmarkel44 0:61364762ee0e 427 #endif
jmarkel44 0:61364762ee0e 428
jmarkel44 0:61364762ee0e 429 #if defined(__cplusplus)
jmarkel44 0:61364762ee0e 430 }
jmarkel44 0:61364762ee0e 431 #endif /* __cplusplus */
jmarkel44 0:61364762ee0e 432
jmarkel44 0:61364762ee0e 433 #endif /* CS_V7_SRC_CORE_PUBLIC_H_ */
jmarkel44 0:61364762ee0e 434 #ifndef V7_EXPORT_INTERNAL_HEADERS
jmarkel44 0:61364762ee0e 435 #ifdef V7_MODULE_LINES
jmarkel44 0:61364762ee0e 436 #line 1 "v7/src/core_public.h"
jmarkel44 0:61364762ee0e 437 #endif
jmarkel44 0:61364762ee0e 438 /*
jmarkel44 0:61364762ee0e 439 * Copyright (c) 2014 Cesanta Software Limited
jmarkel44 0:61364762ee0e 440 * All rights reserved
jmarkel44 0:61364762ee0e 441 */
jmarkel44 0:61364762ee0e 442
jmarkel44 0:61364762ee0e 443 /*
jmarkel44 0:61364762ee0e 444 * === Core
jmarkel44 0:61364762ee0e 445 */
jmarkel44 0:61364762ee0e 446
jmarkel44 0:61364762ee0e 447 #ifndef CS_V7_SRC_CORE_PUBLIC_H_
jmarkel44 0:61364762ee0e 448 #define CS_V7_SRC_CORE_PUBLIC_H_
jmarkel44 0:61364762ee0e 449
jmarkel44 0:61364762ee0e 450 #ifndef _POSIX_C_SOURCE
jmarkel44 0:61364762ee0e 451 #define _POSIX_C_SOURCE 200809L
jmarkel44 0:61364762ee0e 452 #endif
jmarkel44 0:61364762ee0e 453
jmarkel44 0:61364762ee0e 454 /* Amalgamated: #include "v7/src/license.h" */
jmarkel44 0:61364762ee0e 455 /* Amalgamated: #include "v7/src/v7_features.h" */
jmarkel44 0:61364762ee0e 456 /* Amalgamated: #include "v7/src/platform.h" */
jmarkel44 0:61364762ee0e 457
jmarkel44 0:61364762ee0e 458 #include <stddef.h> /* For size_t */
jmarkel44 0:61364762ee0e 459 #include <stdio.h> /* For FILE */
jmarkel44 0:61364762ee0e 460
jmarkel44 0:61364762ee0e 461 #if defined(__cplusplus)
jmarkel44 0:61364762ee0e 462 extern "C" {
jmarkel44 0:61364762ee0e 463 #endif /* __cplusplus */
jmarkel44 0:61364762ee0e 464
jmarkel44 0:61364762ee0e 465 /*
jmarkel44 0:61364762ee0e 466 * TODO(dfrank) : improve amalgamation, so that we'll be able to include
jmarkel44 0:61364762ee0e 467 * files here, and include common/platform.h
jmarkel44 0:61364762ee0e 468 *
jmarkel44 0:61364762ee0e 469 * For now, copy-pasting `WARN_UNUSED_RESULT` here
jmarkel44 0:61364762ee0e 470 */
jmarkel44 0:61364762ee0e 471 #ifdef __GNUC__
jmarkel44 0:61364762ee0e 472 #define WARN_UNUSED_RESULT __attribute__((warn_unused_result))
jmarkel44 0:61364762ee0e 473 #define NOINSTR __attribute__((no_instrument_function))
jmarkel44 0:61364762ee0e 474 #else
jmarkel44 0:61364762ee0e 475 #define WARN_UNUSED_RESULT
jmarkel44 0:61364762ee0e 476 #define NOINSTR
jmarkel44 0:61364762ee0e 477 #endif
jmarkel44 0:61364762ee0e 478
jmarkel44 0:61364762ee0e 479 #define V7_VERSION "1.0"
jmarkel44 0:61364762ee0e 480
jmarkel44 0:61364762ee0e 481 #if (defined(_WIN32) && !defined(__MINGW32__) && !defined(__MINGW64__)) || \
jmarkel44 0:61364762ee0e 482 (defined(_MSC_VER) && _MSC_VER <= 1200)
jmarkel44 0:61364762ee0e 483 #define V7_WINDOWS
jmarkel44 0:61364762ee0e 484 #endif
jmarkel44 0:61364762ee0e 485
jmarkel44 0:61364762ee0e 486 #ifdef V7_WINDOWS
jmarkel44 0:61364762ee0e 487 typedef unsigned __int64 uint64_t;
jmarkel44 0:61364762ee0e 488 #else
jmarkel44 0:61364762ee0e 489 #include <inttypes.h>
jmarkel44 0:61364762ee0e 490 #endif
jmarkel44 0:61364762ee0e 491 /* 64-bit value, used to store JS values */
jmarkel44 0:61364762ee0e 492 typedef uint64_t v7_val_t;
jmarkel44 0:61364762ee0e 493
jmarkel44 0:61364762ee0e 494 /* JavaScript `null` value */
jmarkel44 0:61364762ee0e 495 #define V7_NULL ((uint64_t) 0xfffe << 48)
jmarkel44 0:61364762ee0e 496
jmarkel44 0:61364762ee0e 497 /* JavaScript `undefined` value */
jmarkel44 0:61364762ee0e 498 #define V7_UNDEFINED ((uint64_t) 0xfffd << 48)
jmarkel44 0:61364762ee0e 499
jmarkel44 0:61364762ee0e 500 /* This if-0 is a dirty workaround to force etags to pick `struct v7` */
jmarkel44 0:61364762ee0e 501 #if 0
jmarkel44 0:61364762ee0e 502 /* Opaque structure. V7 engine context. */
jmarkel44 0:61364762ee0e 503 struct v7 {
jmarkel44 0:61364762ee0e 504 /* ... */
jmarkel44 0:61364762ee0e 505 };
jmarkel44 0:61364762ee0e 506 #endif
jmarkel44 0:61364762ee0e 507
jmarkel44 0:61364762ee0e 508 struct v7;
jmarkel44 0:61364762ee0e 509
jmarkel44 0:61364762ee0e 510 /*
jmarkel44 0:61364762ee0e 511 * Code which is returned by some of the v7 functions. If something other than
jmarkel44 0:61364762ee0e 512 * `V7_OK` is returned from some function, the caller function typically should
jmarkel44 0:61364762ee0e 513 * either immediately cleanup and return the code further, or handle the error.
jmarkel44 0:61364762ee0e 514 */
jmarkel44 0:61364762ee0e 515 enum v7_err {
jmarkel44 0:61364762ee0e 516 V7_OK,
jmarkel44 0:61364762ee0e 517 V7_SYNTAX_ERROR,
jmarkel44 0:61364762ee0e 518 V7_EXEC_EXCEPTION,
jmarkel44 0:61364762ee0e 519 V7_AST_TOO_LARGE,
jmarkel44 0:61364762ee0e 520 V7_INTERNAL_ERROR,
jmarkel44 0:61364762ee0e 521 };
jmarkel44 0:61364762ee0e 522
jmarkel44 0:61364762ee0e 523 /* JavaScript -> C call interface */
jmarkel44 0:61364762ee0e 524 WARN_UNUSED_RESULT
jmarkel44 0:61364762ee0e 525 typedef enum v7_err(v7_cfunction_t)(struct v7 *v7, v7_val_t *res);
jmarkel44 0:61364762ee0e 526
jmarkel44 0:61364762ee0e 527 /* Create V7 instance */
jmarkel44 0:61364762ee0e 528 struct v7 *v7_create(void);
jmarkel44 0:61364762ee0e 529
jmarkel44 0:61364762ee0e 530 /*
jmarkel44 0:61364762ee0e 531 * Customizations of initial V7 state; used by `v7_create_opt()`.
jmarkel44 0:61364762ee0e 532 */
jmarkel44 0:61364762ee0e 533 struct v7_create_opts {
jmarkel44 0:61364762ee0e 534 size_t object_arena_size;
jmarkel44 0:61364762ee0e 535 size_t function_arena_size;
jmarkel44 0:61364762ee0e 536 size_t property_arena_size;
jmarkel44 0:61364762ee0e 537 #ifdef V7_STACK_SIZE
jmarkel44 0:61364762ee0e 538 void *c_stack_base;
jmarkel44 0:61364762ee0e 539 #endif
jmarkel44 0:61364762ee0e 540 #ifdef V7_FREEZE
jmarkel44 0:61364762ee0e 541 /* if not NULL, dump JS heap after init */
jmarkel44 0:61364762ee0e 542 char *freeze_file;
jmarkel44 0:61364762ee0e 543 #endif
jmarkel44 0:61364762ee0e 544 };
jmarkel44 0:61364762ee0e 545
jmarkel44 0:61364762ee0e 546 /*
jmarkel44 0:61364762ee0e 547 * Like `v7_create()`, but allows to customize initial v7 state, see `struct
jmarkel44 0:61364762ee0e 548 * v7_create_opts`.
jmarkel44 0:61364762ee0e 549 */
jmarkel44 0:61364762ee0e 550 struct v7 *v7_create_opt(struct v7_create_opts opts);
jmarkel44 0:61364762ee0e 551
jmarkel44 0:61364762ee0e 552 /* Destroy V7 instance */
jmarkel44 0:61364762ee0e 553 void v7_destroy(struct v7 *v7);
jmarkel44 0:61364762ee0e 554
jmarkel44 0:61364762ee0e 555 /* Return root level (`global`) object of the given V7 instance. */
jmarkel44 0:61364762ee0e 556 v7_val_t v7_get_global(struct v7 *v);
jmarkel44 0:61364762ee0e 557
jmarkel44 0:61364762ee0e 558 /* Return current `this` object. */
jmarkel44 0:61364762ee0e 559 v7_val_t v7_get_this(struct v7 *v);
jmarkel44 0:61364762ee0e 560
jmarkel44 0:61364762ee0e 561 /* Return current `arguments` array */
jmarkel44 0:61364762ee0e 562 v7_val_t v7_get_arguments(struct v7 *v);
jmarkel44 0:61364762ee0e 563
jmarkel44 0:61364762ee0e 564 /* Return i-th argument */
jmarkel44 0:61364762ee0e 565 v7_val_t v7_arg(struct v7 *v, unsigned long i);
jmarkel44 0:61364762ee0e 566
jmarkel44 0:61364762ee0e 567 /* Return the length of `arguments` */
jmarkel44 0:61364762ee0e 568 unsigned long v7_argc(struct v7 *v7);
jmarkel44 0:61364762ee0e 569
jmarkel44 0:61364762ee0e 570 /*
jmarkel44 0:61364762ee0e 571 * Tells the GC about a JS value variable/field owned
jmarkel44 0:61364762ee0e 572 * by C code.
jmarkel44 0:61364762ee0e 573 *
jmarkel44 0:61364762ee0e 574 * User C code should own v7_val_t variables
jmarkel44 0:61364762ee0e 575 * if the value's lifetime crosses any invocation
jmarkel44 0:61364762ee0e 576 * to the v7 runtime that creates new objects or new
jmarkel44 0:61364762ee0e 577 * properties and thus can potentially trigger GC.
jmarkel44 0:61364762ee0e 578 *
jmarkel44 0:61364762ee0e 579 * The registration of the variable prevents the GC from mistakenly treat
jmarkel44 0:61364762ee0e 580 * the object as garbage. The GC might be triggered potentially
jmarkel44 0:61364762ee0e 581 * allows the GC to update pointers
jmarkel44 0:61364762ee0e 582 *
jmarkel44 0:61364762ee0e 583 * User code should also explicitly disown the variables with v7_disown once
jmarkel44 0:61364762ee0e 584 * it goes out of scope or the structure containing the v7_val_t field is freed.
jmarkel44 0:61364762ee0e 585 *
jmarkel44 0:61364762ee0e 586 * Example:
jmarkel44 0:61364762ee0e 587 *
jmarkel44 0:61364762ee0e 588 * ```
jmarkel44 0:61364762ee0e 589 * struct v7_val cb;
jmarkel44 0:61364762ee0e 590 * v7_own(v7, &cb);
jmarkel44 0:61364762ee0e 591 * cb = v7_array_get(v7, args, 0);
jmarkel44 0:61364762ee0e 592 * // do something with cb
jmarkel44 0:61364762ee0e 593 * v7_disown(v7, &cb);
jmarkel44 0:61364762ee0e 594 * ```
jmarkel44 0:61364762ee0e 595 */
jmarkel44 0:61364762ee0e 596 void v7_own(struct v7 *v7, v7_val_t *v);
jmarkel44 0:61364762ee0e 597
jmarkel44 0:61364762ee0e 598 /*
jmarkel44 0:61364762ee0e 599 * Returns 1 if value is found, 0 otherwise
jmarkel44 0:61364762ee0e 600 */
jmarkel44 0:61364762ee0e 601 int v7_disown(struct v7 *v7, v7_val_t *v);
jmarkel44 0:61364762ee0e 602
jmarkel44 0:61364762ee0e 603 /*
jmarkel44 0:61364762ee0e 604 * Enable or disable GC.
jmarkel44 0:61364762ee0e 605 *
jmarkel44 0:61364762ee0e 606 * Must be called before invoking v7_exec or v7_apply
jmarkel44 0:61364762ee0e 607 * from within a cfunction unless you know what you're doing.
jmarkel44 0:61364762ee0e 608 *
jmarkel44 0:61364762ee0e 609 * GC is disabled during execution of cfunctions in order to simplify
jmarkel44 0:61364762ee0e 610 * memory management of simple cfunctions.
jmarkel44 0:61364762ee0e 611 * However executing even small snippets of JS code causes a lot of memory
jmarkel44 0:61364762ee0e 612 * pressure. Enabling GC solves that but forces you to take care of the
jmarkel44 0:61364762ee0e 613 * reachability of your temporary V7 v7_val_t variables, as the GC needs
jmarkel44 0:61364762ee0e 614 * to know where they are since objects and strings can be either reclaimed
jmarkel44 0:61364762ee0e 615 * or relocated during a GC pass.
jmarkel44 0:61364762ee0e 616 */
jmarkel44 0:61364762ee0e 617 void v7_set_gc_enabled(struct v7 *v7, int enabled);
jmarkel44 0:61364762ee0e 618
jmarkel44 0:61364762ee0e 619 /*
jmarkel44 0:61364762ee0e 620 * Set an optional C stack limit.
jmarkel44 0:61364762ee0e 621 *
jmarkel44 0:61364762ee0e 622 * It sets a flag that will cause the interpreter
jmarkel44 0:61364762ee0e 623 * to throw an InterruptedError.
jmarkel44 0:61364762ee0e 624 * It's safe to call it from signal handlers and ISRs
jmarkel44 0:61364762ee0e 625 * on single threaded environments.
jmarkel44 0:61364762ee0e 626 */
jmarkel44 0:61364762ee0e 627 void v7_interrupt(struct v7 *v7);
jmarkel44 0:61364762ee0e 628
jmarkel44 0:61364762ee0e 629 /* Returns last parser error message. TODO: rename it to `v7_get_error()` */
jmarkel44 0:61364762ee0e 630 const char *v7_get_parser_error(struct v7 *v7);
jmarkel44 0:61364762ee0e 631
jmarkel44 0:61364762ee0e 632 #if defined(V7_ENABLE_STACK_TRACKING)
jmarkel44 0:61364762ee0e 633 /*
jmarkel44 0:61364762ee0e 634 * Available if only `V7_ENABLE_STACK_TRACKING` is defined.
jmarkel44 0:61364762ee0e 635 *
jmarkel44 0:61364762ee0e 636 * Stack metric id. See `v7_stack_stat()`
jmarkel44 0:61364762ee0e 637 */
jmarkel44 0:61364762ee0e 638 enum v7_stack_stat_what {
jmarkel44 0:61364762ee0e 639 /* max stack size consumed by `i_exec()` */
jmarkel44 0:61364762ee0e 640 V7_STACK_STAT_EXEC,
jmarkel44 0:61364762ee0e 641 /* max stack size consumed by `parse()` (which is called from `i_exec()`) */
jmarkel44 0:61364762ee0e 642 V7_STACK_STAT_PARSER,
jmarkel44 0:61364762ee0e 643
jmarkel44 0:61364762ee0e 644 V7_STACK_STATS_CNT
jmarkel44 0:61364762ee0e 645 };
jmarkel44 0:61364762ee0e 646
jmarkel44 0:61364762ee0e 647 /*
jmarkel44 0:61364762ee0e 648 * Available if only `V7_ENABLE_STACK_TRACKING` is defined.
jmarkel44 0:61364762ee0e 649 *
jmarkel44 0:61364762ee0e 650 * Returns stack metric specified by the metric id `what`. See
jmarkel44 0:61364762ee0e 651 * `v7_stack_stat_clean()`
jmarkel44 0:61364762ee0e 652 */
jmarkel44 0:61364762ee0e 653 int v7_stack_stat(struct v7 *v7, enum v7_stack_stat_what what);
jmarkel44 0:61364762ee0e 654
jmarkel44 0:61364762ee0e 655 /*
jmarkel44 0:61364762ee0e 656 * Available if only `V7_ENABLE_STACK_TRACKING` is defined.
jmarkel44 0:61364762ee0e 657 *
jmarkel44 0:61364762ee0e 658 * Clean all stack statistics gathered so far. See `v7_stack_stat()`
jmarkel44 0:61364762ee0e 659 */
jmarkel44 0:61364762ee0e 660 void v7_stack_stat_clean(struct v7 *v7);
jmarkel44 0:61364762ee0e 661 #endif
jmarkel44 0:61364762ee0e 662
jmarkel44 0:61364762ee0e 663 #if defined(__cplusplus)
jmarkel44 0:61364762ee0e 664 }
jmarkel44 0:61364762ee0e 665 #endif /* __cplusplus */
jmarkel44 0:61364762ee0e 666
jmarkel44 0:61364762ee0e 667 #endif /* CS_V7_SRC_CORE_PUBLIC_H_ */
jmarkel44 0:61364762ee0e 668 #ifdef V7_MODULE_LINES
jmarkel44 0:61364762ee0e 669 #line 1 "v7/src/primitive_public.h"
jmarkel44 0:61364762ee0e 670 #endif
jmarkel44 0:61364762ee0e 671 /*
jmarkel44 0:61364762ee0e 672 * Copyright (c) 2014 Cesanta Software Limited
jmarkel44 0:61364762ee0e 673 * All rights reserved
jmarkel44 0:61364762ee0e 674 */
jmarkel44 0:61364762ee0e 675
jmarkel44 0:61364762ee0e 676 /*
jmarkel44 0:61364762ee0e 677 * === Primitives
jmarkel44 0:61364762ee0e 678 *
jmarkel44 0:61364762ee0e 679 * All primitive values but strings.
jmarkel44 0:61364762ee0e 680 *
jmarkel44 0:61364762ee0e 681 * "foreign" values are also here, see `v7_mk_foreign()`.
jmarkel44 0:61364762ee0e 682 */
jmarkel44 0:61364762ee0e 683
jmarkel44 0:61364762ee0e 684 #ifndef CS_V7_SRC_PRIMITIVE_PUBLIC_H_
jmarkel44 0:61364762ee0e 685 #define CS_V7_SRC_PRIMITIVE_PUBLIC_H_
jmarkel44 0:61364762ee0e 686
jmarkel44 0:61364762ee0e 687 /* Amalgamated: #include "v7/src/core_public.h" */
jmarkel44 0:61364762ee0e 688
jmarkel44 0:61364762ee0e 689 #if defined(__cplusplus)
jmarkel44 0:61364762ee0e 690 extern "C" {
jmarkel44 0:61364762ee0e 691 #endif /* __cplusplus */
jmarkel44 0:61364762ee0e 692
jmarkel44 0:61364762ee0e 693 /* Make numeric primitive value */
jmarkel44 0:61364762ee0e 694 NOINSTR v7_val_t v7_mk_number(struct v7 *v7, double num);
jmarkel44 0:61364762ee0e 695
jmarkel44 0:61364762ee0e 696 /*
jmarkel44 0:61364762ee0e 697 * Returns number value stored in `v7_val_t` as `double`.
jmarkel44 0:61364762ee0e 698 *
jmarkel44 0:61364762ee0e 699 * Returns NaN for non-numbers.
jmarkel44 0:61364762ee0e 700 */
jmarkel44 0:61364762ee0e 701 NOINSTR double v7_get_double(struct v7 *v7, v7_val_t v);
jmarkel44 0:61364762ee0e 702
jmarkel44 0:61364762ee0e 703 /*
jmarkel44 0:61364762ee0e 704 * Returns number value stored in `v7_val_t` as `int`. If the number value is
jmarkel44 0:61364762ee0e 705 * not an integer, the fraction part will be discarded.
jmarkel44 0:61364762ee0e 706 *
jmarkel44 0:61364762ee0e 707 * If the given value is a non-number, or NaN, the result is undefined.
jmarkel44 0:61364762ee0e 708 */
jmarkel44 0:61364762ee0e 709 NOINSTR int v7_get_int(struct v7 *v7, v7_val_t v);
jmarkel44 0:61364762ee0e 710
jmarkel44 0:61364762ee0e 711 /* Returns true if given value is a primitive number value */
jmarkel44 0:61364762ee0e 712 int v7_is_number(v7_val_t v);
jmarkel44 0:61364762ee0e 713
jmarkel44 0:61364762ee0e 714 /* Make boolean primitive value (either `true` or `false`) */
jmarkel44 0:61364762ee0e 715 NOINSTR v7_val_t v7_mk_boolean(struct v7 *v7, int is_true);
jmarkel44 0:61364762ee0e 716
jmarkel44 0:61364762ee0e 717 /*
jmarkel44 0:61364762ee0e 718 * Returns boolean stored in `v7_val_t`:
jmarkel44 0:61364762ee0e 719 * 0 for `false` or non-boolean, non-0 for `true`
jmarkel44 0:61364762ee0e 720 */
jmarkel44 0:61364762ee0e 721 NOINSTR int v7_get_bool(struct v7 *v7, v7_val_t v);
jmarkel44 0:61364762ee0e 722
jmarkel44 0:61364762ee0e 723 /* Returns true if given value is a primitive boolean value */
jmarkel44 0:61364762ee0e 724 int v7_is_boolean(v7_val_t v);
jmarkel44 0:61364762ee0e 725
jmarkel44 0:61364762ee0e 726 /*
jmarkel44 0:61364762ee0e 727 * Make `null` primitive value.
jmarkel44 0:61364762ee0e 728 *
jmarkel44 0:61364762ee0e 729 * NOTE: this function is deprecated and will be removed in future releases.
jmarkel44 0:61364762ee0e 730 * Use `V7_NULL` instead.
jmarkel44 0:61364762ee0e 731 */
jmarkel44 0:61364762ee0e 732 NOINSTR v7_val_t v7_mk_null(void);
jmarkel44 0:61364762ee0e 733
jmarkel44 0:61364762ee0e 734 /* Returns true if given value is a primitive `null` value */
jmarkel44 0:61364762ee0e 735 int v7_is_null(v7_val_t v);
jmarkel44 0:61364762ee0e 736
jmarkel44 0:61364762ee0e 737 /*
jmarkel44 0:61364762ee0e 738 * Make `undefined` primitive value.
jmarkel44 0:61364762ee0e 739 *
jmarkel44 0:61364762ee0e 740 * NOTE: this function is deprecated and will be removed in future releases.
jmarkel44 0:61364762ee0e 741 * Use `V7_UNDEFINED` instead.
jmarkel44 0:61364762ee0e 742 */
jmarkel44 0:61364762ee0e 743 NOINSTR v7_val_t v7_mk_undefined(void);
jmarkel44 0:61364762ee0e 744
jmarkel44 0:61364762ee0e 745 /* Returns true if given value is a primitive `undefined` value */
jmarkel44 0:61364762ee0e 746 int v7_is_undefined(v7_val_t v);
jmarkel44 0:61364762ee0e 747
jmarkel44 0:61364762ee0e 748 /*
jmarkel44 0:61364762ee0e 749 * Make JavaScript value that holds C/C++ `void *` pointer.
jmarkel44 0:61364762ee0e 750 *
jmarkel44 0:61364762ee0e 751 * A foreign value is completely opaque and JS code cannot do anything useful
jmarkel44 0:61364762ee0e 752 * with it except holding it in properties and passing it around.
jmarkel44 0:61364762ee0e 753 * It behaves like a sealed object with no properties.
jmarkel44 0:61364762ee0e 754 *
jmarkel44 0:61364762ee0e 755 * NOTE:
jmarkel44 0:61364762ee0e 756 * Only valid pointers (as defined by each supported architecture) will fully
jmarkel44 0:61364762ee0e 757 * preserved. In particular, all supported 64-bit architectures (x86_64, ARM-64)
jmarkel44 0:61364762ee0e 758 * actually define a 48-bit virtual address space.
jmarkel44 0:61364762ee0e 759 * Foreign values will be sign-extended as required, i.e creating a foreign
jmarkel44 0:61364762ee0e 760 * value of something like `(void *) -1` will work as expected. This is
jmarkel44 0:61364762ee0e 761 * important because in some 64-bit OSs (e.g. Solaris) the user stack grows
jmarkel44 0:61364762ee0e 762 * downwards from the end of the address space.
jmarkel44 0:61364762ee0e 763 *
jmarkel44 0:61364762ee0e 764 * If you need to store exactly sizeof(void*) bytes of raw data where
jmarkel44 0:61364762ee0e 765 * `sizeof(void*)` >= 8, please use byte arrays instead.
jmarkel44 0:61364762ee0e 766 */
jmarkel44 0:61364762ee0e 767 NOINSTR v7_val_t v7_mk_foreign(struct v7 *v7, void *ptr);
jmarkel44 0:61364762ee0e 768
jmarkel44 0:61364762ee0e 769 /*
jmarkel44 0:61364762ee0e 770 * Returns `void *` pointer stored in `v7_val_t`.
jmarkel44 0:61364762ee0e 771 *
jmarkel44 0:61364762ee0e 772 * Returns NULL if the value is not a foreign pointer.
jmarkel44 0:61364762ee0e 773 */
jmarkel44 0:61364762ee0e 774 NOINSTR void *v7_get_ptr(struct v7 *v7, v7_val_t v);
jmarkel44 0:61364762ee0e 775
jmarkel44 0:61364762ee0e 776 /* Returns true if given value holds `void *` pointer */
jmarkel44 0:61364762ee0e 777 int v7_is_foreign(v7_val_t v);
jmarkel44 0:61364762ee0e 778
jmarkel44 0:61364762ee0e 779 #if defined(__cplusplus)
jmarkel44 0:61364762ee0e 780 }
jmarkel44 0:61364762ee0e 781 #endif /* __cplusplus */
jmarkel44 0:61364762ee0e 782
jmarkel44 0:61364762ee0e 783 #endif /* CS_V7_SRC_PRIMITIVE_PUBLIC_H_ */
jmarkel44 0:61364762ee0e 784 #ifdef V7_MODULE_LINES
jmarkel44 0:61364762ee0e 785 #line 1 "v7/src/string_public.h"
jmarkel44 0:61364762ee0e 786 #endif
jmarkel44 0:61364762ee0e 787 /*
jmarkel44 0:61364762ee0e 788 * Copyright (c) 2014 Cesanta Software Limited
jmarkel44 0:61364762ee0e 789 * All rights reserved
jmarkel44 0:61364762ee0e 790 */
jmarkel44 0:61364762ee0e 791
jmarkel44 0:61364762ee0e 792 /*
jmarkel44 0:61364762ee0e 793 * === Strings
jmarkel44 0:61364762ee0e 794 */
jmarkel44 0:61364762ee0e 795
jmarkel44 0:61364762ee0e 796 #ifndef CS_V7_SRC_STRING_PUBLIC_H_
jmarkel44 0:61364762ee0e 797 #define CS_V7_SRC_STRING_PUBLIC_H_
jmarkel44 0:61364762ee0e 798
jmarkel44 0:61364762ee0e 799 /* Amalgamated: #include "v7/src/core_public.h" */
jmarkel44 0:61364762ee0e 800
jmarkel44 0:61364762ee0e 801 #if defined(__cplusplus)
jmarkel44 0:61364762ee0e 802 extern "C" {
jmarkel44 0:61364762ee0e 803 #endif /* __cplusplus */
jmarkel44 0:61364762ee0e 804
jmarkel44 0:61364762ee0e 805 /*
jmarkel44 0:61364762ee0e 806 * Creates a string primitive value.
jmarkel44 0:61364762ee0e 807 * `str` must point to the utf8 string of length `len`.
jmarkel44 0:61364762ee0e 808 * If `len` is ~0, `str` is assumed to be NUL-terminated and `strlen(str)` is
jmarkel44 0:61364762ee0e 809 * used.
jmarkel44 0:61364762ee0e 810 *
jmarkel44 0:61364762ee0e 811 * If `copy` is non-zero, the string data is copied and owned by the GC. The
jmarkel44 0:61364762ee0e 812 * caller can free the string data afterwards. Otherwise (`copy` is zero), the
jmarkel44 0:61364762ee0e 813 * caller owns the string data, and is responsible for not freeing it while it
jmarkel44 0:61364762ee0e 814 * is used.
jmarkel44 0:61364762ee0e 815 */
jmarkel44 0:61364762ee0e 816 v7_val_t v7_mk_string(struct v7 *v7, const char *str, size_t len, int copy);
jmarkel44 0:61364762ee0e 817
jmarkel44 0:61364762ee0e 818 /* Returns true if given value is a primitive string value */
jmarkel44 0:61364762ee0e 819 int v7_is_string(v7_val_t v);
jmarkel44 0:61364762ee0e 820
jmarkel44 0:61364762ee0e 821 /*
jmarkel44 0:61364762ee0e 822 * Returns a pointer to the string stored in `v7_val_t`.
jmarkel44 0:61364762ee0e 823 *
jmarkel44 0:61364762ee0e 824 * String length returned in `len`, which is allowed to be NULL. Returns NULL
jmarkel44 0:61364762ee0e 825 * if the value is not a string.
jmarkel44 0:61364762ee0e 826 *
jmarkel44 0:61364762ee0e 827 * JS strings can contain embedded NUL chars and may or may not be NUL
jmarkel44 0:61364762ee0e 828 * terminated.
jmarkel44 0:61364762ee0e 829 *
jmarkel44 0:61364762ee0e 830 * CAUTION: creating new JavaScript object, array, or string may kick in a
jmarkel44 0:61364762ee0e 831 * garbage collector, which in turn may relocate string data and invalidate
jmarkel44 0:61364762ee0e 832 * pointer returned by `v7_get_string()`.
jmarkel44 0:61364762ee0e 833 *
jmarkel44 0:61364762ee0e 834 * Short JS strings are embedded inside the `v7_val_t` value itself. This is why
jmarkel44 0:61364762ee0e 835 * a pointer to a `v7_val_t` is required. It also means that the string data
jmarkel44 0:61364762ee0e 836 * will become invalid once that `v7_val_t` value goes out of scope.
jmarkel44 0:61364762ee0e 837 */
jmarkel44 0:61364762ee0e 838 const char *v7_get_string(struct v7 *v7, v7_val_t *v, size_t *len);
jmarkel44 0:61364762ee0e 839
jmarkel44 0:61364762ee0e 840 /*
jmarkel44 0:61364762ee0e 841 * Returns a pointer to the string stored in `v7_val_t`.
jmarkel44 0:61364762ee0e 842 *
jmarkel44 0:61364762ee0e 843 * Returns NULL if the value is not a string or if the string is not compatible
jmarkel44 0:61364762ee0e 844 * with a C string.
jmarkel44 0:61364762ee0e 845 *
jmarkel44 0:61364762ee0e 846 * C compatible strings contain exactly one NUL char, in terminal position.
jmarkel44 0:61364762ee0e 847 *
jmarkel44 0:61364762ee0e 848 * All strings owned by the V7 engine (see `v7_mk_string()`) are guaranteed to
jmarkel44 0:61364762ee0e 849 * be NUL terminated. Out of these, those that don't include embedded NUL chars
jmarkel44 0:61364762ee0e 850 * are guaranteed to be C compatible.
jmarkel44 0:61364762ee0e 851 */
jmarkel44 0:61364762ee0e 852 const char *v7_get_cstring(struct v7 *v7, v7_val_t *v);
jmarkel44 0:61364762ee0e 853
jmarkel44 0:61364762ee0e 854 #if defined(__cplusplus)
jmarkel44 0:61364762ee0e 855 }
jmarkel44 0:61364762ee0e 856 #endif /* __cplusplus */
jmarkel44 0:61364762ee0e 857
jmarkel44 0:61364762ee0e 858 #endif /* CS_V7_SRC_STRING_PUBLIC_H_ */
jmarkel44 0:61364762ee0e 859 #ifdef V7_MODULE_LINES
jmarkel44 0:61364762ee0e 860 #line 1 "v7/src/object_public.h"
jmarkel44 0:61364762ee0e 861 #endif
jmarkel44 0:61364762ee0e 862 /*
jmarkel44 0:61364762ee0e 863 * Copyright (c) 2014 Cesanta Software Limited
jmarkel44 0:61364762ee0e 864 * All rights reserved
jmarkel44 0:61364762ee0e 865 */
jmarkel44 0:61364762ee0e 866
jmarkel44 0:61364762ee0e 867 /*
jmarkel44 0:61364762ee0e 868 * === Objects
jmarkel44 0:61364762ee0e 869 */
jmarkel44 0:61364762ee0e 870
jmarkel44 0:61364762ee0e 871 #ifndef CS_V7_SRC_OBJECT_PUBLIC_H_
jmarkel44 0:61364762ee0e 872 #define CS_V7_SRC_OBJECT_PUBLIC_H_
jmarkel44 0:61364762ee0e 873
jmarkel44 0:61364762ee0e 874 /* Amalgamated: #include "v7/src/core_public.h" */
jmarkel44 0:61364762ee0e 875
jmarkel44 0:61364762ee0e 876 #if defined(__cplusplus)
jmarkel44 0:61364762ee0e 877 extern "C" {
jmarkel44 0:61364762ee0e 878 #endif /* __cplusplus */
jmarkel44 0:61364762ee0e 879
jmarkel44 0:61364762ee0e 880 /*
jmarkel44 0:61364762ee0e 881 * Property attributes bitmask
jmarkel44 0:61364762ee0e 882 */
jmarkel44 0:61364762ee0e 883 typedef unsigned short v7_prop_attr_t;
jmarkel44 0:61364762ee0e 884 #define V7_PROPERTY_NON_WRITABLE (1 << 0)
jmarkel44 0:61364762ee0e 885 #define V7_PROPERTY_NON_ENUMERABLE (1 << 1)
jmarkel44 0:61364762ee0e 886 #define V7_PROPERTY_NON_CONFIGURABLE (1 << 2)
jmarkel44 0:61364762ee0e 887 #define V7_PROPERTY_GETTER (1 << 3)
jmarkel44 0:61364762ee0e 888 #define V7_PROPERTY_SETTER (1 << 4)
jmarkel44 0:61364762ee0e 889 #define _V7_PROPERTY_HIDDEN (1 << 5)
jmarkel44 0:61364762ee0e 890 /* property not managed by V7 HEAP */
jmarkel44 0:61364762ee0e 891 #define _V7_PROPERTY_OFF_HEAP (1 << 6)
jmarkel44 0:61364762ee0e 892 /* special property holding user data and destructor cb */
jmarkel44 0:61364762ee0e 893 #define _V7_PROPERTY_USER_DATA_AND_DESTRUCTOR (1 << 7)
jmarkel44 0:61364762ee0e 894 /*
jmarkel44 0:61364762ee0e 895 * not a property attribute, but a flag for `v7_def()`. It's here in order to
jmarkel44 0:61364762ee0e 896 * keep all offsets in one place
jmarkel44 0:61364762ee0e 897 */
jmarkel44 0:61364762ee0e 898 #define _V7_DESC_PRESERVE_VALUE (1 << 8)
jmarkel44 0:61364762ee0e 899
jmarkel44 0:61364762ee0e 900 #define V7_PROP_ATTR_IS_WRITABLE(a) (!(a & V7_PROPERTY_NON_WRITABLE))
jmarkel44 0:61364762ee0e 901 #define V7_PROP_ATTR_IS_ENUMERABLE(a) (!(a & V7_PROPERTY_NON_ENUMERABLE))
jmarkel44 0:61364762ee0e 902 #define V7_PROP_ATTR_IS_CONFIGURABLE(a) (!(a & V7_PROPERTY_NON_CONFIGURABLE))
jmarkel44 0:61364762ee0e 903
jmarkel44 0:61364762ee0e 904 /*
jmarkel44 0:61364762ee0e 905 * Internal helpers for `V7_DESC_...` macros
jmarkel44 0:61364762ee0e 906 */
jmarkel44 0:61364762ee0e 907 #define _V7_DESC_SHIFT 16
jmarkel44 0:61364762ee0e 908 #define _V7_DESC_MASK ((1 << _V7_DESC_SHIFT) - 1)
jmarkel44 0:61364762ee0e 909 #define _V7_MK_DESC(v, n) \
jmarkel44 0:61364762ee0e 910 (((v7_prop_attr_desc_t)(n)) << _V7_DESC_SHIFT | ((v) ? (n) : 0))
jmarkel44 0:61364762ee0e 911 #define _V7_MK_DESC_INV(v, n) _V7_MK_DESC(!(v), (n))
jmarkel44 0:61364762ee0e 912
jmarkel44 0:61364762ee0e 913 /*
jmarkel44 0:61364762ee0e 914 * Property attribute descriptors that may be given to `v7_def()`: for each
jmarkel44 0:61364762ee0e 915 * attribute (`v7_prop_attr_t`), there is a corresponding macro, which takes
jmarkel44 0:61364762ee0e 916 * param: either 1 (set attribute) or 0 (clear attribute). If some particular
jmarkel44 0:61364762ee0e 917 * attribute isn't mentioned at all, it's left unchanged (or default, if the
jmarkel44 0:61364762ee0e 918 * property is being created)
jmarkel44 0:61364762ee0e 919 *
jmarkel44 0:61364762ee0e 920 * There is additional flag: `V7_DESC_PRESERVE_VALUE`. If it is set, the
jmarkel44 0:61364762ee0e 921 * property value isn't changed (or set to `undefined` if the property is being
jmarkel44 0:61364762ee0e 922 * created)
jmarkel44 0:61364762ee0e 923 */
jmarkel44 0:61364762ee0e 924 typedef unsigned long v7_prop_attr_desc_t;
jmarkel44 0:61364762ee0e 925 #define V7_DESC_WRITABLE(v) _V7_MK_DESC_INV(v, V7_PROPERTY_NON_WRITABLE)
jmarkel44 0:61364762ee0e 926 #define V7_DESC_ENUMERABLE(v) _V7_MK_DESC_INV(v, V7_PROPERTY_NON_ENUMERABLE)
jmarkel44 0:61364762ee0e 927 #define V7_DESC_CONFIGURABLE(v) _V7_MK_DESC_INV(v, V7_PROPERTY_NON_CONFIGURABLE)
jmarkel44 0:61364762ee0e 928 #define V7_DESC_GETTER(v) _V7_MK_DESC(v, V7_PROPERTY_GETTER)
jmarkel44 0:61364762ee0e 929 #define V7_DESC_SETTER(v) _V7_MK_DESC(v, V7_PROPERTY_SETTER)
jmarkel44 0:61364762ee0e 930 #define V7_DESC_PRESERVE_VALUE _V7_DESC_PRESERVE_VALUE
jmarkel44 0:61364762ee0e 931
jmarkel44 0:61364762ee0e 932 #define _V7_DESC_HIDDEN(v) _V7_MK_DESC(v, _V7_PROPERTY_HIDDEN)
jmarkel44 0:61364762ee0e 933 #define _V7_DESC_OFF_HEAP(v) _V7_MK_DESC(v, _V7_PROPERTY_OFF_HEAP)
jmarkel44 0:61364762ee0e 934
jmarkel44 0:61364762ee0e 935 /* See `v7_set_destructor_cb` */
jmarkel44 0:61364762ee0e 936 typedef void(v7_destructor_cb_t)(struct v7 *v7, void *ud);
jmarkel44 0:61364762ee0e 937
jmarkel44 0:61364762ee0e 938 /* Make an empty object */
jmarkel44 0:61364762ee0e 939 v7_val_t v7_mk_object(struct v7 *v7);
jmarkel44 0:61364762ee0e 940
jmarkel44 0:61364762ee0e 941 /*
jmarkel44 0:61364762ee0e 942 * Returns true if the given value is an object or function.
jmarkel44 0:61364762ee0e 943 * i.e. it returns true if the value holds properties and can be
jmarkel44 0:61364762ee0e 944 * used as argument to `v7_get`, `v7_set` and `v7_def`.
jmarkel44 0:61364762ee0e 945 */
jmarkel44 0:61364762ee0e 946 int v7_is_object(v7_val_t v);
jmarkel44 0:61364762ee0e 947
jmarkel44 0:61364762ee0e 948 /* Set object's prototype. Return old prototype or undefined on error. */
jmarkel44 0:61364762ee0e 949 v7_val_t v7_set_proto(struct v7 *v7, v7_val_t obj, v7_val_t proto);
jmarkel44 0:61364762ee0e 950
jmarkel44 0:61364762ee0e 951 /* Get object's prototype. */
jmarkel44 0:61364762ee0e 952 v7_val_t v7_get_proto(struct v7 *v7, v7_val_t obj);
jmarkel44 0:61364762ee0e 953
jmarkel44 0:61364762ee0e 954 /*
jmarkel44 0:61364762ee0e 955 * Lookup property `name` in object `obj`. If `obj` holds no such property,
jmarkel44 0:61364762ee0e 956 * an `undefined` value is returned.
jmarkel44 0:61364762ee0e 957 *
jmarkel44 0:61364762ee0e 958 * If `name_len` is ~0, `name` is assumed to be NUL-terminated and
jmarkel44 0:61364762ee0e 959 * `strlen(name)` is used.
jmarkel44 0:61364762ee0e 960 */
jmarkel44 0:61364762ee0e 961 v7_val_t v7_get(struct v7 *v7, v7_val_t obj, const char *name, size_t name_len);
jmarkel44 0:61364762ee0e 962
jmarkel44 0:61364762ee0e 963 /*
jmarkel44 0:61364762ee0e 964 * Like `v7_get()`, but "returns" value through `res` pointer argument.
jmarkel44 0:61364762ee0e 965 * `res` must not be `NULL`.
jmarkel44 0:61364762ee0e 966 *
jmarkel44 0:61364762ee0e 967 * Caller should check the error code returned, and if it's something other
jmarkel44 0:61364762ee0e 968 * than `V7_OK`, perform cleanup and return this code further.
jmarkel44 0:61364762ee0e 969 */
jmarkel44 0:61364762ee0e 970 WARN_UNUSED_RESULT
jmarkel44 0:61364762ee0e 971 enum v7_err v7_get_throwing(struct v7 *v7, v7_val_t obj, const char *name,
jmarkel44 0:61364762ee0e 972 size_t name_len, v7_val_t *res);
jmarkel44 0:61364762ee0e 973
jmarkel44 0:61364762ee0e 974 /*
jmarkel44 0:61364762ee0e 975 * Define object property, similar to JavaScript `Object.defineProperty()`.
jmarkel44 0:61364762ee0e 976 *
jmarkel44 0:61364762ee0e 977 * `name`, `name_len` specify property name, `val` is a property value.
jmarkel44 0:61364762ee0e 978 * `attrs_desc` is a set of flags which can affect property's attributes,
jmarkel44 0:61364762ee0e 979 * see comment of `v7_prop_attr_desc_t` for details.
jmarkel44 0:61364762ee0e 980 *
jmarkel44 0:61364762ee0e 981 * If `name_len` is ~0, `name` is assumed to be NUL-terminated and
jmarkel44 0:61364762ee0e 982 * `strlen(name)` is used.
jmarkel44 0:61364762ee0e 983 *
jmarkel44 0:61364762ee0e 984 * Returns non-zero on success, 0 on error (e.g. out of memory).
jmarkel44 0:61364762ee0e 985 *
jmarkel44 0:61364762ee0e 986 * See also `v7_set()`.
jmarkel44 0:61364762ee0e 987 */
jmarkel44 0:61364762ee0e 988 int v7_def(struct v7 *v7, v7_val_t obj, const char *name, size_t name_len,
jmarkel44 0:61364762ee0e 989 v7_prop_attr_desc_t attrs_desc, v7_val_t v);
jmarkel44 0:61364762ee0e 990
jmarkel44 0:61364762ee0e 991 /*
jmarkel44 0:61364762ee0e 992 * Set object property. Behaves just like JavaScript assignment.
jmarkel44 0:61364762ee0e 993 *
jmarkel44 0:61364762ee0e 994 * See also `v7_def()`.
jmarkel44 0:61364762ee0e 995 */
jmarkel44 0:61364762ee0e 996 int v7_set(struct v7 *v7, v7_val_t obj, const char *name, size_t len,
jmarkel44 0:61364762ee0e 997 v7_val_t val);
jmarkel44 0:61364762ee0e 998
jmarkel44 0:61364762ee0e 999 /*
jmarkel44 0:61364762ee0e 1000 * A helper function to define object's method backed by a C function `func`.
jmarkel44 0:61364762ee0e 1001 * `name` must be NUL-terminated.
jmarkel44 0:61364762ee0e 1002 *
jmarkel44 0:61364762ee0e 1003 * Return value is the same as for `v7_set()`.
jmarkel44 0:61364762ee0e 1004 */
jmarkel44 0:61364762ee0e 1005 int v7_set_method(struct v7 *, v7_val_t obj, const char *name,
jmarkel44 0:61364762ee0e 1006 v7_cfunction_t *func);
jmarkel44 0:61364762ee0e 1007
jmarkel44 0:61364762ee0e 1008 /*
jmarkel44 0:61364762ee0e 1009 * Delete own property `name` of the object `obj`. Does not follow the
jmarkel44 0:61364762ee0e 1010 * prototype chain.
jmarkel44 0:61364762ee0e 1011 *
jmarkel44 0:61364762ee0e 1012 * If `name_len` is ~0, `name` is assumed to be NUL-terminated and
jmarkel44 0:61364762ee0e 1013 * `strlen(name)` is used.
jmarkel44 0:61364762ee0e 1014 *
jmarkel44 0:61364762ee0e 1015 * Returns 0 on success, -1 on error.
jmarkel44 0:61364762ee0e 1016 */
jmarkel44 0:61364762ee0e 1017 int v7_del(struct v7 *v7, v7_val_t obj, const char *name, size_t name_len);
jmarkel44 0:61364762ee0e 1018
jmarkel44 0:61364762ee0e 1019 #if V7_ENABLE__Proxy
jmarkel44 0:61364762ee0e 1020 struct prop_iter_proxy_ctx;
jmarkel44 0:61364762ee0e 1021 #endif
jmarkel44 0:61364762ee0e 1022
jmarkel44 0:61364762ee0e 1023 /*
jmarkel44 0:61364762ee0e 1024 * Context for property iteration, see `v7_next_prop()`.
jmarkel44 0:61364762ee0e 1025 *
jmarkel44 0:61364762ee0e 1026 * Clients should not interpret contents of this structure, it's here merely to
jmarkel44 0:61364762ee0e 1027 * allow clients to allocate it not from the heap.
jmarkel44 0:61364762ee0e 1028 */
jmarkel44 0:61364762ee0e 1029 struct prop_iter_ctx {
jmarkel44 0:61364762ee0e 1030 #if V7_ENABLE__Proxy
jmarkel44 0:61364762ee0e 1031 struct prop_iter_proxy_ctx *proxy_ctx;
jmarkel44 0:61364762ee0e 1032 #endif
jmarkel44 0:61364762ee0e 1033 struct v7_property *cur_prop;
jmarkel44 0:61364762ee0e 1034
jmarkel44 0:61364762ee0e 1035 unsigned init : 1;
jmarkel44 0:61364762ee0e 1036 };
jmarkel44 0:61364762ee0e 1037
jmarkel44 0:61364762ee0e 1038 /*
jmarkel44 0:61364762ee0e 1039 * Initialize the property iteration context `ctx`, see `v7_next_prop()` for
jmarkel44 0:61364762ee0e 1040 * usage example.
jmarkel44 0:61364762ee0e 1041 */
jmarkel44 0:61364762ee0e 1042 enum v7_err v7_init_prop_iter_ctx(struct v7 *v7, v7_val_t obj,
jmarkel44 0:61364762ee0e 1043 struct prop_iter_ctx *ctx);
jmarkel44 0:61364762ee0e 1044
jmarkel44 0:61364762ee0e 1045 /*
jmarkel44 0:61364762ee0e 1046 * Destruct the property iteration context `ctx`, see `v7_next_prop()` for
jmarkel44 0:61364762ee0e 1047 * usage example
jmarkel44 0:61364762ee0e 1048 */
jmarkel44 0:61364762ee0e 1049 void v7_destruct_prop_iter_ctx(struct v7 *v7, struct prop_iter_ctx *ctx);
jmarkel44 0:61364762ee0e 1050
jmarkel44 0:61364762ee0e 1051 /*
jmarkel44 0:61364762ee0e 1052 * Iterate over the `obj`'s properties.
jmarkel44 0:61364762ee0e 1053 *
jmarkel44 0:61364762ee0e 1054 * Usage example (here we assume we have some `v7_val_t obj`):
jmarkel44 0:61364762ee0e 1055 *
jmarkel44 0:61364762ee0e 1056 * struct prop_iter_ctx ctx;
jmarkel44 0:61364762ee0e 1057 * v7_val_t name, val;
jmarkel44 0:61364762ee0e 1058 * v7_prop_attr_t attrs;
jmarkel44 0:61364762ee0e 1059 *
jmarkel44 0:61364762ee0e 1060 * v7_init_prop_iter_ctx(v7, obj, &ctx);
jmarkel44 0:61364762ee0e 1061 * while (v7_next_prop(v7, &ctx, &name, &val, &attrs)) {
jmarkel44 0:61364762ee0e 1062 * if (V7_PROP_ATTR_IS_ENUMERABLE(attrs)) continue;
jmarkel44 0:61364762ee0e 1063 * ...
jmarkel44 0:61364762ee0e 1064 * }
jmarkel44 0:61364762ee0e 1065 * v7_destruct_prop_iter_ctx(v7, &ctx);
jmarkel44 0:61364762ee0e 1066 *
jmarkel44 0:61364762ee0e 1067 * As you see, v7_next_prop will iterate through all properties, including
jmarkel44 0:61364762ee0e 1068 * non-enumerable ones, and it's your responsibility to test the attributes
jmarkel44 0:61364762ee0e 1069 * with the provided `V7_PROP_ATTR_*` macros and proceed as you see fit.
jmarkel44 0:61364762ee0e 1070 */
jmarkel44 0:61364762ee0e 1071 int v7_next_prop(struct v7 *v7, struct prop_iter_ctx *ctx, v7_val_t *name,
jmarkel44 0:61364762ee0e 1072 v7_val_t *value, v7_prop_attr_t *attrs);
jmarkel44 0:61364762ee0e 1073
jmarkel44 0:61364762ee0e 1074 /* Returns true if the object is an instance of a given constructor. */
jmarkel44 0:61364762ee0e 1075 int v7_is_instanceof(struct v7 *v7, v7_val_t o, const char *c);
jmarkel44 0:61364762ee0e 1076
jmarkel44 0:61364762ee0e 1077 /* Returns true if the object is an instance of a given constructor. */
jmarkel44 0:61364762ee0e 1078 int v7_is_instanceof_v(struct v7 *v7, v7_val_t o, v7_val_t c);
jmarkel44 0:61364762ee0e 1079
jmarkel44 0:61364762ee0e 1080 /*
jmarkel44 0:61364762ee0e 1081 * Associates an opaque C value (anything that can be casted to a `void * )
jmarkel44 0:61364762ee0e 1082 * with an object.
jmarkel44 0:61364762ee0e 1083 *
jmarkel44 0:61364762ee0e 1084 * You can achieve a similar effect by just setting a special property with
jmarkel44 0:61364762ee0e 1085 * a foreign value (see `v7_mk_foreign`), except user data offers the following
jmarkel44 0:61364762ee0e 1086 * advantages:
jmarkel44 0:61364762ee0e 1087 *
jmarkel44 0:61364762ee0e 1088 * 1. You don't have to come up with some arbitrary "special" property name.
jmarkel44 0:61364762ee0e 1089 * 2. JS scripts cannot access user data by mistake via property lookup.
jmarkel44 0:61364762ee0e 1090 * 3. The user data is available to the destructor. When the desctructor is
jmarkel44 0:61364762ee0e 1091 * invoked you cannot access any of its properties.
jmarkel44 0:61364762ee0e 1092 * 4. Allows the implementation to use a more compact encoding
jmarkel44 0:61364762ee0e 1093 *
jmarkel44 0:61364762ee0e 1094 * Does nothing if `obj` is not a mutable object.
jmarkel44 0:61364762ee0e 1095 */
jmarkel44 0:61364762ee0e 1096 void v7_set_user_data(struct v7 *v7, v7_val_t obj, void *ud);
jmarkel44 0:61364762ee0e 1097
jmarkel44 0:61364762ee0e 1098 /*
jmarkel44 0:61364762ee0e 1099 * Get the opaque user data set with `v7_set_user_data`.
jmarkel44 0:61364762ee0e 1100 *
jmarkel44 0:61364762ee0e 1101 * Returns NULL if there is no user data set or if `obj` is not an object.
jmarkel44 0:61364762ee0e 1102 */
jmarkel44 0:61364762ee0e 1103 void *v7_get_user_data(struct v7 *v7, v7_val_t obj);
jmarkel44 0:61364762ee0e 1104
jmarkel44 0:61364762ee0e 1105 /*
jmarkel44 0:61364762ee0e 1106 * Register a callback which will be invoked when a given object gets
jmarkel44 0:61364762ee0e 1107 * reclaimed by the garbage collector.
jmarkel44 0:61364762ee0e 1108 *
jmarkel44 0:61364762ee0e 1109 * The callback will be invoked while garbage collection is still in progress
jmarkel44 0:61364762ee0e 1110 * and hence the internal state of the JS heap is in an undefined state.
jmarkel44 0:61364762ee0e 1111 *
jmarkel44 0:61364762ee0e 1112 * The only v7 API which is safe to use in this callback is `v7_disown()`,
jmarkel44 0:61364762ee0e 1113 * that's why `v7` pointer is given to it. *Calls to any other v7 functions are
jmarkel44 0:61364762ee0e 1114 * illegal here*.
jmarkel44 0:61364762ee0e 1115 *
jmarkel44 0:61364762ee0e 1116 * The intended use case is to reclaim resources allocated by C code.
jmarkel44 0:61364762ee0e 1117 */
jmarkel44 0:61364762ee0e 1118 void v7_set_destructor_cb(struct v7 *v7, v7_val_t obj, v7_destructor_cb_t *d);
jmarkel44 0:61364762ee0e 1119
jmarkel44 0:61364762ee0e 1120 #if defined(__cplusplus)
jmarkel44 0:61364762ee0e 1121 }
jmarkel44 0:61364762ee0e 1122 #endif /* __cplusplus */
jmarkel44 0:61364762ee0e 1123
jmarkel44 0:61364762ee0e 1124 #endif /* CS_V7_SRC_OBJECT_PUBLIC_H_ */
jmarkel44 0:61364762ee0e 1125 #ifdef V7_MODULE_LINES
jmarkel44 0:61364762ee0e 1126 #line 1 "v7/src/array_public.h"
jmarkel44 0:61364762ee0e 1127 #endif
jmarkel44 0:61364762ee0e 1128 /*
jmarkel44 0:61364762ee0e 1129 * Copyright (c) 2014 Cesanta Software Limited
jmarkel44 0:61364762ee0e 1130 * All rights reserved
jmarkel44 0:61364762ee0e 1131 */
jmarkel44 0:61364762ee0e 1132
jmarkel44 0:61364762ee0e 1133 /*
jmarkel44 0:61364762ee0e 1134 * === Arrays
jmarkel44 0:61364762ee0e 1135 */
jmarkel44 0:61364762ee0e 1136
jmarkel44 0:61364762ee0e 1137 #ifndef CS_V7_SRC_ARRAY_PUBLIC_H_
jmarkel44 0:61364762ee0e 1138 #define CS_V7_SRC_ARRAY_PUBLIC_H_
jmarkel44 0:61364762ee0e 1139
jmarkel44 0:61364762ee0e 1140 /* Amalgamated: #include "v7/src/core_public.h" */
jmarkel44 0:61364762ee0e 1141
jmarkel44 0:61364762ee0e 1142 #if defined(__cplusplus)
jmarkel44 0:61364762ee0e 1143 extern "C" {
jmarkel44 0:61364762ee0e 1144 #endif /* __cplusplus */
jmarkel44 0:61364762ee0e 1145
jmarkel44 0:61364762ee0e 1146 /* Make an empty array object */
jmarkel44 0:61364762ee0e 1147 v7_val_t v7_mk_array(struct v7 *v7);
jmarkel44 0:61364762ee0e 1148
jmarkel44 0:61364762ee0e 1149 /* Returns true if given value is an array object */
jmarkel44 0:61364762ee0e 1150 int v7_is_array(struct v7 *v7, v7_val_t v);
jmarkel44 0:61364762ee0e 1151
jmarkel44 0:61364762ee0e 1152 /* Returns length on an array. If `arr` is not an array, 0 is returned. */
jmarkel44 0:61364762ee0e 1153 unsigned long v7_array_length(struct v7 *v7, v7_val_t arr);
jmarkel44 0:61364762ee0e 1154
jmarkel44 0:61364762ee0e 1155 /* Insert value `v` in array `arr` at the end of the array. */
jmarkel44 0:61364762ee0e 1156 int v7_array_push(struct v7 *, v7_val_t arr, v7_val_t v);
jmarkel44 0:61364762ee0e 1157
jmarkel44 0:61364762ee0e 1158 /*
jmarkel44 0:61364762ee0e 1159 * Like `v7_array_push()`, but "returns" value through the `res` pointer
jmarkel44 0:61364762ee0e 1160 * argument. `res` is allowed to be `NULL`.
jmarkel44 0:61364762ee0e 1161 *
jmarkel44 0:61364762ee0e 1162 * Caller should check the error code returned, and if it's something other
jmarkel44 0:61364762ee0e 1163 * than `V7_OK`, perform cleanup and return this code further.
jmarkel44 0:61364762ee0e 1164 */
jmarkel44 0:61364762ee0e 1165 WARN_UNUSED_RESULT
jmarkel44 0:61364762ee0e 1166 enum v7_err v7_array_push_throwing(struct v7 *v7, v7_val_t arr, v7_val_t v,
jmarkel44 0:61364762ee0e 1167 int *res);
jmarkel44 0:61364762ee0e 1168
jmarkel44 0:61364762ee0e 1169 /*
jmarkel44 0:61364762ee0e 1170 * Return array member at index `index`. If `index` is out of bounds, undefined
jmarkel44 0:61364762ee0e 1171 * is returned.
jmarkel44 0:61364762ee0e 1172 */
jmarkel44 0:61364762ee0e 1173 v7_val_t v7_array_get(struct v7 *, v7_val_t arr, unsigned long index);
jmarkel44 0:61364762ee0e 1174
jmarkel44 0:61364762ee0e 1175 /* Insert value `v` into `arr` at index `index`. */
jmarkel44 0:61364762ee0e 1176 int v7_array_set(struct v7 *v7, v7_val_t arr, unsigned long index, v7_val_t v);
jmarkel44 0:61364762ee0e 1177
jmarkel44 0:61364762ee0e 1178 /*
jmarkel44 0:61364762ee0e 1179 * Like `v7_array_set()`, but "returns" value through the `res` pointer
jmarkel44 0:61364762ee0e 1180 * argument. `res` is allowed to be `NULL`.
jmarkel44 0:61364762ee0e 1181 *
jmarkel44 0:61364762ee0e 1182 * Caller should check the error code returned, and if it's something other
jmarkel44 0:61364762ee0e 1183 * than `V7_OK`, perform cleanup and return this code further.
jmarkel44 0:61364762ee0e 1184 */
jmarkel44 0:61364762ee0e 1185 WARN_UNUSED_RESULT
jmarkel44 0:61364762ee0e 1186 enum v7_err v7_array_set_throwing(struct v7 *v7, v7_val_t arr,
jmarkel44 0:61364762ee0e 1187 unsigned long index, v7_val_t v, int *res);
jmarkel44 0:61364762ee0e 1188
jmarkel44 0:61364762ee0e 1189 /* Delete value in array `arr` at index `index`, if it exists. */
jmarkel44 0:61364762ee0e 1190 void v7_array_del(struct v7 *v7, v7_val_t arr, unsigned long index);
jmarkel44 0:61364762ee0e 1191
jmarkel44 0:61364762ee0e 1192 #if defined(__cplusplus)
jmarkel44 0:61364762ee0e 1193 }
jmarkel44 0:61364762ee0e 1194 #endif /* __cplusplus */
jmarkel44 0:61364762ee0e 1195
jmarkel44 0:61364762ee0e 1196 #endif /* CS_V7_SRC_ARRAY_PUBLIC_H_ */
jmarkel44 0:61364762ee0e 1197 #ifdef V7_MODULE_LINES
jmarkel44 0:61364762ee0e 1198 #line 1 "v7/src/function_public.h"
jmarkel44 0:61364762ee0e 1199 #endif
jmarkel44 0:61364762ee0e 1200 /*
jmarkel44 0:61364762ee0e 1201 * Copyright (c) 2014 Cesanta Software Limited
jmarkel44 0:61364762ee0e 1202 * All rights reserved
jmarkel44 0:61364762ee0e 1203 */
jmarkel44 0:61364762ee0e 1204
jmarkel44 0:61364762ee0e 1205 /*
jmarkel44 0:61364762ee0e 1206 * === Functions
jmarkel44 0:61364762ee0e 1207 */
jmarkel44 0:61364762ee0e 1208
jmarkel44 0:61364762ee0e 1209 #ifndef CS_V7_SRC_FUNCTION_PUBLIC_H_
jmarkel44 0:61364762ee0e 1210 #define CS_V7_SRC_FUNCTION_PUBLIC_H_
jmarkel44 0:61364762ee0e 1211
jmarkel44 0:61364762ee0e 1212 /* Amalgamated: #include "v7/src/core_public.h" */
jmarkel44 0:61364762ee0e 1213
jmarkel44 0:61364762ee0e 1214 #if defined(__cplusplus)
jmarkel44 0:61364762ee0e 1215 extern "C" {
jmarkel44 0:61364762ee0e 1216 #endif /* __cplusplus */
jmarkel44 0:61364762ee0e 1217
jmarkel44 0:61364762ee0e 1218 /*
jmarkel44 0:61364762ee0e 1219 * Make a JS function object backed by a cfunction.
jmarkel44 0:61364762ee0e 1220 *
jmarkel44 0:61364762ee0e 1221 * `func` is a C callback.
jmarkel44 0:61364762ee0e 1222 *
jmarkel44 0:61364762ee0e 1223 * A function object is JS object having the Function prototype that holds a
jmarkel44 0:61364762ee0e 1224 * cfunction value in a hidden property.
jmarkel44 0:61364762ee0e 1225 *
jmarkel44 0:61364762ee0e 1226 * The function object will have a `prototype` property holding an object that
jmarkel44 0:61364762ee0e 1227 * will be used as the prototype of objects created when calling the function
jmarkel44 0:61364762ee0e 1228 * with the `new` operator.
jmarkel44 0:61364762ee0e 1229 */
jmarkel44 0:61364762ee0e 1230 v7_val_t v7_mk_function(struct v7 *, v7_cfunction_t *func);
jmarkel44 0:61364762ee0e 1231
jmarkel44 0:61364762ee0e 1232 /*
jmarkel44 0:61364762ee0e 1233 * Make f a JS function with specified prototype `proto`, so that the resulting
jmarkel44 0:61364762ee0e 1234 * function is better suited for the usage as a constructor.
jmarkel44 0:61364762ee0e 1235 */
jmarkel44 0:61364762ee0e 1236 v7_val_t v7_mk_function_with_proto(struct v7 *v7, v7_cfunction_t *f,
jmarkel44 0:61364762ee0e 1237 v7_val_t proto);
jmarkel44 0:61364762ee0e 1238
jmarkel44 0:61364762ee0e 1239 /*
jmarkel44 0:61364762ee0e 1240 * Make a JS value that holds C/C++ callback pointer.
jmarkel44 0:61364762ee0e 1241 *
jmarkel44 0:61364762ee0e 1242 * CAUTION: This is a low-level function value. It's not a real object and
jmarkel44 0:61364762ee0e 1243 * cannot hold user defined properties. You should use `v7_mk_function` unless
jmarkel44 0:61364762ee0e 1244 * you know what you're doing.
jmarkel44 0:61364762ee0e 1245 */
jmarkel44 0:61364762ee0e 1246 v7_val_t v7_mk_cfunction(v7_cfunction_t *func);
jmarkel44 0:61364762ee0e 1247
jmarkel44 0:61364762ee0e 1248 /*
jmarkel44 0:61364762ee0e 1249 * Returns true if given value is callable (i.e. it's either a JS function or
jmarkel44 0:61364762ee0e 1250 * cfunction)
jmarkel44 0:61364762ee0e 1251 */
jmarkel44 0:61364762ee0e 1252 int v7_is_callable(struct v7 *v7, v7_val_t v);
jmarkel44 0:61364762ee0e 1253
jmarkel44 0:61364762ee0e 1254 #if defined(__cplusplus)
jmarkel44 0:61364762ee0e 1255 }
jmarkel44 0:61364762ee0e 1256 #endif /* __cplusplus */
jmarkel44 0:61364762ee0e 1257
jmarkel44 0:61364762ee0e 1258 #endif /* CS_V7_SRC_FUNCTION_PUBLIC_H_ */
jmarkel44 0:61364762ee0e 1259 #ifdef V7_MODULE_LINES
jmarkel44 0:61364762ee0e 1260 #line 1 "v7/src/regexp_public.h"
jmarkel44 0:61364762ee0e 1261 #endif
jmarkel44 0:61364762ee0e 1262 /*
jmarkel44 0:61364762ee0e 1263 * Copyright (c) 2014 Cesanta Software Limited
jmarkel44 0:61364762ee0e 1264 * All rights reserved
jmarkel44 0:61364762ee0e 1265 */
jmarkel44 0:61364762ee0e 1266
jmarkel44 0:61364762ee0e 1267 /*
jmarkel44 0:61364762ee0e 1268 * === RegExp
jmarkel44 0:61364762ee0e 1269 */
jmarkel44 0:61364762ee0e 1270
jmarkel44 0:61364762ee0e 1271 #ifndef CS_V7_SRC_REGEXP_PUBLIC_H_
jmarkel44 0:61364762ee0e 1272 #define CS_V7_SRC_REGEXP_PUBLIC_H_
jmarkel44 0:61364762ee0e 1273
jmarkel44 0:61364762ee0e 1274 /* Amalgamated: #include "v7/src/core_public.h" */
jmarkel44 0:61364762ee0e 1275
jmarkel44 0:61364762ee0e 1276 #if defined(__cplusplus)
jmarkel44 0:61364762ee0e 1277 extern "C" {
jmarkel44 0:61364762ee0e 1278 #endif /* __cplusplus */
jmarkel44 0:61364762ee0e 1279
jmarkel44 0:61364762ee0e 1280 /*
jmarkel44 0:61364762ee0e 1281 * Make RegExp object.
jmarkel44 0:61364762ee0e 1282 * `regex`, `regex_len` specify a pattern, `flags` and `flags_len` specify
jmarkel44 0:61364762ee0e 1283 * flags. Both utf8 encoded. For example, `regex` is `(.+)`, `flags` is `gi`.
jmarkel44 0:61364762ee0e 1284 * If `regex_len` is ~0, `regex` is assumed to be NUL-terminated and
jmarkel44 0:61364762ee0e 1285 * `strlen(regex)` is used.
jmarkel44 0:61364762ee0e 1286 */
jmarkel44 0:61364762ee0e 1287 WARN_UNUSED_RESULT
jmarkel44 0:61364762ee0e 1288 enum v7_err v7_mk_regexp(struct v7 *v7, const char *regex, size_t regex_len,
jmarkel44 0:61364762ee0e 1289 const char *flags, size_t flags_len, v7_val_t *res);
jmarkel44 0:61364762ee0e 1290
jmarkel44 0:61364762ee0e 1291 /* Returns true if given value is a JavaScript RegExp object*/
jmarkel44 0:61364762ee0e 1292 int v7_is_regexp(struct v7 *v7, v7_val_t v);
jmarkel44 0:61364762ee0e 1293
jmarkel44 0:61364762ee0e 1294 #if defined(__cplusplus)
jmarkel44 0:61364762ee0e 1295 }
jmarkel44 0:61364762ee0e 1296 #endif /* __cplusplus */
jmarkel44 0:61364762ee0e 1297
jmarkel44 0:61364762ee0e 1298 #endif /* CS_V7_SRC_REGEXP_PUBLIC_H_ */
jmarkel44 0:61364762ee0e 1299 #ifdef V7_MODULE_LINES
jmarkel44 0:61364762ee0e 1300 #line 1 "v7/src/conversion_public.h"
jmarkel44 0:61364762ee0e 1301 #endif
jmarkel44 0:61364762ee0e 1302 /*
jmarkel44 0:61364762ee0e 1303 * Copyright (c) 2014 Cesanta Software Limited
jmarkel44 0:61364762ee0e 1304 * All rights reserved
jmarkel44 0:61364762ee0e 1305 */
jmarkel44 0:61364762ee0e 1306
jmarkel44 0:61364762ee0e 1307 /*
jmarkel44 0:61364762ee0e 1308 * === Conversion
jmarkel44 0:61364762ee0e 1309 */
jmarkel44 0:61364762ee0e 1310
jmarkel44 0:61364762ee0e 1311 #ifndef CS_V7_SRC_CONVERSION_PUBLIC_H_
jmarkel44 0:61364762ee0e 1312 #define CS_V7_SRC_CONVERSION_PUBLIC_H_
jmarkel44 0:61364762ee0e 1313
jmarkel44 0:61364762ee0e 1314 /* Amalgamated: #include "v7/src/core_public.h" */
jmarkel44 0:61364762ee0e 1315
jmarkel44 0:61364762ee0e 1316 #if defined(__cplusplus)
jmarkel44 0:61364762ee0e 1317 extern "C" {
jmarkel44 0:61364762ee0e 1318 #endif /* __cplusplus */
jmarkel44 0:61364762ee0e 1319
jmarkel44 0:61364762ee0e 1320 /* Stringify mode, see `v7_stringify()` and `v7_stringify_throwing()` */
jmarkel44 0:61364762ee0e 1321 enum v7_stringify_mode {
jmarkel44 0:61364762ee0e 1322 V7_STRINGIFY_DEFAULT,
jmarkel44 0:61364762ee0e 1323 V7_STRINGIFY_JSON,
jmarkel44 0:61364762ee0e 1324 V7_STRINGIFY_DEBUG,
jmarkel44 0:61364762ee0e 1325 };
jmarkel44 0:61364762ee0e 1326
jmarkel44 0:61364762ee0e 1327 /*
jmarkel44 0:61364762ee0e 1328 * Generate string representation of the JavaScript value `val` into a buffer
jmarkel44 0:61364762ee0e 1329 * `buf`, `len`. If `len` is too small to hold a generated string,
jmarkel44 0:61364762ee0e 1330 * `v7_stringify()` allocates required memory. In that case, it is caller's
jmarkel44 0:61364762ee0e 1331 * responsibility to free the allocated buffer. Generated string is guaranteed
jmarkel44 0:61364762ee0e 1332 * to be 0-terminated.
jmarkel44 0:61364762ee0e 1333 *
jmarkel44 0:61364762ee0e 1334 * Available stringification modes are:
jmarkel44 0:61364762ee0e 1335 *
jmarkel44 0:61364762ee0e 1336 * - `V7_STRINGIFY_DEFAULT`:
jmarkel44 0:61364762ee0e 1337 * Convert JS value to string, using common JavaScript semantics:
jmarkel44 0:61364762ee0e 1338 * - If value is an object:
jmarkel44 0:61364762ee0e 1339 * - call `toString()`;
jmarkel44 0:61364762ee0e 1340 * - If `toString()` returned non-primitive value, call `valueOf()`;
jmarkel44 0:61364762ee0e 1341 * - If `valueOf()` returned non-primitive value, throw `TypeError`.
jmarkel44 0:61364762ee0e 1342 * - Now we have a primitive, and if it's not a string, then stringify it.
jmarkel44 0:61364762ee0e 1343 *
jmarkel44 0:61364762ee0e 1344 * - `V7_STRINGIFY_JSON`:
jmarkel44 0:61364762ee0e 1345 * Generate JSON output
jmarkel44 0:61364762ee0e 1346 *
jmarkel44 0:61364762ee0e 1347 * - `V7_STRINGIFY_DEBUG`:
jmarkel44 0:61364762ee0e 1348 * Mostly like JSON, but will not omit non-JSON objects like functions.
jmarkel44 0:61364762ee0e 1349 *
jmarkel44 0:61364762ee0e 1350 * Example code:
jmarkel44 0:61364762ee0e 1351 *
jmarkel44 0:61364762ee0e 1352 * char buf[100], *p;
jmarkel44 0:61364762ee0e 1353 * p = v7_stringify(v7, obj, buf, sizeof(buf), V7_STRINGIFY_DEFAULT);
jmarkel44 0:61364762ee0e 1354 * printf("JSON string: [%s]\n", p);
jmarkel44 0:61364762ee0e 1355 * if (p != buf) {
jmarkel44 0:61364762ee0e 1356 * free(p);
jmarkel44 0:61364762ee0e 1357 * }
jmarkel44 0:61364762ee0e 1358 */
jmarkel44 0:61364762ee0e 1359 char *v7_stringify(struct v7 *v7, v7_val_t v, char *buf, size_t len,
jmarkel44 0:61364762ee0e 1360 enum v7_stringify_mode mode);
jmarkel44 0:61364762ee0e 1361
jmarkel44 0:61364762ee0e 1362 /*
jmarkel44 0:61364762ee0e 1363 * Like `v7_stringify()`, but "returns" value through the `res` pointer
jmarkel44 0:61364762ee0e 1364 * argument. `res` must not be `NULL`.
jmarkel44 0:61364762ee0e 1365 *
jmarkel44 0:61364762ee0e 1366 * Caller should check the error code returned, and if it's something other
jmarkel44 0:61364762ee0e 1367 * than `V7_OK`, perform cleanup and return this code further.
jmarkel44 0:61364762ee0e 1368 */
jmarkel44 0:61364762ee0e 1369 WARN_UNUSED_RESULT
jmarkel44 0:61364762ee0e 1370 enum v7_err v7_stringify_throwing(struct v7 *v7, v7_val_t v, char *buf,
jmarkel44 0:61364762ee0e 1371 size_t size, enum v7_stringify_mode mode,
jmarkel44 0:61364762ee0e 1372 char **res);
jmarkel44 0:61364762ee0e 1373
jmarkel44 0:61364762ee0e 1374 /*
jmarkel44 0:61364762ee0e 1375 * A shortcut for `v7_stringify()` with `V7_STRINGIFY_JSON`
jmarkel44 0:61364762ee0e 1376 */
jmarkel44 0:61364762ee0e 1377 #define v7_to_json(a, b, c, d) v7_stringify(a, b, c, d, V7_STRINGIFY_JSON)
jmarkel44 0:61364762ee0e 1378
jmarkel44 0:61364762ee0e 1379 /* Returns true if given value evaluates to true, as in `if (v)` statement. */
jmarkel44 0:61364762ee0e 1380 int v7_is_truthy(struct v7 *v7, v7_val_t v);
jmarkel44 0:61364762ee0e 1381
jmarkel44 0:61364762ee0e 1382 #if defined(__cplusplus)
jmarkel44 0:61364762ee0e 1383 }
jmarkel44 0:61364762ee0e 1384 #endif /* __cplusplus */
jmarkel44 0:61364762ee0e 1385
jmarkel44 0:61364762ee0e 1386 #endif /* CS_V7_SRC_CONVERSION_PUBLIC_H_ */
jmarkel44 0:61364762ee0e 1387 #ifdef V7_MODULE_LINES
jmarkel44 0:61364762ee0e 1388 #line 1 "v7/src/exec_public.h"
jmarkel44 0:61364762ee0e 1389 #endif
jmarkel44 0:61364762ee0e 1390 /*
jmarkel44 0:61364762ee0e 1391 * Copyright (c) 2014 Cesanta Software Limited
jmarkel44 0:61364762ee0e 1392 * All rights reserved
jmarkel44 0:61364762ee0e 1393 */
jmarkel44 0:61364762ee0e 1394
jmarkel44 0:61364762ee0e 1395 /*
jmarkel44 0:61364762ee0e 1396 * === Execution of JavaScript code
jmarkel44 0:61364762ee0e 1397 */
jmarkel44 0:61364762ee0e 1398
jmarkel44 0:61364762ee0e 1399 #ifndef CS_V7_SRC_EXEC_PUBLIC_H_
jmarkel44 0:61364762ee0e 1400 #define CS_V7_SRC_EXEC_PUBLIC_H_
jmarkel44 0:61364762ee0e 1401
jmarkel44 0:61364762ee0e 1402 /* Amalgamated: #include "v7/src/core_public.h" */
jmarkel44 0:61364762ee0e 1403
jmarkel44 0:61364762ee0e 1404 #if defined(__cplusplus)
jmarkel44 0:61364762ee0e 1405 extern "C" {
jmarkel44 0:61364762ee0e 1406 #endif /* __cplusplus */
jmarkel44 0:61364762ee0e 1407
jmarkel44 0:61364762ee0e 1408 /*
jmarkel44 0:61364762ee0e 1409 * Execute JavaScript `js_code`. The result of evaluation is stored in
jmarkel44 0:61364762ee0e 1410 * the `result` variable.
jmarkel44 0:61364762ee0e 1411 *
jmarkel44 0:61364762ee0e 1412 * Return:
jmarkel44 0:61364762ee0e 1413 *
jmarkel44 0:61364762ee0e 1414 * - V7_OK on success. `result` contains the result of execution.
jmarkel44 0:61364762ee0e 1415 * - V7_SYNTAX_ERROR if `js_code` in not a valid code. `result` is undefined.
jmarkel44 0:61364762ee0e 1416 * - V7_EXEC_EXCEPTION if `js_code` threw an exception. `result` stores
jmarkel44 0:61364762ee0e 1417 * an exception object.
jmarkel44 0:61364762ee0e 1418 * - V7_AST_TOO_LARGE if `js_code` contains an AST segment longer than 16 bit.
jmarkel44 0:61364762ee0e 1419 * `result` is undefined. To avoid this error, build V7 with V7_LARGE_AST.
jmarkel44 0:61364762ee0e 1420 */
jmarkel44 0:61364762ee0e 1421 WARN_UNUSED_RESULT
jmarkel44 0:61364762ee0e 1422 enum v7_err v7_exec(struct v7 *v7, const char *js_code, v7_val_t *result);
jmarkel44 0:61364762ee0e 1423
jmarkel44 0:61364762ee0e 1424 /*
jmarkel44 0:61364762ee0e 1425 * Options for `v7_exec_opt()`. To get default options, like `v7_exec()` uses,
jmarkel44 0:61364762ee0e 1426 * just zero out this struct.
jmarkel44 0:61364762ee0e 1427 */
jmarkel44 0:61364762ee0e 1428 struct v7_exec_opts {
jmarkel44 0:61364762ee0e 1429 /* Filename, used for stack traces only */
jmarkel44 0:61364762ee0e 1430 const char *filename;
jmarkel44 0:61364762ee0e 1431
jmarkel44 0:61364762ee0e 1432 /*
jmarkel44 0:61364762ee0e 1433 * Object to be used as `this`. Note: when it is zeroed out, i.e. it's a
jmarkel44 0:61364762ee0e 1434 * number `0`, the `undefined` value is assumed. It means that it's
jmarkel44 0:61364762ee0e 1435 * impossible to actually use the number `0` as `this` object, but it makes
jmarkel44 0:61364762ee0e 1436 * little sense anyway.
jmarkel44 0:61364762ee0e 1437 */
jmarkel44 0:61364762ee0e 1438 v7_val_t this_obj;
jmarkel44 0:61364762ee0e 1439
jmarkel44 0:61364762ee0e 1440 /* Whether the given `js_code` should be interpreted as JSON, not JS code */
jmarkel44 0:61364762ee0e 1441 unsigned is_json : 1;
jmarkel44 0:61364762ee0e 1442 };
jmarkel44 0:61364762ee0e 1443
jmarkel44 0:61364762ee0e 1444 /*
jmarkel44 0:61364762ee0e 1445 * Customizable version of `v7_exec()`: allows to specify various options, see
jmarkel44 0:61364762ee0e 1446 * `struct v7_exec_opts`.
jmarkel44 0:61364762ee0e 1447 */
jmarkel44 0:61364762ee0e 1448 enum v7_err v7_exec_opt(struct v7 *v7, const char *js_code,
jmarkel44 0:61364762ee0e 1449 const struct v7_exec_opts *opts, v7_val_t *res);
jmarkel44 0:61364762ee0e 1450
jmarkel44 0:61364762ee0e 1451 /*
jmarkel44 0:61364762ee0e 1452 * Same as `v7_exec()`, but loads source code from `path` file.
jmarkel44 0:61364762ee0e 1453 */
jmarkel44 0:61364762ee0e 1454 WARN_UNUSED_RESULT
jmarkel44 0:61364762ee0e 1455 enum v7_err v7_exec_file(struct v7 *v7, const char *path, v7_val_t *result);
jmarkel44 0:61364762ee0e 1456
jmarkel44 0:61364762ee0e 1457 /*
jmarkel44 0:61364762ee0e 1458 * Parse `str` and store corresponding JavaScript object in `res` variable.
jmarkel44 0:61364762ee0e 1459 * String `str` should be '\0'-terminated.
jmarkel44 0:61364762ee0e 1460 * Return value and semantic is the same as for `v7_exec()`.
jmarkel44 0:61364762ee0e 1461 */
jmarkel44 0:61364762ee0e 1462 WARN_UNUSED_RESULT
jmarkel44 0:61364762ee0e 1463 enum v7_err v7_parse_json(struct v7 *v7, const char *str, v7_val_t *res);
jmarkel44 0:61364762ee0e 1464
jmarkel44 0:61364762ee0e 1465 /*
jmarkel44 0:61364762ee0e 1466 * Same as `v7_parse_json()`, but loads JSON string from `path`.
jmarkel44 0:61364762ee0e 1467 */
jmarkel44 0:61364762ee0e 1468 WARN_UNUSED_RESULT
jmarkel44 0:61364762ee0e 1469 enum v7_err v7_parse_json_file(struct v7 *v7, const char *path, v7_val_t *res);
jmarkel44 0:61364762ee0e 1470
jmarkel44 0:61364762ee0e 1471 #if !defined(V7_NO_COMPILER)
jmarkel44 0:61364762ee0e 1472
jmarkel44 0:61364762ee0e 1473 /*
jmarkel44 0:61364762ee0e 1474 * Compile JavaScript code `js_code` into the byte code and write generated
jmarkel44 0:61364762ee0e 1475 * byte code into opened file stream `fp`. If `generate_binary_output` is 0,
jmarkel44 0:61364762ee0e 1476 * then generated byte code is in human-readable text format. Otherwise, it is
jmarkel44 0:61364762ee0e 1477 * in the binary format, suitable for execution by V7 instance.
jmarkel44 0:61364762ee0e 1478 * NOTE: `fp` must be a valid, opened, writable file stream.
jmarkel44 0:61364762ee0e 1479 */
jmarkel44 0:61364762ee0e 1480 WARN_UNUSED_RESULT
jmarkel44 0:61364762ee0e 1481 enum v7_err v7_compile(const char *js_code, int generate_binary_output,
jmarkel44 0:61364762ee0e 1482 int use_bcode, FILE *fp);
jmarkel44 0:61364762ee0e 1483
jmarkel44 0:61364762ee0e 1484 #endif /* V7_NO_COMPILER */
jmarkel44 0:61364762ee0e 1485
jmarkel44 0:61364762ee0e 1486 /*
jmarkel44 0:61364762ee0e 1487 * Call function `func` with arguments `args`, using `this_obj` as `this`.
jmarkel44 0:61364762ee0e 1488 * `args` should be an array containing arguments or `undefined`.
jmarkel44 0:61364762ee0e 1489 *
jmarkel44 0:61364762ee0e 1490 * `res` can be `NULL` if return value is not required.
jmarkel44 0:61364762ee0e 1491 */
jmarkel44 0:61364762ee0e 1492 WARN_UNUSED_RESULT
jmarkel44 0:61364762ee0e 1493 enum v7_err v7_apply(struct v7 *v7, v7_val_t func, v7_val_t this_obj,
jmarkel44 0:61364762ee0e 1494 v7_val_t args, v7_val_t *res);
jmarkel44 0:61364762ee0e 1495
jmarkel44 0:61364762ee0e 1496 #if defined(__cplusplus)
jmarkel44 0:61364762ee0e 1497 }
jmarkel44 0:61364762ee0e 1498 #endif /* __cplusplus */
jmarkel44 0:61364762ee0e 1499
jmarkel44 0:61364762ee0e 1500 #endif /* CS_V7_SRC_EXEC_PUBLIC_H_ */
jmarkel44 0:61364762ee0e 1501 #ifdef V7_MODULE_LINES
jmarkel44 0:61364762ee0e 1502 #line 1 "v7/src/exceptions_public.h"
jmarkel44 0:61364762ee0e 1503 #endif
jmarkel44 0:61364762ee0e 1504 /*
jmarkel44 0:61364762ee0e 1505 * Copyright (c) 2014 Cesanta Software Limited
jmarkel44 0:61364762ee0e 1506 * All rights reserved
jmarkel44 0:61364762ee0e 1507 */
jmarkel44 0:61364762ee0e 1508
jmarkel44 0:61364762ee0e 1509 /*
jmarkel44 0:61364762ee0e 1510 * === Exceptions
jmarkel44 0:61364762ee0e 1511 */
jmarkel44 0:61364762ee0e 1512
jmarkel44 0:61364762ee0e 1513 #ifndef CS_V7_SRC_EXCEPTIONS_PUBLIC_H_
jmarkel44 0:61364762ee0e 1514 #define CS_V7_SRC_EXCEPTIONS_PUBLIC_H_
jmarkel44 0:61364762ee0e 1515
jmarkel44 0:61364762ee0e 1516 /* Amalgamated: #include "v7/src/core_public.h" */
jmarkel44 0:61364762ee0e 1517
jmarkel44 0:61364762ee0e 1518 #if defined(__cplusplus)
jmarkel44 0:61364762ee0e 1519 extern "C" {
jmarkel44 0:61364762ee0e 1520 #endif /* __cplusplus */
jmarkel44 0:61364762ee0e 1521
jmarkel44 0:61364762ee0e 1522 /* Throw an exception with an already existing value. */
jmarkel44 0:61364762ee0e 1523 WARN_UNUSED_RESULT
jmarkel44 0:61364762ee0e 1524 enum v7_err v7_throw(struct v7 *v7, v7_val_t v);
jmarkel44 0:61364762ee0e 1525
jmarkel44 0:61364762ee0e 1526 /*
jmarkel44 0:61364762ee0e 1527 * Throw an exception with given formatted message.
jmarkel44 0:61364762ee0e 1528 *
jmarkel44 0:61364762ee0e 1529 * Pass "Error" as typ for a generic error.
jmarkel44 0:61364762ee0e 1530 */
jmarkel44 0:61364762ee0e 1531 WARN_UNUSED_RESULT
jmarkel44 0:61364762ee0e 1532 enum v7_err v7_throwf(struct v7 *v7, const char *typ, const char *err_fmt, ...);
jmarkel44 0:61364762ee0e 1533
jmarkel44 0:61364762ee0e 1534 /*
jmarkel44 0:61364762ee0e 1535 * Rethrow the currently thrown object. In fact, it just returns
jmarkel44 0:61364762ee0e 1536 * V7_EXEC_EXCEPTION.
jmarkel44 0:61364762ee0e 1537 */
jmarkel44 0:61364762ee0e 1538 WARN_UNUSED_RESULT
jmarkel44 0:61364762ee0e 1539 enum v7_err v7_rethrow(struct v7 *v7);
jmarkel44 0:61364762ee0e 1540
jmarkel44 0:61364762ee0e 1541 /*
jmarkel44 0:61364762ee0e 1542 * Returns the value that is being thrown at the moment, or `undefined` if
jmarkel44 0:61364762ee0e 1543 * nothing is being thrown. If `is_thrown` is not `NULL`, it will be set
jmarkel44 0:61364762ee0e 1544 * to either 0 or 1, depending on whether something is thrown at the moment.
jmarkel44 0:61364762ee0e 1545 */
jmarkel44 0:61364762ee0e 1546 v7_val_t v7_get_thrown_value(struct v7 *v7, unsigned char *is_thrown);
jmarkel44 0:61364762ee0e 1547
jmarkel44 0:61364762ee0e 1548 /* Clears currently thrown value, if any. */
jmarkel44 0:61364762ee0e 1549 void v7_clear_thrown_value(struct v7 *v7);
jmarkel44 0:61364762ee0e 1550
jmarkel44 0:61364762ee0e 1551 #if defined(__cplusplus)
jmarkel44 0:61364762ee0e 1552 }
jmarkel44 0:61364762ee0e 1553 #endif /* __cplusplus */
jmarkel44 0:61364762ee0e 1554
jmarkel44 0:61364762ee0e 1555 #endif /* CS_V7_SRC_EXCEPTIONS_PUBLIC_H_ */
jmarkel44 0:61364762ee0e 1556 #ifdef V7_MODULE_LINES
jmarkel44 0:61364762ee0e 1557 #line 1 "v7/src/gc_public.h"
jmarkel44 0:61364762ee0e 1558 #endif
jmarkel44 0:61364762ee0e 1559 /*
jmarkel44 0:61364762ee0e 1560 * Copyright (c) 2014 Cesanta Software Limited
jmarkel44 0:61364762ee0e 1561 * All rights reserved
jmarkel44 0:61364762ee0e 1562 */
jmarkel44 0:61364762ee0e 1563
jmarkel44 0:61364762ee0e 1564 /*
jmarkel44 0:61364762ee0e 1565 * === Garbage Collector
jmarkel44 0:61364762ee0e 1566 */
jmarkel44 0:61364762ee0e 1567
jmarkel44 0:61364762ee0e 1568 #ifndef CS_V7_SRC_GC_PUBLIC_H_
jmarkel44 0:61364762ee0e 1569 #define CS_V7_SRC_GC_PUBLIC_H_
jmarkel44 0:61364762ee0e 1570
jmarkel44 0:61364762ee0e 1571 /* Amalgamated: #include "v7/src/core_public.h" */
jmarkel44 0:61364762ee0e 1572
jmarkel44 0:61364762ee0e 1573 #if defined(__cplusplus)
jmarkel44 0:61364762ee0e 1574 extern "C" {
jmarkel44 0:61364762ee0e 1575 #endif /* __cplusplus */
jmarkel44 0:61364762ee0e 1576
jmarkel44 0:61364762ee0e 1577 #if V7_ENABLE__Memory__stats
jmarkel44 0:61364762ee0e 1578
jmarkel44 0:61364762ee0e 1579 /* Heap metric id, see `v7_heap_stat()` */
jmarkel44 0:61364762ee0e 1580 enum v7_heap_stat_what {
jmarkel44 0:61364762ee0e 1581 V7_HEAP_STAT_HEAP_SIZE,
jmarkel44 0:61364762ee0e 1582 V7_HEAP_STAT_HEAP_USED,
jmarkel44 0:61364762ee0e 1583 V7_HEAP_STAT_STRING_HEAP_RESERVED,
jmarkel44 0:61364762ee0e 1584 V7_HEAP_STAT_STRING_HEAP_USED,
jmarkel44 0:61364762ee0e 1585 V7_HEAP_STAT_OBJ_HEAP_MAX,
jmarkel44 0:61364762ee0e 1586 V7_HEAP_STAT_OBJ_HEAP_FREE,
jmarkel44 0:61364762ee0e 1587 V7_HEAP_STAT_OBJ_HEAP_CELL_SIZE,
jmarkel44 0:61364762ee0e 1588 V7_HEAP_STAT_FUNC_HEAP_MAX,
jmarkel44 0:61364762ee0e 1589 V7_HEAP_STAT_FUNC_HEAP_FREE,
jmarkel44 0:61364762ee0e 1590 V7_HEAP_STAT_FUNC_HEAP_CELL_SIZE,
jmarkel44 0:61364762ee0e 1591 V7_HEAP_STAT_PROP_HEAP_MAX,
jmarkel44 0:61364762ee0e 1592 V7_HEAP_STAT_PROP_HEAP_FREE,
jmarkel44 0:61364762ee0e 1593 V7_HEAP_STAT_PROP_HEAP_CELL_SIZE,
jmarkel44 0:61364762ee0e 1594 V7_HEAP_STAT_FUNC_AST_SIZE,
jmarkel44 0:61364762ee0e 1595 V7_HEAP_STAT_BCODE_OPS_SIZE,
jmarkel44 0:61364762ee0e 1596 V7_HEAP_STAT_BCODE_LIT_TOTAL_SIZE,
jmarkel44 0:61364762ee0e 1597 V7_HEAP_STAT_BCODE_LIT_DESER_SIZE,
jmarkel44 0:61364762ee0e 1598 V7_HEAP_STAT_FUNC_OWNED,
jmarkel44 0:61364762ee0e 1599 V7_HEAP_STAT_FUNC_OWNED_MAX
jmarkel44 0:61364762ee0e 1600 };
jmarkel44 0:61364762ee0e 1601
jmarkel44 0:61364762ee0e 1602 /* Returns a given heap statistics */
jmarkel44 0:61364762ee0e 1603 int v7_heap_stat(struct v7 *v7, enum v7_heap_stat_what what);
jmarkel44 0:61364762ee0e 1604 #endif
jmarkel44 0:61364762ee0e 1605
jmarkel44 0:61364762ee0e 1606 /*
jmarkel44 0:61364762ee0e 1607 * Perform garbage collection.
jmarkel44 0:61364762ee0e 1608 * Pass true to full in order to reclaim unused heap back to the OS.
jmarkel44 0:61364762ee0e 1609 */
jmarkel44 0:61364762ee0e 1610 void v7_gc(struct v7 *v7, int full);
jmarkel44 0:61364762ee0e 1611
jmarkel44 0:61364762ee0e 1612 #if defined(__cplusplus)
jmarkel44 0:61364762ee0e 1613 }
jmarkel44 0:61364762ee0e 1614 #endif /* __cplusplus */
jmarkel44 0:61364762ee0e 1615
jmarkel44 0:61364762ee0e 1616 #endif /* CS_V7_SRC_GC_PUBLIC_H_ */
jmarkel44 0:61364762ee0e 1617 #ifdef V7_MODULE_LINES
jmarkel44 0:61364762ee0e 1618 #line 1 "v7/src/util_public.h"
jmarkel44 0:61364762ee0e 1619 #endif
jmarkel44 0:61364762ee0e 1620 /*
jmarkel44 0:61364762ee0e 1621 * Copyright (c) 2014 Cesanta Software Limited
jmarkel44 0:61364762ee0e 1622 * All rights reserved
jmarkel44 0:61364762ee0e 1623 */
jmarkel44 0:61364762ee0e 1624
jmarkel44 0:61364762ee0e 1625 /*
jmarkel44 0:61364762ee0e 1626 * === Utility functions
jmarkel44 0:61364762ee0e 1627 */
jmarkel44 0:61364762ee0e 1628
jmarkel44 0:61364762ee0e 1629 #ifndef CS_V7_SRC_UTIL_PUBLIC_H_
jmarkel44 0:61364762ee0e 1630 #define CS_V7_SRC_UTIL_PUBLIC_H_
jmarkel44 0:61364762ee0e 1631
jmarkel44 0:61364762ee0e 1632 /* Amalgamated: #include "v7/src/core_public.h" */
jmarkel44 0:61364762ee0e 1633
jmarkel44 0:61364762ee0e 1634 #if defined(__cplusplus)
jmarkel44 0:61364762ee0e 1635 extern "C" {
jmarkel44 0:61364762ee0e 1636 #endif /* __cplusplus */
jmarkel44 0:61364762ee0e 1637
jmarkel44 0:61364762ee0e 1638 /* Output a string representation of the value to stdout.
jmarkel44 0:61364762ee0e 1639 * V7_STRINGIFY_DEBUG mode is used. */
jmarkel44 0:61364762ee0e 1640 void v7_print(struct v7 *v7, v7_val_t v);
jmarkel44 0:61364762ee0e 1641
jmarkel44 0:61364762ee0e 1642 /* Output a string representation of the value to stdout followed by a newline.
jmarkel44 0:61364762ee0e 1643 * V7_STRINGIFY_DEBUG mode is used. */
jmarkel44 0:61364762ee0e 1644 void v7_println(struct v7 *v7, v7_val_t v);
jmarkel44 0:61364762ee0e 1645
jmarkel44 0:61364762ee0e 1646 /* Output a string representation of the value to a file.
jmarkel44 0:61364762ee0e 1647 * V7_STRINGIFY_DEBUG mode is used. */
jmarkel44 0:61364762ee0e 1648 void v7_fprint(FILE *f, struct v7 *v7, v7_val_t v);
jmarkel44 0:61364762ee0e 1649
jmarkel44 0:61364762ee0e 1650 /* Output a string representation of the value to a file followed by a newline.
jmarkel44 0:61364762ee0e 1651 * V7_STRINGIFY_DEBUG mode is used. */
jmarkel44 0:61364762ee0e 1652 void v7_fprintln(FILE *f, struct v7 *v7, v7_val_t v);
jmarkel44 0:61364762ee0e 1653
jmarkel44 0:61364762ee0e 1654 /* Output stack trace recorded in the exception `e` to file `f` */
jmarkel44 0:61364762ee0e 1655 void v7_fprint_stack_trace(FILE *f, struct v7 *v7, v7_val_t e);
jmarkel44 0:61364762ee0e 1656
jmarkel44 0:61364762ee0e 1657 /* Output error object message and possibly stack trace to f */
jmarkel44 0:61364762ee0e 1658 void v7_print_error(FILE *f, struct v7 *v7, const char *ctx, v7_val_t e);
jmarkel44 0:61364762ee0e 1659
jmarkel44 0:61364762ee0e 1660 #if V7_ENABLE__Proxy
jmarkel44 0:61364762ee0e 1661
jmarkel44 0:61364762ee0e 1662 struct v7_property;
jmarkel44 0:61364762ee0e 1663
jmarkel44 0:61364762ee0e 1664 /*
jmarkel44 0:61364762ee0e 1665 * C callback, analogue of JS callback `getOwnPropertyDescriptor()`.
jmarkel44 0:61364762ee0e 1666 * Callbacks of this type are used for C API only, see `m7_mk_proxy()`.
jmarkel44 0:61364762ee0e 1667 *
jmarkel44 0:61364762ee0e 1668 * `name` is the name of the property, and the function should fill `attrs` and
jmarkel44 0:61364762ee0e 1669 * `value` with the property data. Before this callback is called, `attrs` is
jmarkel44 0:61364762ee0e 1670 * set to 0, and `value` is `V7_UNDEFINED`.
jmarkel44 0:61364762ee0e 1671 *
jmarkel44 0:61364762ee0e 1672 * It should return non-zero if the property should be considered existing, or
jmarkel44 0:61364762ee0e 1673 * zero otherwise.
jmarkel44 0:61364762ee0e 1674 *
jmarkel44 0:61364762ee0e 1675 * You can inspect the property attributes with the `V7_PROP_ATTR_IS_*` macros.
jmarkel44 0:61364762ee0e 1676 */
jmarkel44 0:61364762ee0e 1677 typedef int(v7_get_own_prop_desc_cb_t)(struct v7 *v7, v7_val_t target,
jmarkel44 0:61364762ee0e 1678 v7_val_t name, v7_prop_attr_t *attrs,
jmarkel44 0:61364762ee0e 1679 v7_val_t *value);
jmarkel44 0:61364762ee0e 1680
jmarkel44 0:61364762ee0e 1681 /* Handler for `v7_mk_proxy()`; each item is a cfunction */
jmarkel44 0:61364762ee0e 1682 typedef struct {
jmarkel44 0:61364762ee0e 1683 v7_cfunction_t *get;
jmarkel44 0:61364762ee0e 1684 v7_cfunction_t *set;
jmarkel44 0:61364762ee0e 1685 v7_cfunction_t *own_keys;
jmarkel44 0:61364762ee0e 1686 v7_get_own_prop_desc_cb_t *get_own_prop_desc;
jmarkel44 0:61364762ee0e 1687 } v7_proxy_hnd_t;
jmarkel44 0:61364762ee0e 1688
jmarkel44 0:61364762ee0e 1689 /*
jmarkel44 0:61364762ee0e 1690 * Create a Proxy object, see:
jmarkel44 0:61364762ee0e 1691 * https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Proxy
jmarkel44 0:61364762ee0e 1692 *
jmarkel44 0:61364762ee0e 1693 * Only two traps are implemented so far: `get()` and `set()`. Note that
jmarkel44 0:61364762ee0e 1694 * `Object.defineProperty()` bypasses the `set()` trap.
jmarkel44 0:61364762ee0e 1695 *
jmarkel44 0:61364762ee0e 1696 * If `target` is not an object, the empty object will be used, so it's safe
jmarkel44 0:61364762ee0e 1697 * to pass `V7_UNDEFINED` as `target`.
jmarkel44 0:61364762ee0e 1698 */
jmarkel44 0:61364762ee0e 1699 v7_val_t v7_mk_proxy(struct v7 *v7, v7_val_t target,
jmarkel44 0:61364762ee0e 1700 const v7_proxy_hnd_t *handler);
jmarkel44 0:61364762ee0e 1701
jmarkel44 0:61364762ee0e 1702 #endif /* V7_ENABLE__Proxy */
jmarkel44 0:61364762ee0e 1703
jmarkel44 0:61364762ee0e 1704 #if defined(__cplusplus)
jmarkel44 0:61364762ee0e 1705 }
jmarkel44 0:61364762ee0e 1706 #endif /* __cplusplus */
jmarkel44 0:61364762ee0e 1707
jmarkel44 0:61364762ee0e 1708 #endif /* CS_V7_SRC_UTIL_PUBLIC_H_ */
jmarkel44 0:61364762ee0e 1709 #ifdef V7_MODULE_LINES
jmarkel44 0:61364762ee0e 1710 #line 1 "v7/src/main_public.h"
jmarkel44 0:61364762ee0e 1711 #endif
jmarkel44 0:61364762ee0e 1712 /*
jmarkel44 0:61364762ee0e 1713 * Copyright (c) 2014 Cesanta Software Limited
jmarkel44 0:61364762ee0e 1714 * All rights reserved
jmarkel44 0:61364762ee0e 1715 */
jmarkel44 0:61364762ee0e 1716
jmarkel44 0:61364762ee0e 1717 /*
jmarkel44 0:61364762ee0e 1718 * === v7 main()
jmarkel44 0:61364762ee0e 1719 */
jmarkel44 0:61364762ee0e 1720
jmarkel44 0:61364762ee0e 1721 #ifndef CS_V7_SRC_MAIN_PUBLIC_H_
jmarkel44 0:61364762ee0e 1722 #define CS_V7_SRC_MAIN_PUBLIC_H_
jmarkel44 0:61364762ee0e 1723
jmarkel44 0:61364762ee0e 1724 /* Amalgamated: #include "v7/src/core_public.h" */
jmarkel44 0:61364762ee0e 1725
jmarkel44 0:61364762ee0e 1726 #if defined(__cplusplus)
jmarkel44 0:61364762ee0e 1727 extern "C" {
jmarkel44 0:61364762ee0e 1728 #endif /* __cplusplus */
jmarkel44 0:61364762ee0e 1729
jmarkel44 0:61364762ee0e 1730 /*
jmarkel44 0:61364762ee0e 1731 * V7 executable main function.
jmarkel44 0:61364762ee0e 1732 *
jmarkel44 0:61364762ee0e 1733 * There are various callbacks available:
jmarkel44 0:61364762ee0e 1734 *
jmarkel44 0:61364762ee0e 1735 * `pre_freeze_init()` and `pre_init()` are optional intialization functions,
jmarkel44 0:61364762ee0e 1736 * aimed to export any extra functionality into vanilla v7 engine. They are
jmarkel44 0:61364762ee0e 1737 * called after v7 initialization, before executing given files or inline
jmarkel44 0:61364762ee0e 1738 * expressions. `pre_freeze_init()` is called before "freezing" v7 state;
jmarkel44 0:61364762ee0e 1739 * whereas `pre_init` called afterwards.
jmarkel44 0:61364762ee0e 1740 *
jmarkel44 0:61364762ee0e 1741 * `post_init()`, if provided, is called after executing files and expressions,
jmarkel44 0:61364762ee0e 1742 * before destroying v7 instance and exiting.
jmarkel44 0:61364762ee0e 1743 */
jmarkel44 0:61364762ee0e 1744 int v7_main(int argc, char *argv[], void (*pre_freeze_init)(struct v7 *),
jmarkel44 0:61364762ee0e 1745 void (*pre_init)(struct v7 *), void (*post_init)(struct v7 *));
jmarkel44 0:61364762ee0e 1746
jmarkel44 0:61364762ee0e 1747 #if defined(__cplusplus)
jmarkel44 0:61364762ee0e 1748 }
jmarkel44 0:61364762ee0e 1749 #endif /* __cplusplus */
jmarkel44 0:61364762ee0e 1750
jmarkel44 0:61364762ee0e 1751 #endif /* CS_V7_SRC_MAIN_PUBLIC_H_ */
jmarkel44 0:61364762ee0e 1752 #endif /* V7_EXPORT_INTERNAL_HEADERS */