@@ -2230,114 +2230,94 @@ njs_string_prototype_last_index_of(njs_vm_t *vm, njs_value_t *args,
2230
2230
njs_uint_t nargs , njs_index_t unused )
2231
2231
{
2232
2232
double pos ;
2233
- ssize_t index , start , length , search_length ;
2233
+ int64_t index , start , length , search_length ;
2234
2234
njs_int_t ret ;
2235
- njs_value_t * value , * search_string , lvalue ;
2235
+ njs_value_t * this , * search , search_lvalue ;
2236
2236
const u_char * p , * end ;
2237
- njs_string_prop_t string , search ;
2238
-
2239
- ret = njs_string_object_validate (vm , njs_arg (args , nargs , 0 ));
2240
- if (njs_slow_path (ret != NJS_OK )) {
2241
- return ret ;
2242
- }
2243
-
2244
- index = -1 ;
2237
+ njs_string_prop_t string , s ;
2245
2238
2246
- length = njs_string_prop ( & string , njs_argument (args , 0 ) );
2239
+ this = njs_argument (args , 0 );
2247
2240
2248
- search_string = njs_lvalue_arg (& lvalue , args , nargs , 1 );
2241
+ if (njs_slow_path (njs_is_null_or_undefined (this ))) {
2242
+ njs_type_error (vm , "cannot convert \"%s\"to object" ,
2243
+ njs_type_string (this -> type ));
2244
+ return NJS_ERROR ;
2245
+ }
2249
2246
2250
- if (njs_slow_path (!njs_is_string (search_string ))) {
2251
- ret = njs_value_to_string (vm , search_string , search_string );
2252
- if (njs_slow_path (ret != NJS_OK )) {
2253
- return ret ;
2254
- }
2247
+ ret = njs_value_to_string (vm , this , this );
2248
+ if (njs_slow_path (ret != NJS_OK )) {
2249
+ return NJS_ERROR ;
2255
2250
}
2256
2251
2257
- search_length = njs_string_prop (& search , search_string );
2252
+ search = njs_lvalue_arg (& search_lvalue , args , nargs , 1 );
2253
+ ret = njs_value_to_string (vm , search , search );
2254
+ if (njs_slow_path (ret != NJS_OK )) {
2255
+ return ret ;
2256
+ }
2258
2257
2259
- if (length < search_length ) {
2260
- goto done ;
2258
+ ret = njs_value_to_number (vm , njs_arg (args , nargs , 2 ), & pos );
2259
+ if (njs_slow_path (ret != NJS_OK )) {
2260
+ return ret ;
2261
2261
}
2262
2262
2263
- value = njs_arg (args , nargs , 2 );
2264
-
2265
- if (njs_slow_path (!njs_is_number (value ))) {
2266
- ret = njs_value_to_number (vm , value , & pos );
2267
- if (njs_slow_path (ret != NJS_OK )) {
2268
- return ret ;
2269
- }
2263
+ if (!isnan (pos )) {
2264
+ start = njs_number_to_integer (pos );
2270
2265
2271
2266
} else {
2272
- pos = njs_number ( value ) ;
2267
+ start = INT64_MAX ;
2273
2268
}
2274
2269
2275
- if (isnan (pos )) {
2276
- index = NJS_STRING_MAX_LENGTH ;
2270
+ length = njs_string_prop (& string , this );
2277
2271
2278
- } else {
2279
- index = njs_number_to_integer (pos );
2272
+ start = njs_min (njs_max (start , 0 ), length );
2280
2273
2281
- if (index < 0 ) {
2282
- index = 0 ;
2283
- }
2284
- }
2274
+ search_length = njs_string_prop (& s , search );
2285
2275
2286
- if (search_length == 0 ) {
2287
- index = njs_min (index , length );
2288
- goto done ;
2289
- }
2276
+ index = length - search_length ;
2290
2277
2291
- if (index >= length ) {
2292
- index = length - 1 ;
2278
+ if (index > start ) {
2279
+ index = start ;
2293
2280
}
2294
2281
2282
+ end = string .start + string .size ;
2283
+
2295
2284
if (string .size == (size_t ) length ) {
2296
2285
/* Byte or ASCII string. */
2297
2286
2298
- start = length - search . size ;
2287
+ p = & string . start [ index ] ;
2299
2288
2300
- if (index > start ) {
2301
- index = start ;
2289
+ if (p > end - s . size ) {
2290
+ p = end - s . size ;
2302
2291
}
2303
2292
2304
- p = string .start + index ;
2305
-
2306
- do {
2307
- if (memcmp (p , search .start , search .size ) == 0 ) {
2293
+ for (; p >= string .start ; p -- ) {
2294
+ if (memcmp (p , s .start , s .size ) == 0 ) {
2295
+ index = p - string .start ;
2308
2296
goto done ;
2309
2297
}
2298
+ }
2310
2299
2311
- index -- ;
2312
- p -- ;
2313
-
2314
- } while (p >= string .start );
2300
+ index = -1 ;
2315
2301
2316
2302
} else {
2317
2303
/* UTF-8 string. */
2318
2304
2319
- end = string .start + string .size ;
2320
- p = njs_string_offset (string .start , end , index );
2321
- end -= search .size ;
2322
-
2323
- while (p > end ) {
2324
- index -- ;
2325
- p = njs_utf8_prev (p );
2305
+ if (index < 0 || index == length ) {
2306
+ index = (search_length == 0 ) ? index : -1 ;
2307
+ goto done ;
2326
2308
}
2327
2309
2328
- for ( ;; ) {
2329
- if (memcmp (p , search .start , search .size ) == 0 ) {
2310
+ p = njs_string_offset (string .start , end , index );
2311
+
2312
+ for (; p >= string .start ; p = njs_utf8_prev (p )) {
2313
+ if ((p + s .size ) <= end && memcmp (p , s .start , s .size ) == 0 ) {
2330
2314
goto done ;
2331
2315
}
2332
2316
2333
2317
index -- ;
2334
-
2335
- if (p <= string .start ) {
2336
- break ;
2337
- }
2338
-
2339
- p = njs_utf8_prev (p );
2340
2318
}
2319
+
2320
+ index = -1 ;
2341
2321
}
2342
2322
2343
2323
done :
0 commit comments