static Eterm math_call_1(Process* p, double (*func)(double), Eterm arg1) { FloatDef a1; Eterm res; Eterm* hp; ERTS_FP_CHECK_INIT(p); if (is_float(arg1)) { GET_DOUBLE(arg1, a1); } else if (is_small(arg1)) { a1.fd = signed_val(arg1); } else if (is_big(arg1)) { if (big_to_double(arg1, &a1.fd) < 0) { badarith: p->freason = BADARITH; return THE_NON_VALUE; } } else { p->freason = BADARG; return THE_NON_VALUE; } a1.fd = (*func)(a1.fd); ERTS_FP_ERROR_THOROUGH(p, a1.fd, goto badarith); hp = HAlloc(p, FLOAT_SIZE_OBJECT); res = make_float(hp); PUT_DOUBLE(a1, hp); return res; }
BIF_RETTYPE float_1(BIF_ALIST_1) { Eterm res; Eterm* hp; FloatDef f; /* check args */ if (is_not_integer(BIF_ARG_1)) { if (is_float(BIF_ARG_1)) { BIF_RET(BIF_ARG_1); } else { badarg: BIF_ERROR(BIF_P, BADARG); } } if (is_small(BIF_ARG_1)) { Sint i = signed_val(BIF_ARG_1); f.fd = i; /* use "C"'s auto casting */ } else if (big_to_double(BIF_ARG_1, &f.fd) < 0) { goto badarg; } hp = HAlloc(BIF_P, FLOAT_SIZE_OBJECT); res = make_float(hp); PUT_DOUBLE(f, hp); BIF_RET(res); }
jsval to_js(ErlNifEnv* env, JSContext* cx, ERL_NIF_TERM term) { int intval; unsigned int uintval; long longval; unsigned long ulongval; double doubleval; ERL_NIF_TERM head; ERL_NIF_TERM tail; const ERL_NIF_TERM* tuple; int arity; if(enif_is_atom(env, term)) { return to_js_special(env, cx, term); } if(enif_is_binary(env, term)) { return to_js_string(env, cx, term); } if(enif_is_empty_list(env, term)) { return to_js_empty_array(cx); } if(enif_get_int(env, term, &intval)) { return to_js_number(cx, (double) intval); } if(enif_get_uint(env, term, &uintval)) { return to_js_number(cx, (double) uintval); } if(enif_get_long(env, term, &longval)) { return to_js_number(cx, (double) longval); } if(enif_get_ulong(env, term, &ulongval)) { return to_js_number(cx, (double) ulongval); } if(enif_get_double(env, term, &doubleval)) { return to_js_number(cx, doubleval); } // enif doesn't seem to have any API to decode bignums, so use lower-level functions: if(is_big(term) && big_to_double(term, &doubleval) == 0) { return to_js_number(cx, doubleval); } if(enif_get_list_cell(env, term, &head, &tail)) { return to_js_array(env, cx, head, tail); } if(enif_get_tuple(env, term, &arity, &tuple)) { if(arity == 1) { return to_js_object(env, cx, tuple[0]); } } return JSVAL_VOID; }