void SimpleBackend::tryNextFunction () {
	RK_TRACE (PHP);

	if ((!busy) && (!command_stack.isEmpty ())) {
		// clean up previous command if applicable
		if (command_stack.first ()->complete) {
			delete command_stack.first ();
			command_stack.pop_front ();

			if (!command_stack.count ()) return;
		}

		busy = true;
		command_stack.first ()->complete = true;
		current_flags = command_stack.first ()->flags;
		current_type = command_stack.first ()->type;

		current_values.clear ();
		template_pos = 0;
		if (current_type == Preprocess) current_template = preprocess_template;
		else if (current_type == Printout) current_template = printout_template;
		else if (current_type == Calculate) current_template = calculate_template;
		else if (current_type == Preview) current_template = preview_template;
		template_sep = current_template.indexOf ("!!!");

		if (template_sep < 0) {
			commandFinished ("");
			return;
		}

		processCall ();
	}
}
示例#2
0
    void
    serverPstreamConn_impl::processRecdPacket(packetPtr const callPacketP,
                                              callInfo *const callInfoP) {

        packetPtr responsePacketP;
        try {
            processCall(this->registryP, callPacketP, callInfoP,
                        &responsePacketP);
        } catch (exception const &e) {
            throwf("Error executing received packet as an XML-RPC RPC.  %s",
                   e.what());
        }
        try {
            this->packetSocketP->writeWait(responsePacketP);
        } catch (exception const &e) {
            throwf("Failed to write the response to the packet socket.  %s",
                   e.what());
        }
    }
示例#3
0
void StackMachine::execute(Code * code) {
    code_ = code;
    data_stack_.reserve(max_stack_size_);
    return_addresses_.reserve(max_stack_size_);
    stack_frame_starts_.reserve(max_stack_size_);

    stack_top_ptr_ = data_stack_.data();
    return_addresses_top_ptr_ = return_addresses_.data();
    stack_frame_starts_top_ptr_ = stack_frame_starts_.data();

    current_stack_frame_start_ = stack_top_ptr_;

    frame_start_of_last_function_call_.reserve(functionsCount(code));
    current_function_ = nullptr;

    processCall(0);

    run();
}
示例#4
0
int main (int argc, char *argv[])
{
  int currArg = 1;
  int lastArg = 0;
  int i;
  
  if(argc < 4 || argc > 8) {
    printError("Usage: PDGCS_read [-g] [-TARG:abi=nXX] [-TENV:PIC] -o <output_file> <input_file>\n");
    exit(1);
  }

  while( lastArg != currArg ){
	lastArg = currArg;
	if(!strncmp(argv[currArg], "-g",2)) {
	    if(argv[currArg][2] == '\0')
	       Debug_Level = 2;
	    else
	       Debug_Level = atoi(&argv[currArg][2]);
	    currArg++;
	}
	
	if (!strncmp(argv[currArg], "-ej",3)) {
		One_Trip_Do_Loops = 1;
		currArg++;
	}

	if (!strncmp(argv[currArg], "-YVF_CHAR",9)) {
		VF_CHAR_OPTION = 1;
		currArg++;
	}
	
	if (!strncmp(argv[currArg], "-TENV:PIC",9)) {
		Gen_PIC_Shared = 1;
		currArg++;
	}
	
	if (!strncmp(argv[currArg], "-TARG:abi=n32",13)) {
		ABI_Name = "n32";
		currArg++;
	}
	
	if (!strncmp(argv[currArg], "-TARG:abi=n64",13)) {
		ABI_Name = "n64";
		currArg++;
	}
	
	if (!strncmp(argv[currArg], "-std_return",11)) {
		Standard_Return = 1;
		currArg++;
	}
 	
	if(!strncmp(argv[currArg], "-f90debug_names:folded",22)){
		Debug_Name_Folding = 1;
		currArg++;
	}

	if(!strncmp(argv[currArg], "-f90debug_names:asis",20)){
		Debug_Name_Folding = 0;
		currArg++;
	}
  }

  PDGCS_entry_no_SGI_fe();

  if(strcmp(argv[currArg], "-o")) {
    printError("Usage: no output file specified\n");
    for(i = 0; i < argc; i++)
      printf("%s\n", argv[i]);
  }
  currArg++;

  Irb_File_Name = strdup(argv[currArg]);
  currArg++;
  
  infile = fopen(argv[currArg], "r");
  
  if(!infile)
  {
    char buf[1024];
    sprintf(buf, "Unable to open file: \"%s\"", argv[currArg]);
    printError(buf);
  }
    
  initPdgTbl();
  
  while(processCall());
  
  return 0;
}
示例#5
0
void StackMachine::run() {
    while (true) {
        Instruction current_instruction = currentBytecode().getInsn(current_location_++);
        char const * v  = 0;
        switch (current_instruction) {
        case BC_DLOAD:
            push(currentBytecode().getDouble(current_location_));
            current_location_ += sizeof(double);
            break;
        case BC_DLOAD0:
            push(0.0);
            break;
        case BC_DLOAD1:
            push(1.0);
            break;
        case BC_ILOAD:
            push(currentBytecode().getInt64(current_location_));
            current_location_ += sizeof(vm_int_t);
            break;
        case BC_ILOAD0:
            push(vm_int_t(0L));
            break;
        case BC_ILOAD1:
            push(vm_int_t(1L));
            break;
        case BC_SLOAD:
            push(code_->constantById(getCurrent2BytesAndShiftLocation()).c_str());
            break;
        case BC_SLOAD0:
            push(__EMPTY_STRING);
            break;
        case BC_DADD:
            PUSH_BINARY_RESULT(double, std::plus<double>());
            break;
        case BC_DSUB:
            PUSH_BINARY_RESULT(double, std::minus<double>());
            break;
        case BC_DMUL:
            PUSH_BINARY_RESULT(double, std::multiplies<double>());
            break;
        case BC_DDIV:
            PUSH_BINARY_RESULT(double, std::divides<double>());
            break;
        case BC_IADD:
            PUSH_BINARY_RESULT(vm_int_t, std::plus<vm_int_t>());
            break;
        case BC_ISUB:
            PUSH_BINARY_RESULT(vm_int_t, std::minus<vm_int_t>());
            break;
        case BC_IMUL:
            PUSH_BINARY_RESULT(vm_int_t, std::multiplies<vm_int_t>());
            break;
        case BC_IDIV:
            PUSH_BINARY_RESULT(vm_int_t, std::divides<vm_int_t>());
            break;
        case BC_IMOD:
            PUSH_BINARY_RESULT(vm_int_t, std::modulus<vm_int_t>());
            break;
        case BC_IAOR:
            PUSH_BINARY_RESULT(vm_int_t, std::bit_or<vm_int_t>());
            break;
        case BC_IAAND:
            PUSH_BINARY_RESULT(vm_int_t, std::bit_and<vm_int_t>());
            break;
        case BC_IAXOR:
            PUSH_BINARY_RESULT(vm_int_t, std::bit_xor<vm_int_t>());
            break;
        case BC_DCMP:
            PUSH_BINARY_RESULT_(double, vm_int_t, cmp<double>);
            break;
        case BC_ICMP:
            PUSH_BINARY_RESULT(vm_int_t, cmp<vm_int_t>);
            break;
        case BC_DNEG:
            push(-popDouble());
            break;
        case BC_INEG:
            push(-popInt());
            break;
        case BC_IPRINT:
            os_ << popInt();
            os_.flush();
            break;
        case BC_DPRINT:
            os_ << popDouble();
            os_.flush();
            break;
        case BC_SPRINT:
            v = popString();
            os_ << (v == 0 ? "" : v);
            os_.flush();
            break;
        case BC_I2D:
            push((double) popInt());
            break;
        case BC_S2I:
            v = popString();
            try {
                push((vm_int_t) v);
            } catch (std::exception & e) {
                throwError("S2I conversion error: " + string(v));
            }
            break;
        case BC_D2I:
            push((vm_int_t) popDouble());
            break;
        case BC_POP:
            pop();
            break;
        case BC_LOADDVAR0:
            loadLocalVar<double>(0);
            break;
        case BC_LOADDVAR1:
            loadLocalVar<double>(1);
            break;
        case BC_LOADDVAR2:
            loadLocalVar<double>(2);
            break;
        case BC_LOADDVAR3:
            loadLocalVar<double>(3);
            break;
        case BC_LOADDVAR:
            loadLocalVar<double>(getCurrent2BytesAndShiftLocation());
            break;
        case BC_LOADIVAR0:
            loadLocalVar<vm_int_t>(0);
            break;
        case BC_LOADIVAR1:
            loadLocalVar<vm_int_t>(1);
            break;
        case BC_LOADIVAR2:
            loadLocalVar<vm_int_t>(2);
            break;
        case BC_LOADIVAR3:
            loadLocalVar<vm_int_t>(3);
            break;
        case BC_LOADIVAR:
            loadLocalVar<vm_int_t>(getCurrent2BytesAndShiftLocation());
            break;
        case BC_LOADSVAR0:
            loadLocalVar<vm_str_t>(0);
            break;
        case BC_LOADSVAR1:
            loadLocalVar<vm_str_t>(1);
            break;
        case BC_LOADSVAR2:
            loadLocalVar<vm_str_t>(2);
            break;
        case BC_LOADSVAR3:
            loadLocalVar<vm_str_t>(3);
            break;
        case BC_LOADSVAR:
            loadLocalVar<vm_str_t>(getCurrent2BytesAndShiftLocation());
            break;
        case BC_STOREDVAR0:
            storeLocalVar<double>(0);
            break;
        case BC_STOREDVAR1:
            storeLocalVar<double>(1);
            break;
        case BC_STOREDVAR2:
            storeLocalVar<double>(2);
            break;
        case BC_STOREDVAR3:
            storeLocalVar<double>(3);
            break;
        case BC_STOREDVAR:
            storeLocalVar<double>(getCurrent2BytesAndShiftLocation());
            break;
        case BC_STOREIVAR0:
            storeLocalVar<vm_int_t>(0);
            break;
        case BC_STOREIVAR1:
            storeLocalVar<vm_int_t>(1);
            break;
        case BC_STOREIVAR2:
            storeLocalVar<vm_int_t>(2);
            break;
        case BC_STOREIVAR3:
            storeLocalVar<vm_int_t>(3);
            break;
        case BC_STOREIVAR:
            storeLocalVar<vm_int_t>(getCurrent2BytesAndShiftLocation());
            break;
        case BC_STORESVAR0:
            storeLocalVar<vm_str_t>(0);
            break;
        case BC_STORESVAR1:
            storeLocalVar<vm_str_t>(1);
            break;
        case BC_STORESVAR2:
            storeLocalVar<vm_str_t>(2);
            break;
        case BC_STORESVAR3:
            storeLocalVar<vm_str_t>(3);
            break;
        case BC_STORESVAR:
            storeLocalVar<vm_str_t>(getCurrent2BytesAndShiftLocation());
            break;
        case BC_LOADCTXDVAR:
            processLoadContextVar<double>();
            break;
        case BC_LOADCTXIVAR:
            processLoadContextVar<vm_int_t>();
            break;
        case BC_LOADCTXSVAR:
            processLoadContextVar<vm_str_t>();
            break;
        case BC_STORECTXDVAR:
            processStoreContextVar<double>();
            break;
        case BC_STORECTXIVAR:
            processStoreContextVar<vm_int_t>();
            break;
        case BC_STORECTXSVAR:
            processStoreContextVar<vm_str_t>();
            break;
        case BC_JA:
            current_location_ = calculateTransitionAndShiftLocation();
            continue;
        case BC_IFICMPE:
        case BC_IFICMPNE:
        case BC_IFICMPL:
        case BC_IFICMPLE:
        case BC_IFICMPG:
        case BC_IFICMPGE: {
            index_t transition = calculateTransitionAndShiftLocation();

            vm_int_t a = popInt();
            vm_int_t b = popInt();

            if (ifSatisfied(current_instruction, cmp(a, b))) {
                current_location_= transition;
                continue;
            }
            break;
        }
        case BC_CALL:
            processCall(getCurrent2BytesAndShiftLocation());
            break;
        case BC_CALLNATIVE:
            processNativeCall(getCurrent2BytesAndShiftLocation());
            continue;
        case BC_RETURN:
            if (processReturn()) {
                return;
            }
            continue;
        default:
            throwError("unsupported insn=" + string(bytecodeName(current_instruction)));
            return;
        }
    }
}
示例#6
0
Status *BytecodeInterpreter::execute(vector<Var *> &) try {
    #ifdef BCPRINT
    disassemble();
    return Status::Ok();
    #endif

    #ifdef MATHVM_WITH_SDL
    pre_init_sdl();
    #endif

    processCall(0);
    while (pointer() < bc()->length()) {
        Instruction instruction = next();
        switch (instruction) {
            case BC_INVALID:    throw "Invalid code";
            case BC_DLOAD:      operandStack.push_back(bc_read<double>()); break;
            case BC_ILOAD:      operandStack.push_back(bc_read<int64_t>()); break;
            case BC_SLOAD:      operandStack.push_back(constantById(bc_read<uint16_t>()).c_str()); break;
            case BC_DLOAD0:     operandStack.push_back((double)0); break;
            case BC_ILOAD0:     operandStack.push_back((int64_t)0); break;
            case BC_SLOAD0:     operandStack.push_back(constantById(0).c_str()); break;
            case BC_DLOAD1:     operandStack.push_back((double)1.0); break;
            case BC_ILOAD1:     operandStack.push_back((int64_t)1); break;
            case BC_DLOADM1:    operandStack.push_back((double) - 1.0); break;
            case BC_ILOADM1:    operandStack.push_back((int64_t) - 1); break;
            case BC_DADD:       operandStack.push_back(pop_return().d + pop_return().d); break;
            case BC_IADD:       operandStack.push_back(pop_return().i + pop_return().i); break;
            case BC_DSUB:       operandStack.push_back(pop_return().d - pop_return().d); break;
            case BC_ISUB:       operandStack.push_back(pop_return().i - pop_return().i); break;
            case BC_DMUL:       operandStack.push_back(pop_return().d * pop_return().d); break;
            case BC_IMUL:       operandStack.push_back(pop_return().i * pop_return().i); break;
            case BC_DDIV:       operandStack.push_back(pop_return().d / pop_return().d); break;
            case BC_IDIV:       operandStack.push_back(pop_return().i / pop_return().i); break;
            case BC_IMOD:       operandStack.push_back(pop_return().i % pop_return().i); break;
            case BC_IAOR:       operandStack.push_back(pop_return().i | pop_return().i); break;
            case BC_IAAND:      operandStack.push_back(pop_return().i & pop_return().i); break;
            case BC_IAXOR:      operandStack.push_back(pop_return().i ^ pop_return().i); break;
            case BC_DNEG:       operandStack.back().d = -operandStack.back().d; break;
            case BC_INEG:       operandStack.back().i = -operandStack.back().i; break;
            case BC_DPRINT:     std::cout << pop_return().d << std::flush; break;
            case BC_IPRINT:     std::cout << pop_return().i << std::flush; break;
            case BC_SPRINT:     std::cout << pop_return().c << std::flush; break;
            case BC_I2D:        operandStack.back().d = operandStack.back().i; break;
            case BC_D2I :       operandStack.back().i = operandStack.back().d; break;
            case BC_S2I:        operandStack.back().i = reinterpret_cast<int64_t>(operandStack.back().c); break;
            case BC_SWAP:       std::iter_swap(operandStack.end() - 1, operandStack.end() - 2); break;
            case BC_POP:        operandStack.pop_back(); break;
            case BC_LOADDVAR:
            case BC_LOADIVAR:
            case BC_LOADSVAR:   operandStack.push_back(value(bc_read<uint16_t>())); break;
            case BC_STOREDVAR:
            case BC_STOREIVAR:
            case BC_STORESVAR:  value(bc_read<uint16_t>()) = pop_return(); break;
            case BC_LOADCTXDVAR:
            case BC_LOADCTXIVAR:
            case BC_LOADCTXSVAR: operandStack.push_back(value(bc_read<uint16_t>(), bc_read<uint16_t>())); break;
            case BC_STORECTXDVAR:
            case BC_STORECTXIVAR:
            case BC_STORECTXSVAR: value(bc_read<uint16_t>(), bc_read<uint16_t>()) = pop_return(); break;
            case BC_DCMP:       operandStack.push_back(compare<double>(pop_return().d, pop_return().d)); break;
            case BC_ICMP:       operandStack.push_back(compare<int64_t>(pop_return().i, pop_return().i)); break;
            case BC_JA:         pointer() += bc()->getInt16(pointer()); break;
            case BC_IFICMPE:    pointer() += pop_return().i == pop_return().i ? bc()->getInt16(pointer()) : sizeof(int16_t); break;
            case BC_IFICMPNE:   pointer() += pop_return().i != pop_return().i ? bc()->getInt16(pointer()) : sizeof(int16_t); break;
            case BC_IFICMPG:    pointer() += pop_return().i >  pop_return().i ? bc()->getInt16(pointer()) : sizeof(int16_t); break;
            case BC_IFICMPGE:   pointer() += pop_return().i >= pop_return().i ? bc()->getInt16(pointer()) : sizeof(int16_t); break;
            case BC_IFICMPL:    pointer() += pop_return().i <  pop_return().i ? bc()->getInt16(pointer()) : sizeof(int16_t); break;
            case BC_IFICMPLE:   pointer() += pop_return().i <= pop_return().i ? bc()->getInt16(pointer()) : sizeof(int16_t); break;
            case BC_CALL:       processCall(bc_read<uint16_t>()); break;
            case BC_CALLNATIVE: processNativeCall(bc_read<uint16_t>()); break;
            case BC_RETURN:     processReturn(); break;
            case BC_BREAK:      break;
            case BC_DUMP:       std::cout << operandStack.back().i << std::endl; break;
            case BC_STOP:       return Status::Warning("Execution stopped");
            default: throw "Not implemented"; break;
        }
    }
    return Status::Ok();
} catch (const char *msg) {
    return Status::Error(msg);
}
示例#7
0
 virtual double Run(CVectorBratAlgorithmParam& args) override
 {
     double result;
     return processCall( PyObject_CallMethod( m_instance, ccast( "Run" ),ccast( "(O)"), createPyArguments( args ) ), result );
 }
void SimpleBackend::writeData (const QString &data) {
	RK_TRACE (PHP);

	current_values.append (data);
	processCall ();
}
示例#9
0
 virtual std::string GetOutputUnit() const override
 {
     std::string result;
     return processCall( PyObject_CallMethod( m_instance, ccast( "GetOutputUnit" ), nullptr ), result );
 }
示例#10
0
 virtual std::string GetInputParamUnit(uint32_t indexParam) const override
 {
     std::string result;
     return processCall( PyObject_CallMethod( m_instance, ccast( "GetInputParamUnit" ), ccast( "(i)" ), indexParam ), result );
 }
示例#11
0
 virtual CBratAlgorithmParam::bratAlgoParamTypeVal GetInputParamFormat(uint32_t indexParam) const override
 {
     uint32_t result;
     return (CBratAlgorithmParam::bratAlgoParamTypeVal)
             processCall( PyObject_CallMethod( m_instance, ccast( "GetInputParamFormat" ), ccast( "(i)" ), indexParam ), result );
 }
示例#12
0
 virtual uint32_t GetNumInputParam() const override
 {
     uint32_t result;
     return processCall( PyObject_CallMethod( m_instance, ccast( "GetNumInputParam" ), nullptr ), result );
 }
示例#13
0
 virtual std::string GetDescription() const override
 {
     std::string result;
     return processCall( PyObject_CallMethod( m_instance, ccast( "GetDescription" ), nullptr ), result );
 }