예제 #1
0
파일: v8base.cpp 프로젝트: pgmsoul/GitLib
	//*,{
	//	"type":"function",
	//	"name":"setConfig(callback,[filename])",
	//	"text":"读取或设置配置文件,配置文件是一个 Json 格式的文本文件,可以是 utf-8 获取 ansi 编码。",
	//	"param":[
	//		{
	//			"type":"function",
	//			"name":"callback(cfg)",
	//			"text":"setConfig 函数如果成功,会触发这个回调函数,cfg 是一个对象,它的属性就是配置内容,对这个对象的任何更改最后都会作为 Json 格式保存到配置文件。"
	//		},
	//		{
	//			"type":"string",
	//			"name":"[filename]",
	//			"text":"配置文件名,缺省是和脚本同路径同名的一个后缀为“.json”的文本文件,如果指定了文件名,则读取和保存对应的文件。"
	//		}
	//	],
	//	"return":{
	//		"type":"boolean",
	//		"text":"如果成功打开了配置文件,函数返回 true,否则返回 undefined。"
	//	}
	//}//*
	Handle<Value> setConfig(const Arguments& args){
		HandleScope stack;
		while(true){
			if(args.Length()<1) break;
			if(!args[0]->IsFunction()) break;
			cs::String file;
			if(args.Length()>1)
				GetString(args[1],file);
			cs::Config cfg(file);
			cs::Json* json = cfg.Lock();
			if(!json) break;

			json->ToString(file,false);
			Handle<Object> glb = GetGlobal();
			Handle<Object> JSON = glb->Get(NEW_STR(JSON))->ToObject();
			Handle<Function> parse = Handle<Function>::Cast(JSON->Get(NEW_STR(parse)));
			Handle<Function> stringify = Handle<Function>::Cast(JSON->Get(NEW_STR(stringify)));
			Handle<Function> callback = Handle<Function>::Cast(args[0]);
			Handle<Value> argv[3];
			argv[0] = NEW_WSTR(file.Handle());
			Handle<Value> v = parse->Call(JSON,1,argv);
			if(v.IsEmpty()||!v->IsObject()) v = Object::New();
			argv[0] = v;
			CallFunc(glb,callback,1,argv);
			v = stringify->Call(JSON,1,argv);
			GetString(v,file);
			json->Parse(file);
			return True();
		}
		return Undefined();
	}
예제 #2
0
int Scene::Tick(int* currFunction, int* currTask) {
  if(IsDone())
    return (int)SUCCES;

  if(stack.empty())
      return (int)FAILURE;

  // Go to stack and execute last entry if not null-pointer. If null-pointer, remove and take next. If stack is empty, return false.
  while(functions[stack.back().x][stack.back().y] == UNDEFINED) { // Find entry which is not undefined
    stack.pop_back();
    if(stack.empty())
      return FAILURE; // No more commmands. We already checked if we solved the task, so we return FAILURE
  }
  
  *currFunction = stack.back().x;
  *currTask = stack.back().y;
  // Execute function
  int returnValue = CallFunc(functions[stack.back().x][stack.back().y]);
  // (x, y+1) into stack.
  stack.back().y++;

  // If return is not -1, put (return, 0) into stack;
  if(returnValue != -1)
    stack.push_back((Pos){returnValue, 0});

  return (int)NOT_DONE;
}
예제 #3
0
파일: sana2.cpp 프로젝트: sunfirefox/WinUAE
static uae_u32 copyfrombuff (TrapContext *ctx, uaecptr from, uaecptr to, uae_u32 len, uaecptr func)
{
	m68k_areg (regs, 0) = to;
	m68k_areg (regs, 1) = from;
	m68k_dreg (regs, 0) = len;
	return CallFunc (ctx, func);
}
예제 #4
0
파일: sana2.cpp 프로젝트: sunfirefox/WinUAE
static uae_u32 packetfilter (TrapContext *ctx, uaecptr hook, uaecptr ios2, uaecptr data)
{
	uae_u32 a2, v;

	a2 = m68k_areg (regs, 2);
	m68k_areg (regs, 0) = hook;
	m68k_areg (regs, 2) = ios2;
	m68k_areg (regs, 1) = data;
	v = CallFunc (ctx, get_long (hook + 8));
	m68k_areg (regs, 2) = a2;
	return v;
}
예제 #5
0
s64 SysCalls::DoSyscall(u32 code)
{
	if(code < 0x400)
	{
		if(sc_table[code])
		{
			(*sc_table[code])();
			return SC_ARGS_1;
		}

		//TODO: remove this
		switch(code)
		{
			//process
			case 2: return lv2ProcessWaitForChild(CPU);
			case 4: return lv2ProcessGetStatus(CPU);
			case 5: return lv2ProcessDetachChild(CPU);
			case 12: return lv2ProcessGetNumberOfObject(CPU);
			case 13: return lv2ProcessGetId(CPU);
			case 18: return lv2ProcessGetPpid(CPU);
			case 19: return lv2ProcessKill(CPU);
			case 23: return lv2ProcessWaitForChild2(CPU);
			case 25: return lv2ProcessGetSdkVersion(CPU);
			//timer
			case 141:
			case 142:
				Sleep(SC_ARGS_1 / (1000 * 1000));
			return 0;

			//tty
			case 988:
				ConLog.Warning("SysCall 988! r3: 0x%llx, r4: 0x%llx, pc: 0x%llx",
					CPU.GPR[3], CPU.GPR[4], CPU.PC);
			return 0;

			case 999:
				dump_enable = !dump_enable;
				ConLog.Warning("Dump %s", dump_enable ? "enabled" : "disabled");
			return 0;
		}
		ConLog.Error("Unknown syscall: %d - %08x", code, code);
		return 0;
	}
	
	if(CallFunc(code)) return SC_ARGS_1;

	//ConLog.Error("Unknown function 0x%08x", code);
	//return 0;

	//TODO: remove this
	return DoFunc(code);
}
예제 #6
0
llvm::Value *CodeGen::CallMulWithOverflow(llvm::Value *left, llvm::Value *right,
                                          llvm::Value *&overflow_bit) {
  PELOTON_ASSERT(left->getType() == right->getType());
  llvm::Function *mul_func = llvm::Intrinsic::getDeclaration(
      &GetModule(), llvm::Intrinsic::smul_with_overflow, left->getType());

  // Perform the multiplication
  llvm::Value *mul_result = CallFunc(mul_func, {left, right});

  // Pull out the overflow bit from the resulting aggregate/struct
  overflow_bit = GetBuilder().CreateExtractValue(mul_result, 1);

  // Pull out the actual result of the subtraction
  return GetBuilder().CreateExtractValue(mul_result, 0);
}
예제 #7
0
llvm::Value *CodeGen::CallSubWithOverflow(llvm::Value *left, llvm::Value *right,
                                          llvm::Value *&overflow_bit) {
  PELOTON_ASSERT(left->getType() == right->getType());

  // Get the intrinsic that does the addition with overflow checking
  llvm::Function *sub_func = llvm::Intrinsic::getDeclaration(
      &GetModule(), llvm::Intrinsic::ssub_with_overflow, left->getType());

  // Perform the subtraction
  llvm::Value *sub_result = CallFunc(sub_func, {left, right});

  // Pull out the overflow bit from the resulting aggregate/struct
  overflow_bit = GetBuilder().CreateExtractValue(sub_result, 1);

  // Pull out the actual result of the subtraction
  return GetBuilder().CreateExtractValue(sub_result, 0);
}
예제 #8
0
void SysCalls::DoSyscall(u32 code)
{
	if(code < 1024)
	{
		(*sc_table[code])();
		return;
	}
	
	if(CallFunc(code))
	{
		return;
	}
	//ConLog.Error("Unknown function 0x%08x", code);
	//return 0;

	//TODO: remove this
	declCPU();
	RESULT(DoFunc(code));
}
예제 #9
0
llvm::Value *CodeGen::CallPrintf(const std::string &format,
                                 const std::vector<llvm::Value *> &args) {
  auto *printf_fn = LookupBuiltin("printf");
  if (printf_fn == nullptr) {
    printf_fn = RegisterBuiltin(
        "printf", llvm::TypeBuilder<int(char *, ...), false>::get(GetContext()),
        reinterpret_cast<void *>(printf));
  }
  auto &ir_builder = code_context_.GetBuilder();
  auto *format_str =
      ir_builder.CreateGEP(ConstString(format), {Const32(0), Const32(0)});

  // Collect all the arguments into a vector
  std::vector<llvm::Value *> printf_args{format_str};
  printf_args.insert(printf_args.end(), args.begin(), args.end());

  // Call the function
  return CallFunc(printf_fn, printf_args);
}
예제 #10
0
파일: traps.cpp 프로젝트: Blonder/WinUAE
uae_u32 trap_call_func(TrapContext *ctx, uaecptr func)
{
	uae_u32 v;
	if (trap_is_indirect_null(ctx)) {
		uae_u8 *p = ctx->host_trap_data + RTAREA_TRAP_DATA_EXTRA;
		for (int i = 0; i < 16; i++) {
			if (ctx->calllib_reg_inuse[i]) {
				put_long_host(p, ctx->calllib_regs[i]);
				ctx->calllib_reg_inuse[i] = 0;
			} else {
				put_long_host(p, ctx->saved_regs.regs[i]);
			}
			p += 4;
		}
		v = call_hardware_trap_back(ctx, TRAPCMD_CALL_FUNC, func, ctx->amiga_trap_data + RTAREA_TRAP_DATA_EXTRA, 0, 0);
	} else {
		uae_u32 storedregs[16];
		bool storedregsused[16];
		for (int i = 0; i < 16; i++) {
			storedregsused[i] = false;
			if (ctx->calllib_reg_inuse[i]) {
				if ((i & 7) >= 2) {
					storedregsused[i] = true;
					storedregs[i] = regs.regs[i];
				}
				regs.regs[i] = ctx->calllib_regs[i];
			}
			ctx->calllib_reg_inuse[i] = 0;
		}
		v = CallFunc(ctx, func);
		for (int i = 0; i < 16; i++) {
			if (storedregsused[i]) {
				regs.regs[i] = storedregs[i];
			}
		}
	}
	return v;
}
예제 #11
0
void Thread::run() //called automatically when we start the thread
{
	emit CallFunc(SArg1); //must be directly connected to thread for progress bar to work! (
}
예제 #12
0
void Switch::spawnBombInRoom() {
  Value nil;
  // run the script where we call our c++ function
  CallFunc(luaState, "spawn_bombs", nil); 

}
예제 #13
0
파일: main.cpp 프로젝트: CCJY/coliru
int main()
{
    std::cout << CallFunc(&Foo::pfnFoo, 100U, 0.5) << std::endl;
    std::cout << CallFunc<UINT, UINT, double>(&Foo::pfnFoo, 100, 0.5f) << std::endl;
}
예제 #14
0
llvm::Value *CodeGen::Sqrt(llvm::Value *val) {
  llvm::Function *sqrt_func = llvm::Intrinsic::getDeclaration(
      &GetModule(), llvm::Intrinsic::sqrt, val->getType());
  return CallFunc(sqrt_func, {val});
}