PerlQt
view release on metacpan or search on metacpan
PerlQt/Qt.xs view on Meta::CPAN
AV* ar = newAV();
RETVAL = newRV_noinc((SV*)ar);
for(int i=0; s[i] ; i++)
{
SV *item = newSViv((IV)s[i]);
if(!av_store(ar, (I32)i, item))
SvREFCNT_dec( item );
}
OUTPUT:
RETVAL
void
STORE(obj,sv)
SV* obj
SV* sv
CODE:
if (!SvROK(obj))
croak("?");
IV tmp = SvIV((SV*)SvRV(obj));
QRgb *s = (QRgb*) tmp;
if(!SvROK(sv) || SvTYPE(SvRV(sv)) != SVt_PVAV ||
av_len((AV*)SvRV(sv)) < 0) {
s = new QRgb[1];
s[0] = 0;
sv_setref_pv(obj, "Qt::_internal::QRgbStar", (void*)s);
return;
}
AV *list = (AV*)SvRV(sv);
int count = av_len(list);
s = new QRgb[count + 2];
int i;
for(i = 0; i <= count; i++) {
SV **item = av_fetch(list, i, 0);
if(!item || !SvOK(*item)) {
s[i] = 0;
continue;
}
s[i] = SvIV(*item);
}
s[i] = 0;
sv_setref_pv(obj, "Qt::_internal::QRgbStar", (void*)s);
void
DESTROY(obj)
SV* obj
CODE:
if (!SvROK(obj))
croak("?");
IV tmp = SvIV((SV*)SvRV(obj));
QRgb *s = (QRgb*) tmp;
delete[] s;
# --------------- XSUBS for Qt::_internal::* helpers ----------------
MODULE = Qt PACKAGE = Qt::_internal
PROTOTYPES: DISABLE
void
getMethStat()
PPCODE:
XPUSHs(sv_2mortal(newSViv((int)methcache->size())));
XPUSHs(sv_2mortal(newSViv((int)methcache->count())));
void
getClassStat()
PPCODE:
XPUSHs(sv_2mortal(newSViv((int)classcache->size())));
XPUSHs(sv_2mortal(newSViv((int)classcache->count())));
void
getIsa(classId)
int classId
PPCODE:
Smoke::Index *parents =
qt_Smoke->inheritanceList +
qt_Smoke->classes[classId].parents;
while(*parents)
XPUSHs(sv_2mortal(newSVpv(qt_Smoke->classes[*parents++].className, 0)));
void
dontRecurse()
CODE:
avoid_fetchmethod = true;
void *
sv_to_ptr(sv)
SV* sv
void *
allocateMocArguments(count)
int count
CODE:
RETVAL = (void*)new MocArgument[count + 1];
OUTPUT:
RETVAL
void
setMocType(ptr, idx, name, static_type)
void *ptr
int idx
char *name
char *static_type
CODE:
Smoke::Index typeId = qt_Smoke->idType(name);
if(!typeId) XSRETURN_NO;
MocArgument *arg = (MocArgument*)ptr;
arg[idx].st.set(qt_Smoke, typeId);
if(!strcmp(static_type, "ptr"))
arg[idx].argType = xmoc_ptr;
else if(!strcmp(static_type, "bool"))
arg[idx].argType = xmoc_bool;
else if(!strcmp(static_type, "int"))
arg[idx].argType = xmoc_int;
else if(!strcmp(static_type, "double"))
arg[idx].argType = xmoc_double;
else if(!strcmp(static_type, "char*"))
arg[idx].argType = xmoc_charstar;
else if(!strcmp(static_type, "QString"))
arg[idx].argType = xmoc_QString;
XSRETURN_YES;
void
installsignal(name)
char *name
CODE:
char *file = __FILE__;
newXS(name, XS_signal, file);
void
installqt_invoke(name)
char *name
CODE:
char *file = __FILE__;
PerlQt/Qt.xs view on Meta::CPAN
isValidAllocatedPointer(obj)
SV *obj
CODE:
RETVAL = 0;
smokeperl_object *o = sv_obj_info(obj);
if(o && o->ptr && o->allocated)
RETVAL = 1;
OUTPUT:
RETVAL
SV*
findAllocatedObjectFor(obj)
SV *obj
CODE:
RETVAL = &PL_sv_undef;
smokeperl_object *o = sv_obj_info(obj);
SV *ret;
if(o && o->ptr && (ret = getPointerObject(o->ptr)))
RETVAL = ret;
OUTPUT:
RETVAL
SV *
getGV(cv)
SV *cv
CODE:
RETVAL = (SvROK(cv) && (SvTYPE(SvRV(cv))==SVt_PVCV) ?
SvREFCNT_inc(CvGV((CV*)SvRV(cv))) : &PL_sv_undef);
OUTPUT:
RETVAL
int
idClass(name)
char *name
CODE:
RETVAL = qt_Smoke->idClass(name);
OUTPUT:
RETVAL
int
idMethodName(name)
char *name
CODE:
RETVAL = qt_Smoke->idMethodName(name);
OUTPUT:
RETVAL
int
idMethod(idclass, idmethodname)
int idclass
int idmethodname
CODE:
RETVAL = qt_Smoke->idMethod(idclass, idmethodname);
OUTPUT:
RETVAL
void
findMethod(c, name)
char *c
char *name
PPCODE:
Smoke::Index meth = qt_Smoke->findMethod(c, name);
// printf("DAMNIT on %s::%s => %d\n", c, name, meth);
if(!meth) {
// empty list
} else if(meth > 0) {
Smoke::Index i = qt_Smoke->methodMaps[meth].method;
if(!i) { // shouldn't happen
croak("Corrupt method %s::%s", c, name);
} else if(i > 0) { // single match
PUSHs(sv_2mortal(newSViv(
(IV)qt_Smoke->methodMaps[meth].method
)));
} else { // multiple match
i = -i; // turn into ambiguousMethodList index
while(qt_Smoke->ambiguousMethodList[i]) {
PUSHs(sv_2mortal(newSViv(
(IV)qt_Smoke->ambiguousMethodList[i]
)));
i++;
}
}
}
void
findMethodFromIds(idclass, idmethodname)
int idclass
int idmethodname
PPCODE:
Smoke::Index meth = qt_Smoke->findMethod(idclass, idmethodname);
if(!meth) {
// empty list
} else if(meth > 0) {
Smoke::Index i = qt_Smoke->methodMaps[meth].method;
if(i >= 0) { // single match
PUSHs(sv_2mortal(newSViv((IV)i)));
} else { // multiple match
i = -i; // turn into ambiguousMethodList index
while(qt_Smoke->ambiguousMethodList[i]) {
PUSHs(sv_2mortal(newSViv(
(IV)qt_Smoke->ambiguousMethodList[i]
)));
i++;
}
}
}
# findAllMethods(classid [, startingWith]) : returns { "mungedName" => [index in methods, ...], ... }
HV*
findAllMethods(classid, ...)
SV* classid
CODE:
RETVAL=newHV();
if(SvIOK(classid)) {
Smoke::Index c = (Smoke::Index) SvIV(classid);
char * pat = 0L;
if(items > 1 && SvPOK(ST(1)))
pat = SvPV_nolen(ST(1));
Smoke::Index imax = qt_Smoke->numMethodMaps;
Smoke::Index imin = 0, icur = -1, methmin = 0, methmax = 0;
int icmp = -1;
while(imax >= imin) {
icur = (imin + imax) / 2;
icmp = qt_Smoke->leg(qt_Smoke->methodMaps[icur].classId, c);
if(!icmp) {
Smoke::Index pos = icur;
while(icur && qt_Smoke->methodMaps[icur-1].classId == c)
icur --;
methmin = icur;
icur = pos;
while(icur < imax && qt_Smoke->methodMaps[icur+1].classId == c)
icur ++;
methmax = icur;
break;
}
if (icmp > 0)
imax = icur - 1;
else
imin = icur + 1;
}
if(!icmp) {
for(Smoke::Index i=methmin ; i <= methmax ; i++) {
Smoke::Index m = qt_Smoke->methodMaps[i].name;
if(!pat || !strncmp(qt_Smoke->methodNames[m], pat, strlen(pat))) {
Smoke::Index ix= qt_Smoke->methodMaps[i].method;
AV* meths = newAV();
if(ix >= 0) { // single match
av_push(meths, newSViv((IV)ix));
PerlQt/Qt.xs view on Meta::CPAN
AV *methods = (AV*)SvRV(rmeths);
SV *errmsg = newSVpvf("");
for(int i = 0; i <= av_len(methods); i++) {
sv_catpv(errmsg, "\t");
IV id = SvIV(*(av_fetch(methods, i, 0)));
Smoke::Method &meth = qt_Smoke->methods[id];
const char *tname = qt_Smoke->types[meth.ret].name;
if(meth.flags & Smoke::mf_static) sv_catpv(errmsg, "static ");
sv_catpvf(errmsg, "%s ", (tname ? tname:"void"));
sv_catpvf(errmsg, "%s::%s(", qt_Smoke->classes[meth.classId].className, qt_Smoke->methodNames[meth.name]);
for(int i = 0; i < meth.numArgs; i++) {
if(i) sv_catpv(errmsg, ", ");
tname = qt_Smoke->types[qt_Smoke->argumentList[meth.args+i]].name;
sv_catpv(errmsg, (tname ? tname:"void"));
}
sv_catpv(errmsg, ")");
if(meth.flags & Smoke::mf_const) sv_catpv(errmsg, " const");
sv_catpv(errmsg, "\n");
}
RETVAL=errmsg;
}
else
RETVAL=newSVpvf("");
OUTPUT:
RETVAL
SV *
catArguments(r_args)
SV* r_args
CODE:
RETVAL=newSVpvf("");
if(SvROK(r_args) && SvTYPE(SvRV(r_args)) == SVt_PVAV) {
AV* args=(AV*)SvRV(r_args);
for(int i = 0; i <= av_len(args); i++) {
SV **arg=av_fetch(args, i, 0);
if(i) sv_catpv(RETVAL, ", ");
if(!arg || !SvOK(*arg)) {
sv_catpv(RETVAL, "undef");
} else if(SvROK(*arg)) {
smokeperl_object *o = sv_obj_info(*arg);
if(o)
sv_catpv(RETVAL, o->smoke->className(o->classId));
else
sv_catsv(RETVAL, *arg);
} else {
bool isString = SvPOK(*arg);
STRLEN len;
char *s = SvPV(*arg, len);
if(isString) sv_catpv(RETVAL, "'");
sv_catpvn(RETVAL, s, len > 10 ? 10 : len);
if(len > 10) sv_catpv(RETVAL, "...");
if(isString) sv_catpv(RETVAL, "'");
}
}
}
OUTPUT:
RETVAL
SV *
callMethod(...)
PPCODE:
if(_current_method) {
MethodCall c(qt_Smoke, _current_method, &ST(0), items);
c.next();
SV *ret = c.var();
SvREFCNT_inc(ret);
PUSHs(sv_2mortal(ret));
} else
PUSHs(sv_newmortal());
bool
isObject(obj)
SV *obj
CODE:
RETVAL = sv_to_ptr(obj) ? TRUE : FALSE;
OUTPUT:
RETVAL
void
setCurrentMethod(meth)
int meth
CODE:
// FIXME: damn, this is lame, and it doesn't handle ambiguous methods
_current_method = meth; //qt_Smoke->methodMaps[meth].method;
SV *
getClassList()
CODE:
AV *av = newAV();
for(int i = 1; i <= qt_Smoke->numClasses; i++) {
//printf("%s => %d\n", qt_Smoke->classes[i].className, i);
av_push(av, newSVpv(qt_Smoke->classes[i].className, 0));
// hv_store(hv, qt_Smoke->classes[i].className, 0, newSViv(i), 0);
}
RETVAL = newRV((SV*)av);
OUTPUT:
RETVAL
void
installthis(package)
char *package
CODE:
if(!package) XSRETURN_EMPTY;
char *name = new char[strlen(package) + 7];
char *file = __FILE__;
strcpy(name, package);
strcat(name, "::this");
// *{ $name } = sub () : lvalue;
CV *thissub = newXS(name, XS_this, file);
sv_setpv((SV*)thissub, ""); // sub this () : lvalue;
delete[] name;
void
installattribute(package, name)
char *package
char *name
CODE:
if(!package || !name) XSRETURN_EMPTY;
char *attr = new char[strlen(package) + strlen(name) + 3];
sprintf(attr, "%s::%s", package, name);
char *file = __FILE__;
( run in 1.199 second using v1.01-cache-2.11-cpan-5511b514fd6 )