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.

add callback validation for array methods

+27 -32
+27 -32
src/ant.c
··· 15508 15508 return true; 15509 15509 } 15510 15510 15511 + static inline bool is_callable(jsval_t v) { 15512 + uint8_t t = vtype(v); 15513 + return t == T_FUNC || t == T_CFUNC; 15514 + } 15515 + 15516 + static inline jsval_t require_callback(struct js *js, jsval_t *args, int nargs, const char *name) { 15517 + if (nargs == 0 || !is_callable(args[0])) 15518 + return js_mkerr(js, "%s requires a function argument", name); 15519 + return args[0]; 15520 + } 15521 + 15511 15522 static jsval_t array_shallow_copy(struct js *js, jsval_t arr, jsoff_t len) { 15512 15523 jsval_t result = mkarr(js); 15513 15524 if (is_err(result)) return result; ··· 15815 15826 if (vtype(arr) != T_ARR && vtype(arr) != T_OBJ) 15816 15827 return js_mkerr(js, "every called on non-array"); 15817 15828 15818 - if (nargs == 0 || (vtype(args[0]) != T_FUNC && vtype(args[0]) != T_CFUNC)) 15819 - return js_mkerr(js, "every requires a function argument"); 15820 - 15821 - jsval_t callback = args[0]; 15829 + jsval_t callback = require_callback(js, args, nargs, "every"); 15830 + if (is_err(callback)) return callback; 15822 15831 15823 15832 jsoff_t len_off = lkp_interned(js, arr, INTERN_LENGTH, 6); 15824 15833 jsoff_t len = 0; ··· 15860 15869 if (vtype(arr) != T_ARR && vtype(arr) != T_OBJ) 15861 15870 return js_mkerr(js, "forEach called on non-array"); 15862 15871 15863 - if (nargs == 0 || (vtype(args[0]) != T_FUNC && vtype(args[0]) != T_CFUNC)) 15864 - return js_mkerr(js, "forEach requires a function argument"); 15865 - 15866 - jsval_t callback = args[0]; 15872 + jsval_t callback = require_callback(js, args, nargs, "forEach"); 15873 + if (is_err(callback)) return callback; 15867 15874 15868 15875 jsoff_t len_off = lkp_interned(js, arr, INTERN_LENGTH, 6); 15869 15876 jsoff_t len = 0; ··· 15951 15958 if (vtype(arr) != T_ARR && vtype(arr) != T_OBJ) 15952 15959 return js_mkerr(js, "map called on non-array"); 15953 15960 15954 - if (nargs == 0 || (vtype(args[0]) != T_FUNC && vtype(args[0]) != T_CFUNC)) 15955 - return js_mkerr(js, "map requires a function argument"); 15956 - 15957 - jsval_t callback = args[0]; 15961 + jsval_t callback = require_callback(js, args, nargs, "map"); 15962 + if (is_err(callback)) return callback; 15958 15963 15959 15964 jsoff_t len_off = lkp_interned(js, arr, INTERN_LENGTH, 6); 15960 15965 jsoff_t len = 0; ··· 16004 16009 if (vtype(arr) != T_ARR && vtype(arr) != T_OBJ) 16005 16010 return js_mkerr(js, "filter called on non-array"); 16006 16011 16007 - if (nargs == 0 || (vtype(args[0]) != T_FUNC && vtype(args[0]) != T_CFUNC)) 16008 - return js_mkerr(js, "filter requires a function argument"); 16009 - 16010 - jsval_t callback = args[0]; 16012 + jsval_t callback = require_callback(js, args, nargs, "filter"); 16013 + if (is_err(callback)) return callback; 16011 16014 16012 16015 jsoff_t len_off = lkp_interned(js, arr, INTERN_LENGTH, 6); 16013 16016 jsoff_t len = 0; ··· 16061 16064 if (vtype(arr) != T_ARR && vtype(arr) != T_OBJ) 16062 16065 return js_mkerr(js, "reduce called on non-array"); 16063 16066 16064 - if (nargs == 0 || (vtype(args[0]) != T_FUNC && vtype(args[0]) != T_CFUNC)) 16065 - return js_mkerr(js, "reduce requires a function argument"); 16066 - 16067 - jsval_t callback = args[0]; 16067 + jsval_t callback = require_callback(js, args, nargs, "reduce"); 16068 + if (is_err(callback)) return callback; 16068 16069 bool has_initial = (nargs >= 2); 16069 16070 16070 16071 jsoff_t len_off = lkp_interned(js, arr, INTERN_LENGTH, 6); ··· 16302 16303 if (vtype(arr) != T_ARR && vtype(arr) != T_OBJ) 16303 16304 return js_mkerr(js, "%s called on non-array", name); 16304 16305 16305 - if (nargs == 0 || (vtype(args[0]) != T_FUNC && vtype(args[0]) != T_CFUNC)) 16306 - return js_mkerr(js, "%s requires a function argument", name); 16307 - 16308 - jsval_t callback = args[0]; 16306 + jsval_t callback = require_callback(js, args, nargs, name); 16307 + if (is_err(callback)) return callback; 16309 16308 16310 16309 jsoff_t len_off = lkp_interned(js, arr, INTERN_LENGTH, 6); 16311 16310 jsoff_t len = 0; ··· 16355 16354 if (vtype(arr) != T_ARR && vtype(arr) != T_OBJ) 16356 16355 return js_mkerr(js, "%s called on non-array", name); 16357 16356 16358 - if (nargs == 0 || (vtype(args[0]) != T_FUNC && vtype(args[0]) != T_CFUNC)) 16359 - return js_mkerr(js, "%s requires a function argument", name); 16360 - 16361 - jsval_t callback = args[0]; 16357 + jsval_t callback = require_callback(js, args, nargs, name); 16358 + if (is_err(callback)) return callback; 16362 16359 16363 16360 jsoff_t len_off = lkp_interned(js, arr, INTERN_LENGTH, 6); 16364 16361 jsoff_t len = 0; ··· 16720 16717 if (vtype(arr) != T_ARR && vtype(arr) != T_OBJ) 16721 16718 return js_mkerr(js, "some called on non-array"); 16722 16719 16723 - if (nargs == 0 || (vtype(args[0]) != T_FUNC && vtype(args[0]) != T_CFUNC)) 16724 - return js_mkerr(js, "some requires a function argument"); 16725 - 16726 - jsval_t callback = args[0]; 16720 + jsval_t callback = require_callback(js, args, nargs, "some"); 16721 + if (is_err(callback)) return callback; 16727 16722 16728 16723 jsoff_t len_off = lkp_interned(js, arr, INTERN_LENGTH, 6); 16729 16724 jsoff_t len = 0;