|
8 | 8 | #include <njs_main.h> |
9 | 9 |
|
10 | 10 |
|
11 | | -static njs_int_t njs_object_property_query(njs_vm_t *vm, |
12 | | - njs_property_query_t *pq, njs_object_t *object, uint32_t atom_id); |
13 | 11 | static njs_int_t njs_array_property_query(njs_vm_t *vm, |
14 | 12 | njs_property_query_t *pq, njs_array_t *array, uint32_t index, |
15 | 13 | uint32_t atom_id); |
@@ -537,91 +535,6 @@ njs_value_is_data_view(const njs_value_t *value) |
537 | 535 | } |
538 | 536 |
|
539 | 537 |
|
540 | | -/* |
541 | | - * ES5.1, 8.12.1: [[GetOwnProperty]], [[GetProperty]]. |
542 | | - * The njs_property_query() returns values |
543 | | - * NJS_OK property has been found in object, |
544 | | - * retval of type njs_object_prop_t * is in pq->lhq.value. |
545 | | - * in NJS_PROPERTY_QUERY_GET |
546 | | - * prop->type is NJS_PROPERTY or NJS_PROPERTY_HANDLER. |
547 | | - * in NJS_PROPERTY_QUERY_SET, NJS_PROPERTY_QUERY_DELETE |
548 | | - * prop->type is NJS_PROPERTY, NJS_PROPERTY_REF, NJS_PROPERTY_PLACE_REF, |
549 | | - * NJS_PROPERTY_TYPED_ARRAY_REF or |
550 | | - * NJS_PROPERTY_HANDLER. |
551 | | - * NJS_DECLINED property was not found in object, |
552 | | - * if pq->lhq.value != NULL it contains retval of type |
553 | | - * njs_object_prop_t * where prop->type is NJS_WHITEOUT |
554 | | - * NJS_ERROR exception has been thrown. |
555 | | - */ |
556 | | - |
557 | | -njs_int_t |
558 | | -njs_property_query(njs_vm_t *vm, njs_property_query_t *pq, njs_value_t *value, |
559 | | - uint32_t atom_id) |
560 | | -{ |
561 | | - uint32_t index; |
562 | | - njs_int_t ret; |
563 | | - njs_object_t *obj; |
564 | | - njs_function_t *function; |
565 | | - |
566 | | - njs_assert(atom_id != NJS_ATOM_STRING_unknown); |
567 | | - |
568 | | - switch (value->type) { |
569 | | - case NJS_BOOLEAN: |
570 | | - case NJS_NUMBER: |
571 | | - case NJS_SYMBOL: |
572 | | - index = njs_primitive_prototype_index(value->type); |
573 | | - obj = njs_vm_proto(vm, index); |
574 | | - break; |
575 | | - |
576 | | - case NJS_STRING: |
577 | | - if (njs_atom_is_number(atom_id)) { |
578 | | - return njs_string_property_query(vm, pq, value, |
579 | | - njs_atom_number(atom_id)); |
580 | | - } |
581 | | - |
582 | | - obj = &vm->string_object; |
583 | | - break; |
584 | | - |
585 | | - case NJS_OBJECT: |
586 | | - case NJS_ARRAY: |
587 | | - case NJS_ARRAY_BUFFER: |
588 | | - case NJS_DATA_VIEW: |
589 | | - case NJS_TYPED_ARRAY: |
590 | | - case NJS_REGEXP: |
591 | | - case NJS_DATE: |
592 | | - case NJS_PROMISE: |
593 | | - case NJS_OBJECT_VALUE: |
594 | | - obj = njs_object(value); |
595 | | - break; |
596 | | - |
597 | | - case NJS_FUNCTION: |
598 | | - function = njs_function_value_copy(vm, value); |
599 | | - if (njs_slow_path(function == NULL)) { |
600 | | - return NJS_ERROR; |
601 | | - } |
602 | | - |
603 | | - obj = &function->object; |
604 | | - break; |
605 | | - |
606 | | - case NJS_UNDEFINED: |
607 | | - case NJS_NULL: |
608 | | - default: |
609 | | - njs_atom_string_get(vm, atom_id, &pq->lhq.key); |
610 | | - njs_type_error(vm, "cannot get property \"%V\" of %s", &pq->lhq.key, |
611 | | - njs_type_string(value->type)); |
612 | | - return NJS_ERROR; |
613 | | - } |
614 | | - |
615 | | - ret = njs_object_property_query(vm, pq, obj, atom_id); |
616 | | - |
617 | | - if (njs_slow_path(ret == NJS_DECLINED && obj->slots != NULL)) { |
618 | | - return njs_external_property_query(vm, pq, value); |
619 | | - } |
620 | | - |
621 | | - return ret; |
622 | | -} |
623 | | - |
624 | | - |
625 | 538 | njs_inline njs_int_t |
626 | 539 | njs_object_property_query(njs_vm_t *vm, njs_property_query_t *pq, |
627 | 540 | njs_object_t *object, uint32_t atom_id) |
@@ -748,6 +661,91 @@ njs_object_property_query(njs_vm_t *vm, njs_property_query_t *pq, |
748 | 661 | } |
749 | 662 |
|
750 | 663 |
|
| 664 | +/* |
| 665 | + * ES5.1, 8.12.1: [[GetOwnProperty]], [[GetProperty]]. |
| 666 | + * The njs_property_query() returns values |
| 667 | + * NJS_OK property has been found in object, |
| 668 | + * retval of type njs_object_prop_t * is in pq->lhq.value. |
| 669 | + * in NJS_PROPERTY_QUERY_GET |
| 670 | + * prop->type is NJS_PROPERTY or NJS_PROPERTY_HANDLER. |
| 671 | + * in NJS_PROPERTY_QUERY_SET, NJS_PROPERTY_QUERY_DELETE |
| 672 | + * prop->type is NJS_PROPERTY, NJS_PROPERTY_REF, NJS_PROPERTY_PLACE_REF, |
| 673 | + * NJS_PROPERTY_TYPED_ARRAY_REF or |
| 674 | + * NJS_PROPERTY_HANDLER. |
| 675 | + * NJS_DECLINED property was not found in object, |
| 676 | + * if pq->lhq.value != NULL it contains retval of type |
| 677 | + * njs_object_prop_t * where prop->type is NJS_WHITEOUT |
| 678 | + * NJS_ERROR exception has been thrown. |
| 679 | + */ |
| 680 | + |
| 681 | +njs_int_t |
| 682 | +njs_property_query(njs_vm_t *vm, njs_property_query_t *pq, njs_value_t *value, |
| 683 | + uint32_t atom_id) |
| 684 | +{ |
| 685 | + uint32_t index; |
| 686 | + njs_int_t ret; |
| 687 | + njs_object_t *obj; |
| 688 | + njs_function_t *function; |
| 689 | + |
| 690 | + njs_assert(atom_id != NJS_ATOM_STRING_unknown); |
| 691 | + |
| 692 | + switch (value->type) { |
| 693 | + case NJS_BOOLEAN: |
| 694 | + case NJS_NUMBER: |
| 695 | + case NJS_SYMBOL: |
| 696 | + index = njs_primitive_prototype_index(value->type); |
| 697 | + obj = njs_vm_proto(vm, index); |
| 698 | + break; |
| 699 | + |
| 700 | + case NJS_STRING: |
| 701 | + if (njs_atom_is_number(atom_id)) { |
| 702 | + return njs_string_property_query(vm, pq, value, |
| 703 | + njs_atom_number(atom_id)); |
| 704 | + } |
| 705 | + |
| 706 | + obj = &vm->string_object; |
| 707 | + break; |
| 708 | + |
| 709 | + case NJS_OBJECT: |
| 710 | + case NJS_ARRAY: |
| 711 | + case NJS_ARRAY_BUFFER: |
| 712 | + case NJS_DATA_VIEW: |
| 713 | + case NJS_TYPED_ARRAY: |
| 714 | + case NJS_REGEXP: |
| 715 | + case NJS_DATE: |
| 716 | + case NJS_PROMISE: |
| 717 | + case NJS_OBJECT_VALUE: |
| 718 | + obj = njs_object(value); |
| 719 | + break; |
| 720 | + |
| 721 | + case NJS_FUNCTION: |
| 722 | + function = njs_function_value_copy(vm, value); |
| 723 | + if (njs_slow_path(function == NULL)) { |
| 724 | + return NJS_ERROR; |
| 725 | + } |
| 726 | + |
| 727 | + obj = &function->object; |
| 728 | + break; |
| 729 | + |
| 730 | + case NJS_UNDEFINED: |
| 731 | + case NJS_NULL: |
| 732 | + default: |
| 733 | + njs_atom_string_get(vm, atom_id, &pq->lhq.key); |
| 734 | + njs_type_error(vm, "cannot get property \"%V\" of %s", &pq->lhq.key, |
| 735 | + njs_type_string(value->type)); |
| 736 | + return NJS_ERROR; |
| 737 | + } |
| 738 | + |
| 739 | + ret = njs_object_property_query(vm, pq, obj, atom_id); |
| 740 | + |
| 741 | + if (njs_slow_path(ret == NJS_DECLINED && obj->slots != NULL)) { |
| 742 | + return njs_external_property_query(vm, pq, value); |
| 743 | + } |
| 744 | + |
| 745 | + return ret; |
| 746 | +} |
| 747 | + |
| 748 | + |
751 | 749 | static njs_int_t |
752 | 750 | njs_array_property_query(njs_vm_t *vm, njs_property_query_t *pq, |
753 | 751 | njs_array_t *array, uint32_t index, uint32_t atom_id) |
|
0 commit comments