• R/O
  • HTTP
  • SSH
  • HTTPS

system-metrics: Commit


Commit MetaInfo

Revision3a8904408c58e227030956440f821819980aae07 (tree)
Zeit2020-06-02 10:52:47
AutorTomasz Konojacki <me@xenu...>
CommiterTomasz Konojacki

Log Message

sdsad

Ändern Zusammenfassung

Diff

--- a/lib/System/Metrics.xs
+++ b/lib/System/Metrics.xs
@@ -28,6 +28,7 @@
2828 #include <cstdlib>
2929 #include <stdexcept>
3030 #include "system_metrics.hxx"
31+#include "3rdparty/nonstd/span.hpp"
3132
3233 extern "C" {
3334 #define NO_XSLOCKS
@@ -69,26 +70,33 @@ extern "C" {
6970 _we_caught = true; \
7071 } \
7172 if (SM_UNLIKELY(_we_caught)) { \
72- dTHX; \
73- croak("%s: %s", __func__, _we_txt); \
73+ SV *func_name = cv_name(cv, NULL, 0); \
74+ croak("%" SVf ": %s", SVfARG(func_name), _we_txt); \
7475 } \
7576 } while (0);
7677
7778
7879 template<typename T> static inline void
79-unpack_args(pTHX_ T &args_struct, SV **mark)
80+unpack_args(pTHX_ T &args_struct, CV* cv, SV **mark)
8081 {
8182 dSP; dAX; dITEMS;
8283
83- if (items%2==0)
84- croak("uneven");
84+ if (SM_UNLIKELY(items % 2 == 0)) {
85+ SV *func_name = cv_name(cv, NULL, 0);
86+ croak(
87+ "%" SVf ": uneven number of arguments (expected a key-value list)",
88+ func_name
89+ );
90+ }
8591
86- for (size_t i = 1; items > (i + 1); i += 2) {
92+ for (I32 i = 1; items > (i + 1); i += 2) {
8793 STRLEN len;
8894 char *key = SvPV(ST(i), len);
8995
90- if (!args_struct.contains({key,len}))
91- croak("uknown argument \"%s\"", key);
96+ if (!SM_UNLIKELY(args_struct.contains({key,len}))) {
97+ SV *func_name = cv_name(cv, NULL, 0);
98+ croak("%" SVf ": unknown argument \"%s\"", func_name, key);
99+ }
92100
93101 args_struct.at({key,len}) = ST(i+1);
94102 }
@@ -97,7 +105,7 @@ unpack_args(pTHX_ T &args_struct, SV **mark)
97105 static inline AV *
98106 deref_av(SV *rv) {
99107 if(!SvROK(rv) || (SvTYPE(SvRV(rv)) != SVt_PVAV)) {
100- croak("expected arrayref");
108+ return nullptr;
101109 }
102110
103111 return reinterpret_cast<AV*>(SvRV(rv));
@@ -202,19 +210,30 @@ CODE:
202210 SM_MAPIFY_STRUCT(SV*, fields)
203211 } args;
204212
205- unpack_args(aTHX_ args, mark);
213+ unpack_args(aTHX_ args, cv, mark);
206214
207215 process_list_fields fields;
208216 if (args.fields) {
209- // FIXME: pusty arrayref!
210217 AV *fields_arr = deref_av(args.fields);
218+ if(!fields_arr) {
219+ SV *func_name = cv_name(cv, NULL, 0);
220+ croak(
221+ "%" SVf ": \"fields\" must be an arrayref", SVfARG(func_name)
222+ );
223+ }
211224
212225 for (SSize_t i = 0; AvFILL(fields_arr) >= i; i++) {
213- STRLEN len;
214- char *key = SvPV(AvARRAY(fields_arr)[i], len);
215-
216- if (!fields.contains({key,len}))
217- croak("Unknown field \"%s\"", key);
226+ SV *field = *av_fetch(fields_arr, i, 1);
227+ size_t len;
228+ char *key = SvPV(field, len);
229+
230+ if (!fields.contains({key,len})) {
231+ SV *func_name = cv_name(cv, NULL, 0);
232+ croak(
233+ "%" SVf ": unknown field \"%" SVf "\"", SVfARG(func_name),
234+ SVfARG(field)
235+ );
236+ }
218237
219238 fields.at({key,len}) = true;
220239 }
@@ -261,8 +280,7 @@ CODE:
261280
262281 #ifdef USE_ITHREADS
263282 void
264-CLONE(class_name, ...)
265- char* class_name;
283+CLONE(char *class_name, ...)
266284 CODE:
267285 char buf[200];
268286 snprintf(buf, sizeof(buf), "%s%s", class_name, "::__instances");
Show on old repository browser