| Index: runtime/lib/math.cc
|
| ===================================================================
|
| --- runtime/lib/math.cc (revision 14972)
|
| +++ runtime/lib/math.cc (working copy)
|
| @@ -16,162 +16,59 @@
|
|
|
| namespace dart {
|
|
|
| -DEFINE_NATIVE_ENTRY(MathNatives_sqrt, 1) {
|
| +DEFINE_NATIVE_ENTRY(Math_sqrt, 1) {
|
| GET_NATIVE_ARGUMENT(Double, operand, arguments->NativeArgAt(0));
|
| return Double::New(sqrt(operand.value()));
|
| }
|
|
|
| -DEFINE_NATIVE_ENTRY(MathNatives_sin, 1) {
|
| +DEFINE_NATIVE_ENTRY(Math_sin, 1) {
|
| GET_NATIVE_ARGUMENT(Double, operand, arguments->NativeArgAt(0));
|
| return Double::New(sin(operand.value()));
|
| }
|
|
|
| -DEFINE_NATIVE_ENTRY(MathNatives_cos, 1) {
|
| +DEFINE_NATIVE_ENTRY(Math_cos, 1) {
|
| GET_NATIVE_ARGUMENT(Double, operand, arguments->NativeArgAt(0));
|
| return Double::New(cos(operand.value()));
|
| }
|
|
|
| -DEFINE_NATIVE_ENTRY(MathNatives_tan, 1) {
|
| +DEFINE_NATIVE_ENTRY(Math_tan, 1) {
|
| GET_NATIVE_ARGUMENT(Double, operand, arguments->NativeArgAt(0));
|
| return Double::New(tan(operand.value()));
|
| }
|
|
|
| -DEFINE_NATIVE_ENTRY(MathNatives_asin, 1) {
|
| +DEFINE_NATIVE_ENTRY(Math_asin, 1) {
|
| GET_NATIVE_ARGUMENT(Double, operand, arguments->NativeArgAt(0));
|
| return Double::New(asin(operand.value()));
|
| }
|
|
|
| -DEFINE_NATIVE_ENTRY(MathNatives_acos, 1) {
|
| +DEFINE_NATIVE_ENTRY(Math_acos, 1) {
|
| GET_NATIVE_ARGUMENT(Double, operand, arguments->NativeArgAt(0));
|
| return Double::New(acos(operand.value()));
|
| }
|
|
|
| -DEFINE_NATIVE_ENTRY(MathNatives_atan, 1) {
|
| +DEFINE_NATIVE_ENTRY(Math_atan, 1) {
|
| GET_NATIVE_ARGUMENT(Double, operand, arguments->NativeArgAt(0));
|
| return Double::New(atan(operand.value()));
|
| }
|
|
|
| -DEFINE_NATIVE_ENTRY(MathNatives_atan2, 2) {
|
| +DEFINE_NATIVE_ENTRY(Math_atan2, 2) {
|
| GET_NATIVE_ARGUMENT(Double, operand1, arguments->NativeArgAt(0));
|
| GET_NATIVE_ARGUMENT(Double, operand2, arguments->NativeArgAt(1));
|
| return Double::New(atan2(operand1.value(), operand2.value()));
|
| }
|
|
|
| -DEFINE_NATIVE_ENTRY(MathNatives_exp, 1) {
|
| +DEFINE_NATIVE_ENTRY(Math_exp, 1) {
|
| GET_NATIVE_ARGUMENT(Double, operand, arguments->NativeArgAt(0));
|
| return Double::New(exp(operand.value()));
|
| }
|
|
|
| -DEFINE_NATIVE_ENTRY(MathNatives_log, 1) {
|
| +DEFINE_NATIVE_ENTRY(Math_log, 1) {
|
| GET_NATIVE_ARGUMENT(Double, operand, arguments->NativeArgAt(0));
|
| return Double::New(log(operand.value()));
|
| }
|
|
|
| -DEFINE_NATIVE_ENTRY(MathNatives_random, 0) {
|
| +DEFINE_NATIVE_ENTRY(Math_random, 0) {
|
| return Double::New(static_cast<double>(Random::RandomInt32()-1)/0x80000000);
|
| }
|
|
|
| -
|
| -// TODO(srdjan): Investigate for performance hit; the integer and double parsing
|
| -// may not be efficient as we need to generate two extra growable arrays.
|
| -static bool IsValidLiteral(const Scanner::GrowableTokenStream& tokens,
|
| - Token::Kind literal_kind,
|
| - bool* is_positive,
|
| - String** value) {
|
| - if ((tokens.length() == 2) &&
|
| - (tokens[0].kind == literal_kind) &&
|
| - (tokens[1].kind == Token::kEOS)) {
|
| - *is_positive = true;
|
| - *value = tokens[0].literal;
|
| - return true;
|
| - }
|
| - if ((tokens.length() == 3) &&
|
| - ((tokens[0].kind == Token::kTIGHTADD) ||
|
| - (tokens[0].kind == Token::kSUB)) &&
|
| - (tokens[1].kind == literal_kind) &&
|
| - (tokens[2].kind == Token::kEOS)) {
|
| - // Check there is no space between "+/-" and number.
|
| - if ((tokens[0].offset + 1) != tokens[1].offset) {
|
| - return false;
|
| - }
|
| - *is_positive = tokens[0].kind == Token::kTIGHTADD;
|
| - *value = tokens[1].literal;
|
| - return true;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -
|
| -DEFINE_NATIVE_ENTRY(MathNatives_parseInt, 1) {
|
| - GET_NATIVE_ARGUMENT(String, value, arguments->NativeArgAt(0));
|
| - const String& dummy_key = String::Handle(Symbols::Empty());
|
| - Scanner scanner(value, dummy_key);
|
| - const Scanner::GrowableTokenStream& tokens = scanner.GetStream();
|
| - String* int_string;
|
| - bool is_positive;
|
| - if (IsValidLiteral(tokens, Token::kINTEGER, &is_positive, &int_string)) {
|
| - if (is_positive) {
|
| - return Integer::New(*int_string);
|
| - } else {
|
| - String& temp = String::Handle();
|
| - temp = String::Concat(String::Handle(Symbols::New("-")),
|
| - *int_string);
|
| - return Integer::New(temp);
|
| - }
|
| - } else {
|
| - GrowableArray<const Object*> args;
|
| - args.Add(&value);
|
| - Exceptions::ThrowByType(Exceptions::kFormat, args);
|
| - return Object::null();
|
| - }
|
| -}
|
| -
|
| -
|
| -DEFINE_NATIVE_ENTRY(MathNatives_parseDouble, 1) {
|
| - GET_NATIVE_ARGUMENT(String, value, arguments->NativeArgAt(0));
|
| - const String& dummy_key = String::Handle(Symbols::Empty());
|
| - Scanner scanner(value, dummy_key);
|
| - const Scanner::GrowableTokenStream& tokens = scanner.GetStream();
|
| - String* number_string;
|
| - bool is_positive;
|
| - if (IsValidLiteral(tokens, Token::kDOUBLE, &is_positive, &number_string)) {
|
| - const char* cstr = number_string->ToCString();
|
| - char* p_end = NULL;
|
| - double double_value = strtod(cstr, &p_end);
|
| - ASSERT(p_end != cstr);
|
| - if (!is_positive) {
|
| - double_value = -double_value;
|
| - }
|
| - return Double::New(double_value);
|
| - }
|
| -
|
| - if (IsValidLiteral(tokens, Token::kINTEGER, &is_positive, &number_string)) {
|
| - Integer& res = Integer::Handle(Integer::New(*number_string));
|
| - if (is_positive) {
|
| - return Double::New(res.AsDoubleValue());
|
| - } else {
|
| - return Double::New(-res.AsDoubleValue());
|
| - }
|
| - }
|
| -
|
| - // Infinity and nan.
|
| - if (IsValidLiteral(tokens, Token::kIDENT, &is_positive, &number_string)) {
|
| - if (number_string->Equals("NaN")) {
|
| - return Double::New(NAN);
|
| - }
|
| - if (number_string->Equals("Infinity")) {
|
| - if (is_positive) {
|
| - return Double::New(INFINITY);
|
| - } else {
|
| - return Double::New(-INFINITY);
|
| - }
|
| - }
|
| - }
|
| -
|
| - GrowableArray<const Object*> args;
|
| - args.Add(&value);
|
| - Exceptions::ThrowByType(Exceptions::kFormat, args);
|
| - return Object::null();
|
| -}
|
| -
|
| } // namespace dart
|
|
|