| | 750 | static void encode_op(zend_op_array* from, zend_op* opline, unsigned int ops) { |
|---|
| | 751 | encode(opline->opcode); |
|---|
| | 752 | encode32(opline->lineno); |
|---|
| | 753 | switch (ops & EXT_MASK) { |
|---|
| | 754 | case EXT_UNUSED: |
|---|
| | 755 | break; |
|---|
| | 756 | case EXT_STD: |
|---|
| | 757 | case EXT_FCALL: |
|---|
| | 758 | case EXT_ARG: |
|---|
| | 759 | case EXT_IFACE: |
|---|
| | 760 | encode32(opline->extended_value); |
|---|
| | 761 | break; |
|---|
| | 762 | case EXT_SEND: |
|---|
| | 763 | case EXT_SEND_NOREF: |
|---|
| | 764 | case EXT_INIT_FCALL: |
|---|
| | 765 | case EXT_FETCH: |
|---|
| | 766 | case EXT_CAST: |
|---|
| | 767 | case EXT_DECLARE: |
|---|
| | 768 | case EXT_FCLASS: |
|---|
| | 769 | case EXT_BIT: |
|---|
| | 770 | case EXT_ISSET: |
|---|
| | 771 | case EXT_ASSIGN: |
|---|
| | 772 | encode((unsigned char)opline->extended_value); |
|---|
| | 773 | break; |
|---|
| | 774 | case EXT_FE: |
|---|
| | 775 | encode((unsigned char)opline->extended_value); |
|---|
| | 776 | break; |
|---|
| | 777 | case EXT_OPLINE: |
|---|
| | 778 | encode_opline(opline->extended_value, from->last); |
|---|
| | 779 | break; |
|---|
| | 780 | case EXT_CLASS: |
|---|
| | 781 | encode_var(opline->extended_value, from->T); |
|---|
| | 782 | break; |
|---|
| | 783 | default: |
|---|
| | 784 | zend_bailout(); |
|---|
| | 785 | break; |
|---|
| | 786 | } |
|---|
| | 787 | switch (ops & RES_MASK) { |
|---|
| | 788 | case RES_UNUSED: |
|---|
| | 789 | break; |
|---|
| | 790 | case RES_TMP: |
|---|
| | 791 | case RES_CLASS: |
|---|
| | 792 | encode_var(opline->result.u.var, from->T); |
|---|
| | 793 | break; |
|---|
| | 794 | case RES_VAR: |
|---|
| | 795 | encode_var(opline->result.u.var, from->T); |
|---|
| | 796 | if ((opline->result.u.EA.type & EXT_TYPE_UNUSED) != 0) { |
|---|
| | 797 | encode(1); |
|---|
| | 798 | } else { |
|---|
| | 799 | encode(0); |
|---|
| | 800 | } |
|---|
| | 801 | break; |
|---|
| | 802 | case RES_STD: |
|---|
| | 803 | encode_znode(&opline->result, from->T); |
|---|
| | 804 | if (opline->result.op_type == IS_VAR) { |
|---|
| | 805 | if ((opline->result.u.EA.type & EXT_TYPE_UNUSED) != 0) { |
|---|
| | 806 | encode(1); |
|---|
| | 807 | } else { |
|---|
| | 808 | encode(0); |
|---|
| | 809 | } |
|---|
| | 810 | } |
|---|
| | 811 | break; |
|---|
| | 812 | default: |
|---|
| | 813 | zend_bailout(); |
|---|
| | 814 | break; |
|---|
| | 815 | } |
|---|
| | 816 | switch (ops & OP1_MASK) { |
|---|
| | 817 | case OP1_UNUSED: |
|---|
| | 818 | break; |
|---|
| | 819 | case OP1_OPLINE: |
|---|
| | 820 | encode_opline(opline->op1.u.opline_num,from->last); |
|---|
| | 821 | break; |
|---|
| | 822 | case OP1_BRK: |
|---|
| | 823 | case OP1_CONT: |
|---|
| | 824 | encode_opline(opline->op1.u.opline_num, from->last_brk_cont); |
|---|
| | 825 | break; |
|---|
| | 826 | case OP1_CLASS: |
|---|
| | 827 | case OP1_TMP: |
|---|
| | 828 | case OP1_VAR: |
|---|
| | 829 | encode_var(opline->op1.u.var, from->T); |
|---|
| | 830 | break; |
|---|
| | 831 | case OP1_UCLASS: |
|---|
| | 832 | encode((unsigned char)opline->op1.op_type); |
|---|
| | 833 | if (opline->op1.op_type != IS_UNUSED) { |
|---|
| | 834 | encode_var(opline->op1.u.var, from->T); |
|---|
| | 835 | } |
|---|
| | 836 | break; |
|---|
| | 837 | case OP1_ARG: |
|---|
| | 838 | encode32(opline->op1.u.constant.value.lval); |
|---|
| | 839 | break; |
|---|
| | 840 | #ifdef ZEND_ENGINE_2 |
|---|
| | 841 | case OP1_JMPADDR: |
|---|
| | 842 | encode_opline(opline->op1.u.jmp_addr - from->opcodes, from->last); |
|---|
| | 843 | break; |
|---|
| | 844 | #endif |
|---|
| | 845 | case OP1_STD: |
|---|
| | 846 | encode_znode(&opline->op1, from->T); |
|---|
| | 847 | break; |
|---|
| | 848 | default: |
|---|
| | 849 | zend_bailout(); |
|---|
| | 850 | break; |
|---|
| | 851 | } |
|---|
| | 852 | switch (ops & OP2_MASK) { |
|---|
| | 853 | case OP2_UNUSED: |
|---|
| | 854 | break; |
|---|
| | 855 | case OP2_OPLINE: |
|---|
| | 856 | encode_opline(opline->op2.u.opline_num, from->last); |
|---|
| | 857 | break; |
|---|
| | 858 | case OP2_ARG: |
|---|
| | 859 | encode32(opline->op2.u.opline_num); |
|---|
| | 860 | break; |
|---|
| | 861 | case OP2_ISSET: |
|---|
| | 862 | case OP2_INCLUDE: |
|---|
| | 863 | encode((unsigned char)opline->op2.u.constant.value.lval); |
|---|
| | 864 | break; |
|---|
| | 865 | case OP2_FETCH: |
|---|
| | 866 | #ifdef ZEND_ENGINE_2 |
|---|
| | 867 | encode((unsigned char)opline->op2.u.EA.type); |
|---|
| | 868 | if (opline->op2.u.EA.type == ZEND_FETCH_STATIC_MEMBER) { |
|---|
| | 869 | encode_var(opline->op2.u.var, from->T); |
|---|
| | 870 | } |
|---|
| | 871 | #else |
|---|
| | 872 | encode((unsigned char)opline->op2.u.fetch_type); |
|---|
| | 873 | #endif |
|---|
| | 874 | break; |
|---|
| | 875 | case OP2_CLASS: |
|---|
| | 876 | case OP2_TMP: |
|---|
| | 877 | case OP2_VAR: |
|---|
| | 878 | encode_var(opline->op2.u.var, from->T); |
|---|
| | 879 | break; |
|---|
| | 880 | #ifdef ZEND_ENGINE_2 |
|---|
| | 881 | case OP2_JMPADDR: |
|---|
| | 882 | encode_opline(opline->op2.u.jmp_addr - from->opcodes, from->last); |
|---|
| | 883 | break; |
|---|
| | 884 | #endif |
|---|
| | 885 | case OP2_STD: |
|---|
| | 886 | encode_znode(&opline->op2, from->T); |
|---|
| | 887 | break; |
|---|
| | 888 | default: |
|---|
| | 889 | zend_bailout(); |
|---|
| | 890 | break; |
|---|
| | 891 | } |
|---|
| | 892 | |
|---|
| | 893 | } |
|---|
| | 894 | |
|---|
| 842 | | unsigned int ops = op_dsc->ops; |
|---|
| 843 | | encode(opline->opcode); |
|---|
| 844 | | #if EA_ENCODER_VERSION < 2 |
|---|
| 845 | | encode32(opline->lineno); |
|---|
| 846 | | #endif |
|---|
| 847 | | switch (ops & EXT_MASK) { |
|---|
| 848 | | case EXT_UNUSED: |
|---|
| 849 | | break; |
|---|
| 850 | | case EXT_STD: |
|---|
| 851 | | case EXT_FCALL: |
|---|
| 852 | | case EXT_ARG: |
|---|
| 853 | | case EXT_IFACE: |
|---|
| 854 | | encode32(opline->extended_value); |
|---|
| 855 | | break; |
|---|
| 856 | | case EXT_SEND: |
|---|
| 857 | | case EXT_SEND_NOREF: |
|---|
| 858 | | case EXT_INIT_FCALL: |
|---|
| 859 | | case EXT_FETCH: |
|---|
| 860 | | case EXT_CAST: |
|---|
| 861 | | case EXT_DECLARE: |
|---|
| 862 | | case EXT_FCLASS: |
|---|
| 863 | | case EXT_BIT: |
|---|
| 864 | | case EXT_ISSET: |
|---|
| 865 | | case EXT_ASSIGN: |
|---|
| 866 | | encode((unsigned char)opline->extended_value); |
|---|
| 867 | | break; |
|---|
| 868 | | case EXT_FE: |
|---|
| 869 | | #if EA_ENCODER_VERSION >= 3 |
|---|
| 870 | | encode((unsigned char)opline->extended_value); |
|---|
| 871 | | #endif |
|---|
| 872 | | break; |
|---|
| 873 | | case EXT_OPLINE: |
|---|
| 874 | | encode_opline(opline->extended_value, from->last); |
|---|
| 875 | | break; |
|---|
| 876 | | case EXT_CLASS: |
|---|
| 877 | | encode_var(opline->extended_value, from->T); |
|---|
| 878 | | break; |
|---|
| 879 | | default: |
|---|
| 880 | | zend_bailout(); |
|---|
| 881 | | break; |
|---|
| 882 | | } |
|---|
| 883 | | switch (ops & RES_MASK) { |
|---|
| 884 | | case RES_UNUSED: |
|---|
| 885 | | break; |
|---|
| 886 | | case RES_TMP: |
|---|
| 887 | | case RES_CLASS: |
|---|
| 888 | | encode_var(opline->result.u.var, from->T); |
|---|
| 889 | | break; |
|---|
| 890 | | case RES_VAR: |
|---|
| 891 | | encode_var(opline->result.u.var, from->T); |
|---|
| 892 | | if ((opline->result.u.EA.type & EXT_TYPE_UNUSED) != 0) { |
|---|
| 893 | | encode(1); |
|---|
| 894 | | } else { |
|---|
| 895 | | encode(0); |
|---|
| 896 | | } |
|---|
| 897 | | break; |
|---|
| 898 | | case RES_STD: |
|---|
| 899 | | encode_znode(&opline->result, from->T); |
|---|
| 900 | | if (opline->result.op_type == IS_VAR) { |
|---|
| 901 | | if ((opline->result.u.EA.type & EXT_TYPE_UNUSED) != 0) { |
|---|
| 902 | | encode(1); |
|---|
| 903 | | } else { |
|---|
| 904 | | encode(0); |
|---|
| 905 | | } |
|---|
| 906 | | } |
|---|
| 907 | | break; |
|---|
| 908 | | default: |
|---|
| 909 | | zend_bailout(); |
|---|
| 910 | | break; |
|---|
| 911 | | } |
|---|
| 912 | | switch (ops & OP1_MASK) { |
|---|
| 913 | | case OP1_UNUSED: |
|---|
| 914 | | break; |
|---|
| 915 | | case OP1_OPLINE: |
|---|
| 916 | | encode_opline(opline->op1.u.opline_num,from->last); |
|---|
| 917 | | break; |
|---|
| 918 | | case OP1_BRK: |
|---|
| 919 | | case OP1_CONT: |
|---|
| 920 | | encode_opline(opline->op1.u.opline_num, from->last_brk_cont); |
|---|
| 921 | | break; |
|---|
| 922 | | case OP1_CLASS: |
|---|
| 923 | | case OP1_TMP: |
|---|
| 924 | | case OP1_VAR: |
|---|
| 925 | | encode_var(opline->op1.u.var, from->T); |
|---|
| 926 | | break; |
|---|
| 927 | | case OP1_UCLASS: |
|---|
| 928 | | encode((unsigned char)opline->op1.op_type); |
|---|
| 929 | | if (opline->op1.op_type != IS_UNUSED) { |
|---|
| 930 | | encode_var(opline->op1.u.var, from->T); |
|---|
| 931 | | } |
|---|
| 932 | | break; |
|---|
| 933 | | case OP1_ARG: |
|---|
| 934 | | encode32(opline->op1.u.constant.value.lval); |
|---|
| 935 | | break; |
|---|
| 936 | | #ifdef ZEND_ENGINE_2 |
|---|
| 937 | | case OP1_JMPADDR: |
|---|
| 938 | | encode_opline(opline->op1.u.jmp_addr - from->opcodes, from->last); |
|---|
| 939 | | break; |
|---|
| 940 | | #endif |
|---|
| 941 | | case OP1_STD: |
|---|
| 942 | | encode_znode(&opline->op1, from->T); |
|---|
| 943 | | break; |
|---|
| 944 | | default: |
|---|
| 945 | | zend_bailout(); |
|---|
| 946 | | break; |
|---|
| 947 | | } |
|---|
| 948 | | switch (ops & OP2_MASK) { |
|---|
| 949 | | case OP2_UNUSED: |
|---|
| 950 | | break; |
|---|
| 951 | | case OP2_OPLINE: |
|---|
| 952 | | encode_opline(opline->op2.u.opline_num, from->last); |
|---|
| 953 | | break; |
|---|
| 954 | | case OP2_ARG: |
|---|
| 955 | | encode32(opline->op2.u.opline_num); |
|---|
| 956 | | break; |
|---|
| 957 | | case OP2_ISSET: |
|---|
| 958 | | case OP2_INCLUDE: |
|---|
| 959 | | encode((unsigned char)opline->op2.u.constant.value.lval); |
|---|
| 960 | | break; |
|---|
| 961 | | case OP2_FETCH: |
|---|
| 962 | | #ifdef ZEND_ENGINE_2 |
|---|
| 963 | | encode((unsigned char)opline->op2.u.EA.type); |
|---|
| 964 | | if (opline->op2.u.EA.type == ZEND_FETCH_STATIC_MEMBER) { |
|---|
| 965 | | encode_var(opline->op2.u.var, from->T); |
|---|
| 966 | | } |
|---|
| 967 | | #else |
|---|
| 968 | | encode((unsigned char)opline->op2.u.fetch_type); |
|---|
| 969 | | #endif |
|---|
| 970 | | break; |
|---|
| 971 | | case OP2_CLASS: |
|---|
| 972 | | case OP2_TMP: |
|---|
| 973 | | case OP2_VAR: |
|---|
| 974 | | encode_var(opline->op2.u.var, from->T); |
|---|
| 975 | | break; |
|---|
| 976 | | #ifdef ZEND_ENGINE_2 |
|---|
| 977 | | case OP2_JMPADDR: |
|---|
| 978 | | encode_opline(opline->op2.u.jmp_addr - from->opcodes, from->last); |
|---|
| 979 | | break; |
|---|
| 980 | | #endif |
|---|
| 981 | | case OP2_STD: |
|---|
| 982 | | encode_znode(&opline->op2, from->T); |
|---|
| 983 | | break; |
|---|
| 984 | | default: |
|---|
| 985 | | zend_bailout(); |
|---|
| 986 | | break; |
|---|
| 987 | | } |
|---|
| | 987 | encode_op(from, opline, op_dsc->ops); |
|---|