/// \brief Perform the quicksort. /// void *operator()() { // TODO: This should be raised as a run-time error. assert(CompareFn && "Comparison function is unknown!"); auto const Caller = ThreadListener.getActiveFunction(); assert(Caller && !Caller->isShim()); auto const Call = llvm::ImmutableCallSite(Caller->getActiveInstruction()); auto const KeyPtrObj = Caller->getPointerObject(Call.getArgument(0)); auto const ArrayPtrObj = Caller->getPointerObject(Call.getArgument(1)); ThreadListener.pushShimFunction(); auto const Shim = ThreadListener.getActiveFunction(); // Array element is always the left side of comparison, key object is // always the right side of comparison. auto CompareFnArg = CompareFn->arg_begin(); Shim->setPointerObject( &*CompareFnArg, ArrayPtrObj); Shim->setPointerObject(&*++CompareFnArg, KeyPtrObj ); acquireMemory(); auto const Result = bsearch(); releaseMemory(); ThreadListener.popShimFunction(); // The C standard specifies the result is not const. auto const Unqualified = const_cast<char *>(Result); // Notify of the returned pointer (and its pointer object). auto const CallInst = Call.getInstruction(); auto const Idx = seec::trace::getThreadEnvironment().getInstructionIndex(); ThreadListener.notifyValue(Idx, CallInst, reinterpret_cast<void *>(Unqualified)); // Note that Caller is invalidated when the shim function is pushed, so we // need to retrieve a new pointer to the active function. ThreadListener.getActiveFunction() ->setPointerObject(CallInst, Result ? ArrayPtrObj : seec::trace::PointerTarget{}); // const_cast due to the C standard. return Unqualified; }
void marshall_PackageStructurePtr(Marshall *m) { switch(m->action()) { case Marshall::FromVALUE: { break; } case Marshall::ToVALUE: { KSharedPtr<Plasma::PackageStructure> *ptr = new KSharedPtr<Plasma::PackageStructure>(*(KSharedPtr<Plasma::PackageStructure>*)m->item().s_voidp); if (ptr == 0) { *(m->var()) = Qnil; break; } Plasma::PackageStructure * package = ptr->data(); VALUE obj = getPointerObject(package); if (obj == Qnil) { smokeruby_object * o = ALLOC(smokeruby_object); o->smoke = m->smoke(); o->classId = m->smoke()->idClass("Plasma::PackageStructure").index; o->ptr = package; o->allocated = false; obj = set_obj_info("Plasma::PackageStructure", o); } *(m->var()) = obj; if (m->cleanup()) { } break; } default: m->unsupported(); break; } }
/// \brief Perform the quicksort. /// void operator()() { // TODO: This should be raised as a run-time error. assert(CompareFn && "Comparison function is unknown!"); auto const Caller = ThreadListener.getActiveFunction(); assert(Caller && !Caller->isShim()); auto const Call = llvm::ImmutableCallSite(Caller->getActiveInstruction()); auto const ArrayPtrObj = Caller->getPointerObject(Call.getArgument(0)); ThreadListener.pushShimFunction(); auto const Shim = ThreadListener.getActiveFunction(); auto CompareFnArg = CompareFn->arg_begin(); Shim->setPointerObject( &*CompareFnArg, ArrayPtrObj); Shim->setPointerObject(&*++CompareFnArg, ArrayPtrObj); acquireMemory(); quicksort(0, ElementCount - 1); releaseMemory(); ThreadListener.popShimFunction(); }
void marshall_QHashQStringQVariant(Marshall *m) { switch(m->action()) { case Marshall::FromVALUE: { VALUE hash = *(m->var()); if (TYPE(hash) != T_HASH) { m->item().s_voidp = 0; break; } QHash<QString,QVariant> * map = new QHash<QString,QVariant>; // Convert the ruby hash to an array of key/value arrays VALUE temp = rb_funcall(hash, rb_intern("to_a"), 0); for (long i = 0; i < RARRAY_LEN(temp); i++) { VALUE key = rb_ary_entry(rb_ary_entry(temp, i), 0); VALUE value = rb_ary_entry(rb_ary_entry(temp, i), 1); smokeruby_object *o = value_obj_info(value); if (o == 0 || o->ptr == 0) { continue; } (*map)[QString(StringValuePtr(key))] = (QVariant)*(QVariant*)o->ptr; } m->item().s_voidp = map; m->next(); if(m->cleanup()) delete map; } break; case Marshall::ToVALUE: { QHash<QString,QVariant> *map = (QHash<QString,QVariant>*)m->item().s_voidp; if (!map) { *(m->var()) = Qnil; break; } VALUE hv = rb_hash_new(); QHash<QString,QVariant>::Iterator it; for (it = map->begin(); it != map->end(); ++it) { void *p = new QVariant(it.value()); VALUE obj = getPointerObject(p); if (obj == Qnil) { smokeruby_object * o = alloc_smokeruby_object( true, qtcore_Smoke, qtcore_Smoke->idClass("QVariant").index, p ); obj = set_obj_info("Qt::Variant", o); } rb_hash_aset(hv, rb_str_new2(((QString*)&(it.key()))->toLatin1()), obj); } *(m->var()) = hv; m->next(); // if(m->cleanup()) // delete map; } break; default: m->unsupported(); break; } }