Exemplo n.º 1
0
  /// \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;
  }
Exemplo n.º 2
0
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;
    }
}
Exemplo n.º 3
0
  /// \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();
  }
Exemplo n.º 4
0
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;
    }
}