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 missing string methods

+109 -9
+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.1.8') 77 + version_conf.set('ANT_VERSION', '0.1.1.9') 78 78 version_conf.set('ANT_GIT_HASH', git_hash) 79 79 version_conf.set('ANT_BUILD_DATE', build_date) 80 80
+108 -8
src/ant.c
··· 468 468 static jsval_t builtin_string_padStart(struct js *js, jsval_t *args, int nargs); 469 469 static jsval_t builtin_string_padEnd(struct js *js, jsval_t *args, int nargs); 470 470 static jsval_t builtin_string_charAt(struct js *js, jsval_t *args, int nargs); 471 + static jsval_t builtin_string_at(struct js *js, jsval_t *args, int nargs); 472 + static jsval_t builtin_string_lastIndexOf(struct js *js, jsval_t *args, int nargs); 473 + static jsval_t builtin_string_concat(struct js *js, jsval_t *args, int nargs); 474 + static jsval_t builtin_string_fromCharCode(struct js *js, jsval_t *args, int nargs); 471 475 static jsval_t builtin_number_toString(struct js *js, jsval_t *args, int nargs); 472 476 static jsval_t builtin_number_toFixed(struct js *js, jsval_t *args, int nargs); 473 477 static jsval_t builtin_number_toPrecision(struct js *js, jsval_t *args, int nargs); ··· 11783 11787 jsval_t str = js->this_val; 11784 11788 if (vtype(str) != T_STR) return js_mkerr(js, "indexOf called on non-string"); 11785 11789 if (nargs == 0) return tov(-1); 11790 + 11786 11791 jsval_t search = args[0]; 11787 - 11788 11792 if (vtype(search) != T_STR) return tov(-1); 11793 + 11789 11794 jsoff_t str_len, str_off = vstr(js, str, &str_len); 11790 11795 jsoff_t search_len, search_off = vstr(js, search, &search_len); 11796 + if (search_len == 0) return tov(0); 11797 + if (search_len > str_len) return tov(-1); 11798 + 11791 11799 const char *str_ptr = (char *) &js->mem[str_off]; 11792 11800 const char *search_ptr = (char *) &js->mem[search_off]; 11793 - 11801 + 11794 11802 for (jsoff_t i = 0; i <= str_len - search_len; i++) { 11795 - if (memcmp(str_ptr + i, search_ptr, search_len) == 0) { 11796 - return tov((double) i); 11797 - } 11803 + if (memcmp(str_ptr + i, search_ptr, search_len) == 0) return tov((double) i); 11798 11804 } 11799 - 11800 11805 return tov(-1); 11801 11806 } 11802 11807 ··· 12684 12689 char ch = js->mem[str_off + idx]; 12685 12690 12686 12691 return js_mkstr(js, &ch, 1); 12692 + } 12693 + 12694 + static jsval_t builtin_string_at(struct js *js, jsval_t *args, int nargs) { 12695 + jsval_t str = js->this_val; 12696 + if (vtype(str) != T_STR) return js_mkerr(js, "at called on non-string"); 12697 + if (nargs < 1 || vtype(args[0]) != T_NUM) return js_mkundef(); 12698 + 12699 + jsoff_t str_len = offtolen(loadoff(js, (jsoff_t) vdata(str))); 12700 + double idx_d = tod(args[0]); 12701 + long idx = (long) idx_d; 12702 + 12703 + if (idx < 0) idx += (long) str_len; 12704 + if (idx < 0 || idx >= (long) str_len) return js_mkundef(); 12705 + 12706 + jsoff_t str_off = (jsoff_t) vdata(str) + sizeof(jsoff_t); 12707 + char ch = js->mem[str_off + idx]; 12708 + return js_mkstr(js, &ch, 1); 12709 + } 12710 + 12711 + static jsval_t builtin_string_lastIndexOf(struct js *js, jsval_t *args, int nargs) { 12712 + jsval_t str = js->this_val; 12713 + if (vtype(str) != T_STR) return js_mkerr(js, "lastIndexOf called on non-string"); 12714 + if (nargs == 0) return tov(-1); 12715 + 12716 + jsval_t search = args[0]; 12717 + if (vtype(search) != T_STR) return tov(-1); 12718 + 12719 + jsoff_t str_len, str_off = vstr(js, str, &str_len); 12720 + jsoff_t search_len, search_off = vstr(js, search, &search_len); 12721 + if (search_len == 0) return tov((double) str_len); 12722 + if (search_len > str_len) return tov(-1); 12723 + 12724 + const char *str_ptr = (char *) &js->mem[str_off]; 12725 + const char *search_ptr = (char *) &js->mem[search_off]; 12726 + 12727 + for (jsoff_t i = str_len - search_len + 1; i > 0; i--) { 12728 + if (memcmp(str_ptr + i - 1, search_ptr, search_len) == 0) return tov((double)(i - 1)); 12729 + } 12730 + return tov(-1); 12731 + } 12732 + 12733 + static jsval_t builtin_string_concat(struct js *js, jsval_t *args, int nargs) { 12734 + jsval_t str = js->this_val; 12735 + if (vtype(str) != T_STR) return js_mkerr(js, "concat called on non-string"); 12736 + 12737 + jsoff_t total_len; 12738 + jsoff_t base_off = vstr(js, str, &total_len); 12739 + for (int i = 0; i < nargs; i++) { 12740 + if (vtype(args[i]) != T_STR) continue; 12741 + jsoff_t arg_len; 12742 + vstr(js, args[i], &arg_len); 12743 + total_len += arg_len; 12744 + } 12745 + 12746 + char *result = (char *)ANT_GC_MALLOC(total_len + 1); 12747 + if (!result) return js_mkerr(js, "oom"); 12748 + 12749 + jsoff_t base_len; 12750 + base_off = vstr(js, str, &base_len); 12751 + memcpy(result, &js->mem[base_off], base_len); 12752 + jsoff_t pos = base_len; 12753 + 12754 + for (int i = 0; i < nargs; i++) { 12755 + if (vtype(args[i]) != T_STR) continue; 12756 + jsoff_t arg_len, arg_off = vstr(js, args[i], &arg_len); 12757 + memcpy(result + pos, &js->mem[arg_off], arg_len); 12758 + pos += arg_len; 12759 + } 12760 + result[pos] = '\0'; 12761 + 12762 + jsval_t ret = js_mkstr(js, result, pos); 12763 + ANT_GC_FREE(result); 12764 + return ret; 12765 + } 12766 + 12767 + static jsval_t builtin_string_fromCharCode(struct js *js, jsval_t *args, int nargs) { 12768 + if (nargs == 0) return js_mkstr(js, "", 0); 12769 + 12770 + char *buf = (char *)ANT_GC_MALLOC(nargs + 1); 12771 + if (!buf) return js_mkerr(js, "oom"); 12772 + 12773 + for (int i = 0; i < nargs; i++) { 12774 + if (vtype(args[i]) != T_NUM) { buf[i] = 0; continue; } 12775 + int code = (int) tod(args[i]); 12776 + buf[i] = (char)(code & 0xFF); 12777 + } 12778 + buf[nargs] = '\0'; 12779 + 12780 + jsval_t ret = js_mkstr(js, buf, nargs); 12781 + ANT_GC_FREE(buf); 12782 + return ret; 12687 12783 } 12688 12784 12689 12785 static jsval_t builtin_number_toString(struct js *js, jsval_t *args, int nargs) { ··· 15023 15119 setprop(js, string_proto, js_mkstr(js, "padStart", 8), js_mkfun(builtin_string_padStart)); 15024 15120 setprop(js, string_proto, js_mkstr(js, "padEnd", 6), js_mkfun(builtin_string_padEnd)); 15025 15121 setprop(js, string_proto, js_mkstr(js, "charAt", 6), js_mkfun(builtin_string_charAt)); 15026 - 15122 + setprop(js, string_proto, js_mkstr(js, "at", 2), js_mkfun(builtin_string_at)); 15123 + setprop(js, string_proto, js_mkstr(js, "lastIndexOf", 11), js_mkfun(builtin_string_lastIndexOf)); 15124 + setprop(js, string_proto, js_mkstr(js, "concat", 6), js_mkfun(builtin_string_concat)); 15125 + 15027 15126 jsval_t number_proto = js_mkobj(js); 15028 15127 set_proto(js, number_proto, object_proto); 15029 15128 setprop(js, number_proto, js_mkstr(js, "toString", 8), js_mkfun(builtin_number_toString)); ··· 15156 15255 set_proto(js, str_ctor_obj, function_proto); 15157 15256 setprop(js, str_ctor_obj, js_mkstr(js, "__native_func", 13), js_mkfun(builtin_String)); 15158 15257 setprop(js, str_ctor_obj, js_mkstr(js, "prototype", 9), string_proto); 15258 + setprop(js, str_ctor_obj, js_mkstr(js, "fromCharCode", 12), js_mkfun(builtin_string_fromCharCode)); 15159 15259 setprop(js, glob, js_mkstr(js, "String", 6), mkval(T_FUNC, vdata(str_ctor_obj))); 15160 15260 15161 15261 jsval_t number_ctor_obj = mkobj(js, 0); ··· 15193 15293 setprop(js, arr_ctor_obj, js_mkstr(js, "from", 4), js_mkfun(builtin_Array_from)); 15194 15294 setprop(js, arr_ctor_obj, js_mkstr(js, "of", 2), js_mkfun(builtin_Array_of)); 15195 15295 setprop(js, glob, js_mkstr(js, "Array", 5), mkval(T_FUNC, vdata(arr_ctor_obj))); 15196 - 15296 + 15197 15297 jsval_t map_ctor_obj = mkobj(js, 0); 15198 15298 set_proto(js, map_ctor_obj, function_proto); 15199 15299 setprop(js, map_ctor_obj, js_mkstr(js, "__native_func", 13), js_mkfun(builtin_Map));