MIRROR: javascript for ๐Ÿœ's, a tiny runtime with big ambitions
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

global number functions

+65 -1
+1 -1
meson.build
··· 74 74 build_date = run_command('date', '+%Y-%m-%d', check: true).stdout().strip() 75 75 76 76 version_conf = configuration_data() 77 - version_conf.set('ANT_VERSION', '0.1.0.32') 77 + version_conf.set('ANT_VERSION', '0.1.0.33') 78 78 version_conf.set('ANT_GIT_HASH', git_hash) 79 79 version_conf.set('ANT_BUILD_DATE', build_date) 80 80
+64
src/ant.c
··· 7938 7938 return mkval(T_BOOL, isfinite(val) ? 1 : 0); 7939 7939 } 7940 7940 7941 + static double js_to_number(struct js *js, jsval_t arg) { 7942 + if (vtype(arg) == T_NUM) return tod(arg); 7943 + if (vtype(arg) == T_BOOL) return vdata(arg) ? 1.0 : 0.0; 7944 + if (vtype(arg) == T_NULL) return 0.0; 7945 + if (vtype(arg) == T_UNDEF) return NAN; 7946 + if (vtype(arg) == T_STR) { 7947 + jsoff_t len; 7948 + jsoff_t off = vstr(js, arg, &len); 7949 + const char *str = (char *) &js->mem[off]; 7950 + while (*str == ' ' || *str == '\t' || *str == '\n' || *str == '\r') str++; 7951 + if (*str == '\0') return 0.0; 7952 + char *end; 7953 + double val = strtod(str, &end); 7954 + while (*end == ' ' || *end == '\t' || *end == '\n' || *end == '\r') end++; 7955 + if (end == str || *end != '\0') return NAN; 7956 + return val; 7957 + } 7958 + return NAN; 7959 + } 7960 + 7961 + static jsval_t builtin_global_isNaN(struct js *js, jsval_t *args, int nargs) { 7962 + if (nargs == 0) return mkval(T_BOOL, 1); 7963 + double val = js_to_number(js, args[0]); 7964 + return mkval(T_BOOL, isnan(val) ? 1 : 0); 7965 + } 7966 + 7967 + static jsval_t builtin_global_isFinite(struct js *js, jsval_t *args, int nargs) { 7968 + if (nargs == 0) return mkval(T_BOOL, 0); 7969 + double val = js_to_number(js, args[0]); 7970 + return mkval(T_BOOL, isfinite(val) ? 1 : 0); 7971 + } 7972 + 7973 + static jsval_t builtin_Number_isInteger(struct js *js, jsval_t *args, int nargs) { 7974 + if (nargs == 0) return mkval(T_BOOL, 0); 7975 + jsval_t arg = args[0]; 7976 + 7977 + if (vtype(arg) != T_NUM) return mkval(T_BOOL, 0); 7978 + 7979 + double val = tod(arg); 7980 + if (!isfinite(val)) return mkval(T_BOOL, 0); 7981 + return mkval(T_BOOL, (val == floor(val)) ? 1 : 0); 7982 + } 7983 + 7984 + static jsval_t builtin_Number_isSafeInteger(struct js *js, jsval_t *args, int nargs) { 7985 + if (nargs == 0) return mkval(T_BOOL, 0); 7986 + jsval_t arg = args[0]; 7987 + 7988 + if (vtype(arg) != T_NUM) return mkval(T_BOOL, 0); 7989 + 7990 + double val = tod(arg); 7991 + if (!isfinite(val)) return mkval(T_BOOL, 0); 7992 + if (val != floor(val)) return mkval(T_BOOL, 0); 7993 + 7994 + return mkval(T_BOOL, (val >= -9007199254740991.0 && val <= 9007199254740991.0) ? 1 : 0); 7995 + } 7996 + 7941 7997 static jsval_t builtin_Number(struct js *js, jsval_t *args, int nargs) { 7942 7998 if (nargs == 0) return tov(0.0); 7943 7999 jsval_t arg = args[0]; ··· 7949 8005 jsoff_t len; 7950 8006 jsoff_t off = vstr(js, arg, &len); 7951 8007 const char *str = (char *) &js->mem[off]; 8008 + while (*str == ' ' || *str == '\t' || *str == '\n' || *str == '\r') str++; 8009 + if (*str == '\0') return tov(0.0); 7952 8010 char *end; 7953 8011 double val = strtod(str, &end); 8012 + while (*end == ' ' || *end == '\t' || *end == '\n' || *end == '\r') end++; 8013 + if (end == str || *end != '\0') return tov(NAN); 7954 8014 return tov(val); 7955 8015 } else if (vtype(arg) == T_NULL || vtype(arg) == T_UNDEF) { 7956 8016 return tov(0.0); ··· 14058 14118 setprop(js, number_ctor_obj, js_mkstr(js, "__native_func", 13), js_mkfun(builtin_Number)); 14059 14119 setprop(js, number_ctor_obj, js_mkstr(js, "isNaN", 5), js_mkfun(builtin_Number_isNaN)); 14060 14120 setprop(js, number_ctor_obj, js_mkstr(js, "isFinite", 8), js_mkfun(builtin_Number_isFinite)); 14121 + setprop(js, number_ctor_obj, js_mkstr(js, "isInteger", 9), js_mkfun(builtin_Number_isInteger)); 14122 + setprop(js, number_ctor_obj, js_mkstr(js, "isSafeInteger", 13), js_mkfun(builtin_Number_isSafeInteger)); 14061 14123 setprop(js, number_ctor_obj, js_mkstr(js, "prototype", 9), number_proto); 14062 14124 setprop(js, glob, js_mkstr(js, "Number", 6), mkval(T_FUNC, vdata(number_ctor_obj))); 14063 14125 ··· 14183 14245 setprop(js, glob, js_mkstr(js, "eval", 4), js_mkfun(builtin_eval)); 14184 14246 setprop(js, glob, js_mkstr(js, "parseInt", 8), js_mkfun(builtin_parseInt)); 14185 14247 setprop(js, glob, js_mkstr(js, "parseFloat", 10), js_mkfun(builtin_parseFloat)); 14248 + setprop(js, glob, js_mkstr(js, "isNaN", 5), js_mkfun(builtin_global_isNaN)); 14249 + setprop(js, glob, js_mkstr(js, "isFinite", 8), js_mkfun(builtin_global_isFinite)); 14186 14250 setprop(js, glob, js_mkstr(js, "btoa", 4), js_mkfun(builtin_btoa)); 14187 14251 setprop(js, glob, js_mkstr(js, "atob", 4), js_mkfun(builtin_atob)); 14188 14252 setprop(js, glob, js_mkstr(js, "NaN", 3), tov(NAN));