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,236 @@ 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 = ecma_make_simple_value (ECMA_SIMPLE_VALUE_EMPTY);
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 (!ecma_is_value_empty (regexp_value));
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_value,
390
+ ecma_op_object_get (regexp_obj_p, global_string_p),
391
+ ret_value);
392
+
393
+ JERRY_ASSERT (ecma_is_value_boolean (global_value));
394
+
395
+ ecma_value_t exec_arguments[1 ] = { this_to_string_value };
396
+
397
+ if (!ecma_is_value_true (global_value))
398
+ {
399
+ /* 7. */
400
+ ret_value = ecma_builtin_regexp_prototype_dispatch_routine (LIT_MAGIC_STRING_EXEC,
401
+ regexp_value,
402
+ exec_arguments,
403
+ 1 );
404
+ }
405
+ else
406
+ {
407
+ /* 8.a. */
408
+ ecma_number_t *zero_number_p = ecma_alloc_number ();
409
+ *zero_number_p = 0 ;
410
+
411
+ ecma_string_t *index_zero_string_p = ecma_new_ecma_string_from_uint32 (0 );
412
+
413
+ ecma_string_t *last_index_string_p = ecma_get_magic_string (LIT_MAGIC_STRING_LASTINDEX_UL);
414
+
415
+ ECMA_TRY_CATCH (put_value,
416
+ ecma_op_object_put (regexp_obj_p,
417
+ last_index_string_p,
418
+ ecma_make_number_value (zero_number_p),
419
+ true ),
420
+ ret_value);
421
+
422
+ /* 8.b. */
423
+ ECMA_TRY_CATCH (new_array_value,
424
+ ecma_op_create_array_object (NULL , 0 , false ),
425
+ ret_value);
426
+
427
+ ecma_object_t *new_array_obj_p = ecma_get_object_from_value (new_array_value);
428
+
429
+ /* 8.c. */
430
+ ecma_number_t previous_last_index = 0 ;
431
+ /* 8.d. */
432
+ uint32_t n = 0 ;
433
+ /* 8.e. */
434
+ bool last_match = true ;
435
+
436
+ // ecma_completion_value_t exec_result = ecma_make_empty_completion_value ();
437
+
438
+ /* 8.f. */
439
+ while (last_match && ecma_is_completion_value_empty (ret_value))
440
+ {
441
+ /* 8.f.i. */
442
+ ECMA_TRY_CATCH (exec_value,
443
+ ecma_builtin_regexp_prototype_dispatch_routine (LIT_MAGIC_STRING_EXEC,
444
+ regexp_value,
445
+ exec_arguments,
446
+ 1 ),
447
+ ret_value);
448
+
449
+ if (ecma_is_value_null (exec_value))
450
+ {
451
+ /* 8.f.ii. */
452
+ last_match = false ;
453
+ }
454
+ else
455
+ {
456
+ /* 8.f.iii. */
457
+ ECMA_TRY_CATCH (this_index_value,
458
+ ecma_op_object_get (regexp_obj_p, last_index_string_p),
459
+ ret_value);
460
+
461
+ ECMA_TRY_CATCH (this_index_number,
462
+ ecma_op_to_number (this_index_value),
463
+ ret_value);
464
+
465
+ ecma_number_t this_index = *ecma_get_number_from_value (this_index_number);
466
+
467
+ /* 8.f.iii.2. */
468
+ if (this_index == previous_last_index)
469
+ {
470
+ ecma_number_t *new_last_index_p = ecma_alloc_number ();
471
+ *new_last_index_p = this_index + 1 ;
472
+ /* 8.f.iii.2.a. */
473
+ ECMA_TRY_CATCH (index_put_value,
474
+ ecma_op_object_put (regexp_obj_p,
475
+ last_index_string_p,
476
+ ecma_make_number_value (new_last_index_p),
477
+ true ),
478
+ ret_value);
479
+
480
+ /* 8.f.iii.2.b. */
481
+ previous_last_index = this_index + 1 ;
482
+
483
+ ECMA_FINALIZE (index_put_value);
484
+
485
+ ecma_dealloc_number (new_last_index_p);
486
+ }
487
+ else
488
+ {
489
+ /* 8.f.iii.3. */
490
+ previous_last_index = this_index;
491
+ }
492
+
493
+ if (ecma_is_completion_value_empty (ret_value))
494
+ {
495
+ /* 8.f.iii.4. */
496
+ JERRY_ASSERT (ecma_is_value_object (exec_value));
497
+ ecma_object_t *exec_obj_p = ecma_get_object_from_value (exec_value);
498
+
499
+ ECMA_TRY_CATCH (match_string_value,
500
+ ecma_op_object_get (exec_obj_p, index_zero_string_p),
501
+ ret_value);
502
+
503
+ /* 8.f.iii.5. */
504
+ ecma_property_descriptor_t prop_desc = ecma_make_empty_property_descriptor ();
505
+ {
506
+ prop_desc.is_value_defined = true ;
507
+ prop_desc.value = match_string_value;
508
+
509
+ prop_desc.is_writable_defined = true ;
510
+ prop_desc.is_writable = true ;
511
+
512
+ prop_desc.is_enumerable_defined = true ;
513
+ prop_desc.is_enumerable = true ;
514
+
515
+ prop_desc.is_configurable_defined = true ;
516
+ prop_desc.is_configurable = true ;
517
+ }
518
+
519
+ ecma_string_t *current_index_str_p = ecma_new_ecma_string_from_uint32 (n);
520
+
521
+ ecma_completion_value_t completion = ecma_op_object_define_own_property (new_array_obj_p,
522
+ current_index_str_p,
523
+ &prop_desc,
524
+ false );
525
+ JERRY_ASSERT (ecma_is_completion_value_normal_true (completion));
526
+
527
+ ecma_deref_ecma_string (current_index_str_p);
528
+
529
+ /* 8.f.iii.6. */
530
+ n++;
531
+
532
+ ECMA_FINALIZE (match_string_value);
533
+ }
534
+
535
+ ECMA_FINALIZE (this_index_number);
536
+
537
+ ECMA_FINALIZE (this_index_value);
538
+ }
539
+
540
+ ECMA_FINALIZE (exec_value);
541
+ }
542
+
543
+ if (ecma_is_completion_value_empty (ret_value))
544
+ {
545
+ if (n == 0 )
546
+ {
547
+ /* 8.g. */
548
+ ret_value = ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_NULL);
549
+ }
550
+ else
551
+ {
552
+ /* 8.h. */
553
+ ret_value = ecma_make_normal_completion_value (ecma_copy_value (new_array_value, true ));
554
+ }
555
+ }
556
+
557
+ ECMA_FINALIZE (new_array_value);
558
+
559
+ ECMA_FINALIZE (put_value);
560
+
561
+ ecma_deref_ecma_string (last_index_string_p);
562
+ ecma_deref_ecma_string (index_zero_string_p);
563
+ ecma_dealloc_number (zero_number_p);
564
+ }
565
+
566
+ ECMA_FINALIZE (global_value);
567
+
568
+ ecma_deref_ecma_string (global_string_p);
569
+
570
+ ecma_free_value (regexp_value, true );
571
+ }
572
+
573
+ ECMA_FINALIZE (this_to_string_value);
574
+
575
+ ECMA_FINALIZE (this_check_coercible_value);
576
+
577
+ return ret_value;
348
578
} /* ecma_builtin_string_prototype_object_match */
579
+ #endif /* !CONFIG_ECMA_COMPACT_PROFILE_DISABLE_REGEXP_BUILTIN */
349
580
350
581
/* *
351
582
* The String.prototype object's 'replace' routine
0 commit comments