Esempio n. 1
0
void LuaStackFrame::resetPC() {
  if(!isLua()) return;

  code_ = getFunc()->getLClosure()->proto_->instructions_.begin();
  constants_ = getFunc()->getLClosure()->proto_->constants.begin();
  savedpc = -1;
}
Esempio n. 2
0
	LuaCallBase::LuaCallBase(lua_State *L, const char *func) : _L(L) 
	{
		SLB_DEBUG_CALL;
		lua_getglobal(L,func);
		getFunc(-1);
		lua_pop(L,1); 
	}
Esempio n. 3
0
//功能:得到一条语句中的变量名,保存到数组中
//参数:begin指明从哪里开始查找函数
//返回值:变量名的个数
int getVarFromOneCmd(int begin, string cmd, string oneCmdVarName[])
{
	int cmdVarLen = 0;

	string func[255] = {""};
	int flen = 0;
	int rowNum = getFunc(func, begin, flen);

	string funcVarName[255] = {""};
	int vlen = 0;
	vlen = getFuncVar(funcVarName, begin);  // 得到函数的所有变量名

	string globeVarName[255] = {""};
	int glen = 0;
	glen = getGlobeVar(globeVarName);

	string single[255] = {""};
	int slen = 0;
	slen = covertCmd(cmd, single);
	for(int i=0; i<slen; i++)
	{
		if(isIn(single[i], funcVarName, vlen) || isIn(single[i], globeVarName, glen))  // 如果single[i]是变量名
		{
			oneCmdVarName[cmdVarLen] = single[i];
			cmdVarLen++;
		}
	}

	return cmdVarLen;
}
Esempio n. 4
0
/**********************
 * Returns true if do array bounds checking for the current function
 */
bool IRState::arrayBoundsCheck()
{
    bool result;
    switch (global.params.useArrayBounds)
    {
        case BOUNDSCHECKoff:
            result = false;
            break;

        case BOUNDSCHECKon:
            result = true;
            break;

        case BOUNDSCHECKsafeonly:
        {
            result = false;
            FuncDeclaration *fd = getFunc();
            if (fd)
            {   Type *t = fd->type;
                if (t->ty == Tfunction && ((TypeFunction *)t)->trust == TRUSTsafe)
                    result = true;
            }
            break;
        }

        default:
            assert(0);
    }
    return result;
}
Esempio n. 5
0
unsigned int
ROEdge::getNumSuccessors() const {
    if (getFunc() == ET_SINK) {
        return 0;
    }
    return (unsigned int) myFollowingEdges.size();
}
Esempio n. 6
0
void LuaStackFrame::sanityCheck() {
  if(isLua()) {
    LuaProto *p = getFunc()->getLClosure()->proto_;
    assert(savedpc >= -1);
    assert(savedpc < (int)p->instructions_.size());
  }
}
Esempio n. 7
0
/**
*@brief Pythonの関数実行の関数
* @param fname 関数名
*/
void PyObj::setFunc(const char *fname)
{
	PyGILState_STATE gilstate;
   
	gilstate = PyGILState_Ensure();
	bpy::object pfunc = getFunc(fname);
	try
	{
		


		
		pfunc();

		

		
	}
	catch(const bpy::error_already_set&)
	{
		PyErr_Print();
	}
	catch (...)
	{
		
	}
	PyGILState_Release(gilstate);
}
Esempio n. 8
0
unsigned int
ROEdge::getNumPredecessors() const {
    if (getFunc() == ET_SOURCE) {
        return 0;
    }
    return (unsigned int) myApproachingEdges.size();
}
Esempio n. 9
0
int LuaStackFrame::getCurrentLine() {
  if(!isLua()) return -1;

  if(savedpc == -1) return -1;

  LuaProto *p = getFunc()->getLClosure()->proto_;
  return p->getLine( savedpc );
}
Esempio n. 10
0
//功能:检查一个函数中的变量在使用前是否赋了初值,基本思想就是检查一个变量第一次出现时其后是否是"=", 是的话就不再检查,不是的话就检查它第二次出现时其后是否是等"="
//返回值:函数结尾下一行行数减1
int noInitialVarFunc(int begin)
{
	int i, j, k;
	string func[255] = {""};
	int flen = 0;
	int rowNum = getFunc(func, begin, flen);
	if(-1 != rowNum)
	{
		string funcVarName[255] = {""};
		int vlen = getFuncVar(funcVarName, begin);

		string single[255] = {""};
		int slen = 0;

		int pos[10] = {-1};
		int posCount = -1;
		for(i=0; i<vlen; i++)  // 要考虑一行中多次出现变量的情况,如for语句中
		{
			int tempFlag = -1;   //变量是否赋值的标志
			for(j=0; j<flen; j++)
			{
				tempFlag = -1;
				slen = covertCmd(func[j], single);
				posCount = isContain(funcVarName[i], single, slen, pos);
				if(1 == posCount)   // 变量在该行出现一次
				{
					if("=" == single[pos[0]+1])  // j行变量声明时赋值了,不需要再检查
					{
						break;
					}
					else // 变量声明时没有赋值,继续检查,下次出现时一定要赋值
					{
						for(k=j+1; k<flen; k++)
						{
							slen = covertCmd(func[k], single);
							posCount = isContain(funcVarName[i], single, slen, pos);
							if(-1 != posCount)   // k行第二次出现变量
							{
								if("=" != single[pos[0]+1])   // 如果第二次没有赋值就报错
								{
									errNum[errLen] = (rowNum-flen+j+1);
									errType[errLen] = 8;
									errLen++;	
								}
								tempFlag = 1;
								break;   //第二次出现了变量就跳出
							}
						}
					}

					if(1 == tempFlag)
						break;
				}
			}   //遍历命令
		} //遍历变量名
	}
	return rowNum;
}
Esempio n. 11
0
/**
 * Convert a string representing a function into a function
 * 
 * @param serialized A string representing a function
 * @return The function represented by the string
 */
std::shared_ptr<TransformerFunction const> InverseOffsetFunction::deserialize(std::string const &serialized) {
   std::stringstream ss(serialized);
   std::string s;
   std::getline(ss, s, ','); // sign
   int sign = atoi(s.c_str());
   std::getline(ss, s); // offset
   int offset = atoi(s.c_str());
   return getFunc(sign, offset);
} // deserialize
Esempio n. 12
0
supla_channel_temphum *supla_device_channel::getTempHum(void) {

	double temp;


    if ( getType() == SUPLA_CHANNELTYPE_THERMOMETERDS18B20
	 	&& getFunc() == SUPLA_CHANNELFNC_THERMOMETER  ) {

			getDouble(&temp);

			if ( temp > -273 && temp <= 1000 ) {
				return new supla_channel_temphum(0, getId(), temp, 0);
			}

 	} else if ( ( getType() == SUPLA_CHANNELTYPE_DHT11
		 			 || getType() == SUPLA_CHANNELTYPE_DHT22
					 || getType() == SUPLA_CHANNELTYPE_AM2302 )
			 	&& ( getFunc() == SUPLA_CHANNELFNC_THERMOMETER
					 || getFunc() == SUPLA_CHANNELFNC_HUMIDITY
					 || getFunc() == SUPLA_CHANNELFNC_HUMIDITYANDTEMPERATURE ) ) {

			int n;
			char value[SUPLA_CHANNELVALUE_SIZE];
			double humidity;

			getValue(value);
			memcpy(&n, value, 4);
			temp = n/1000.00;

			memcpy(&n, &value[4], 4);
			humidity = n/1000.00;

			if ( temp > -273
				 && temp <= 1000
				 && humidity >= 0
				 && humidity <= 100 ) {

				return new supla_channel_temphum(1, getId(), temp, humidity);
			}
	}

	return NULL;
}
Esempio n. 13
0
//功能:检测一个函数中的内存泄漏问题 1.1、malloc开了内存,没有free这块内存。
int memoryLeakFunc1(int begin)
{
	string func[255] = {""};
	int flen = 0;
	int rowNum = -1;
	rowNum =  getFunc(func, begin, flen);

	if(-1 != rowNum)   // 如果读取到了函数
	{
		int i, j;
		string temp = "";
		string single[255] = {""};
		int slen = 0;
		for(i=0; i<flen; i++)
		{
			temp = func[i];
			slen = covertCmd(temp, single);
			// 有"malloc"没有"="的情况
			if(isIn("malloc", single, slen) && !isIn("=", single, slen))  
			{
				errNum[errLen] = (rowNum-flen+i+1);
				errType[errLen] = 7;
				errLen++;
			}
			//有"malloc", 有"="的情况
			if(isIn("malloc", single, slen) && isIn("=", single, slen))
			{
				int freeFlag = -1;
				int pos[10] = {-1};
				int posCount = -1;
				posCount = isContain("=", single, slen, pos);
				string pFree = single[pos[0]-1];
				for(j=i+1; j<flen; j++)
				{
					temp = func[j];
					slen = covertCmd(temp, single);
					if(isIn("free", single, slen) && isIn(pFree, single, slen))  // free了pFree指向的指针
					{
						freeFlag = 1;
						break;
					}
				}
				if(-1 == freeFlag)   // 如果没有free
				{
					errNum[errLen] = (rowNum-flen+i+1);
					errType[errLen] = 7;
					errLen++;
				}
			}
		}

		return rowNum;
	}
	return -1;
}
Esempio n. 14
0
static void funcEnter(unsigned long tid,const char *name,unsigned long long addr) {
	sContext *context = getCurrent(tid);
	sFuncCall *call = getFunc(context->current,name,addr);
	if(call == NULL)
		context->current = append(context->current,name,addr);
	else
		context->current = call;
	context->current->running = 1;
	context->current->calls++;
	context->layer++;
}
Esempio n. 15
0
X86CompilerFuncDecl* X86Compiler::endFunc()
{
  X86CompilerFuncDecl* func = getFunc();
  ASMJIT_ASSERT(func != NULL);

  bind(func->_exitLabel);
  addItem(func->_end);

  func->setFuncFlag(kFuncFlagIsFinished);
  _func = NULL;

  return func;
}
Esempio n. 16
0
Error X86Compiler::setArg(uint32_t argIndex, const Var& var) {
  X86FuncNode* func = getFunc();

  if (func == NULL)
    return kErrorInvalidArgument;

  if (!isVarValid(var))
    return kErrorInvalidState;

  VarData* vd = getVd(var);
  func->setArg(argIndex, vd);

  return kErrorOk;
}
Esempio n. 17
0
void X86Compiler::_emitReturn(const Operand* first, const Operand* second)
{
  X86CompilerFuncDecl* func = getFunc();

  if (func == NULL)
  {
    setError(kErrorNoFunction);
    return;
  }

  X86CompilerFuncRet* ret = Compiler_newItem<X86CompilerFuncRet>(this, func, first, second);

  if (ret == NULL)
  {
    setError(kErrorNoHeapMemory);
    return;
  }

  addItem(ret);
}
Esempio n. 18
0
HLSentinel* X86Compiler::endFunc() {
  X86FuncNode* func = getFunc();
  ASMJIT_ASSERT(func != NULL);

  // Add local constant pool at the end of the function (if exist).
  setCursor(func->getExitNode());

  if (_localConstPoolLabel.isInitialized()) {
    embedConstPool(_localConstPoolLabel, _localConstPool);
    _localConstPoolLabel.reset();
    _localConstPool.reset();
  }

  // Finalize.
  func->addFuncFlags(kFuncFlagIsFinished);
  _func = NULL;

  setCursor(func->getEnd());
  return func->getEnd();
}
Esempio n. 19
0
X86CompilerFuncCall* X86Compiler::_emitCall(const Operand* o0)
{
  X86CompilerFuncDecl* func = getFunc();

  if (func == NULL)
  {
    setError(kErrorNoFunction);
    return NULL;
  }

  X86CompilerFuncCall* call = Compiler_newItem<X86CompilerFuncCall>(this, func, o0);
  if (call == NULL)
  {
    setError(kErrorNoHeapMemory);
    return NULL;
  }

  addItem(call);
  return call;
}
Esempio n. 20
0
int main() {
	int funcIndex, status;
	params *arguments = malloc(sizeof(params));
	bool newLineNeeded = { TRUE };
	getStartupText();
	while (TRUE) {
		getMarker(&newLineNeeded);
		newLineNeeded.x = TRUE;
		if ((funcIndex = getFunc(getInput(SPACE_CHAR))) == INVALID_FUNCTION)
			continue;
		if ((status = getArgs(&(cmd[funcIndex].info), getInput(NEWLINE),
				arguments)) != OK) {
			continue;
		}
		if (cmd[funcIndex].ptr == &empty) { /* Doesn't create a new line after an empty command. */
			newLineNeeded.x = FALSE;
			continue;
		}
		(cmd[funcIndex].ptr)(arguments);
	}/* End while */
	return 0;
}
Esempio n. 21
0
XmmVar X86Compiler::getXmmArg(uint32_t argIndex)
{
  X86CompilerFuncDecl* func = getFunc();
  XmmVar var;

  if (func != NULL)
  {
    const X86FuncDecl* decl = func->getDecl();

    if (argIndex < decl->getArgumentsCount())
    {
      X86CompilerVar* cv = func->getVar(argIndex);

      var._var.id = cv->getId();
      var._var.size = cv->getSize();
      var._var.regCode = x86VarInfo[cv->getType()].getCode();
      var._var.varType = cv->getType();
    }
  }

  return var;
}
Esempio n. 22
0
Error Context::livenessAnalysis() {
  FuncNode* func = getFunc();
  JumpNode* from = NULL;

  Node* node = func->getEnd();
  uint32_t bLen = static_cast<uint32_t>(
    ((_contextVd.getLength() + VarBits::kEntityBits - 1) / VarBits::kEntityBits));

  LivenessTarget* ltCur = NULL;
  LivenessTarget* ltUnused = NULL;

  size_t varMapToVaListOffset = _varMapToVaListOffset;

  // No variables.
  if (bLen == 0)
    return kErrorOk;

  VarBits* bCur = newBits(bLen);
  if (bCur == NULL)
    goto _NoMemory;

  // Allocate bits for code visited first time.
_OnVisit:
  for (;;) {
    if (node->hasLiveness()) {
      if (bCur->_addBitsDelSource(node->getLiveness(), bCur, bLen))
        goto _OnPatch;
      else
        goto _OnDone;
    }

    VarBits* bTmp = copyBits(bCur, bLen);
    if (bTmp == NULL)
      goto _NoMemory;

    node->setLiveness(bTmp);
    VarMap* map = node->getMap();

    if (map != NULL) {
      uint32_t vaCount = map->getVaCount();
      VarAttr* vaList = reinterpret_cast<VarAttr*>(((uint8_t*)map) + varMapToVaListOffset);

      for (uint32_t i = 0; i < vaCount; i++) {
        VarAttr* va = &vaList[i];
        VarData* vd = va->getVd();

        uint32_t flags = va->getFlags();
        uint32_t ctxId = vd->getContextId();

        if ((flags & kVarAttrOutAll) && !(flags & kVarAttrInAll)) {
          // Write-Only.
          bTmp->setBit(ctxId);
          bCur->delBit(ctxId);
        }
        else {
          // Read-Only or Read/Write.
          bTmp->setBit(ctxId);
          bCur->setBit(ctxId);
        }
      }
    }

    if (node->getType() == kNodeTypeTarget)
      goto _OnTarget;

    if (node == func)
      goto _OnDone;

    ASMJIT_ASSERT(node->getPrev());
    node = node->getPrev();
  }

  // Patch already generated liveness bits.
_OnPatch:
  for (;;) {
    ASMJIT_ASSERT(node->hasLiveness());
    VarBits* bNode = node->getLiveness();

    if (!bNode->_addBitsDelSource(bCur, bLen))
      goto _OnDone;

    if (node->getType() == kNodeTypeTarget)
      goto _OnTarget;

    if (node == func)
      goto _OnDone;

    node = node->getPrev();
  }

_OnTarget:
  if (static_cast<TargetNode*>(node)->getNumRefs() != 0) {
    // Push a new LivenessTarget onto the stack if needed.
    if (ltCur == NULL || ltCur->node != node) {
      // Allocate a new LivenessTarget object (from pool or zone).
      LivenessTarget* ltTmp = ltUnused;

      if (ltTmp != NULL) {
        ltUnused = ltUnused->prev;
      }
      else {
        ltTmp = _baseZone.allocT<LivenessTarget>(
          sizeof(LivenessTarget) - sizeof(VarBits) + bLen * sizeof(uintptr_t));

        if (ltTmp == NULL)
          goto _NoMemory;
      }

      // Initialize and make current - ltTmp->from will be set later on.
      ltTmp->prev = ltCur;
      ltTmp->node = static_cast<TargetNode*>(node);
      ltCur = ltTmp;

      from = static_cast<TargetNode*>(node)->getFrom();
      ASMJIT_ASSERT(from != NULL);
    }
    else {
      from = ltCur->from;
      goto _OnJumpNext;
    }

    // Visit/Patch.
    do {
      ltCur->from = from;
      bCur->copyBits(node->getLiveness(), bLen);

      if (!from->hasLiveness()) {
        node = from;
        goto _OnVisit;
      }

      // Issue #25: Moved '_OnJumpNext' here since it's important to patch
      // code again if there are more live variables than before.
_OnJumpNext:
      if (bCur->delBits(from->getLiveness(), bLen)) {
        node = from;
        goto _OnPatch;
      }

      from = from->getJumpNext();
    } while (from != NULL);

    // Pop the current LivenessTarget from the stack.
    {
      LivenessTarget* ltTmp = ltCur;

      ltCur = ltCur->prev;
      ltTmp->prev = ltUnused;
      ltUnused = ltTmp;
    }
  }

  bCur->copyBits(node->getLiveness(), bLen);
  node = node->getPrev();

  if (node->isJmp() || !node->isFetched())
    goto _OnDone;

  if (!node->hasLiveness())
    goto _OnVisit;

  if (bCur->delBits(node->getLiveness(), bLen))
    goto _OnPatch;

_OnDone:
  if (ltCur != NULL) {
    node = ltCur->node;
    from = ltCur->from;

    goto _OnJumpNext;
  }
  return kErrorOk;

_NoMemory:
  return setError(kErrorNoHeapMemory);
}
Esempio n. 23
0
void initGlobalFuncs(GlobalState& g) {
    g.llvm_opaque_type = llvm::StructType::create(g.context, "opaque");

    g.llvm_clfunction_type_ptr = lookupFunction("boxCLFunction")->arg_begin()->getType();
    g.llvm_module_type_ptr = g.stdlib_module->getTypeByName("class.pyston::BoxedModule")->getPointerTo();
    assert(g.llvm_module_type_ptr);
    g.llvm_bool_type_ptr = lookupFunction("boxBool")->getReturnType();

    g.llvm_value_type_ptr = lookupFunction("getattr")->getReturnType();
    g.llvm_value_type = g.llvm_value_type_ptr->getSequentialElementType();
    g.llvm_value_type_ptr_ptr = g.llvm_value_type_ptr->getPointerTo();
    // g.llvm_class_type_ptr = llvm::cast<llvm::StructType>(g.llvm_value_type)->getElementType(0);
    // g.llvm_class_type = g.llvm_class_type_ptr->getSequentialElementType();
    g.llvm_class_type = g.stdlib_module->getTypeByName("class.pyston::BoxedClass");
    assert(g.llvm_class_type);
    g.llvm_class_type_ptr = g.llvm_class_type->getPointerTo();

    g.llvm_str_type_ptr = lookupFunction("boxStringPtr")->arg_begin()->getType();

    // The LLVM vector type for the arguments that we pass to runtimeCall and related functions.
    // It will be a pointer to a type named something like class.std::vector or
    // class.std::vector.##. We can figure out exactly what it is by looking at the last
    // argument of runtimeCall.
    g.vector_ptr = (--lookupFunction("runtimeCall")->getArgumentList().end())->getType();

    g.llvm_closure_type_ptr = g.stdlib_module->getTypeByName("class.pyston::BoxedClosure")->getPointerTo();
    assert(g.llvm_closure_type_ptr);

    g.llvm_generator_type_ptr = g.stdlib_module->getTypeByName("class.pyston::BoxedGenerator")->getPointerTo();
    assert(g.llvm_generator_type_ptr);

#define GET(N) g.funcs.N = getFunc((void*)N, STRINGIFY(N))

    g.funcs.printf = addFunc((void*)printf, g.i8_ptr, true);
    g.funcs.my_assert = getFunc((void*)my_assert, "my_assert");
    g.funcs.malloc = addFunc((void*)malloc, g.i8_ptr, g.i64);
    g.funcs.free = addFunc((void*)free, g.void_, g.i8_ptr);

    g.funcs.allowGLReadPreemption = addFunc((void*)threading::allowGLReadPreemption, g.void_);

    GET(boxCLFunction);
    GET(unboxCLFunction);
    GET(createUserClass);
    GET(boxInt);
    GET(unboxInt);
    GET(boxFloat);
    GET(unboxFloat);
    GET(boxStringPtr);
    GET(boxInstanceMethod);
    GET(boxBool);
    GET(unboxBool);
    GET(createTuple);
    GET(createList);
    GET(createDict);
    GET(createSlice);
    GET(createClosure);
    GET(createGenerator);
    GET(createLong);
    GET(createSet);

    GET(getattr);
    GET(setattr);
    GET(delattr);
    GET(getitem);
    GET(setitem);
    GET(delitem);
    GET(getGlobal);
    GET(delGlobal);
    GET(binop);
    GET(compare);
    GET(augbinop);
    GET(nonzero);
    GET(print);
    GET(unboxedLen);
    GET(getclsattr);
    GET(unaryop);
    GET(import);
    GET(importFrom);
    GET(importStar);
    GET(repr);
    GET(isinstance);
    GET(yield);

    GET(checkUnpackingLength);
    GET(raiseAttributeError);
    GET(raiseAttributeErrorStr);
    GET(raiseNotIterableError);
    GET(assertNameDefined);
    GET(assertFail);

    GET(printFloat);
    GET(listAppendInternal);

    g.funcs.runtimeCall = getFunc((void*)runtimeCall, "runtimeCall");
    g.funcs.runtimeCall0 = addFunc((void*)runtimeCall, g.llvm_value_type_ptr, g.llvm_value_type_ptr, g.i32);
    g.funcs.runtimeCall1
        = addFunc((void*)runtimeCall, g.llvm_value_type_ptr, g.llvm_value_type_ptr, g.i32, g.llvm_value_type_ptr);
    g.funcs.runtimeCall2 = addFunc((void*)runtimeCall, g.llvm_value_type_ptr, g.llvm_value_type_ptr, g.i32,
                                   g.llvm_value_type_ptr, g.llvm_value_type_ptr);
    g.funcs.runtimeCall3 = addFunc((void*)runtimeCall, g.llvm_value_type_ptr, g.llvm_value_type_ptr, g.i32,
                                   g.llvm_value_type_ptr, g.llvm_value_type_ptr, g.llvm_value_type_ptr);

    g.funcs.callattr = getFunc((void*)callattr, "callattr");
    g.funcs.callattr0
        = addFunc((void*)callattr, g.llvm_value_type_ptr, g.llvm_value_type_ptr, g.llvm_str_type_ptr, g.i1, g.i32);
    g.funcs.callattr1 = addFunc((void*)callattr, g.llvm_value_type_ptr, g.llvm_value_type_ptr, g.llvm_str_type_ptr,
                                g.i1, g.i32, g.llvm_value_type_ptr);
    g.funcs.callattr2 = addFunc((void*)callattr, g.llvm_value_type_ptr, g.llvm_value_type_ptr, g.llvm_str_type_ptr,
                                g.i1, g.i32, g.llvm_value_type_ptr, g.llvm_value_type_ptr);
    g.funcs.callattr3 = addFunc((void*)callattr, g.llvm_value_type_ptr, g.llvm_value_type_ptr, g.llvm_str_type_ptr,
                                g.i1, g.i32, g.llvm_value_type_ptr, g.llvm_value_type_ptr, g.llvm_value_type_ptr);

    g.funcs.reoptCompiledFunc = addFunc((void*)reoptCompiledFunc, g.i8_ptr, g.i8_ptr);
    g.funcs.compilePartialFunc = addFunc((void*)compilePartialFunc, g.i8_ptr, g.i8_ptr);

    GET(__cxa_begin_catch);
    g.funcs.__cxa_end_catch = addFunc((void*)__cxa_end_catch, g.void_);
    GET(raise0);
    GET(raise3);

    GET(div_float_float);
    GET(mod_float_float);
    GET(pow_float_float);
}
Esempio n. 24
0
Automaton getAutomaton(int inputMemorySize, int outputMemorySize, int funcValuesAsInteger) {
	BooleanFunction func = getFunc(1 + inputMemorySize + outputMemorySize, funcValuesAsInteger);
	return AIOM(inputMemorySize, outputMemorySize, func).getAutomaton();
}
Esempio n. 25
0
File: c8c.c Progetto: c8c/c8c
int ex(nodeType *p) {
    int lblx, lbly, lbl1, lbl2, lblz, lbl3;
    int i,j;
    SymbolType type;
    char* fun_name;
    int numofparas;
    FunNode* func;
    nodeType* paras;
    int *size;
    if (!p) return 0;
    switch(p->type) {
        case typeCon:       
        printf("\tpush\t%d\n", p->con.value); 
        break;  
        case typeId:
        printf("\tpush\tfp[%d]\n",getSymbol(p->id.i)->index);
        break;
        case typeStr:
        printf("\tpush\t\"%s\"\n",p->str.value);// " not include in con.value
        break;
        case typeArr:
        storeOffsetInIn(p);
        testOutofBoundary(p);
        printf("\tpush\tfp[in]\n");
        break;
        case typeOpr:
            switch(p->opr.oper) {
                case INT: 
                case CHAR://Declaration
                    if(p->opr.oper == INT)
                        type = INTTYPE;
                    else if(p->opr.oper == CHAR)
                        type = CHARTYPE;
                    else{
                        printf("Compile Error(1072): Unknown indentifier type\n");
                        exit(-1);
                    }
                    switch(p->opr.op[0]->type){
                        case typeId://A variable
                            printf("\tpush\tsp\n");//allocate space in stack
                            printf("\tpush\t1\n");
                            printf("\tadd\t\n");
                            printf("\tpop\tsp\n");
                            break;
                        case typeArr://An array
                            size = (int *)malloc(sizeof(int) * p->opr.op[0]->arr.dimension);
                            for(i = 0; i < p->opr.op[0]->arr.dimension; i++){
                                ex(p->opr.op[0]->arr.index[i]);
                            }
                            for(i = 0; i < p->opr.op[0]->arr.dimension - 1; i++){
                                printf("\tmul\t\n");
                                }
                            printf("\tpush\tsp\n");
                            printf("\tadd\t\n");
                            printf("\tpop\tsp\n");
                            break;
                        default:
                            printf("Compile Error(1070): Unknown declaration type. <%d>\n",p->opr.op[0]->type);
                            exit(-1);
                            break;
                    }
                    break;
                case CODEBLOCK:
                    ex(p->opr.op[0]);
                    ex(p->opr.op[1]);
                    break;
                case FOR:
                    ex(p->opr.op[0]);
                    printf("L%03d:\n", lblx = lbl++);
                    ex(p->opr.op[1]);
                    printf("\tj0\tL%03d\n", lbly = lbl++);
                    lblz = lbl++;
                    push(lblz,lbly);        
                    ex(p->opr.op[3]);
                    printf("L%03d:\n", lblz);
                    ex(p->opr.op[2]);
                    printf("\tjmp\tL%03d\n", lblx);
                    printf("L%03d:\n", lbly);
                    pop();
                    break;
                case CALL:
                    fun_name = p->opr.op[0]->id.i;//get function name;
                    numofparas = 0;
                    /*push parameters in stack*/
                    for(paras = p->opr.op[1];paras != NULL;paras = paras->para.next){
                        storeOffsetInIn(paras->para.name);
                        if(paras->para.name->type == typeArr)
                            testOutofBoundary(paras->para.name);
                        printf("\tpush\tfp[in]\n");//push para in stack
                        numofparas++;
                    }
                    /*actually, this exist check should be done in c8.y*/
                    if(func = getFunc(fun_name) == NULL){ 
                        printf("Error 1051: function (%s())not declared.\n",fun_name);
                        exit(-1);
                    }
                    printf("\tcall\tL%03d,%d\n",func->label,numofparas);
                break;
                case WHILE:
                    printf("L%03d:\n", lbl1 = lbl++);
                    ex(p->opr.op[0]);
                    printf("\tj0\tL%03d\n", lbl2 = lbl++);
                    push(lbl1,lbl2);
                    ex(p->opr.op[1]);
                    printf("\tjmp\tL%03d\n", lbl1);
                    printf("L%03d:\n", lbl2);
                    pop();
                break;
                case DO-WHILE:
                    lbl1 = lbl++;
                    lbl2 = lbl++;
                    lbl3 = lbl++;
                    push(lbl3,lbl2);
                    printf("L%03d:\n",lbl1);
                    ex(p->opr.op[0]);
                    printf("L%03d:\n", lbl3);
                    ex(p->opr.op[1]);
                    printf("\tj0\tL%03d\n", lbl2);
                    printf("\tjmp\tL%03d\n", lbl1);
                    printf("L%03d:\n", lbl2);
                    pop();
                break;
                case BREAK: printf("\tjmp\tL%03d\n", top(1)); break;
                case CONTINUE: printf("\tjmp\tL%03d\n", top(0)); break;
                case IF:
                ex(p->opr.op[0]);
                if (p->opr.nops > 2) {
                    printf("\tj0\tL%03d\n", lbl1 = lbl++);
                    ex(p->opr.op[1]);
                    printf("\tjmp\tL%03d\n", lbl2 = lbl++);
                    printf("L%03d:\n", lbl1);
                    ex(p->opr.op[2]);
                    printf("L%03d:\n", lbl2);
                } else {
                    printf("\tj0\tL%03d\n", lbl1 = lbl++);
                    ex(p->opr.op[1]);
                    printf("L%03d:\n", lbl1);
                }
                break;
                case READ:
                    printf("\tgeti\n");
                    storeOffsetInIn(p->opr.op[0]); 
                    if(p->opr.op[0]->type == typeArr)
                        testOutofBoundary(p->opr.op[0]);               
                    printf("\tpop\tfp[in]\n");
                break;
                case PRINT:     
                    ex(p->opr.op[0]);
                    printf("\tputi\n");
                break;
                case '=':
                    ex(p->opr.op[1]);
                    storeOffsetInIn(p->opr.op[0]);
                    if(p->opr.op[0]->type == typeArr)
                        testOutofBoundary(p->opr.op[0]);
                    printf("\tpop\tfp[in]\n");
                break;
                case UMINUS:    
                    ex(p->opr.op[0]);
                    printf("\tneg\n");
                break;
            default:/*Expr*/
/*semicolon*/
        ex(p->opr.op[0]);
        ex(p->opr.op[1]);
        switch(p->opr.oper) {
            case '+':   printf("\tadd\n"); break;
            case '-':   printf("\tsub\n"); break; 
            case '*':   printf("\tmul\n"); break;
            case '/':   printf("\tdiv\n"); break;
            case '%':   printf("\tmod\n"); break;
            case '<':   printf("\tcomplt\n"); break;
            case '>':   printf("\tcompgt\n"); break;
            case GE:    printf("\tcompge\n"); break;
            case LE:    printf("\tcomple\n"); break;
            case NE:    printf("\tcompne\n"); break;
            case EQ:    printf("\tcompeq\n"); break;
            case AND:   printf("\tand\n"); break;
            case OR:    printf("\tor\n"); break;
        }
    }
}
return 0;
}
Esempio n. 26
0
void initGlobalFuncs(GlobalState& g) {
    g.llvm_opaque_type = llvm::StructType::create(g.context, "opaque");

    g.llvm_functionmetadata_type_ptr = lookupFunction("createFunctionFromMetadata")->arg_begin()->getType();
    g.llvm_module_type_ptr = g.stdlib_module->getTypeByName("class.pyston::BoxedModule")->getPointerTo();
    assert(g.llvm_module_type_ptr);
    g.llvm_bool_type_ptr = lookupFunction("boxBool")->getReturnType();

    g.llvm_value_type_ptr = lookupFunction("getattr")->getReturnType();
    g.llvm_value_type = g.llvm_value_type_ptr->getSequentialElementType();
    g.llvm_value_type_ptr_ptr = g.llvm_value_type_ptr->getPointerTo();
    // g.llvm_class_type_ptr = llvm::cast<llvm::StructType>(g.llvm_value_type)->getElementType(0);
    // g.llvm_class_type = g.llvm_class_type_ptr->getSequentialElementType();
    g.llvm_class_type = g.stdlib_module->getTypeByName("class.pyston::BoxedClass");
    assert(g.llvm_class_type);
    g.llvm_class_type_ptr = g.llvm_class_type->getPointerTo();

    g.llvm_boxedstring_type_ptr = g.stdlib_module->getTypeByName("class.pyston::BoxedString");
    assert(g.llvm_boxedstring_type_ptr);
    g.llvm_boxedstring_type_ptr = g.llvm_boxedstring_type_ptr->getPointerTo();

    g.llvm_dict_type_ptr = g.stdlib_module->getTypeByName("class.pyston::BoxedDict");
    assert(g.llvm_dict_type_ptr);
    g.llvm_dict_type_ptr = g.llvm_dict_type_ptr->getPointerTo();

    g.llvm_aststmt_type_ptr = g.stdlib_module->getTypeByName("class.pyston::AST_stmt");
    assert(g.llvm_aststmt_type_ptr);
    g.llvm_aststmt_type_ptr = g.llvm_aststmt_type_ptr->getPointerTo();

    g.llvm_astexpr_type_ptr = g.stdlib_module->getTypeByName("class.pyston::AST_expr");
    assert(g.llvm_astexpr_type_ptr);
    g.llvm_astexpr_type_ptr = g.llvm_astexpr_type_ptr->getPointerTo();

    // The LLVM vector type for the arguments that we pass to runtimeCall and related functions.
    // It will be a pointer to a type named something like class.std::vector or
    // class.std::vector.##. We can figure out exactly what it is by looking at the last
    // argument of runtimeCall.
    g.vector_ptr = (--lookupFunction("runtimeCall")->getArgumentList().end())->getType();

    g.llvm_closure_type_ptr = g.stdlib_module->getTypeByName("class.pyston::BoxedClosure")->getPointerTo();
    assert(g.llvm_closure_type_ptr);

    g.llvm_generator_type_ptr = g.stdlib_module->getTypeByName("class.pyston::BoxedGenerator")->getPointerTo();
    assert(g.llvm_generator_type_ptr);

    g.llvm_excinfo_type = g.stdlib_module->getTypeByName("struct.pyston::ExcInfo");
    assert(g.llvm_excinfo_type);

    g.llvm_frame_info_type = g.stdlib_module->getTypeByName("struct.pyston::FrameInfo");
    assert(g.llvm_frame_info_type);

#define GET(N) g.funcs.N = getFunc((void*)N, STRINGIFY(N))

    g.funcs.printf = addFunc((void*)printf, g.i8_ptr, true);
    g.funcs.my_assert = getFunc((void*)my_assert, "my_assert");
    g.funcs.malloc = addFunc((void*)malloc, g.i8_ptr, g.i64);
    g.funcs.free = addFunc((void*)free, g.void_, g.i8_ptr);

    g.funcs.allowGLReadPreemption = getFunc((void*)threading::allowGLReadPreemption, "allowGLReadPreemption");

    GET(softspace);

    GET(createFunctionFromMetadata);
    GET(getFunctionMetadata);
    GET(createUserClass);
    GET(boxInt);
    GET(unboxInt);
    GET(boxFloat);
    GET(unboxFloat);
    GET(boxInstanceMethod);
    GET(boxBool);
    GET(unboxBool);
    GET(createTuple);
    GET(createList);
    GET(createDict);
    GET(createSlice);
    GET(createClosure);
    GET(createGenerator);
    GET(createSet);
    GET(initFrame);
    GET(deinitFrame);

    GET(getattr);
    GET(getattr_capi);
    GET(setattr);
    GET(delattr);
    GET(getitem);
    GET(getitem_capi);
    GET(setitem);
    GET(delitem);
    GET(getGlobal);
    GET(delGlobal);
    GET(setGlobal);
    GET(binop);
    GET(compare);
    GET(augbinop);
    GET(nonzero);
    GET(unboxedLen);
    GET(getclsattr);
    GET(unaryop);
    GET(import);
    GET(importFrom);
    GET(importStar);
    GET(repr);
    GET(exceptionMatches);
    GET(yield);
    GET(getiterHelper);
    GET(hasnext);
    GET(apply_slice);

    GET(unpackIntoArray);
    GET(raiseAttributeError);
    GET(raiseAttributeErrorStr);
    GET(raiseAttributeErrorCapi);
    GET(raiseAttributeErrorStrCapi);
    GET(raiseIndexErrorStr);
    GET(raiseIndexErrorStrCapi);
    GET(raiseNotIterableError);
    GET(assertNameDefined);
    GET(assertFailDerefNameDefined);
    GET(assertFail);
    GET(printExprHelper);
    GET(printHelper);

    GET(listAppendInternal);
    GET(getSysStdout);

    GET(exec);
    GET(boxedLocalsSet);
    GET(boxedLocalsGet);
    GET(boxedLocalsDel);

    g.funcs.runtimeCall.cxx_val = getFunc((void*)runtimeCall, "runtimeCall");
    g.funcs.runtimeCall0.cxx_val = addFunc((void*)runtimeCall, g.llvm_value_type_ptr, g.llvm_value_type_ptr, g.i32);
    g.funcs.runtimeCall1.cxx_val
        = addFunc((void*)runtimeCall, g.llvm_value_type_ptr, g.llvm_value_type_ptr, g.i32, g.llvm_value_type_ptr);
    g.funcs.runtimeCall2.cxx_val = addFunc((void*)runtimeCall, g.llvm_value_type_ptr, g.llvm_value_type_ptr, g.i32,
                                           g.llvm_value_type_ptr, g.llvm_value_type_ptr);
    g.funcs.runtimeCall3.cxx_val = addFunc((void*)runtimeCall, g.llvm_value_type_ptr, g.llvm_value_type_ptr, g.i32,
                                           g.llvm_value_type_ptr, g.llvm_value_type_ptr, g.llvm_value_type_ptr);
    g.funcs.runtimeCallN.cxx_val
        = addFunc((void*)runtimeCall, g.llvm_value_type_ptr, g.llvm_value_type_ptr, g.i32, g.llvm_value_type_ptr,
                  g.llvm_value_type_ptr, g.llvm_value_type_ptr, g.llvm_value_type_ptr->getPointerTo());

    g.funcs.runtimeCall.capi_val = getFunc((void*)runtimeCallCapi, "runtimeCallCapi");
    g.funcs.runtimeCall0.capi_val
        = addFunc((void*)runtimeCallCapi, g.llvm_value_type_ptr, g.llvm_value_type_ptr, g.i32);
    g.funcs.runtimeCall1.capi_val
        = addFunc((void*)runtimeCallCapi, g.llvm_value_type_ptr, g.llvm_value_type_ptr, g.i32, g.llvm_value_type_ptr);
    g.funcs.runtimeCall2.capi_val = addFunc((void*)runtimeCallCapi, g.llvm_value_type_ptr, g.llvm_value_type_ptr, g.i32,
                                            g.llvm_value_type_ptr, g.llvm_value_type_ptr);
    g.funcs.runtimeCall3.capi_val = addFunc((void*)runtimeCallCapi, g.llvm_value_type_ptr, g.llvm_value_type_ptr, g.i32,
                                            g.llvm_value_type_ptr, g.llvm_value_type_ptr, g.llvm_value_type_ptr);
    g.funcs.runtimeCallN.capi_val
        = addFunc((void*)runtimeCallCapi, g.llvm_value_type_ptr, g.llvm_value_type_ptr, g.i32, g.llvm_value_type_ptr,
                  g.llvm_value_type_ptr, g.llvm_value_type_ptr, g.llvm_value_type_ptr->getPointerTo());


    g.funcs.callattr.cxx_val = getFunc((void*)callattr, "callattr");
    g.funcs.callattr0.cxx_val
        = addFunc((void*)callattr, g.llvm_value_type_ptr, g.llvm_value_type_ptr, g.llvm_boxedstring_type_ptr, g.i64);
    g.funcs.callattr1.cxx_val = addFunc((void*)callattr, g.llvm_value_type_ptr, g.llvm_value_type_ptr,
                                        g.llvm_boxedstring_type_ptr, g.i64, g.llvm_value_type_ptr);
    g.funcs.callattr2.cxx_val
        = addFunc((void*)callattr, g.llvm_value_type_ptr, g.llvm_value_type_ptr, g.llvm_boxedstring_type_ptr, g.i64,
                  g.llvm_value_type_ptr, g.llvm_value_type_ptr);
    g.funcs.callattr3.cxx_val
        = addFunc((void*)callattr, g.llvm_value_type_ptr, g.llvm_value_type_ptr, g.llvm_boxedstring_type_ptr, g.i64,
                  g.llvm_value_type_ptr, g.llvm_value_type_ptr, g.llvm_value_type_ptr);
    g.funcs.callattrN.cxx_val = addFunc(
        (void*)callattr, g.llvm_value_type_ptr, g.llvm_value_type_ptr, g.llvm_boxedstring_type_ptr, g.i64,
        g.llvm_value_type_ptr, g.llvm_value_type_ptr, g.llvm_value_type_ptr, g.llvm_value_type_ptr->getPointerTo());


    g.funcs.callattr.capi_val = getFunc((void*)callattrCapi, "callattrCapi");
    g.funcs.callattr0.capi_val = addFunc((void*)callattrCapi, g.llvm_value_type_ptr, g.llvm_value_type_ptr,
                                         g.llvm_boxedstring_type_ptr, g.i64);
    g.funcs.callattr1.capi_val = addFunc((void*)callattrCapi, g.llvm_value_type_ptr, g.llvm_value_type_ptr,
                                         g.llvm_boxedstring_type_ptr, g.i64, g.llvm_value_type_ptr);
    g.funcs.callattr2.capi_val
        = addFunc((void*)callattrCapi, g.llvm_value_type_ptr, g.llvm_value_type_ptr, g.llvm_boxedstring_type_ptr, g.i64,
                  g.llvm_value_type_ptr, g.llvm_value_type_ptr);
    g.funcs.callattr3.capi_val
        = addFunc((void*)callattrCapi, g.llvm_value_type_ptr, g.llvm_value_type_ptr, g.llvm_boxedstring_type_ptr, g.i64,
                  g.llvm_value_type_ptr, g.llvm_value_type_ptr, g.llvm_value_type_ptr);
    g.funcs.callattrN.capi_val = addFunc(
        (void*)callattrCapi, g.llvm_value_type_ptr, g.llvm_value_type_ptr, g.llvm_boxedstring_type_ptr, g.i64,
        g.llvm_value_type_ptr, g.llvm_value_type_ptr, g.llvm_value_type_ptr, g.llvm_value_type_ptr->getPointerTo());

    g.funcs.reoptCompiledFunc = addFunc((void*)reoptCompiledFunc, g.i8_ptr, g.i8_ptr);
    g.funcs.compilePartialFunc = addFunc((void*)compilePartialFunc, g.i8_ptr, g.i8_ptr);

    g.funcs.__cxa_end_catch = addFunc((void*)__cxa_end_catch, g.void_);
    GET(raise0);
    GET(raise0_capi);
    GET(raise3);
    GET(raise3_capi);
    GET(PyErr_Fetch);
    GET(PyErr_NormalizeException);
    GET(PyErr_Restore);
    GET(caughtCapiException);
    GET(reraiseCapiExcAsCxx);
    GET(deopt);

    GET(div_float_float);
    GET(floordiv_float_float);
    GET(mod_float_float);
    GET(pow_float_float);

    GET(dump);
}
Esempio n. 27
0
QString VDPAUContext::init()
{
	QString err;
	
	vdp_get_proc_address = NULL;
	vdpDevice = VDP_INVALID_HANDLE;
	
	VdpStatus st = vdp_device_create_x11( vdpDisplay, vdpScreen, &vdpDevice, &vdp_get_proc_address );
	if ( st != VDP_STATUS_OK ) {
		err = "Can't create vdp device : ";
		if ( st == VDP_STATUS_NO_IMPLEMENTATION )
			err += "No vdpau implementation.";
		else
			err += "Unsupported GPU?";
		return err;
	}
	if ( vdpDevice==VDP_INVALID_HANDLE )
		return "Invalid VdpDevice handle !!";
	if ( !vdp_get_proc_address )
		return "vdp_get_proc_address is NULL !!";
		
	if ( !getFunc( VDP_FUNC_ID_GET_ERROR_STRING , (void**)&vdp_get_error_string ) )
		return "Can't get VDP_FUNC_ID_GET_ERROR_STRING address !!";
		
	if ( !getFunc( VDP_FUNC_ID_GET_API_VERSION , (void**)&vdp_get_api_version ) )
		return "Can't get VDP_FUNC_ID_GET_API_VERSION address !!";
		
	if ( !getFunc( VDP_FUNC_ID_GET_INFORMATION_STRING , (void**)&vdp_get_information_string ) )
		return "Can't get VDP_FUNC_ID_GET_INFORMATION_STRING address !!";
	
	if ( !getFunc( VDP_FUNC_ID_DEVICE_DESTROY , (void**)&vdp_device_destroy ) )
		return "Can't get VDP_FUNC_ID_DEVICE_DESTROY address !!";
	
	if ( !getFunc( VDP_FUNC_ID_GENERATE_CSC_MATRIX , (void**)&vdp_generate_csc_matrix ) )
		return "Can't get VDP_FUNC_ID_GENERATE_CSC_MATRIX address !!";
	
	if ( !getFunc( VDP_FUNC_ID_VIDEO_SURFACE_QUERY_CAPABILITIES , (void**)&vdp_video_surface_query_capabilities ) )
		return "Can't get VDP_FUNC_ID_VIDEO_SURFACE_QUERY_CAPABILITIES address !!";
	
	if ( !getFunc( VDP_FUNC_ID_VIDEO_SURFACE_QUERY_GET_PUT_BITS_Y_CB_CR_CAPABILITIES , (void**)&vdp_video_surface_query_get_put_bits_y_cb_cr_capabilities ) )
		return "Can't get VDP_FUNC_ID_VIDEO_SURFACE_QUERY_GET_PUT_BITS_Y_CB_CR_CAPABILITIES address !!";
		
	if ( !getFunc( VDP_FUNC_ID_VIDEO_SURFACE_CREATE , (void**)&vdp_video_surface_create ) )
		return "Can't get VDP_FUNC_ID_VIDEO_SURFACE_CREATE address !!";
		
	if ( !getFunc( VDP_FUNC_ID_VIDEO_SURFACE_DESTROY , (void**)&vdp_video_surface_destroy ) )
		return "Can't get VDP_FUNC_ID_VIDEO_SURFACE_DESTROY address !!";
		
	if ( !getFunc( VDP_FUNC_ID_VIDEO_SURFACE_GET_PARAMETERS , (void**)&vdp_video_surface_get_parameters ) )
		return "Can't get VDP_FUNC_ID_VIDEO_SURFACE_GET_PARAMETERS address !!";
		
	if ( !getFunc( VDP_FUNC_ID_VIDEO_SURFACE_GET_BITS_Y_CB_CR , (void**)&vdp_video_surface_get_bits_y_cb_cr ) )
		return "Can't get VDP_FUNC_ID_VIDEO_SURFACE_GET_BITS_Y_CB_CR address !!";
		
	if ( !getFunc( VDP_FUNC_ID_VIDEO_SURFACE_PUT_BITS_Y_CB_CR , (void**)&vdp_video_surface_put_bits_y_cb_cr ) )
		return "Can't get VDP_FUNC_ID_VIDEO_SURFACE_PUT_BITS_Y_CB_CR address !!";
		
	if ( !getFunc( VDP_FUNC_ID_OUTPUT_SURFACE_QUERY_CAPABILITIES , (void**)&vdp_output_surface_query_capabilities ) )
		return "Can't get VDP_FUNC_ID_OUTPUT_SURFACE_QUERY_CAPABILITIES address !!";
	
	if ( !getFunc( VDP_FUNC_ID_OUTPUT_SURFACE_QUERY_GET_PUT_BITS_NATIVE_CAPABILITIES , (void**)&vdp_output_surface_query_get_put_bits_native_capabilities ) )
		return "Can't get VDP_FUNC_ID_OUTPUT_SURFACE_QUERY_GET_PUT_BITS_NATIVE_CAPABILITIES address !!";
		
	if ( !getFunc( VDP_FUNC_ID_OUTPUT_SURFACE_QUERY_PUT_BITS_INDEXED_CAPABILITIES , (void**)&vdp_output_surface_query_put_bits_indexed_capabilities ) )
		return "Can't get VDP_FUNC_ID_OUTPUT_SURFACE_QUERY_PUT_BITS_INDEXED_CAPABILITIES address !!";
		
	if ( !getFunc( VDP_FUNC_ID_OUTPUT_SURFACE_QUERY_PUT_BITS_Y_CB_CR_CAPABILITIES , (void**)&vdp_output_surface_query_put_bits_y_cb_cr_capabilities ) )
		return "Can't get VDP_FUNC_ID_OUTPUT_SURFACE_QUERY_PUT_BITS_Y_CB_CR_CAPABILITIES address !!";
		
	if ( !getFunc( VDP_FUNC_ID_OUTPUT_SURFACE_CREATE , (void**)&vdp_output_surface_create ) )
		return "Can't get VDP_FUNC_ID_OUTPUT_SURFACE_CREATE address !!";
		
	if ( !getFunc( VDP_FUNC_ID_OUTPUT_SURFACE_DESTROY , (void**)&vdp_output_surface_destroy ) )
		return "Can't get VDP_FUNC_ID_OUTPUT_SURFACE_DESTROY address !!";
	
	if ( !getFunc( VDP_FUNC_ID_OUTPUT_SURFACE_GET_PARAMETERS , (void**)&vdp_output_surface_get_parameters ) )
		return "Can't get VDP_FUNC_ID_OUTPUT_SURFACE_GET_PARAMETERS address !!";
		
	if ( !getFunc( VDP_FUNC_ID_OUTPUT_SURFACE_GET_BITS_NATIVE , (void**)&vdp_output_surface_get_bits_native ) )
		return "Can't get VDP_FUNC_ID_OUTPUT_SURFACE_GET_BITS_NATIVE address !!";
		
	if ( !getFunc( VDP_FUNC_ID_OUTPUT_SURFACE_PUT_BITS_NATIVE , (void**)&vdp_output_surface_put_bits_native ) )
		return "Can't get VDP_FUNC_ID_OUTPUT_SURFACE_PUT_BITS_NATIVE address !!";
		
	if ( !getFunc( VDP_FUNC_ID_OUTPUT_SURFACE_PUT_BITS_INDEXED , (void**)&vdp_output_surface_put_bits_indexed ) )
		return "Can't get VDP_FUNC_ID_OUTPUT_SURFACE_PUT_BITS_INDEXED address !!";
		
	if ( !getFunc( VDP_FUNC_ID_OUTPUT_SURFACE_PUT_BITS_Y_CB_CR , (void**)&vdp_output_surface_put_bits_y_cb_cr ) )
		return "Can't get VDP_FUNC_ID_OUTPUT_SURFACE_PUT_BITS_Y_CB_CR address !!";
		
	if ( !getFunc( VDP_FUNC_ID_BITMAP_SURFACE_QUERY_CAPABILITIES , (void**)&vdp_bitmap_surface_query_capabilities ) )
		return "Can't get VDP_FUNC_ID_BITMAP_SURFACE_QUERY_CAPABILITIES address !!";
		
	if ( !getFunc( VDP_FUNC_ID_BITMAP_SURFACE_CREATE , (void**)&vdp_bitmap_surface_create ) )
		return "Can't get VDP_FUNC_ID_BITMAP_SURFACE_CREATE address !!";
		
	if ( !getFunc( VDP_FUNC_ID_BITMAP_SURFACE_DESTROY , (void**)&vdp_bitmap_surface_destroy ) )
		return "Can't get VDP_FUNC_ID_BITMAP_SURFACE_DESTROY address !!";
		
	if ( !getFunc( VDP_FUNC_ID_BITMAP_SURFACE_GET_PARAMETERS , (void**)&vdp_bitmap_surface_get_parameters ) )
		return "Can't get VDP_FUNC_ID_BITMAP_SURFACE_GET_PARAMETERS address !!";
		
	if ( !getFunc( VDP_FUNC_ID_BITMAP_SURFACE_PUT_BITS_NATIVE , (void**)&vdp_bitmap_surface_put_bits_native ) )
		return "Can't get VDP_FUNC_ID_BITMAP_SURFACE_PUT_BITS_NATIVE address !!";
		
	if ( !getFunc( VDP_FUNC_ID_OUTPUT_SURFACE_RENDER_OUTPUT_SURFACE , (void**)&vdp_output_surface_render_output_surface ) )
		return "Can't get VDP_FUNC_ID_OUTPUT_SURFACE_RENDER_OUTPUT_SURFACE address !!";
		
	if ( !getFunc( VDP_FUNC_ID_OUTPUT_SURFACE_RENDER_BITMAP_SURFACE , (void**)&vdp_output_surface_render_bitmap_surface ) )
		return "Can't get VDP_FUNC_ID_OUTPUT_SURFACE_RENDER_BITMAP_SURFACE address !!";
		
	if ( !getFunc( VDP_FUNC_ID_DECODER_QUERY_CAPABILITIES , (void**)&vdp_decoder_query_capabilities ) )
		return "Can't get VDP_FUNC_ID_DECODER_QUERY_CAPABILITIES address !!";
		
	if ( !getFunc( VDP_FUNC_ID_DECODER_CREATE , (void**)&vdp_decoder_create ) )
		return "Can't get VDP_FUNC_ID_DECODER_CREATE address !!";
		
	if ( !getFunc( VDP_FUNC_ID_DECODER_DESTROY , (void**)&vdp_decoder_destroy ) )
		return "Can't get VDP_FUNC_ID_DECODER_DESTROY address !!";
		
	if ( !getFunc( VDP_FUNC_ID_DECODER_GET_PARAMETERS , (void**)&vdp_decoder_get_parameters ) )
		return "Can't get VDP_FUNC_ID_DECODER_GET_PARAMETERS address !!";
		
	if ( !getFunc( VDP_FUNC_ID_DECODER_RENDER , (void**)&vdp_decoder_render ) )
		return "Can't get VDP_FUNC_ID_DECODER_RENDER address !!";
		
	if ( !getFunc( VDP_FUNC_ID_VIDEO_MIXER_QUERY_FEATURE_SUPPORT , (void**)&vdp_video_mixer_query_feature_support ) )
		return "Can't get VDP_FUNC_ID_VIDEO_MIXER_QUERY_FEATURE_SUPPORT address !!";
		
	if ( !getFunc( VDP_FUNC_ID_VIDEO_MIXER_QUERY_PARAMETER_SUPPORT , (void**)&vdp_video_mixer_query_parameter_support ) )
		return "Can't get VDP_FUNC_ID_VIDEO_MIXER_QUERY_PARAMETER_SUPPORT address !!";
		
	if ( !getFunc( VDP_FUNC_ID_VIDEO_MIXER_QUERY_ATTRIBUTE_SUPPORT , (void**)&vdp_video_mixer_query_attribute_support ) )
		return "Can't get VDP_FUNC_ID_VIDEO_MIXER_QUERY_ATTRIBUTE_SUPPORT address !!";
		
	if ( !getFunc( VDP_FUNC_ID_VIDEO_MIXER_QUERY_PARAMETER_VALUE_RANGE , (void**)&vdp_video_mixer_query_parameter_value_range ) )
		return "Can't get VDP_FUNC_ID_VIDEO_MIXER_QUERY_PARAMETER_VALUE_RANGE address !!";
		
	if ( !getFunc( VDP_FUNC_ID_VIDEO_MIXER_QUERY_ATTRIBUTE_VALUE_RANGE , (void**)&vdp_video_mixer_query_attribute_value_range ) )
		return "Can't get VDP_FUNC_ID_VIDEO_MIXER_QUERY_ATTRIBUTE_VALUE_RANGE address !!";
		
	if ( !getFunc( VDP_FUNC_ID_VIDEO_MIXER_CREATE , (void**)&vdp_video_mixer_create ) )
		return "Can't get VDP_FUNC_ID_VIDEO_MIXER_CREATE address !!";
		
	if ( !getFunc( VDP_FUNC_ID_VIDEO_MIXER_SET_FEATURE_ENABLES , (void**)&vdp_video_mixer_set_feature_enables ) )
		return "Can't get VDP_FUNC_ID_VIDEO_MIXER_SET_FEATURE_ENABLES address !!";
		
	if ( !getFunc( VDP_FUNC_ID_VIDEO_MIXER_SET_ATTRIBUTE_VALUES , (void**)&vdp_video_mixer_set_attribute_values ) )
		return "Can't get VDP_FUNC_ID_VIDEO_MIXER_SET_ATTRIBUTE_VALUES address !!";
		
	if ( !getFunc( VDP_FUNC_ID_VIDEO_MIXER_GET_FEATURE_SUPPORT , (void**)&vdp_video_mixer_get_feature_support ) )
		return "Can't get VDP_FUNC_ID_VIDEO_MIXER_GET_FEATURE_SUPPORT address !!";
		
	if ( !getFunc( VDP_FUNC_ID_VIDEO_MIXER_GET_FEATURE_ENABLES , (void**)&vdp_video_mixer_get_feature_enables ) )
		return "Can't get VDP_FUNC_ID_VIDEO_MIXER_GET_FEATURE_ENABLES address !!";
		
	if ( !getFunc( VDP_FUNC_ID_VIDEO_MIXER_GET_PARAMETER_VALUES , (void**)&vdp_video_mixer_get_parameter_values ) )
		return "Can't get VDP_FUNC_ID_VIDEO_MIXER_GET_PARAMETER_VALUES address !!";
		
	if ( !getFunc( VDP_FUNC_ID_VIDEO_MIXER_GET_ATTRIBUTE_VALUES , (void**)&vdp_video_mixer_get_attribute_values ) )
		return "Can't get VDP_FUNC_ID_VIDEO_MIXER_GET_ATTRIBUTE_VALUES address !!";
		
	if ( !getFunc( VDP_FUNC_ID_VIDEO_MIXER_DESTROY , (void**)&vdp_video_mixer_destroy ) )
		return "Can't get VDP_FUNC_ID_VIDEO_MIXER_DESTROY address !!";
		
	if ( !getFunc( VDP_FUNC_ID_VIDEO_MIXER_RENDER , (void**)&vdp_video_mixer_render ) )
		return "Can't get VDP_FUNC_ID_VIDEO_MIXER_RENDER address !!";
	
	if ( !getFunc( VDP_FUNC_ID_PRESENTATION_QUEUE_TARGET_CREATE_X11 , (void**)&vdp_presentation_queue_target_create_x11 ) )
		return "Can't get VDP_FUNC_ID_PRESENTATION_QUEUE_TARGET_CREATE_X11 address !!";
	
	if ( !getFunc( VDP_FUNC_ID_PRESENTATION_QUEUE_TARGET_DESTROY , (void**)&vdp_presentation_queue_target_destroy ) )
		return "Can't get VDP_FUNC_ID_PRESENTATION_QUEUE_TARGET_DESTROY address !!";
		
	if ( !getFunc( VDP_FUNC_ID_PRESENTATION_QUEUE_CREATE , (void**)&vdp_presentation_queue_create ) )
		return "Can't get VDP_FUNC_ID_PRESENTATION_QUEUE_CREATE address !!";
		
	if ( !getFunc( VDP_FUNC_ID_PRESENTATION_QUEUE_DESTROY , (void**)&vdp_presentation_queue_destroy ) )
		return "Can't get VDP_FUNC_ID_PRESENTATION_QUEUE_DESTROY address !!";
		
	if ( !getFunc( VDP_FUNC_ID_PRESENTATION_QUEUE_SET_BACKGROUND_COLOR , (void**)&vdp_presentation_queue_set_background_color ) )
		return "Can't get VDP_FUNC_ID_PRESENTATION_QUEUE_SET_BACKGROUND_COLOR address !!";
		
	if ( !getFunc( VDP_FUNC_ID_PRESENTATION_QUEUE_GET_BACKGROUND_COLOR , (void**)&vdp_presentation_queue_get_background_color ) )
		return "Can't get VDP_FUNC_ID_PRESENTATION_QUEUE_GET_BACKGROUND_COLOR address !!";
		
	if ( !getFunc( VDP_FUNC_ID_PRESENTATION_QUEUE_GET_TIME , (void**)&vdp_presentation_queue_get_time ) )
		return "Can't get VDP_FUNC_ID_PRESENTATION_QUEUE_GET_TIME address !!";
		
	if ( !getFunc( VDP_FUNC_ID_PRESENTATION_QUEUE_DISPLAY , (void**)&vdp_presentation_queue_display ) )
		return "Can't get VDP_FUNC_ID_PRESENTATION_QUEUE_DISPLAY address !!";
		
	if ( !getFunc( VDP_FUNC_ID_PRESENTATION_QUEUE_BLOCK_UNTIL_SURFACE_IDLE , (void**)&vdp_presentation_queue_block_until_surface_idle ) )
		return "Can't get VDP_FUNC_ID_PRESENTATION_QUEUE_BLOCK_UNTIL_SURFACE_IDLE address !!";
		
	if ( !getFunc( VDP_FUNC_ID_PRESENTATION_QUEUE_QUERY_SURFACE_STATUS , (void**)&vdp_presentation_queue_query_surface_status ) )
		return "Can't get VDP_FUNC_ID_PRESENTATION_QUEUE_QUERY_SURFACE_STATUS address !!";
		
	if ( !getFunc( VDP_FUNC_ID_PREEMPTION_CALLBACK_REGISTER , (void**)&vdp_preemption_callback_register ) )
		return "Can't get VDP_FUNC_ID_PREEMPTION_CALLBACK_REGISTER address !!";
	
	
	unsigned int tmp;
	vdp_get_api_version( &tmp );
	context.append( QString("VDPAU API version : %1\n").arg(tmp) );

	const char *s;
	st = vdp_get_information_string( &s );
	context.append( QString("VDPAU implementation : %1\n\n").arg(s) );
	
	getDecoderCaps();

#ifdef VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L1
	vdp_video_mixer_query_feature_support( vdpDevice, VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L1, &hqScaling );
#endif
	
	return "";
}
Esempio n. 28
0
//功能:在一个函数中检测无效的switch语句
//返回值:返回函数结尾下一行减1
int switchInfunc(int beginFunc)
{
	string func[255] = {""};
	int flen = 0;
	int rowNum = getFunc(func, beginFunc, flen);	

	int i, j, k;
	if(-1 != rowNum)
	{
		int	useFlag = -1;
		int varEqualNum = 0;

		string switchValue = "";  // switch 的值

		string temp = "";
		string single[255] = {""};
		int slen = 0;
		string oneCmdVarName[255] = {""};
		int oneCmdVarLen = 0;
		string switchCmd[255] = {""};
		int switchLen = 0;
		int beginInfunc = 0;

		int pos[10] = {-1};
		int posCount = -1;
		for(i=0; i<flen; i++)
		{
			temp = func[i];
			slen = covertCmd(temp, single);
			if(isIn("switch", single, slen)) //在函数第i行位置 检测到switch语句
			{
				beginInfunc = i;
				int switchPos = getOneSwitch(func, flen, beginInfunc, switchCmd, switchLen); // 得到第一个switch语句
				temp = switchCmd[0];  // switch
				slen = covertCmd(temp, single);
				oneCmdVarLen = getVarFromOneCmd(beginFunc, switchCmd[0], oneCmdVarName);// 得到switch中的变量名
				if(1 == oneCmdVarLen)  //switch中只有一个变量时
				{
					for(j=0; j<oneCmdVarLen; j++)    // 遍历switch中所有变量
					{
						useFlag = -1;
						varEqualNum = 0;
						for(k=i-1; k>=0; k--)   // 在switch语句之前进行检测变量的赋值情况
						{
							temp = func[k];
							slen = covertCmd(temp, single);
							posCount = isContain(oneCmdVarName[j], single, slen, pos);
							int m = 0; // 变量在一行中出现的次数遍历
							if(-1 != posCount)   // 如果出现了变量, 检测最后出现变量的位置是不是a=1的简单形式
							{
								for(m=posCount-1; m>=0; m--) // 从一行最后开始遍历变量
								{
									//single[pos[m]+1] 变量后的第一个字符
									if(">" == single[pos[m]+1] || "<" == single[pos[m]+1] || ">=" == single[pos[m]+1] || 
										"<=" == single[pos[m]+1] || "!=" == single[pos[m]+1] || "+" == single[pos[m]+1] || "-" == single[pos[m]+1] ||
										"*" == single[pos[m]+1] || "/" == single[pos[m]+1])
									{
										continue;
									}
									if("=" == single[pos[m]+1] && onlyNum(single[pos[m]+2])) // a = 数字 的情况
									{
										switchValue = single[pos[m]+2]; // 得到switch的值
										varEqualNum = 1;
										break;
									}
									else
									{
										varEqualNum = -1;
										break;
									}
								}
								if(1 == varEqualNum || -1 == varEqualNum) // 如果continue了就要继续找下一行,而不是退出for循环
									break;
							}	
						}

						if(-1 == varEqualNum)
						{
							// 说明有变量会变
							useFlag = 1;
							break;   // 不是无效分去
						}
					}
					int defaultFlag = -1;
					if(-1 == useFlag)  // 说明一直没有变量变,无效分支
					{
						defaultFlag = -1;
						for(k=0; k<switchLen; k++)
						{
							temp = switchCmd[k];
							slen = covertCmd(temp, single);
							if(isIn("case", single, slen))  // 出现case 分支
							{
								if(switchValue != single[1]) // 当这一行的case值不是switch的时候则报错
								{
									errNum[errLen] = (rowNum-flen+i+1+k);
									errType[errLen] = 3;
									errLen++;
								}
								else   // case值是switch值时,说明default也要报错
									defaultFlag = 1;
							}
						}
						for(k=0; k<switchLen; k++)
						{
							temp = switchCmd[k];
							slen = covertCmd(temp, single);
							if(isIn("default", single, slen) && 1 == defaultFlag)  // 出现case 分支
							{
								errNum[errLen] = (rowNum-flen+i+1+k);
								errType[errLen] = 3;
								errLen++;
							}
						}
					}
				}//switch中只有一个变量时
				
				int defaultFlag = -1;
				if(0 == oneCmdVarLen)  // 说明switch里面没有变量
				{
					temp = switchCmd[0];
					slen = covertCmd(temp, single);
					if(onlyNum(single[2]) && ")" == single[3])   // switch(1) 的形式
					{
						switchValue = single[2];
						defaultFlag = -1;
						for(k=0; k<switchLen; k++)
						{
							temp = switchCmd[k];
							slen = covertCmd(temp, single);
							if(isIn("case", single, slen))  // 出现case 分支
							{
								if(switchValue != single[1]) // 当这一行的case值不是switch的时候则报错
								{
									errNum[errLen] = (rowNum-flen+i+1+k);
									errType[errLen] = 3;
									errLen++;
								}
								else   // case值是switch值时,说明default也要报错
									defaultFlag = 1;
							}
						}
						for(k=0; k<switchLen; k++)
						{
							temp = switchCmd[k];
							slen = covertCmd(temp, single);
							if(isIn("default", single, slen) && 1 == defaultFlag)  // 出现case 分支
							{
								errNum[errLen] = (rowNum-flen+i+1+k);
								errType[errLen] = 3;
								errLen++;
							}
						}
					}
				}
			}   // 检测到switch的位置
		}
	}
	return rowNum;
}
Esempio n. 29
0
X86CompilerVar* X86Compiler::_newVar(const char* name, uint32_t type, uint32_t size)
{
  X86CompilerVar* var = reinterpret_cast<X86CompilerVar*>(_zoneMemory.alloc(sizeof(X86CompilerVar)));
  if (var == NULL) return NULL;

  char nameBuffer[32];
  if (name == NULL)
  {
    sprintf(nameBuffer, "var_%d", _varNameId);
    name = nameBuffer;
    _varNameId++;
  }

  var->_name = _zoneMemory.sdup(name);
  var->_id = static_cast<uint32_t>(_vars.getLength()) | kOperandIdTypeVar;

  var->_type = static_cast<uint8_t>(type);
  var->_class = x86VarInfo[type].getClass();
  var->_priority = 10;

  var->_isRegArgument = false;
  var->_isMemArgument = false;
  var->_isCalculated = false;
  var->_unused = 0;

  var->_size = size;

  var->firstItem = NULL;
  var->lastItem = NULL;
  var->funcScope = getFunc();
  var->funcCall = NULL;

  var->homeRegisterIndex = kRegIndexInvalid;
  var->prefRegisterMask = 0;

  var->homeMemoryOffset = 0;
  var->homeMemoryData = NULL;

  var->regIndex = kRegIndexInvalid;
  var->workOffset = kInvalidValue;

  var->nextActive = NULL;
  var->prevActive = NULL;

  var->state = kVarStateUnused;
  var->changed = false;
  var->saveOnUnuse = false;

  var->regReadCount = 0;
  var->regWriteCount = 0;
  var->regRwCount = 0;

  var->regGpbLoCount = 0;
  var->regGpbHiCount = 0;

  var->memReadCount = 0;
  var->memWriteCount = 0;
  var->memRwCount = 0;

  var->tPtr = NULL;

  _vars.append(var);
  return var;
}
Esempio n. 30
0
//功能:情况三考虑在一个函数中的情况,判断思想是找到if语句中所有的变量名,然后在if语句之前往上查找,如果最后一次出现该变量时是
//+"a=常数"的情况,如果最后是"a>、<、>=、<=、!=、+、-、*、/"的情况就跳过继续往上查,则判断为该变量是不变的,不过这样会有很多的bug,待解决啊……
int ifFunc3(int begin)
{
	string func[255] = {""};
	int flen = 0;
	int rowNum = getFunc(func, begin, flen);	

	int i, j, k;
	if(-1 != rowNum)
	{
		int varEqualNum = 0;
		int useFlag = -1;

		string single[255] = {""};
		int slen = 0;
		string temp = "";

		string oneCmdVarName[255] = {""};
		int cmdVarLen = 0;

		int pos[10] = {-1};
		int posCount = -1;
		for(i=0; i<flen; i++)
		{
			temp = func[i];
			slen = covertCmd(temp, single);

			if(isIn("if", single, slen))  // 在func[i]中检测到if语句
			{
				cmdVarLen = getVarFromOneCmd(begin, temp, oneCmdVarName);  // 得到if条件中变量名

				for(j=0; j<cmdVarLen; j++)    // 遍历if中所有变量
				{
					useFlag = -1;
					varEqualNum = 0;
					for(k=i-1; k>=0; k--)   // 在if语句之前进行检测变量的赋值情况
					{
						temp = func[k];
						slen = covertCmd(temp, single);
						posCount = isContain(oneCmdVarName[j], single, slen, pos);
						int m = 0; // 变量在一行中出现的次数遍历
						if(-1 != posCount)   // 如果出现了变量, 检测最后出现变量的位置是不是a=1的简单形式
						{
							for(m=posCount-1; m>=0; m--) // 从一行最后开始遍历变量
							{
								//single[pos[m]+1] 变量后的第一个字符
								if(">" == single[pos[m]+1] || "<" == single[pos[m]+1] || ">=" == single[pos[m]+1] || 
									"<=" == single[pos[m]+1] || "!=" == single[pos[m]+1] || "+" == single[pos[m]+1] || "-" == single[pos[m]+1] ||
									"*" == single[pos[m]+1] || "/" == single[pos[m]+1])
								{
									continue;
								}
								if("=" == single[pos[m]+1] && onlyNum(single[pos[m]+2])) // a = 数字 的情况
								{
									varEqualNum = 1;
									break;
								}
								else
								{
									varEqualNum = -1;
									break;
								}
							}
							if(1 == varEqualNum || -1 == varEqualNum) // 如果continue了就要继续找下一行,而不是退出for循环
								break;
						}	
					}

					if(-1 == varEqualNum)
					{
						// 说明有变量会变
						useFlag = 1;
						break;   // 不是无效分去
					}
				}

				if(-1 == useFlag)  // 说明一直没有变量变,无效分支
				{
					errNum[errLen] = rowNum-flen+i+1;
					errType[errLen] = 3;
					errLen++;
				}
			}
		}
	}

	return rowNum;
}