Cesanta / v7 Featured

Embedded JavaScript virtual machine

Dependents:   DISCO-F469NI_javascript_blinker

Committer:
Marko Mikulicic
Date:
Tue Oct 11 14:30:58 2016 +0200
Revision:
3:2bce515c5f0b
Parent:
2:7762b98d31c7
Fix armcc build

armcc toolchain seems to lack sys/time.h, disabling the JS Date feature
for now.

Who changed what in which revision?

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