Something went wrong. Try again.
javascript for 🐜's, a tiny runtime with big ambitions antjs.org
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151#include <string.h>
#include "ant.h"#include "cfunc.h"#include "common.h"#include "errors.h"#include "internal.h"#include "modules/domexception.h"
static const struct { const char *name; int code; } domex_codes[] = { { "IndexSizeError", 1 }, { "HierarchyRequestError", 3 }, { "WrongDocumentError", 4 }, { "InvalidCharacterError", 5 }, { "NoModificationAllowedError", 7 }, { "NotFoundError", 8 }, { "NotSupportedError", 9 }, { "InUseAttributeError", 10 }, { "InvalidStateError", 11 }, { "SyntaxError", 12 }, { "InvalidModificationError", 13 }, { "NamespaceError", 14 }, { "InvalidAccessError", 15 }, { "TypeMismatchError", 17 }, { "SecurityError", 18 }, { "NetworkError", 19 }, { "AbortError", 20 }, { "URLMismatchError", 21 }, { "QuotaExceededError", 22 }, { "TimeoutError", 23 }, { "InvalidNodeTypeError", 24 }, { "DataCloneError", 25 },};
static const struct { const char *prop; int code; } domex_constants[] = { { "INDEX_SIZE_ERR", 1 }, { "DOMSTRING_SIZE_ERR", 2 }, { "HIERARCHY_REQUEST_ERR", 3 }, { "WRONG_DOCUMENT_ERR", 4 }, { "INVALID_CHARACTER_ERR", 5 }, { "NO_DATA_ALLOWED_ERR", 6 }, { "NO_MODIFICATION_ALLOWED_ERR", 7 }, { "NOT_FOUND_ERR", 8 }, { "NOT_SUPPORTED_ERR", 9 }, { "INUSE_ATTRIBUTE_ERR", 10 }, { "INVALID_STATE_ERR", 11 }, { "SYNTAX_ERR", 12 }, { "INVALID_MODIFICATION_ERR", 13 }, { "NAMESPACE_ERR", 14 }, { "INVALID_ACCESS_ERR", 15 }, { "VALIDATION_ERR", 16 }, { "TYPE_MISMATCH_ERR", 17 }, { "SECURITY_ERR", 18 }, { "NETWORK_ERR", 19 }, { "ABORT_ERR", 20 }, { "URL_MISMATCH_ERR", 21 }, { "QUOTA_EXCEEDED_ERR", 22 }, { "TIMEOUT_ERR", 23 }, { "INVALID_NODE_TYPE_ERR", 24 }, { "DATA_CLONE_ERR", 25 },};
#define DOMEX_CONSTANTS_LEN (sizeof(domex_constants) / sizeof(domex_constants[0]))
static int name_to_code(const char *name) { if (!name) return 0; for (size_t i = 0; i < sizeof(domex_codes) / sizeof(domex_codes[0]); i++) { if (strcmp(name, domex_codes[i].name) == 0) return domex_codes[i].code; } return 0;}
static void set_constants(ant_t *js, ant_value_t obj) { for (size_t i = 0; i < DOMEX_CONSTANTS_LEN; i++) mkprop_exact_attrs( js, obj, js_mkstr(js, domex_constants[i].prop, strlen(domex_constants[i].prop)), js_mknum(domex_constants[i].code), ANT_PROP_ATTR_ENUMERABLE );}
// new DOMException(message?, name?)static ant_value_t domexception_ctor(ant_params_t) { if (vtype(call_new_target) == kTypeUndefined) return js_mkerr_typed(js, JS_ERR_TYPE, "DOMException constructor requires 'new'"); ant_value_t self = js_getthis(js);
const char *msg; if (nargs < 1 || vtype(args[0]) == kTypeUndefined) { msg = ""; } else if (vtype(args[0]) == kTypeString) { msg = js_getstr(js, args[0], NULL); if (!msg) msg = ""; } else { ant_value_t str_val = js_tostring_val(js, args[0]); msg = (vtype(str_val) == kTypeString) ? js_getstr(js, str_val, NULL) : ""; if (!msg) msg = ""; }
const char *name = (nargs >= 2 && vtype(args[1]) == kTypeString) ? js_getstr(js, args[1], NULL) : "Error"; if (!name) name = "Error";
int code = name_to_code(name); size_t msg_len = strlen(msg); size_t name_len = strlen(name);
js_set(js, self, "message", js_mkstr(js, msg, msg_len)); js_set(js, self, "name", js_mkstr(js, name, name_len)); js_set(js, self, "code", js_mknum(code));
js_set_slot(self, SLOT_ERROR_BRAND, js_true); js_capture_stack(js, self); return js_mkundef();}
ant_value_t make_dom_exception(ant_t *js, const char *message, const char *name) { size_t msg_len = strlen(message); size_t name_len = strlen(name); int code = name_to_code(name);
ant_value_t obj = Ant_Object_CreateBare(js); if (is_object_type(js->builtins.domexception_proto)) js_set_proto_init(obj, js->builtins.domexception_proto);
js_set(js, obj, "message", js_mkstr(js, message, msg_len)); js_set(js, obj, "name", js_mkstr(js, name, name_len)); js_set(js, obj, "code", js_mknum(code)); js_set_tostringtag(js, obj, js_mkstr(js, "DOMException", 12)); js_set_slot(obj, SLOT_ERROR_BRAND, js_true);
return obj;}
void init_domexception_module(ant_t *js) { ant_value_t proto = Ant_Object_CreateBare(js); js->builtins.domexception_proto = proto;
ant_value_t error_proto = js->builtins.error_protos[JS_ERR_GENERIC]; if (vtype(error_proto) != kTypeUndefined) js_set_proto_init(proto, error_proto);
js_set(js, proto, "name", js_mkstr(js, "Error", 5)); js_set(js, proto, "message", js_mkstr(js, "", 0)); js_set(js, proto, "code", js_mknum(0)); js_set_tostringtag(js, proto, js_mkstr(js, "DOMException", 12)); set_constants(js, proto);
ant_value_t fn = Ant_Function_CreateIntrinsicConstructor(js, domexception_ctor, proto, "DOMException", 0); set_constants(js, fn); js_set_global_builtin(js, "DOMException", fn);}