コード例 #1
0
extern "C" int Channel9_environment_initialize(Channel9::Environment *env, const std::string &boot_path)
{
	FFIDefinition *args = new FFIDefinition("Puts Arguments");
	args->add_pointer();
	FFICall *puts_call = new FFICall("puts", ffi_fn(puts), &ffi_type_sint, args);


	env->set_special_channel("ffi_puts", Channel9::value(puts_call));
	env->set_special_channel("hello_test_channel", Channel9::value(test_channel));
	return 0;
}
コード例 #2
0
	void send(Environment *env, const Value &val, const Value &ret)
	{
		if (is(val, MESSAGE))
		{
			Message *msg = ptr<Message>(val);
			if (msg->arg_count() >= 2)
			{
				FFIDefinition *types = new FFIDefinition("sprintf args");
				types->add_pointer(m_string_holder); // output pointer
				types->add_pointer(); // format string

				Message::const_iterator it;
				for (it = msg->args()+2; it != msg->args_end(); it++)
				{
					switch (type(*it))
					{
					case POSITIVE_NUMBER:
					case NEGATIVE_NUMBER:
						types->add(&ffi_type_sint);
						break;
					case FLOAT_NUM:
						types->add(&ffi_type_double);
						break;
					case NIL:
					case UNDEF:
					case STRING:
						types->add_pointer();
						break;
					case BFALSE:
					case BTRUE:
						types->add(&ffi_type_uint);
						break;
					default:
						throw std::runtime_error("Invalid input given to sprintf");
					}
				}

				FFICall *sprintf_call = new FFICall("asprintf", ffi_fn(asprintf), &ffi_type_sint, types);
				sprintf_call->send(env, value(msg), ret);
				return;
			}
		}
		channel_send(env, ret, val, value(&no_return_ctx));
	}