ref: be0685e89e085561342cbc98e3cb5b28d3063f10
parent: ebbc191fe18bf1d0c8e6a588a92880af38b0ca71
author: Tor Andersson <tor.andersson@gmail.com>
date: Tue May 23 08:13:09 EDT 2017
Optimize js_isarrayindex. Avoid floating point number conversions.
--- a/jsrun.c
+++ b/jsrun.c
@@ -434,12 +434,20 @@
/* Property access that takes care of attributes and getters/setters */
-int js_isarrayindex(js_State *J, const char *str, int *idx)
+int js_isarrayindex(js_State *J, const char *p, int *idx)
{
- char buf[32];
- *idx = jsV_numbertointeger(jsV_stringtonumber(J, str));
- sprintf(buf, "%u", *idx);
- return !strcmp(buf, str);
+ int n = 0;
+ while (*p) {
+ int c = *p++;
+ if (c >= '0' && c <= '9') {
+ if (n > INT_MAX / 10 - 1)
+ return 0;
+ n = n * 10 + (c - '0');
+ } else {
+ return 0;
+ }
+ }
+ return *idx = n, 1;
}
static void js_pushrune(js_State *J, Rune rune)