本文整理汇总了C++中HHVM_FN函数的典型用法代码示例。如果您正苦于以下问题:C++ HHVM_FN函数的具体用法?C++ HHVM_FN怎么用?C++ HHVM_FN使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了HHVM_FN函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: f_hphp_get_status
Array f_hphp_get_status() {
std::string out;
ServerStats::ReportStatus(out, ServerStats::Format::JSON);
return HHVM_FN(json_decode)(String(out)).toArray();
}
示例2: strchr
void XDebugServer::parseInput(folly::StringPiece in, String& cmd, Array& args) {
// Always start with a blank array
args = Array::Create();
// Find the first space in the command. Everything before is assumed to be the
// command string
auto ptr = strchr(const_cast<char*>(in.data()), ' ');
if (ptr != nullptr) {
size_t size = ptr - in.data();
cmd = String::attach(StringData::Make(in.data(), size, CopyString));
} else if (in[0] != '\0') {
// There are no spaces, the entire string is the command
cmd = String::attach(StringData::Make(in.data(), CopyString));
return;
} else {
throw_exn(Error::Parse);
}
// Loop starting after the space until the end of the string
char opt;
bool escaped = false;
char* value = nullptr;
ParseState state = ParseState::NORMAL;
do {
ptr++;
switch (state) {
// A new option which is prefixed with "-" is expected
case ParseState::NORMAL:
if (*ptr != '-') {
throw_exn(Error::Parse);
} else {
state = ParseState::OPT_FOLLOWS;
}
break;
// The option key follows
case ParseState::OPT_FOLLOWS:
opt = *ptr;
state = ParseState::SEP_FOLLOWS;
break;
// Expect a " " separator to follow
case ParseState::SEP_FOLLOWS:
if (*ptr != ' ') {
throw_exn(Error::Parse);
} else {
state = ParseState::VALUE_FOLLOWS_FIRST_CHAR;
value = ptr + 1;
}
break;
// Expect the option value's first character to follow. This character
// could be either '"'or '-'
case ParseState::VALUE_FOLLOWS_FIRST_CHAR:
if (*ptr == '"' && opt != '-') {
value = ptr + 1;
state = ParseState::QUOTED;
} else {
state = ParseState::VALUE_FOLLOWS;
}
break;
// The option's value should follow
case ParseState::VALUE_FOLLOWS:
if ((*ptr == ' ' && opt != '-') || *ptr == '\0') {
if (args[opt].isNull()) {
size_t size = ptr - value;
StringData* val_data = StringData::Make(value, size, CopyString);
args.set(opt, String::attach(val_data));
state = ParseState::NORMAL;
} else {
throw_exn(Error::DupArg);
}
}
break;
// State when we are within a quoted string
case ParseState::QUOTED:
// if the quote is escaped, remain in ParseState::QUOTED. This
// will also handle other escaped chars, or an instance of
// an escaped slash followed by a quote: \\"
if (*ptr == '\\') {
escaped = !escaped;
break;
} else if (*ptr != '"') {
break;
} else if (escaped) {
escaped = false;
break;
}
// Need to strip slashes before adding option
if (args[opt].isNull()) {
size_t size = ptr - value;
StringData* val_data = StringData::Make(value, size, CopyString);
args.set(opt, HHVM_FN(stripcslashes)(String::attach(val_data)));
state = ParseState::SKIP_CHAR;
} else {
throw_exn(Error::DupArg);
}
break;
// Do nothing
case ParseState::SKIP_CHAR:
state = ParseState::NORMAL;
break;
//.........这里部分代码省略.........
示例3: HHVM_FUNCTION
void HHVM_FUNCTION(header, const String& str, bool replace /* = true */,
int http_response_code /* = 0 */) {
if (HHVM_FN(headers_sent)()) {
raise_warning("Cannot modify header information - headers already sent");
}
String header = f_rtrim(str);
// new line safety check
// NOTE: PHP actually allows "\n " and "\n\t" to fall through. Is that bad
// for security?
if (header.find('\n') >= 0 || header.find('\r') >= 0) {
raise_warning("Header may not contain more than a single header, "
"new line detected");
return;
}
Transport *transport = g_context->getTransport();
if (transport && header.size()) {
const char *header_line = header.data();
// handle single line of status code
if (header.size() >= 5 && strncasecmp(header_line, "HTTP/", 5) == 0) {
int code = 200;
const char *reason = nullptr;
for (const char *ptr = header_line; *ptr; ptr++) {
if (*ptr == ' ' && *(ptr + 1) != ' ') {
code = atoi(ptr + 1);
for (ptr++; *ptr; ptr++) {
if (*ptr == ' ' && *(ptr + 1) != ' ') {
reason = ptr + 1;
break;
}
}
break;
}
}
if (code) {
transport->setResponse(code, reason);
}
return;
}
const char *colon_offset = strchr(header_line, ':');
String newHeader;
if (colon_offset) {
if (!strncasecmp(header_line, "Content-Type",
colon_offset - header_line)) {
const char *ptr = colon_offset+1, *mimetype = NULL;
while (*ptr == ' ') ptr++;
mimetype = ptr;
if (strncmp(mimetype, "text/", 5) == 0 &&
strstr(mimetype, "charset=") == NULL) {
newHeader = header + ";charset=utf-8";
}
}
}
if (replace) {
transport->replaceHeader(newHeader.empty() ? header : newHeader);
} else {
transport->addHeader(newHeader.empty() ? header : newHeader);
}
if (http_response_code) {
transport->setResponse(http_response_code,
"explicit_header_response_code");
}
}
}
示例4: HHVM_FUNCTION
int64_t HHVM_FUNCTION(connection_aborted) {
return HHVM_FN(connection_status)() == k_CONNECTION_ABORTED;
}
示例5: binary_serialize
void binary_serialize(int8_t thrift_typeID, PHPOutputTransport& transport,
const Variant& value, const Array& fieldspec) {
// At this point the typeID (and field num, if applicable) should've already
// been written to the output so all we need to do is write the payload.
switch (thrift_typeID) {
case T_STOP:
case T_VOID:
return;
case T_STRUCT: {
if (!value.is(KindOfObject)) {
throw_tprotocolexception("Attempt to send non-object "
"type as a T_STRUCT", INVALID_DATA);
}
binary_serialize_spec(value.toObject(), transport,
HHVM_FN(hphp_get_static_property)(value.toObject()->
getClassName(),
s_TSPEC,
false).toArray());
} return;
case T_BOOL:
transport.writeI8(value.toBoolean() ? 1 : 0);
return;
case T_BYTE:
transport.writeI8(value.toByte());
return;
case T_I16:
transport.writeI16(value.toInt16());
return;
case T_I32:
transport.writeI32(value.toInt32());
return;
case T_I64:
case T_U64:
transport.writeI64(value.toInt64());
return;
case T_DOUBLE: {
union {
int64_t c;
double d;
} a;
a.d = value.toDouble();
transport.writeI64(a.c);
} return;
case T_FLOAT: {
union {
int32_t c;
float d;
} a;
a.d = (float)value.toDouble();
transport.writeI32(a.c);
} return;
//case T_UTF7:
case T_UTF8:
case T_UTF16:
case T_STRING: {
String sv = value.toString();
transport.writeString(sv.data(), sv.size());
} return;
case T_MAP: {
Array ht = value.toArray();
uint8_t keytype = fieldspec.rvalAt(PHPTransport::s_ktype,
AccessFlags::Error_Key).toByte();
transport.writeI8(keytype);
uint8_t valtype = fieldspec.rvalAt(PHPTransport::s_vtype,
AccessFlags::Error_Key).toByte();
transport.writeI8(valtype);
Array valspec = fieldspec.rvalAt(PHPTransport::s_val,
AccessFlags::Error_Key).toArray();
transport.writeI32(ht.size());
for (ArrayIter key_ptr = ht.begin(); !key_ptr.end(); ++key_ptr) {
binary_serialize_hashtable_key(keytype, transport, key_ptr.first());
binary_serialize(valtype, transport, key_ptr.second(), valspec);
}
} return;
case T_LIST: {
Array ht = value.toArray();
Variant val;
uint8_t valtype = fieldspec.rvalAt(PHPTransport::s_etype,
AccessFlags::Error_Key).toInt64();
transport.writeI8(valtype);
Array valspec = fieldspec.rvalAt(PHPTransport::s_elem,
AccessFlags::Error_Key).toArray();
transport.writeI32(ht.size());
for (ArrayIter key_ptr = ht.begin(); !key_ptr.end(); ++key_ptr) {
binary_serialize(valtype, transport, key_ptr.second(), valspec);
}
} return;
case T_SET: {
Array ht = value.toArray();
uint8_t keytype = fieldspec.rvalAt(PHPTransport::s_etype,
AccessFlags::Error_Key).toByte();
transport.writeI8(keytype);
transport.writeI32(ht.size());
for (ArrayIter key_ptr = ht.begin(); !key_ptr.end(); ++key_ptr) {
binary_serialize_hashtable_key(keytype, transport, key_ptr.first());
//.........这里部分代码省略.........
示例6: HHVM_FUNCTION
bool HHVM_FUNCTION(bzclose, const Resource& bz) {
return HHVM_FN(fclose)(bz);
}
示例7: switch
bool PDOSqliteStatement::paramHook(PDOBoundParam* param,
PDOParamEvent event_type) {
switch (event_type) {
case PDO_PARAM_EVT_EXEC_PRE:
if (executed && !m_done) {
sqlite3_reset(m_stmt);
m_done = 1;
}
if (param->is_param) {
if (param->paramno == -1) {
param->paramno = sqlite3_bind_parameter_index(m_stmt,
param->name.c_str()) - 1;
}
switch (PDO_PARAM_TYPE(param->param_type)) {
case PDO_PARAM_STMT:
return false;
case PDO_PARAM_NULL:
if (sqlite3_bind_null(m_stmt, param->paramno + 1) == SQLITE_OK) {
return true;
}
handleError(__FILE__, __LINE__);
return false;
case PDO_PARAM_INT:
case PDO_PARAM_BOOL:
if (param->parameter.isNull()) {
if (sqlite3_bind_null(m_stmt, param->paramno + 1) == SQLITE_OK) {
return true;
}
} else {
if (SQLITE_OK == sqlite3_bind_int(m_stmt, param->paramno + 1,
param->parameter.toInt64())) {
return true;
}
}
handleError(__FILE__, __LINE__);
return false;
case PDO_PARAM_LOB:
if (param->parameter.isResource()) {
Variant buf = HHVM_FN(stream_get_contents)(
param->parameter.toResource());
if (!same(buf, false)) {
param->parameter = buf;
} else {
pdo_raise_impl_error(dbh, this, "HY105",
"Expected a stream resource");
return false;
}
} else if (param->parameter.isNull()) {
if (sqlite3_bind_null(m_stmt, param->paramno + 1) == SQLITE_OK) {
return true;
}
handleError(__FILE__, __LINE__);
return false;
}
{
String sparam = param->parameter.toString();
if (SQLITE_OK == sqlite3_bind_blob(m_stmt, param->paramno + 1,
sparam.data(), sparam.size(),
SQLITE_STATIC)) {
return true;
}
}
handleError(__FILE__, __LINE__);
return false;
case PDO_PARAM_STR:
default:
if (param->parameter.isNull()) {
if (sqlite3_bind_null(m_stmt, param->paramno + 1) == SQLITE_OK) {
return true;
}
} else {
String sparam = param->parameter.toString();
if (SQLITE_OK == sqlite3_bind_text(m_stmt, param->paramno + 1,
sparam.data(), sparam.size(),
SQLITE_STATIC)) {
return true;
}
}
handleError(__FILE__, __LINE__);
return false;
}
}
break;
default:;
}
return true;
}
示例8: url_encode_array
static void url_encode_array(StringBuffer &ret, const Variant& varr,
std::set<void*> &seen_arrs,
const String& num_prefix, const String& key_prefix,
const String& key_suffix, const String& arg_sep,
bool encode_plus = true) {
void *id = varr.isArray() ?
(void*)varr.getArrayData() : (void*)varr.getObjectData();
if (!seen_arrs.insert(id).second) {
return; // recursive
}
// Allow multiple non-recursive references to the same array/object
SCOPE_EXIT { seen_arrs.erase(id); };
Array arr;
if (varr.is(KindOfObject)) {
Object o = varr.toObject();
arr = o->isCollection()
? varr.toArray()
: HHVM_FN(get_object_vars(o));
} else {
arr = varr.toArray();
}
for (ArrayIter iter(arr); iter; ++iter) {
Variant data = iter.second();
if (data.isNull() || data.isResource()) continue;
String key = iter.first();
bool numeric = key.isNumeric();
if (data.isArray() || data.is(KindOfObject)) {
String encoded;
if (numeric) {
encoded = key;
} else {
encoded = StringUtil::UrlEncode(key, encode_plus);
}
StringBuffer new_prefix(key_prefix.size() + num_prefix.size() +
encoded.size() + key_suffix.size() + 4);
new_prefix.append(key_prefix);
if (numeric) new_prefix.append(num_prefix);
new_prefix.append(encoded);
new_prefix.append(key_suffix);
new_prefix.append("%5B");
url_encode_array(ret, data, seen_arrs, String(),
new_prefix.detach(), String("%5D", CopyString),
arg_sep);
} else {
if (!ret.empty()) {
ret.append(arg_sep);
}
ret.append(key_prefix);
if (numeric) {
ret.append(num_prefix);
ret.append(key);
} else {
ret.append(StringUtil::UrlEncode(key, encode_plus));
}
ret.append(key_suffix);
ret.append("=");
if (data.isInteger() || data.is(KindOfBoolean)) {
ret.append(String(data.toInt64()));
} else if (data.is(KindOfDouble)) {
ret.append(String(data.toDouble()));
} else {
ret.append(StringUtil::UrlEncode(data.toString(), encode_plus));
}
}
}
}
示例9: HHVM_FUNCTION
TypedValue HHVM_FUNCTION(json_decode, const String& json,
bool assoc, int64_t depth, int64_t options) {
json_set_last_error_code(json_error_codes::JSON_ERROR_NONE);
if (json.empty()) {
return make_tv<KindOfNull>();
}
const int64_t supported_options =
k_JSON_FB_LOOSE |
k_JSON_FB_COLLECTIONS |
k_JSON_FB_STABLE_MAPS |
k_JSON_BIGINT_AS_STRING |
k_JSON_FB_HACK_ARRAYS;
int64_t parser_options = options & supported_options;
Variant z;
const auto ok =
JSON_parser(z, json.data(), json.size(), assoc, depth, parser_options);
if (UNLIKELY(StructuredLog::coinflip(RuntimeOption::EvalSerDesSampleRate))) {
StructuredLog::logSerDes("json", "des", json, z);
}
if (ok) {
return tvReturn(std::move(z));
}
String trimmed = HHVM_FN(trim)(json, "\t\n\r ");
if (trimmed.size() == 4) {
if (!strcasecmp(trimmed.data(), "null")) {
json_set_last_error_code(json_error_codes::JSON_ERROR_NONE);
return make_tv<KindOfNull>();
}
if (!strcasecmp(trimmed.data(), "true")) {
json_set_last_error_code(json_error_codes::JSON_ERROR_NONE);
return make_tv<KindOfBoolean>(true);
}
} else if (trimmed.size() == 5 && !strcasecmp(trimmed.data(), "false")) {
json_set_last_error_code(json_error_codes::JSON_ERROR_NONE);
return make_tv<KindOfBoolean>(false);
}
int64_t p;
double d;
DataType type = json.get()->isNumericWithVal(p, d, 0);
if (type == KindOfInt64) {
json_set_last_error_code(json_error_codes::JSON_ERROR_NONE);
return make_tv<KindOfInt64>(p);
} else if (type == KindOfDouble) {
json_set_last_error_code(json_error_codes::JSON_ERROR_NONE);
if ((options & k_JSON_BIGINT_AS_STRING) &&
(json.toInt64() == LLONG_MAX || json.toInt64() == LLONG_MIN)
&& errno == ERANGE) { // Overflow
bool is_float = false;
for (int i = (trimmed[0] == '-' ? 1 : 0); i < trimmed.size(); ++i) {
if (trimmed[i] < '0' || trimmed[i] > '9') {
is_float = true;
break;
}
}
if (!is_float) {
return tvReturn(trimmed);
}
}
return make_tv<KindOfDouble>(d);
}
char ch0 = json.charAt(0);
if (json.size() > 1 && ch0 == '"' && json.charAt(json.size() - 1) == '"') {
json_set_last_error_code(json_error_codes::JSON_ERROR_NONE);
// Wrap the string in an array to allow the JSON_parser to handle
// things like unicode escape sequences, then unwrap to get result
String wrapped("[");
wrapped += json + "]";
// Stick to a normal hhvm array for the wrapper
const int64_t mask = ~(k_JSON_FB_COLLECTIONS | k_JSON_FB_STABLE_MAPS);
if (JSON_parser(z, wrapped.data(), wrapped.size(), false, depth,
parser_options & mask) && z.isArray()) {
Array arr = z.toArray();
if ((arr.size() == 1) && arr.exists(0)) {
return tvReturn(arr[0]);
}
// The input string could be something like: "foo","bar"
// Which will parse inside the [] wrapper, but be invalid
json_set_last_error_code(json_error_codes::JSON_ERROR_SYNTAX);
}
}
if ((options & k_JSON_FB_LOOSE) && json.size() > 1 &&
ch0 == '\'' && json.charAt(json.size() - 1) == '\'') {
json_set_last_error_code(json_error_codes::JSON_ERROR_NONE);
return tvReturn(json.substr(1, json.size() - 2));
}
assert(json_get_last_error_code() != json_error_codes::JSON_ERROR_NONE);
return make_tv<KindOfNull>();
}
示例10: eval_for_assert
static Variant eval_for_assert(ActRec* const curFP, const String& codeStr) {
String prefixedCode = concat3("<?php return ", codeStr, ";");
auto const oldErrorLevel =
s_option_data->assertQuietEval ? HHVM_FN(error_reporting)(Variant(0)) : 0;
SCOPE_EXIT {
if (s_option_data->assertQuietEval) HHVM_FN(error_reporting)(oldErrorLevel);
};
auto const unit = g_context->compileEvalString(prefixedCode.get());
if (unit == nullptr) {
raise_recoverable_error("Syntax error in assert()");
// Failure to compile the eval string doesn't count as an
// assertion failure.
return Variant(true);
}
if (!(curFP->func()->attrs() & AttrMayUseVV)) {
throw_not_supported("assert()",
"assert called from non-varenv function");
}
if (!curFP->hasVarEnv()) {
curFP->setVarEnv(VarEnv::createLocal(curFP));
}
auto varEnv = curFP->getVarEnv();
if (curFP != vmfp()) {
// If we aren't using FCallBuiltin, the stack frame of the call to assert
// will be in middle of the code we are about to eval and our caller, whose
// varEnv we want to use. The invokeFunc below will get very confused if
// this is the case, since it will be using a varEnv that belongs to the
// wrong function on the stack. So, we rebind it here, to match what
// invokeFunc will expect.
assert(!vmfp()->hasVarEnv());
vmfp()->setVarEnv(varEnv);
varEnv->enterFP(curFP, vmfp());
}
ObjectData* thiz = nullptr;
Class* cls = nullptr;
Class* ctx = curFP->func()->cls();
if (ctx) {
if (curFP->hasThis()) {
thiz = curFP->getThis();
cls = thiz->getVMClass();
} else {
cls = curFP->getClass();
}
}
auto const func = unit->getMain(ctx);
return Variant::attach(
g_context->invokeFunc(
func,
init_null_variant,
thiz,
cls,
varEnv,
nullptr,
ExecutionContext::InvokePseudoMain
)
);
}
示例11: s
// Grab the ip address and port of the client that is connected to this proxy.
bool DebuggerProxy::getClientConnectionInfo(VRefParam address,
VRefParam port) {
Resource s(m_thrift.getSocket().get());
return HHVM_FN(socket_getpeername)(s, address, port);
}
示例12: HHVM_FUNCTION
bool HHVM_FUNCTION(trigger_error, const String& error_msg,
int error_type /* = k_E_USER_NOTICE */) {
std::string msg = error_msg.data(); // not toCppString()
if (UNLIKELY(g_context->getThrowAllErrors())) {
throw Exception(folly::sformat("throwAllErrors: {}", error_type));
}
if (error_type == k_E_USER_ERROR) {
g_context->handleError(msg, error_type, true,
ExecutionContext::ErrorThrowMode::IfUnhandled,
"\nFatal error: ");
return true;
}
if (error_type == k_E_USER_WARNING) {
g_context->handleError(msg, error_type, true,
ExecutionContext::ErrorThrowMode::Never,
"\nWarning: ");
return true;
}
if (error_type == k_E_USER_NOTICE) {
g_context->handleError(msg, error_type, true,
ExecutionContext::ErrorThrowMode::Never,
"\nNotice: ");
return true;
}
if (error_type == k_E_USER_DEPRECATED) {
g_context->handleError(msg, error_type, true,
ExecutionContext::ErrorThrowMode::Never,
"\nDeprecated: ");
return true;
}
if (error_type == k_E_STRICT) {
// So that we can raise strict warnings for mismatched
// params in FCallBuiltin
raise_strict_warning(msg);
return true;
}
ActRec* fp = g_context->getStackFrame();
if (fp->m_func->isNative() &&
fp->m_func->nativeFuncPtr() == (BuiltinFunction)HHVM_FN(trigger_error)) {
fp = g_context->getOuterVMFrame(fp);
}
if (fp && fp->m_func->isBuiltin()) {
if (error_type == k_E_ERROR) {
raise_error_without_first_frame(msg);
return true;
}
if (error_type == k_E_WARNING) {
raise_warning_without_first_frame(msg);
return true;
}
if (error_type == k_E_NOTICE) {
raise_notice_without_first_frame(msg);
return true;
}
if (error_type == k_E_DEPRECATED) {
raise_deprecated_without_first_frame(msg);
return true;
}
if (error_type == k_E_RECOVERABLE_ERROR) {
raise_recoverable_error_without_first_frame(msg);
return true;
}
}
raise_warning("Invalid error type specified");
return false;
}
示例13: VS
bool TestCppBase::TestString() {
// constructors
{
VS(String(15).c_str(), "15");
VS(String(-15).c_str(), "-15");
VS(String(int64_t(12345678912345678LL)).c_str(), "12345678912345678");
VS(String(int64_t(-12345678912345678LL)).c_str(), "-12345678912345678");
VS(String(5.603).c_str(), "5.603");
VS(String("test").c_str(), "test");
VS(String(String("test")).c_str(), "test");
}
// informational
{
VERIFY(String().isNull());
VERIFY(!String("").isNull());
VERIFY(String().empty());
VERIFY(String("").empty());
VERIFY(!String("test").empty());
VERIFY(String().size() == 0);
VERIFY(String().length() == 0);
VERIFY(String("").size() == 0);
VERIFY(String("").length() == 0);
VERIFY(String("test").size() == 4);
VERIFY(String("test").length() == 4);
VERIFY(!String("2test").isNumeric());
VERIFY(!String("2test").isInteger());
VERIFY(!String("test").isNumeric());
VERIFY(!String("test").isInteger());
VERIFY(String("23").isNumeric());
VERIFY(String("23").isInteger());
VERIFY(String("23.3").isNumeric());
VERIFY(!String("23.3").isInteger());
}
// operators
{
String s;
s = "test1"; VS(s.c_str(), "test1");
s = String("test2"); VS(s.c_str(), "test2");
s = Variant("test3"); VS(s.c_str(), "test3");
s = String("a") + "b"; VS(s.c_str(), "ab");
s = String("c") + String("d"); VS(s.c_str(), "cd");
s += "efg"; VS(s.c_str(), "cdefg");
s += String("hij"); VS(s.c_str(), "cdefghij");
}
// manipulations
{
String s = HHVM_FN(strtolower)("Test");
VS(s.c_str(), "test");
}
// conversions
{
VERIFY(!String().toBoolean());
VERIFY(String("123").toBoolean());
VERIFY(String("123").toByte() == 123);
VERIFY(String("32767").toInt16() == 32767);
VERIFY(String("1234567890").toInt32() == 1234567890);
VERIFY(String("123456789012345678").toInt64() == 123456789012345678LL);
VERIFY(String("123.45").toDouble() == 123.45);
}
return Count(true);
}
示例14: HHVM_FN
bool TestExtCurl::test_curl_multi_getcontent() {
Resource mh = HHVM_FN(curl_multi_init)();
Variant c1 = HHVM_FN(curl_init)(String(get_request_uri()));
Variant c2 = HHVM_FN(curl_init)(String(get_request_uri()));
HHVM_FN(curl_setopt)(c1.toResource(), k_CURLOPT_RETURNTRANSFER, true);
HHVM_FN(curl_setopt)(c2.toResource(), k_CURLOPT_RETURNTRANSFER, true);
HHVM_FN(curl_multi_add_handle)(mh, c1.toResource());
HHVM_FN(curl_multi_add_handle)(mh, c2.toResource());
Variant still_running;
do {
HHVM_FN(curl_multi_exec)(mh, ref(still_running));
} while (more(still_running, 0));
VS(HHVM_FN(curl_multi_getcontent)(c1.toResource()), "OK");
VS(HHVM_FN(curl_multi_getcontent)(c1.toResource()), "OK");
VS(HHVM_FN(curl_multi_getcontent)(c2.toResource()), "OK");
VS(HHVM_FN(curl_multi_getcontent)(c2.toResource()), "OK");
return Count(true);
}
示例15: xslt_ext_function_php
//.........这里部分代码省略.........
Array args;
// Reverse order to pop values off ctxt stack
for (int i = nargs - 2; i >= 0; i--) {
Variant arg;
obj = valuePop(ctxt);
switch (obj->type) {
case XPATH_STRING:
arg = String((char*)obj->stringval, CopyString);
break;
case XPATH_BOOLEAN:
arg = (bool)obj->boolval;
break;
case XPATH_NUMBER:
arg = (double)obj->floatval;
break;
case XPATH_NODESET:
if (type == 1) {
char *str = (char*)xmlXPathCastToString(obj);
arg = String(str, CopyString);
xmlFree(str);
} else if (type == 2) {
arg = Array::Create();
if (obj->nodesetval && obj->nodesetval->nodeNr > 0) {
for (int j = 0; j < obj->nodesetval->nodeNr; j++) {
// TODO: not sure this is the right thing to do.
xmlNodePtr node = obj->nodesetval->nodeTab[j];
if (node->type == XML_ELEMENT_NODE) {
Object element = newNode(s_DOMElement,
xmlCopyNode(node, /*extended*/ 1));
arg.toArrRef().append(element);
} else if (node->type == XML_ATTRIBUTE_NODE) {
Object attribute =
newNode(s_DOMAttr,
(xmlNodePtr)xmlCopyProp(nullptr, (xmlAttrPtr)node));
arg.toArrRef().append(attribute);
} else if (node->type == XML_TEXT_NODE) {
Object text =
newNode(s_DOMText,
(xmlNodePtr)xmlNewText(xmlNodeGetContent(node)));
arg.toArrRef().append(text);
} else {
raise_warning("Unhandled node type '%d'", node->type);
// Use a generic DOMNode as fallback for now.
Object nodeobj = newNode(s_DOMNode,
xmlCopyNode(node, /*extended*/ 1));
arg.toArrRef().append(nodeobj);
}
}
}
}
break;
default:
arg = String((char*)xmlXPathCastToString(obj), CopyString);
}
xmlXPathFreeObject(obj);
args.prepend(arg);
}
obj = valuePop(ctxt);
if (obj->stringval == nullptr) {
raise_warning("Handler name must be a string");
xmlXPathFreeObject(obj);
// Push an empty string to get an xslt result.
valuePush(ctxt, xmlXPathNewString((xmlChar*)""));
return;
}
String handler((char*)obj->stringval, CopyString);
xmlXPathFreeObject(obj);
if (!HHVM_FN(is_callable)(handler)) {
raise_warning("Unable to call handler %s()", handler.data());
// Push an empty string to get an xslt result.
valuePush(ctxt, xmlXPathNewString((xmlChar*)""));
} else if (intern->m_registerPhpFunctions == 2 &&
!intern->m_registered_phpfunctions.exists(handler)) {
raise_warning("Not allowed to call handler '%s()'", handler.data());
// Push an empty string to get an xslt result.
valuePush(ctxt, xmlXPathNewString((xmlChar*)""));
} else {
Variant retval = vm_call_user_func(handler, args);
if (retval.isObject() &&
retval.getObjectData()->instanceof(s_DOMNode)) {
ObjectData *retval_data = retval.asCObjRef().get();
xmlNode* nodep = Native::data<DOMNode>(retval_data)->nodep();
valuePush(ctxt, xmlXPathNewNodeSet(nodep));
intern->m_usedElements.prepend(retval);
} else if (retval.is(KindOfBoolean)) {
valuePush(ctxt, xmlXPathNewBoolean(retval.toBoolean()));
} else if (retval.isObject()) {
raise_warning("A PHP Object cannot be converted to an XPath-string");
// Push an empty string to get an xslt result.
valuePush(ctxt, xmlXPathNewString((xmlChar*)""));
} else {
String sretval = retval.toString();
valuePush(ctxt, xmlXPathNewString((xmlChar*)sretval.data()));
}
}
}