diff --git a/zone/perl_questitem.cpp b/zone/perl_questitem.cpp index f30728147..893c6ef87 100644 --- a/zone/perl_questitem.cpp +++ b/zone/perl_questitem.cpp @@ -34,6 +34,19 @@ #undef THIS #endif +#define VALIDATE_THIS_IS_ITEM \ + do { \ + if (sv_derived_from(ST(0), "QuestItem")) { \ + IV tmp = SvIV((SV*)SvRV(ST(0))); \ + THIS = INT2PTR(EQ::ItemInstance*, tmp); \ + } else { \ + Perl_croak(aTHX_ "THIS is not of type EQ::ItemInstance"); \ + } \ + if (THIS == nullptr) { \ + Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); \ + } \ + } while (0); + XS(XS_QuestItem_GetName); XS(XS_QuestItem_GetName) { dXSARGS; @@ -43,15 +56,7 @@ XS(XS_QuestItem_GetName) { EQ::ItemInstance *THIS; Const_char *RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "QuestItem")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EQ::ItemInstance *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EQ::ItemInstance"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ITEM; RETVAL = THIS->GetItem()->Name; sv_setpv(TARG, RETVAL); XSprePUSH; @@ -68,15 +73,7 @@ XS(XS_QuestItem_SetScale) { { EQ::ItemInstance *THIS; float Mult; - - if (sv_derived_from(ST(0), "QuestItem")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EQ::ItemInstance *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EQ::ItemInstance"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ITEM; Mult = (float) SvNV(ST(1)); if (THIS->IsScaling()) { @@ -95,15 +92,7 @@ XS(XS_QuestItem_ItemSay) { EQ::ItemInstance *THIS; Const_char *text; int lang = 0; - - if (sv_derived_from(ST(0), "QuestItem")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EQ::ItemInstance *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EQ::ItemInstance"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ITEM; text = SvPV_nolen(ST(1)); if (items == 3) lang = (int) SvUV(ST(2)); @@ -122,15 +111,7 @@ XS(XS_QuestItem_IsType) { EQ::ItemInstance *THIS; bool RETVAL; uint32 type = (int32) SvIV(ST(1)); - - if (sv_derived_from(ST(0), "QuestItem")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EQ::ItemInstance *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EQ::ItemInstance"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ITEM; RETVAL = THIS->IsType((EQ::item::ItemClass) type); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -146,15 +127,7 @@ XS(XS_QuestItem_IsAttuned) { { EQ::ItemInstance *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "QuestItem")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EQ::ItemInstance *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EQ::ItemInstance"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ITEM; RETVAL = THIS->IsAttuned(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -171,15 +144,7 @@ XS(XS_QuestItem_GetCharges) { EQ::ItemInstance *THIS; int16 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "QuestItem")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EQ::ItemInstance *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EQ::ItemInstance"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ITEM; RETVAL = THIS->GetCharges(); XSprePUSH; PUSHi((IV) RETVAL); @@ -196,15 +161,7 @@ XS(XS_QuestItem_GetAugment) { EQ::ItemInstance *THIS; int16 slot_id = (int16) SvIV(ST(1)); EQ::ItemInstance *RETVAL; - - if (sv_derived_from(ST(0), "QuestItem")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EQ::ItemInstance *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EQ::ItemInstance"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ITEM; RETVAL = THIS->GetAugment(slot_id); ST(0) = sv_newmortal(); sv_setref_pv(ST(0), "QuestItem", (void *) RETVAL); @@ -221,15 +178,7 @@ XS(XS_QuestItem_GetID) { EQ::ItemInstance *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "QuestItem")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EQ::ItemInstance *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EQ::ItemInstance"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ITEM; RETVAL = THIS->GetItem()->ID; XSprePUSH; PUSHi((IV) RETVAL);