int64_t HHVM_FUNCTION(rand, int64_t min /* = 0 */, const Variant& max /* = null_variant */) { #if defined(__APPLE__) || defined(_MSC_VER) if (!s_rand_is_seeded) { #else if (s_state.state != RandomBuf::RequestInit) { #endif randinit(math_generate_seed()); } int64_t number; #ifdef __APPLE__ number = random(); #elif defined(_MSC_VER) number = rand(); #else int32_t numberIn; random_r(&s_state.data, &numberIn); number = numberIn; #endif int64_t int_max = max.isNull() ? RAND_MAX : max.toInt64(); if (min != 0 || int_max != RAND_MAX) { RAND_RANGE(number, min, int_max, RAND_MAX); } return number; } int64_t HHVM_FUNCTION(mt_getrandmax) { return MT_RAND_MAX;} void HHVM_FUNCTION(mt_srand, const Variant& seed /* = null_variant */) { if (seed.isNull()) { return math_mt_srand(math_generate_seed()); } if (seed.isNumeric(true)) { math_mt_srand(seed.toInt32()); } else { raise_warning("mt_srand() expects parameter 1 to be long"); } } int64_t HHVM_FUNCTION(mt_rand, int64_t min /* = 0 */, const Variant& max /* = null_variant */) { return math_mt_rand(min, max.isNull() ? RAND_MAX : max.toInt64()); } double HHVM_FUNCTION(lcg_value) { return math_combined_lcg();} Variant HHVM_FUNCTION(intdiv, int64_t numerator, int64_t divisor) { if (divisor == 0) { SystemLib::throwDivisionByZeroErrorObject(Strings::DIVISION_BY_ZERO); } else if (divisor == -1 && numerator == std::numeric_limits<int64_t>::min()) { SystemLib::throwArithmeticErrorObject( "Division of PHP_INT_MIN by -1 is not an integer"); } return numerator/divisor; } /////////////////////////////////////////////////////////////////////////////// const StaticString s_PHP_ROUND_HALF_UP("PHP_ROUND_HALF_UP"); const StaticString s_PHP_ROUND_HALF_DOWN("PHP_ROUND_HALF_DOWN"); const StaticString s_PHP_ROUND_HALF_EVEN("PHP_ROUND_HALF_EVEN"); const StaticString s_PHP_ROUND_HALF_ODD("PHP_ROUND_HALF_ODD"); #define ICONST(nm) \ Native::registerConstant<KindOfInt64>(makeStaticString(#nm), k_##nm) \ #define DCONST(nm) \ Native::registerConstant<KindOfDouble>(makeStaticString("M_"#nm), k_M_##nm) \ void StandardExtension::requestInitMath() { #if !defined(__APPLE__) && !defined(_MSC_VER) if (s_state.state == RandomBuf::RequestInit) { s_state.state = RandomBuf::ThreadInit; } #endif } void StandardExtension::initMath() { ICONST(PHP_ROUND_HALF_UP); ICONST(PHP_ROUND_HALF_DOWN); ICONST(PHP_ROUND_HALF_EVEN); ICONST(PHP_ROUND_HALF_ODD); DCONST(PI); DCONST(1_PI); DCONST(2_PI); DCONST(2_SQRTPI); DCONST(E); DCONST(EULER); DCONST(LN10); DCONST(LN2); DCONST(LNPI); DCONST(LOG10E); DCONST(LOG2E); DCONST(PI_2); DCONST(PI_4); DCONST(SQRT1_2); DCONST(SQRT2); DCONST(SQRT3); DCONST(SQRTPI); HHVM_FE(min); HHVM_FE(max); HHVM_FE(abs); HHVM_FE(is_finite); HHVM_FE(is_infinite); HHVM_FE(is_nan); HHVM_FE(ceil); HHVM_FE(floor); HHVM_FE(round); HHVM_FE(deg2rad); HHVM_FE(rad2deg); HHVM_FE(decbin); HHVM_FE(dechex); HHVM_FE(decoct); HHVM_FE(bindec); HHVM_FE(hexdec); HHVM_FE(octdec); HHVM_FE(base_convert); HHVM_FE(pow); HHVM_FE(exp); HHVM_FE(expm1); HHVM_FE(log10); HHVM_FE(log1p); HHVM_FE(log); HHVM_FE(cos); HHVM_FE(cosh); HHVM_FE(sin); HHVM_FE(sinh); HHVM_FE(tan); HHVM_FE(tanh); HHVM_FE(acos); HHVM_FE(acosh); HHVM_FE(asin); HHVM_FE(asinh); HHVM_FE(atan); HHVM_FE(atanh); HHVM_FE(atan2); HHVM_FE(hypot); HHVM_FE(fmod); HHVM_FE(sqrt); HHVM_FE(getrandmax); HHVM_FE(srand); HHVM_FE(rand); HHVM_FE(mt_getrandmax); HHVM_FE(mt_srand); HHVM_FE(mt_rand); HHVM_FE(lcg_value); HHVM_FE(intdiv); loadSystemlib("std_math"); }
POETCode* POETAstInterface::Ast2POET(const Ast& n) { static SgTemplateInstantiationFunctionDecl* tmp=0; SgNode* input = (SgNode*) n; if (input == 0) return EMPTY; POETCode* res = POETAstInterface::find_Ast2POET(input); if (res != 0) return res; { SgProject* sageProject=isSgProject(input); if (sageProject != 0) { int filenum = sageProject->numberOfFiles(); for (int i = 0; i < filenum; ++i) { SgSourceFile* sageFile = isSgSourceFile(sageProject->get_fileList()[i]); SgGlobal *root = sageFile->get_globalScope(); SgDeclarationStatementPtrList declList = root->get_declarations (); POETCode* curfile = ROSE_2_POET_list(declList, 0, tmp); curfile = new POETCode_ext(sageFile, curfile); POETAstInterface::set_Ast2POET(sageFile, curfile); res=LIST(curfile, res); } POETAstInterface::set_Ast2POET(sageProject,res); return res; } } { SgBasicBlock* block = isSgBasicBlock(input); if (block != 0) { res=ROSE_2_POET_list(block->get_statements(), res, tmp); POETAstInterface::set_Ast2POET(block, res); return res; } } { SgExprListExp* block = isSgExprListExp(input); if (block != 0) { res=ROSE_2_POET_list(block->get_expressions(), 0, tmp); POETAstInterface::set_Ast2POET(block, res); return res; } } { SgForStatement *f = isSgForStatement(input); if (f != 0) { POETCode* init = ROSE_2_POET_list(f->get_for_init_stmt()->get_init_stmt(),0, tmp); POETCode* ctrl = new POETCode_ext(f, TUPLE3(init,Ast2POET(f->get_test_expr()), Ast2POET(f->get_increment()))); res = CODE_ACC("Nest", PAIR(ctrl,Ast2POET(f->get_loop_body()))); POETAstInterface::set_Ast2POET(input, res); return res; } } { SgVarRefExp * v = isSgVarRefExp(input); if (v != 0) { res = STRING(v->get_symbol()->get_name().str()); POETAstInterface::set_Ast2POET(input, res); return res; } } { SgMemberFunctionRefExp * v = isSgMemberFunctionRefExp(input); if (v != 0) { res = STRING(v->get_symbol()->get_name().str()); POETAstInterface::set_Ast2POET(input, res); return res; } } { SgIntVal * v = isSgIntVal(input); if (v != 0) { res = ICONST(v->get_value()); POETAstInterface::set_Ast2POET(input, res); return res; } } { SgInitializedName* var = isSgInitializedName(input); if (var != 0) { POETCode* name = STRING(var->get_name().str()); POETCode* init = Ast2POET(var->get_initializer()); res = new POETCode_ext(var, PAIR(name,init)); POETAstInterface::set_Ast2POET(input, res); return res; } } /* { std::string fname; AstInterface::AstList params; AstNodeType returnType; AstNodePtr body; if (AstInterface :: IsFunctionDefinition( input, &fname, ¶ms, (AstInterface::AstList*)0, &body, (AstInterface::AstTypeList*)0, &returnType)) { if (body != AST_NULL) std::cerr << "body not empty:" << fname << "\n"; POETCode* c = TUPLE4(STRING(fname), ROSE_2_POET_list(0,params,0), STRING(AstInterface::GetTypeName(returnType)), Ast2POET(body.get_ptr())); res = new POETCode_ext(input, c); POETAstInterface::set_Ast2POET(input,res); return res; } } */ AstInterface::AstList c = AstInterface::GetChildrenList(input); switch (input->variantT()) { case V_SgCastExp: case V_SgAssignInitializer: res = Ast2POET(c[0]); POETAstInterface::set_Ast2POET(input, res); return res; case V_SgDotExp: { POETCode* v1 = Ast2POET(c[1]); if (dynamic_cast<POETString*>(v1)->get_content() == "operator()") return Ast2POET(c[0]); res = CODE_ACC("Bop",TUPLE3(STRING("."), Ast2POET(c[0]), v1)); return res; } case V_SgLessThanOp: res = CODE_ACC("Bop",TUPLE3(STRING("<"),Ast2POET(c[0]), Ast2POET(c[1]))); POETAstInterface::set_Ast2POET(input, res); return res; case V_SgSubtractOp: res = CODE_ACC("Bop",TUPLE3(STRING("-"),Ast2POET(c[0]), Ast2POET(c[1]))); POETAstInterface::set_Ast2POET(input, res); return res; case V_SgAddOp: res = CODE_ACC("Bop",TUPLE3(STRING("+"),Ast2POET(c[0]), Ast2POET(c[1]))); POETAstInterface::set_Ast2POET(input, res); return res; case V_SgMultiplyOp: res = CODE_ACC("Bop",TUPLE3(STRING("*"),Ast2POET(c[0]), Ast2POET(c[1]))); POETAstInterface::set_Ast2POET(input, res); return res; case V_SgDivideOp: res = CODE_ACC("Bop",TUPLE3(STRING("/"),Ast2POET(c[0]), Ast2POET(c[1]))); POETAstInterface::set_Ast2POET(input, res); return res; case V_SgAssignOp: res = CODE_ACC("Assign",PAIR(Ast2POET(c[0]), Ast2POET(c[1]))); POETAstInterface::set_Ast2POET(input, res); return res; case V_SgFunctionCallExp: res = CODE_ACC("FunctionCall",PAIR(Ast2POET(c[0]), Ast2POET(c[1]))); POETAstInterface::set_Ast2POET(input, res); return res; } POETCode * c2 = 0; if (tmp == 0) tmp=isSgTemplateInstantiationFunctionDecl(input); switch (c.size()) { case 0: break; case 1: c2 = Ast2POET(c[0]); break; case 2: c2 = PAIR(Ast2POET(c[0]),Ast2POET(c[1])); break; case 3: c2 = TUPLE3(Ast2POET(c[0]),Ast2POET(c[1]),Ast2POET(c[2])); break; case 4: c2 = TUPLE4(Ast2POET(c[0]),Ast2POET(c[1]),Ast2POET(c[2]),Ast2POET(c[3])); break; default: //std::cerr << "too many children: " << c.size() << ":" << input->unparseToString() << "\n"; c2 = EMPTY; } if (tmp == input) tmp = 0; res = new POETCode_ext(input, c2); POETAstInterface::set_Ast2POET(input,res); return res; }