15
15
*/
16
16
17
17
#include " ecma-alloc.h"
18
+ #include " ecma-array-object.h"
18
19
#include " ecma-builtin-helpers.h"
19
20
#include " ecma-builtins.h"
20
21
#include " ecma-conversion.h"
@@ -331,6 +332,8 @@ ecma_builtin_string_prototype_object_locale_compare (ecma_value_t this_arg, /**<
331
332
return ret_value;
332
333
} /* ecma_builtin_string_prototype_object_locale_compare */
333
334
335
+ #ifndef CONFIG_ECMA_COMPACT_PROFILE_DISABLE_REGEXP_BUILTIN
336
+
334
337
/* *
335
338
* The String.prototype object's 'match' routine
336
339
*
@@ -344,8 +347,245 @@ static ecma_completion_value_t
344
347
ecma_builtin_string_prototype_object_match (ecma_value_t this_arg, /* *< this argument */
345
348
ecma_value_t arg) /* *< routine's argument */
346
349
{
347
- ECMA_BUILTIN_CP_UNIMPLEMENTED (this_arg, arg);
350
+ ecma_completion_value_t ret_value = ecma_make_empty_completion_value ();
351
+
352
+ /* 1. */
353
+ ECMA_TRY_CATCH (this_check_coercible_value,
354
+ ecma_op_check_object_coercible (this_arg),
355
+ ret_value);
356
+
357
+ /* 2. */
358
+ ECMA_TRY_CATCH (this_to_string_value,
359
+ ecma_op_to_string (this_arg),
360
+ ret_value);
361
+
362
+ ecma_value_t regexp_value = 0 ;
363
+ /* 3. */
364
+ if (ecma_is_value_object (arg)
365
+ && ecma_object_get_class_name (ecma_get_object_from_value (arg)) == LIT_MAGIC_STRING_REGEXP_UL)
366
+ {
367
+ regexp_value = ecma_copy_value (arg, true );
368
+ }
369
+ else
370
+ {
371
+ /* 4. */
372
+ ecma_value_t regexp_arguments[1 ] = { arg };
373
+ ECMA_TRY_CATCH (new_regexp_value,
374
+ ecma_builtin_regexp_dispatch_construct (regexp_arguments, 1 ),
375
+ ret_value);
376
+
377
+ regexp_value = ecma_copy_value (new_regexp_value, true );
378
+
379
+ ECMA_FINALIZE (new_regexp_value);
380
+ }
381
+
382
+ if (ecma_is_completion_value_empty (ret_value))
383
+ {
384
+ JERRY_ASSERT (regexp_value != 0 );
385
+ ecma_object_t *regexp_obj_p = ecma_get_object_from_value (regexp_value);
386
+ ecma_string_t *global_string_p = ecma_get_magic_string (LIT_MAGIC_STRING_GLOBAL);
387
+
388
+ /* 5. */
389
+ ECMA_TRY_CATCH (global_prop_value,
390
+ ecma_op_object_get (regexp_obj_p, global_string_p),
391
+ ret_value);
392
+
393
+ ECMA_TRY_CATCH (global_value,
394
+ ecma_op_to_boolean (global_prop_value),
395
+ ret_value);
396
+
397
+ ecma_value_t exec_arguments[1 ] = { this_to_string_value };
398
+
399
+ if (!ecma_is_completion_value_normal_true (global_value))
400
+ {
401
+ /* 7. */
402
+ ret_value = ecma_builtin_regexp_prototype_dispatch_routine (LIT_MAGIC_STRING_EXEC,
403
+ regexp_value,
404
+ exec_arguments,
405
+ 1 );
406
+ }
407
+ else
408
+ {
409
+ /* 8.a. */
410
+ ecma_number_t *zero_number_p = ecma_alloc_number ();
411
+ *zero_number_p = 0 ;
412
+
413
+ ecma_string_t *index_zero_string_p = ecma_new_ecma_string_from_uint32 (0 );
414
+
415
+ ecma_string_t *last_index_string_p = ecma_get_magic_string (LIT_MAGIC_STRING_LASTINDEX_UL);
416
+
417
+ ECMA_TRY_CATCH (put_value,
418
+ ecma_op_object_put (regexp_obj_p,
419
+ last_index_string_p,
420
+ ecma_make_number_value (zero_number_p),
421
+ true ),
422
+ ret_value);
423
+
424
+ /* 8.b. */
425
+ ECMA_TRY_CATCH (new_array_value,
426
+ ecma_op_create_array_object (NULL , 0 , false ),
427
+ ret_value);
428
+
429
+ ecma_object_t *new_array_obj_p = ecma_get_object_from_value (new_array_value);
430
+
431
+ /* 8.c. */
432
+ ecma_number_t previous_last_index = 0 ;
433
+ /* 8.d. */
434
+ uint32_t n = 0 ;
435
+ /* 8.e. */
436
+ bool last_match = true ;
437
+
438
+ ecma_completion_value_t exec_result = ecma_make_empty_completion_value ();
439
+
440
+ /* 8.f. */
441
+ while (last_match && ecma_is_completion_value_empty (exec_result))
442
+ {
443
+ /* 8.f.i. */
444
+ ECMA_TRY_CATCH (exec_value,
445
+ ecma_builtin_regexp_prototype_dispatch_routine (LIT_MAGIC_STRING_EXEC,
446
+ regexp_value,
447
+ exec_arguments,
448
+ 1 ),
449
+ exec_result);
450
+
451
+ if (ecma_is_value_null (exec_value))
452
+ {
453
+ /* 8.f.ii. */
454
+ last_match = false ;
455
+ }
456
+ else
457
+ {
458
+ /* 8.f.iii. */
459
+ ECMA_TRY_CATCH (this_index_value,
460
+ ecma_op_object_get (regexp_obj_p, last_index_string_p),
461
+ exec_result);
462
+
463
+ ECMA_TRY_CATCH (this_index_number,
464
+ ecma_op_to_number (this_index_value),
465
+ exec_result);
466
+
467
+ ecma_number_t this_index = *ecma_get_number_from_value (this_index_number);
468
+
469
+ /* 8.f.iii.2. */
470
+ if (this_index == previous_last_index)
471
+ {
472
+ ecma_number_t *new_last_index_p = ecma_alloc_number ();
473
+ *new_last_index_p = this_index + 1 ;
474
+ /* 8.f.iii.2.a. */
475
+ ECMA_TRY_CATCH (index_put_value,
476
+ ecma_op_object_put (regexp_obj_p,
477
+ last_index_string_p,
478
+ ecma_make_number_value (new_last_index_p),
479
+ true ),
480
+ exec_result);
481
+
482
+ /* 8.f.iii.2.b. */
483
+ previous_last_index = this_index + 1 ;
484
+
485
+ ECMA_FINALIZE (index_put_value);
486
+
487
+ ecma_dealloc_number (new_last_index_p);
488
+ }
489
+ else
490
+ {
491
+ /* 8.f.iii.3. */
492
+ previous_last_index = this_index;
493
+ }
494
+
495
+ if (ecma_is_completion_value_empty (exec_result))
496
+ {
497
+ /* 8.f.iii.4. */
498
+ JERRY_ASSERT (ecma_is_value_object (exec_value));
499
+ ecma_object_t *exec_obj_p = ecma_get_object_from_value (exec_value);
500
+
501
+ ECMA_TRY_CATCH (match_string_value,
502
+ ecma_op_object_get (exec_obj_p, index_zero_string_p),
503
+ exec_result);
504
+
505
+ /* 8.f.iii.5. */
506
+ ecma_property_descriptor_t prop_desc = ecma_make_empty_property_descriptor ();
507
+ {
508
+ prop_desc.is_value_defined = true ;
509
+ prop_desc.value = match_string_value;
510
+
511
+ prop_desc.is_writable_defined = true ;
512
+ prop_desc.is_writable = true ;
513
+
514
+ prop_desc.is_enumerable_defined = true ;
515
+ prop_desc.is_enumerable = false ;
516
+
517
+ prop_desc.is_configurable_defined = true ;
518
+ prop_desc.is_configurable = true ;
519
+ }
520
+
521
+ ecma_string_t *current_index_str_p = ecma_new_ecma_string_from_uint32 (n);
522
+
523
+ ecma_completion_value_t completion = ecma_op_object_define_own_property (new_array_obj_p,
524
+ current_index_str_p,
525
+ &prop_desc,
526
+ false );
527
+ JERRY_ASSERT (ecma_is_completion_value_normal_true (completion));
528
+
529
+ ecma_deref_ecma_string (current_index_str_p);
530
+
531
+ /* 8.f.iii.6. */
532
+ n++;
533
+
534
+ ECMA_FINALIZE (match_string_value);
535
+ }
536
+
537
+ ECMA_FINALIZE (this_index_number);
538
+
539
+ ECMA_FINALIZE (this_index_value);
540
+ }
541
+
542
+ ECMA_FINALIZE (exec_value);
543
+ }
544
+
545
+ if (ecma_is_completion_value_empty (exec_result))
546
+ {
547
+ if (n == 0 )
548
+ {
549
+ /* 8.g. */
550
+ ret_value = ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_NULL);
551
+ }
552
+ else
553
+ {
554
+ /* 8.h. */
555
+ ret_value = ecma_make_normal_completion_value (ecma_copy_value (new_array_value, true ));
556
+ }
557
+ }
558
+ else
559
+ {
560
+ ret_value = exec_result;
561
+ }
562
+
563
+
564
+ ECMA_FINALIZE (new_array_value);
565
+
566
+ ECMA_FINALIZE (put_value);
567
+
568
+ ecma_deref_ecma_string (last_index_string_p);
569
+ ecma_deref_ecma_string (index_zero_string_p);
570
+ ecma_dealloc_number (zero_number_p);
571
+ }
572
+
573
+ ECMA_FINALIZE (global_value);
574
+
575
+ ECMA_FINALIZE (global_prop_value);
576
+
577
+ ecma_deref_ecma_string (global_string_p);
578
+
579
+ ecma_free_value (regexp_value, true );
580
+ }
581
+
582
+ ECMA_FINALIZE (this_to_string_value);
583
+
584
+ ECMA_FINALIZE (this_check_coercible_value);
585
+
586
+ return ret_value;
348
587
} /* ecma_builtin_string_prototype_object_match */
588
+ #endif /* CONFIG_ECMA_COMPACT_PROFILE_DISABLE_REGEXP_BUILTIN */
349
589
350
590
/* *
351
591
* The String.prototype object's 'replace' routine
0 commit comments