Skip to content

Instantly share code, notes, and snippets.

@simonwelsh
Created February 5, 2014 01:13
Show Gist options
  • Save simonwelsh/8815687 to your computer and use it in GitHub Desktop.
Save simonwelsh/8815687 to your computer and use it in GitHub Desktop.
TypedValue* HHVM_FUNCTION(max, ActRec *ar) {
TypedValue* rv;
Variant ret;
int32_t count = ar->numArgs();
if (LIKELY(count >= 1)) {
Variant value(getArg<KindOfAny>(ar, 1));
if (count == 1) {
if (LIKELY(isContainer(value))) {
ArrayIter iter(value);
if (!iter) {
ret = uninit_null();
} else {
ret = iter.secondRefPlus();
++iter;
for (; iter; ++iter) {
Variant currVal = iter.secondRefPlus();
if (more(currVal, ret)) {
ret = currVal;
}
}
}
} else {
ret = value;
}
} else {
for (int32_t i = 1; i < count; ++i) {
Variant currVal(getArg<KindOfAny>(ar, i));
if (more(currVal, ret)) {
ret = currVal;
}
}
}
rv = ret.asTypedValue();
} else {
TypedValue rvSpace;
rv = &rvSpace;
throw_missing_arguments_nr("min", 1, count, 1, rv);
}
frame_free_locals_no_this_inl(ar, 1);
ar->m_r = *rv;
return &ar->m_r;
}
@simonwelsh
Copy link
Author

Program received signal SIGSEGV, Segmentation fault.
0x0000000000000000 in ?? ()
(gdb) bt
#0  0x0000000000000000 in ?? ()
#1  0x0000000000e765eb in HPHP::Native::callFunc(HPHP::Func const*, HPHP::TypedValue*, HPHP::TypedValue*, int, HPHP::TypedValue&) ()
#2  0x0000000000e66122 in void HPHP::VMExecutionContext::dispatchImpl<2>(int) ()
#3  0x0000000000e14ad3 in HPHP::VMExecutionContext::dispatchBB() ()
#4  0x0000000000f49c4e in HPHP::JIT::TranslatorX64::enterTC(unsigned char*, void*) ()
#5  0x0000000000e11b5e in HPHP::VMExecutionContext::enterVM(HPHP::TypedValue*, HPHP::ActRec*) ()
#6  0x0000000000e125fc in HPHP::VMExecutionContext::invokeFunc(HPHP::TypedValue*, HPHP::Func const*, HPHP::Variant const&, HPHP::ObjectData*, HPHP::Class*, HPHP::VarEnv*, HPHP::StringData*, HPHP::VMExecutionContext::InvokeFlags) ()
#7  0x0000000000e12da0 in HPHP::VMExecutionContext::invokeUnit(HPHP::TypedValue*, HPHP::Unit*) ()
#8  0x0000000000ad3071 in HPHP::include_impl_invoke(HPHP::String const&, bool, char const*) ()
#9  0x0000000000b6864a in HPHP::hphp_invoke(HPHP::ExecutionContext*, std::string const&, bool, HPHP::Array const&, HPHP::VRefParamValue const&, std::string const&, std::string const&, bool&, std::string&, bool, bool, bool) ()
#10 0x0000000000b68b33 in HPHP::hphp_invoke_simple(std::string const&, bool) ()
#11 0x0000000000b6cd3b in HPHP::execute_program_impl(int, char**) ()
#12 0x0000000000b6e396 in HPHP::execute_program(int, char**) ()
#13 0x00000000007f110d in main ()

@simonwelsh
Copy link
Author

<?php
/* 
 * proto mixed max(mixed arg1 [, mixed arg2 [, mixed ...]])
 * Function is implemented in ext/standard/array.c
*/ 

echo "\n*** Testing arrays  ***\n";

var_dump(max(array(2,1,2)));
var_dump(max(array(-2,1,2)));
var_dump(max(array(2.1,2.11,2.09)));
var_dump(max(array("", "t", "b")));
var_dump(max(array(false, true, false)));
var_dump(max(array(true, false, true)));
var_dump(max(array(1, true, false, true)));
var_dump(max(array(0, true, false, true)));
var_dump(max(array(0, 1, array(2,3))));
var_dump(max(array(2147483645, 2147483646)));
var_dump(max(array(2147483647, 2147483648)));
var_dump(max(array(2147483646, 2147483648)));
var_dump(max(array(-2147483647, -2147483646)));
var_dump(max(array(-2147483648, -2147483647)));
var_dump(max(array(-2147483649, -2147483647)));

echo "\nDone\n";

?>

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment