Mercurial > vim
comparison src/if_perl.xs @ 7651:c7575b07de98 v7.4.1125
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Author: Bram Moolenaar <Bram@vim.org>
Date: Sun Jan 17 21:15:58 2016 +0100
patch 7.4.1125
Problem: There is no perleval().
Solution: Add perleval(). (Damien)
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Sun, 17 Jan 2016 21:30:04 +0100 |
parents | 53163e4d9e4f |
children | 1a5d34492798 |
comparison
equal
deleted
inserted
replaced
7650:fbc4cabe6704 | 7651:c7575b07de98 |
---|---|
115 #endif | 115 #endif |
116 | 116 |
117 #if (PERL_REVISION == 5) && (PERL_VERSION >= 14) && defined(_MSC_VER) | 117 #if (PERL_REVISION == 5) && (PERL_VERSION >= 14) && defined(_MSC_VER) |
118 /* Using PL_errgv to get the error message after perl_eval_sv() causes a crash | 118 /* Using PL_errgv to get the error message after perl_eval_sv() causes a crash |
119 * with MSVC and Perl version 5.14. */ | 119 * with MSVC and Perl version 5.14. */ |
120 # define AVOID_PL_ERRGV | 120 # define CHECK_EVAL_ERR(len) SvPV(perl_get_sv("@", GV_ADD), (len)); |
121 #else | |
122 # define CHECK_EVAL_ERR(len) SvPV(GvSV(PL_errgv), (len)); | |
121 #endif | 123 #endif |
122 | 124 |
123 /* Compatibility hacks over */ | 125 /* Compatibility hacks over */ |
124 | 126 |
125 static PerlInterpreter *perl_interp = NULL; | 127 static PerlInterpreter *perl_interp = NULL; |
277 # if (PERL_REVISION == 5) && (PERL_VERSION >= 14) | 279 # if (PERL_REVISION == 5) && (PERL_VERSION >= 14) |
278 # ifdef USE_ITHREADS | 280 # ifdef USE_ITHREADS |
279 # define PL_thr_key *dll_PL_thr_key | 281 # define PL_thr_key *dll_PL_thr_key |
280 # endif | 282 # endif |
281 # endif | 283 # endif |
284 # define Perl_hv_iternext_flags dll_Perl_hv_iternext_flags | |
285 # define Perl_hv_iterinit dll_Perl_hv_iterinit | |
286 # define Perl_hv_iterkey dll_Perl_hv_iterkey | |
287 # define Perl_hv_iterval dll_Perl_hv_iterval | |
288 # define Perl_av_fetch dll_Perl_av_fetch | |
289 # define Perl_av_len dll_Perl_av_len | |
290 # define Perl_sv_2nv_flags dll_Perl_sv_2nv_flags | |
282 | 291 |
283 /* | 292 /* |
284 * Declare HANDLE for perl.dll and function pointers. | 293 * Declare HANDLE for perl.dll and function pointers. |
285 */ | 294 */ |
286 static HANDLE hPerlLib = NULL; | 295 static HANDLE hPerlLib = NULL; |
420 static GV** (*Perl_Ierrgv_ptr)(register PerlInterpreter*); | 429 static GV** (*Perl_Ierrgv_ptr)(register PerlInterpreter*); |
421 static SV* (*Perl_Isv_yes_ptr)(register PerlInterpreter*); | 430 static SV* (*Perl_Isv_yes_ptr)(register PerlInterpreter*); |
422 static perl_key* (*Perl_Gthr_key_ptr)_((pTHX)); | 431 static perl_key* (*Perl_Gthr_key_ptr)_((pTHX)); |
423 #endif | 432 #endif |
424 static void (*boot_DynaLoader)_((pTHX_ CV*)); | 433 static void (*boot_DynaLoader)_((pTHX_ CV*)); |
434 static HE * (*Perl_hv_iternext_flags)(pTHX_ HV *, I32); | |
435 static I32 (*Perl_hv_iterinit)(pTHX_ HV *); | |
436 static char * (*Perl_hv_iterkey)(pTHX_ HE *, I32 *); | |
437 static SV * (*Perl_hv_iterval)(pTHX_ HV *, HE *); | |
438 static SV** (*Perl_av_fetch)(pTHX_ AV *, SSize_t, I32); | |
439 static SSize_t (*Perl_av_len)(pTHX_ AV *); | |
440 static NV (*Perl_sv_2nv_flags)(pTHX_ SV *const, const I32); | |
425 | 441 |
426 /* | 442 /* |
427 * Table of name to function pointer of perl. | 443 * Table of name to function pointer of perl. |
428 */ | 444 */ |
429 static struct { | 445 static struct { |
552 {"Perl_Ierrgv_ptr", (PERL_PROC*)&Perl_Ierrgv_ptr}, | 568 {"Perl_Ierrgv_ptr", (PERL_PROC*)&Perl_Ierrgv_ptr}, |
553 {"Perl_Isv_yes_ptr", (PERL_PROC*)&Perl_Isv_yes_ptr}, | 569 {"Perl_Isv_yes_ptr", (PERL_PROC*)&Perl_Isv_yes_ptr}, |
554 {"Perl_Gthr_key_ptr", (PERL_PROC*)&Perl_Gthr_key_ptr}, | 570 {"Perl_Gthr_key_ptr", (PERL_PROC*)&Perl_Gthr_key_ptr}, |
555 #endif | 571 #endif |
556 {"boot_DynaLoader", (PERL_PROC*)&boot_DynaLoader}, | 572 {"boot_DynaLoader", (PERL_PROC*)&boot_DynaLoader}, |
573 {"Perl_hv_iternext_flags", (PERL_PROC*)&Perl_hv_iternext_flags}, | |
574 {"Perl_hv_iterinit", (PERL_PROC*)&Perl_hv_iterinit}, | |
575 {"Perl_hv_iterkey", (PERL_PROC*)&Perl_hv_iterkey}, | |
576 {"Perl_hv_iterval", (PERL_PROC*)&Perl_hv_iterval}, | |
577 {"Perl_av_fetch", (PERL_PROC*)&Perl_av_fetch}, | |
578 {"Perl_av_len", (PERL_PROC*)&Perl_av_len}, | |
579 {"Perl_sv_2nv_flags", (PERL_PROC*)&Perl_sv_2nv_flags}, | |
557 {"", NULL}, | 580 {"", NULL}, |
558 }; | 581 }; |
559 | 582 |
560 /* Work around for perl-5.18. | 583 /* Work around for perl-5.18. |
561 * The definitions of S_SvREFCNT_inc and S_SvREFCNT_dec are needed, so include | 584 * The definitions of S_SvREFCNT_inc and S_SvREFCNT_dec are needed, so include |
654 perl_run(perl_interp); | 677 perl_run(perl_interp); |
655 perl_destruct(perl_interp); | 678 perl_destruct(perl_interp); |
656 perl_free(perl_interp); | 679 perl_free(perl_interp); |
657 perl_interp = NULL; | 680 perl_interp = NULL; |
658 #if (PERL_REVISION == 5) && (PERL_VERSION >= 10) | 681 #if (PERL_REVISION == 5) && (PERL_VERSION >= 10) |
659 Perl_sys_term(); | 682 Perl_sys_term(); |
660 #endif | 683 #endif |
661 } | 684 } |
662 #ifdef DYNAMIC_PERL | 685 #ifdef DYNAMIC_PERL |
663 if (hPerlLib) | 686 if (hPerlLib) |
664 { | 687 { |
908 #endif | 931 #endif |
909 perl_eval_sv(sv, G_DISCARD | G_NOARGS); | 932 perl_eval_sv(sv, G_DISCARD | G_NOARGS); |
910 | 933 |
911 SvREFCNT_dec(sv); | 934 SvREFCNT_dec(sv); |
912 | 935 |
913 #ifdef AVOID_PL_ERRGV | 936 err = CHECK_EVAL_ERR(length); |
914 err = SvPV(perl_get_sv("@", GV_ADD), length); | |
915 #else | |
916 err = SvPV(GvSV(PL_errgv), length); | |
917 #endif | |
918 | 937 |
919 FREETMPS; | 938 FREETMPS; |
920 LEAVE; | 939 LEAVE; |
921 | 940 |
922 if (!length) | 941 if (!length) |
945 deleted_lines_mark(*line, 1L); | 964 deleted_lines_mark(*line, 1L); |
946 --(*end); | 965 --(*end); |
947 --(*line); | 966 --(*line); |
948 } | 967 } |
949 return OK; | 968 return OK; |
969 } | |
970 | |
971 static struct ref_map_S { | |
972 void *vim_ref; | |
973 SV *perl_ref; | |
974 struct ref_map_S *next; | |
975 } *ref_map = NULL; | |
976 | |
977 static void | |
978 ref_map_free(void) | |
979 { | |
980 struct ref_map_S *tofree; | |
981 struct ref_map_S *refs = ref_map; | |
982 | |
983 while (refs) { | |
984 tofree = refs; | |
985 refs = refs->next; | |
986 vim_free(tofree); | |
987 } | |
988 ref_map = NULL; | |
989 } | |
990 | |
991 static struct ref_map_S * | |
992 ref_map_find_SV(sv) | |
993 SV *const sv; | |
994 { | |
995 struct ref_map_S *refs = ref_map; | |
996 int count = 350; | |
997 | |
998 while (refs) { | |
999 if (refs->perl_ref == sv) | |
1000 break; | |
1001 refs = refs->next; | |
1002 count--; | |
1003 } | |
1004 | |
1005 if (!refs && count > 0) { | |
1006 refs = (struct ref_map_S *)alloc(sizeof(struct ref_map_S)); | |
1007 if (!refs) | |
1008 return NULL; | |
1009 refs->perl_ref = sv; | |
1010 refs->vim_ref = NULL; | |
1011 refs->next = ref_map; | |
1012 ref_map = refs; | |
1013 } | |
1014 | |
1015 return refs; | |
1016 } | |
1017 | |
1018 static int | |
1019 perl_to_vim(sv, rettv) | |
1020 SV *sv; | |
1021 typval_T *rettv; | |
1022 { | |
1023 if (SvROK(sv)) | |
1024 sv = SvRV(sv); | |
1025 | |
1026 switch (SvTYPE(sv)) { | |
1027 case SVt_NULL: | |
1028 break; | |
1029 case SVt_NV: /* float */ | |
1030 #ifdef FEAT_FLOAT | |
1031 rettv->v_type = VAR_FLOAT; | |
1032 rettv->vval.v_float = SvNV(sv); | |
1033 break; | |
1034 #endif | |
1035 case SVt_IV: /* integer */ | |
1036 if (!SvROK(sv)) { /* references should be string */ | |
1037 rettv->vval.v_number = SvIV(sv); | |
1038 break; | |
1039 } | |
1040 case SVt_PV: /* string */ | |
1041 { | |
1042 size_t len = 0; | |
1043 char * str_from = SvPV(sv, len); | |
1044 char_u *str_to = (char_u*)alloc(sizeof(char_u) * (len + 1)); | |
1045 | |
1046 if (str_to) { | |
1047 str_to[len] = '\0'; | |
1048 | |
1049 while (len--) { | |
1050 if (str_from[len] == '\0') | |
1051 str_to[len] = '\n'; | |
1052 else | |
1053 str_to[len] = str_from[len]; | |
1054 } | |
1055 } | |
1056 | |
1057 rettv->v_type = VAR_STRING; | |
1058 rettv->vval.v_string = str_to; | |
1059 break; | |
1060 } | |
1061 case SVt_PVAV: /* list */ | |
1062 { | |
1063 SSize_t size; | |
1064 listitem_T * item; | |
1065 SV ** item2; | |
1066 list_T * list; | |
1067 struct ref_map_S * refs; | |
1068 | |
1069 if ((refs = ref_map_find_SV(sv)) == NULL) | |
1070 return FAIL; | |
1071 | |
1072 if (refs->vim_ref) | |
1073 list = (list_T *) refs->vim_ref; | |
1074 else | |
1075 { | |
1076 if ((list = list_alloc()) == NULL) | |
1077 return FAIL; | |
1078 refs->vim_ref = list; | |
1079 | |
1080 for (size = av_len((AV*)sv); size >= 0; size--) | |
1081 { | |
1082 if ((item = listitem_alloc()) == NULL) | |
1083 break; | |
1084 | |
1085 item->li_tv.v_type = VAR_NUMBER; | |
1086 item->li_tv.v_lock = 0; | |
1087 item->li_tv.vval.v_number = 0; | |
1088 list_insert(list, item, list->lv_first); | |
1089 | |
1090 item2 = av_fetch((AV *)sv, size, 0); | |
1091 | |
1092 if (item2 == NULL || *item2 == NULL || | |
1093 perl_to_vim(*item2, &item->li_tv) == FAIL) | |
1094 break; | |
1095 } | |
1096 } | |
1097 | |
1098 list->lv_refcount++; | |
1099 rettv->v_type = VAR_LIST; | |
1100 rettv->vval.v_list = list; | |
1101 break; | |
1102 } | |
1103 case SVt_PVHV: /* dictionary */ | |
1104 { | |
1105 HE * entry; | |
1106 size_t key_len; | |
1107 char * key; | |
1108 dictitem_T * item; | |
1109 SV * item2; | |
1110 dict_T * dict; | |
1111 struct ref_map_S * refs; | |
1112 | |
1113 if ((refs = ref_map_find_SV(sv)) == NULL) | |
1114 return FAIL; | |
1115 | |
1116 if (refs->vim_ref) | |
1117 dict = (dict_T *) refs->vim_ref; | |
1118 else | |
1119 { | |
1120 | |
1121 if ((dict = dict_alloc()) == NULL) | |
1122 return FAIL; | |
1123 refs->vim_ref = dict; | |
1124 | |
1125 hv_iterinit((HV *)sv); | |
1126 | |
1127 for (entry = hv_iternext((HV *)sv); entry; entry = hv_iternext((HV *)sv)) | |
1128 { | |
1129 key_len = 0; | |
1130 key = hv_iterkey(entry, (I32 *)&key_len); | |
1131 | |
1132 if (!key || !key_len || strlen(key) < key_len) { | |
1133 EMSG2("Malformed key Dictionary '%s'", key && *key ? key : "(empty)"); | |
1134 break; | |
1135 } | |
1136 | |
1137 if ((item = dictitem_alloc((char_u *)key)) == NULL) | |
1138 break; | |
1139 | |
1140 item->di_tv.v_type = VAR_NUMBER; | |
1141 item->di_tv.v_lock = 0; | |
1142 item->di_tv.vval.v_number = 0; | |
1143 | |
1144 if (dict_add(dict, item) == FAIL) { | |
1145 dictitem_free(item); | |
1146 break; | |
1147 } | |
1148 item2 = hv_iterval((HV *)sv, entry); | |
1149 if (item2 == NULL || perl_to_vim(item2, &item->di_tv) == FAIL) | |
1150 break; | |
1151 } | |
1152 } | |
1153 | |
1154 dict->dv_refcount++; | |
1155 rettv->v_type = VAR_DICT; | |
1156 rettv->vval.v_dict = dict; | |
1157 break; | |
1158 } | |
1159 default: /* not convertible */ | |
1160 { | |
1161 char *val = SvPV_nolen(sv); | |
1162 rettv->v_type = VAR_STRING; | |
1163 rettv->vval.v_string = val ? vim_strsave((char_u *)val) : NULL; | |
1164 break; | |
1165 } | |
1166 } | |
1167 return OK; | |
1168 } | |
1169 | |
1170 /* | |
1171 * "perleval()" | |
1172 */ | |
1173 void | |
1174 do_perleval(str, rettv) | |
1175 char_u *str; | |
1176 typval_T *rettv; | |
1177 { | |
1178 char *err = NULL; | |
1179 STRLEN err_len = 0; | |
1180 SV *sv = NULL; | |
1181 #ifdef HAVE_SANDBOX | |
1182 SV *safe; | |
1183 #endif | |
1184 | |
1185 if (perl_interp == NULL) | |
1186 { | |
1187 #ifdef DYNAMIC_PERL | |
1188 if (!perl_enabled(TRUE)) | |
1189 { | |
1190 EMSG(_(e_noperl)); | |
1191 return; | |
1192 } | |
1193 #endif | |
1194 perl_init(); | |
1195 } | |
1196 | |
1197 { | |
1198 dSP; | |
1199 ENTER; | |
1200 SAVETMPS; | |
1201 | |
1202 #ifdef HAVE_SANDBOX | |
1203 if (sandbox) | |
1204 { | |
1205 safe = get_sv("VIM::safe", FALSE); | |
1206 # ifndef MAKE_TEST /* avoid a warning for unreachable code */ | |
1207 if (safe == NULL || !SvTRUE(safe)) | |
1208 EMSG(_("E299: Perl evaluation forbidden in sandbox without the Safe module")); | |
1209 else | |
1210 # endif | |
1211 { | |
1212 sv = newSVpv((char *)str, 0); | |
1213 PUSHMARK(SP); | |
1214 XPUSHs(safe); | |
1215 XPUSHs(sv); | |
1216 PUTBACK; | |
1217 call_method("reval", G_SCALAR); | |
1218 SPAGAIN; | |
1219 SvREFCNT_dec(sv); | |
1220 sv = POPs; | |
1221 } | |
1222 } | |
1223 else | |
1224 #endif /* HAVE_SANDBOX */ | |
1225 sv = eval_pv((char *)str, 0); | |
1226 | |
1227 if (sv) { | |
1228 perl_to_vim(sv, rettv); | |
1229 ref_map_free(); | |
1230 err = CHECK_EVAL_ERR(err_len); | |
1231 } | |
1232 PUTBACK; | |
1233 FREETMPS; | |
1234 LEAVE; | |
1235 } | |
1236 if (err_len) | |
1237 msg_split((char_u *)err, highlight_attr[HLF_E]); | |
950 } | 1238 } |
951 | 1239 |
952 /* | 1240 /* |
953 * ":perldo". | 1241 * ":perldo". |
954 */ | 1242 */ |
982 sv_setpvn(sv, "sub VIM::perldo {", sizeof("sub VIM::perldo {") - 1); | 1270 sv_setpvn(sv, "sub VIM::perldo {", sizeof("sub VIM::perldo {") - 1); |
983 sv_catpvn(sv, (char *)eap->arg, length); | 1271 sv_catpvn(sv, (char *)eap->arg, length); |
984 sv_catpvn(sv, "}", 1); | 1272 sv_catpvn(sv, "}", 1); |
985 perl_eval_sv(sv, G_DISCARD | G_NOARGS); | 1273 perl_eval_sv(sv, G_DISCARD | G_NOARGS); |
986 SvREFCNT_dec(sv); | 1274 SvREFCNT_dec(sv); |
987 #ifdef AVOID_PL_ERRGV | 1275 str = CHECK_EVAL_ERR(length); |
988 str = SvPV(perl_get_sv("@", GV_ADD), length); | |
989 #else | |
990 str = SvPV(GvSV(PL_errgv), length); | |
991 #endif | |
992 if (length) | 1276 if (length) |
993 goto err; | 1277 goto err; |
994 | 1278 |
995 if (u_save(eap->line1 - 1, eap->line2 + 1) != OK) | 1279 if (u_save(eap->line1 - 1, eap->line2 + 1) != OK) |
996 return; | 1280 return; |
1000 for (i = eap->line1; i <= eap->line2; i++) | 1284 for (i = eap->line1; i <= eap->line2; i++) |
1001 { | 1285 { |
1002 sv_setpv(GvSV(PL_defgv), (char *)ml_get(i)); | 1286 sv_setpv(GvSV(PL_defgv), (char *)ml_get(i)); |
1003 PUSHMARK(sp); | 1287 PUSHMARK(sp); |
1004 perl_call_pv("VIM::perldo", G_SCALAR | G_EVAL); | 1288 perl_call_pv("VIM::perldo", G_SCALAR | G_EVAL); |
1005 #ifdef AVOID_PL_ERRGV | 1289 str = CHECK_EVAL_ERR(length); |
1006 str = SvPV(perl_get_sv("@", GV_ADD), length); | |
1007 #else | |
1008 str = SvPV(GvSV(PL_errgv), length); | |
1009 #endif | |
1010 if (length) | 1290 if (length) |
1011 break; | 1291 break; |
1012 SPAGAIN; | 1292 SPAGAIN; |
1013 if (SvTRUEx(POPs)) | 1293 if (SvTRUEx(POPs)) |
1014 { | 1294 { |