OLD | NEW |
---|---|
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 22 matching lines...) Expand all Loading... | |
33 #include "api.h" | 33 #include "api.h" |
34 #include "arguments.h" | 34 #include "arguments.h" |
35 #include "bootstrapper.h" | 35 #include "bootstrapper.h" |
36 #include "codegen.h" | 36 #include "codegen.h" |
37 #include "compilation-cache.h" | 37 #include "compilation-cache.h" |
38 #include "compiler.h" | 38 #include "compiler.h" |
39 #include "cpu.h" | 39 #include "cpu.h" |
40 #include "dateparser-inl.h" | 40 #include "dateparser-inl.h" |
41 #include "debug.h" | 41 #include "debug.h" |
42 #include "deoptimizer.h" | 42 #include "deoptimizer.h" |
43 #include "date.h" | |
43 #include "execution.h" | 44 #include "execution.h" |
44 #include "global-handles.h" | 45 #include "global-handles.h" |
45 #include "isolate-inl.h" | 46 #include "isolate-inl.h" |
46 #include "jsregexp.h" | 47 #include "jsregexp.h" |
47 #include "json-parser.h" | 48 #include "json-parser.h" |
48 #include "liveedit.h" | 49 #include "liveedit.h" |
49 #include "liveobjectlist-inl.h" | 50 #include "liveobjectlist-inl.h" |
50 #include "misc-intrinsics.h" | 51 #include "misc-intrinsics.h" |
51 #include "parser.h" | 52 #include "parser.h" |
52 #include "platform.h" | 53 #include "platform.h" |
(...skipping 7450 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
7503 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_tan) { | 7504 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_tan) { |
7504 NoHandleAllocation ha; | 7505 NoHandleAllocation ha; |
7505 ASSERT(args.length() == 1); | 7506 ASSERT(args.length() == 1); |
7506 isolate->counters()->math_tan()->Increment(); | 7507 isolate->counters()->math_tan()->Increment(); |
7507 | 7508 |
7508 CONVERT_DOUBLE_ARG_CHECKED(x, 0); | 7509 CONVERT_DOUBLE_ARG_CHECKED(x, 0); |
7509 return isolate->transcendental_cache()->Get(TranscendentalCache::TAN, x); | 7510 return isolate->transcendental_cache()->Get(TranscendentalCache::TAN, x); |
7510 } | 7511 } |
7511 | 7512 |
7512 | 7513 |
7513 static int MakeDay(int year, int month) { | |
7514 static const int day_from_month[] = {0, 31, 59, 90, 120, 151, | |
7515 181, 212, 243, 273, 304, 334}; | |
7516 static const int day_from_month_leap[] = {0, 31, 60, 91, 121, 152, | |
7517 182, 213, 244, 274, 305, 335}; | |
7518 | |
7519 year += month / 12; | |
7520 month %= 12; | |
7521 if (month < 0) { | |
7522 year--; | |
7523 month += 12; | |
7524 } | |
7525 | |
7526 ASSERT(month >= 0); | |
7527 ASSERT(month < 12); | |
7528 | |
7529 // year_delta is an arbitrary number such that: | |
7530 // a) year_delta = -1 (mod 400) | |
7531 // b) year + year_delta > 0 for years in the range defined by | |
7532 // ECMA 262 - 15.9.1.1, i.e. upto 100,000,000 days on either side of | |
7533 // Jan 1 1970. This is required so that we don't run into integer | |
7534 // division of negative numbers. | |
7535 // c) there shouldn't be an overflow for 32-bit integers in the following | |
7536 // operations. | |
7537 static const int year_delta = 399999; | |
7538 static const int base_day = 365 * (1970 + year_delta) + | |
7539 (1970 + year_delta) / 4 - | |
7540 (1970 + year_delta) / 100 + | |
7541 (1970 + year_delta) / 400; | |
7542 | |
7543 int year1 = year + year_delta; | |
7544 int day_from_year = 365 * year1 + | |
7545 year1 / 4 - | |
7546 year1 / 100 + | |
7547 year1 / 400 - | |
7548 base_day; | |
7549 | |
7550 if ((year % 4 != 0) || (year % 100 == 0 && year % 400 != 0)) { | |
7551 return day_from_year + day_from_month[month]; | |
7552 } | |
7553 | |
7554 return day_from_year + day_from_month_leap[month]; | |
7555 } | |
7556 | |
7557 | |
7558 RUNTIME_FUNCTION(MaybeObject*, Runtime_DateMakeDay) { | 7514 RUNTIME_FUNCTION(MaybeObject*, Runtime_DateMakeDay) { |
7559 NoHandleAllocation ha; | 7515 NoHandleAllocation ha; |
7560 ASSERT(args.length() == 2); | 7516 ASSERT(args.length() == 2); |
7561 | 7517 |
7562 CONVERT_SMI_ARG_CHECKED(year, 0); | 7518 CONVERT_SMI_ARG_CHECKED(year, 0); |
7563 CONVERT_SMI_ARG_CHECKED(month, 1); | 7519 CONVERT_SMI_ARG_CHECKED(month, 1); |
7564 | 7520 |
7565 return Smi::FromInt(MakeDay(year, month)); | 7521 return Smi::FromInt(isolate->date_cache()->DaysFromYearMonth(year, month)); |
7566 } | 7522 } |
7567 | 7523 |
7568 | 7524 |
7569 static const int kDays4Years[] = {0, 365, 2 * 365, 3 * 365 + 1}; | 7525 RUNTIME_FUNCTION(MaybeObject*, Runtime_DateSetValue) { |
7570 static const int kDaysIn4Years = 4 * 365 + 1; | 7526 HandleScope scope(isolate); |
7571 static const int kDaysIn100Years = 25 * kDaysIn4Years - 1; | 7527 ASSERT(args.length() == 3); |
7572 static const int kDaysIn400Years = 4 * kDaysIn100Years + 1; | |
7573 static const int kDays1970to2000 = 30 * 365 + 7; | |
7574 static const int kDaysOffset = 1000 * kDaysIn400Years + 5 * kDaysIn400Years - | |
7575 kDays1970to2000; | |
7576 static const int kYearsOffset = 400000; | |
7577 | 7528 |
7578 static const char kDayInYear[] = { | 7529 CONVERT_ARG_HANDLE_CHECKED(JSDate, date, 0); |
7579 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 7530 CONVERT_DOUBLE_ARG_CHECKED(time, 1); |
7580 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | 7531 CONVERT_SMI_ARG_CHECKED(is_utc, 2); |
7581 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | |
7582 22, 23, 24, 25, 26, 27, 28, | |
7583 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | |
7584 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | |
7585 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | |
7586 22, 23, 24, 25, 26, 27, 28, 29, 30, | |
7587 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | |
7588 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | |
7589 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | |
7590 22, 23, 24, 25, 26, 27, 28, 29, 30, | |
7591 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | |
7592 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | |
7593 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | |
7594 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | |
7595 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | |
7596 22, 23, 24, 25, 26, 27, 28, 29, 30, | |
7597 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | |
7598 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | |
7599 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | |
7600 22, 23, 24, 25, 26, 27, 28, 29, 30, | |
7601 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | |
7602 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | |
7603 | 7532 |
7604 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 7533 DateCache* date_cache = isolate->date_cache(); |
7605 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | |
7606 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | |
7607 22, 23, 24, 25, 26, 27, 28, | |
7608 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | |
7609 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | |
7610 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | |
7611 22, 23, 24, 25, 26, 27, 28, 29, 30, | |
7612 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | |
7613 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | |
7614 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | |
7615 22, 23, 24, 25, 26, 27, 28, 29, 30, | |
7616 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | |
7617 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | |
7618 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | |
7619 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | |
7620 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | |
7621 22, 23, 24, 25, 26, 27, 28, 29, 30, | |
7622 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | |
7623 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | |
7624 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | |
7625 22, 23, 24, 25, 26, 27, 28, 29, 30, | |
7626 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | |
7627 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | |
7628 | 7534 |
7629 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 7535 Object* value = NULL; |
7630 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | 7536 bool is_value_nan = false; |
7631 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 7537 if (isnan(time)) { |
7632 22, 23, 24, 25, 26, 27, 28, 29, | 7538 value = isolate->heap()->nan_value(); |
7633 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 7539 is_value_nan = true; |
7634 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | 7540 } else { |
7635 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 7541 time = is_utc ? time : date_cache->ToUTC(time); |
7636 22, 23, 24, 25, 26, 27, 28, 29, 30, | 7542 if (time < -DateCache::kMaxTimeInMs || |
7637 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 7543 time > DateCache::kMaxTimeInMs) { |
7638 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | 7544 value = isolate->heap()->nan_value(); |
7639 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 7545 is_value_nan = true; |
rossberg
2012/03/06 15:55:50
Indentation.
ulan
2012/03/07 10:55:21
Done.
| |
7640 22, 23, 24, 25, 26, 27, 28, 29, 30, | 7546 } else { |
7641 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 7547 MaybeObject* maybe_result = |
7642 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | 7548 isolate->heap()->AllocateHeapNumber(DoubleToInteger(time)); |
rossberg
2012/03/06 15:55:50
If is_utc is true, this allocation seems redundant
ulan
2012/03/07 10:55:21
Unfortunately we need to truncate the time (Double
| |
7643 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 7549 if (!maybe_result->ToObject(&value)) return maybe_result; |
7644 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | 7550 } |
7645 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 7551 } |
7646 22, 23, 24, 25, 26, 27, 28, 29, 30, | 7552 date->SetValue(value, is_value_nan); |
rossberg
2012/03/06 15:55:50
Why do you need the extra flag? Can't the function
ulan
2012/03/07 10:55:21
Saving one isnan computation.
| |
7647 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 7553 return *date; |
7648 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | |
7649 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | |
7650 22, 23, 24, 25, 26, 27, 28, 29, 30, | |
7651 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | |
7652 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | |
7653 | |
7654 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | |
7655 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | |
7656 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | |
7657 22, 23, 24, 25, 26, 27, 28, | |
7658 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | |
7659 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | |
7660 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | |
7661 22, 23, 24, 25, 26, 27, 28, 29, 30, | |
7662 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | |
7663 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | |
7664 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | |
7665 22, 23, 24, 25, 26, 27, 28, 29, 30, | |
7666 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | |
7667 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | |
7668 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | |
7669 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | |
7670 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | |
7671 22, 23, 24, 25, 26, 27, 28, 29, 30, | |
7672 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | |
7673 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | |
7674 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | |
7675 22, 23, 24, 25, 26, 27, 28, 29, 30, | |
7676 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | |
7677 22, 23, 24, 25, 26, 27, 28, 29, 30, 31}; | |
7678 | |
7679 static const char kMonthInYear[] = { | |
7680 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |
7681 0, 0, 0, 0, 0, 0, | |
7682 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
7683 1, 1, 1, | |
7684 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
7685 2, 2, 2, 2, 2, 2, | |
7686 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, | |
7687 3, 3, 3, 3, 3, | |
7688 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
7689 4, 4, 4, 4, 4, 4, | |
7690 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | |
7691 5, 5, 5, 5, 5, | |
7692 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, | |
7693 6, 6, 6, 6, 6, 6, | |
7694 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, | |
7695 7, 7, 7, 7, 7, 7, | |
7696 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, | |
7697 8, 8, 8, 8, 8, | |
7698 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, | |
7699 9, 9, 9, 9, 9, 9, | |
7700 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, | |
7701 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, | |
7702 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, | |
7703 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, | |
7704 | |
7705 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |
7706 0, 0, 0, 0, 0, 0, | |
7707 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
7708 1, 1, 1, | |
7709 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
7710 2, 2, 2, 2, 2, 2, | |
7711 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, | |
7712 3, 3, 3, 3, 3, | |
7713 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
7714 4, 4, 4, 4, 4, 4, | |
7715 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | |
7716 5, 5, 5, 5, 5, | |
7717 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, | |
7718 6, 6, 6, 6, 6, 6, | |
7719 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, | |
7720 7, 7, 7, 7, 7, 7, | |
7721 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, | |
7722 8, 8, 8, 8, 8, | |
7723 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, | |
7724 9, 9, 9, 9, 9, 9, | |
7725 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, | |
7726 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, | |
7727 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, | |
7728 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, | |
7729 | |
7730 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |
7731 0, 0, 0, 0, 0, 0, | |
7732 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
7733 1, 1, 1, 1, | |
7734 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
7735 2, 2, 2, 2, 2, 2, | |
7736 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, | |
7737 3, 3, 3, 3, 3, | |
7738 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
7739 4, 4, 4, 4, 4, 4, | |
7740 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | |
7741 5, 5, 5, 5, 5, | |
7742 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, | |
7743 6, 6, 6, 6, 6, 6, | |
7744 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, | |
7745 7, 7, 7, 7, 7, 7, | |
7746 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, | |
7747 8, 8, 8, 8, 8, | |
7748 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, | |
7749 9, 9, 9, 9, 9, 9, | |
7750 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, | |
7751 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, | |
7752 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, | |
7753 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, | |
7754 | |
7755 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |
7756 0, 0, 0, 0, 0, 0, | |
7757 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
7758 1, 1, 1, | |
7759 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
7760 2, 2, 2, 2, 2, 2, | |
7761 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, | |
7762 3, 3, 3, 3, 3, | |
7763 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
7764 4, 4, 4, 4, 4, 4, | |
7765 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | |
7766 5, 5, 5, 5, 5, | |
7767 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, | |
7768 6, 6, 6, 6, 6, 6, | |
7769 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, | |
7770 7, 7, 7, 7, 7, 7, | |
7771 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, | |
7772 8, 8, 8, 8, 8, | |
7773 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, | |
7774 9, 9, 9, 9, 9, 9, | |
7775 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, | |
7776 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, | |
7777 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, | |
7778 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}; | |
7779 | |
7780 | |
7781 // This function works for dates from 1970 to 2099. | |
7782 static inline void DateYMDFromTimeAfter1970(int date, | |
7783 int& year, int& month, int& day) { | |
7784 #ifdef DEBUG | |
7785 int save_date = date; // Need this for ASSERT in the end. | |
7786 #endif | |
7787 | |
7788 year = 1970 + (4 * date + 2) / kDaysIn4Years; | |
7789 date %= kDaysIn4Years; | |
7790 | |
7791 month = kMonthInYear[date]; | |
7792 day = kDayInYear[date]; | |
7793 | |
7794 ASSERT(MakeDay(year, month) + day - 1 == save_date); | |
7795 } | 7554 } |
7796 | 7555 |
7797 | 7556 |
7798 static inline void DateYMDFromTimeSlow(int date, | |
7799 int& year, int& month, int& day) { | |
7800 #ifdef DEBUG | |
7801 int save_date = date; // Need this for ASSERT in the end. | |
7802 #endif | |
7803 | |
7804 date += kDaysOffset; | |
7805 year = 400 * (date / kDaysIn400Years) - kYearsOffset; | |
7806 date %= kDaysIn400Years; | |
7807 | |
7808 ASSERT(MakeDay(year, 0) + date == save_date); | |
7809 | |
7810 date--; | |
7811 int yd1 = date / kDaysIn100Years; | |
7812 date %= kDaysIn100Years; | |
7813 year += 100 * yd1; | |
7814 | |
7815 date++; | |
7816 int yd2 = date / kDaysIn4Years; | |
7817 date %= kDaysIn4Years; | |
7818 year += 4 * yd2; | |
7819 | |
7820 date--; | |
7821 int yd3 = date / 365; | |
7822 date %= 365; | |
7823 year += yd3; | |
7824 | |
7825 bool is_leap = (!yd1 || yd2) && !yd3; | |
7826 | |
7827 ASSERT(date >= -1); | |
7828 ASSERT(is_leap || (date >= 0)); | |
7829 ASSERT((date < 365) || (is_leap && (date < 366))); | |
7830 ASSERT(is_leap == ((year % 4 == 0) && (year % 100 || (year % 400 == 0)))); | |
7831 ASSERT(is_leap || ((MakeDay(year, 0) + date) == save_date)); | |
7832 ASSERT(!is_leap || ((MakeDay(year, 0) + date + 1) == save_date)); | |
7833 | |
7834 if (is_leap) { | |
7835 day = kDayInYear[2*365 + 1 + date]; | |
7836 month = kMonthInYear[2*365 + 1 + date]; | |
7837 } else { | |
7838 day = kDayInYear[date]; | |
7839 month = kMonthInYear[date]; | |
7840 } | |
7841 | |
7842 ASSERT(MakeDay(year, month) + day - 1 == save_date); | |
7843 } | |
7844 | |
7845 | |
7846 static inline void DateYMDFromTime(int date, | |
7847 int& year, int& month, int& day) { | |
7848 if (date >= 0 && date < 32 * kDaysIn4Years) { | |
7849 DateYMDFromTimeAfter1970(date, year, month, day); | |
7850 } else { | |
7851 DateYMDFromTimeSlow(date, year, month, day); | |
7852 } | |
7853 } | |
7854 | |
7855 | |
7856 RUNTIME_FUNCTION(MaybeObject*, Runtime_DateYMDFromTime) { | |
7857 NoHandleAllocation ha; | |
7858 ASSERT(args.length() == 2); | |
7859 | |
7860 CONVERT_DOUBLE_ARG_CHECKED(t, 0); | |
7861 CONVERT_ARG_CHECKED(JSArray, res_array, 1); | |
7862 | |
7863 int year, month, day; | |
7864 DateYMDFromTime(static_cast<int>(floor(t / 86400000)), year, month, day); | |
7865 | |
7866 FixedArrayBase* elms_base = FixedArrayBase::cast(res_array->elements()); | |
7867 RUNTIME_ASSERT(elms_base->length() == 3); | |
7868 RUNTIME_ASSERT(res_array->HasFastTypeElements()); | |
7869 | |
7870 MaybeObject* maybe = res_array->EnsureWritableFastElements(); | |
7871 if (maybe->IsFailure()) return maybe; | |
7872 FixedArray* elms = FixedArray::cast(res_array->elements()); | |
7873 elms->set(0, Smi::FromInt(year)); | |
7874 elms->set(1, Smi::FromInt(month)); | |
7875 elms->set(2, Smi::FromInt(day)); | |
7876 | |
7877 return isolate->heap()->undefined_value(); | |
7878 } | |
7879 | |
7880 | |
7881 RUNTIME_FUNCTION(MaybeObject*, Runtime_NewArgumentsFast) { | 7557 RUNTIME_FUNCTION(MaybeObject*, Runtime_NewArgumentsFast) { |
7882 HandleScope scope(isolate); | 7558 HandleScope scope(isolate); |
7883 ASSERT(args.length() == 3); | 7559 ASSERT(args.length() == 3); |
7884 | 7560 |
7885 Handle<JSFunction> callee = args.at<JSFunction>(0); | 7561 Handle<JSFunction> callee = args.at<JSFunction>(0); |
7886 Object** parameters = reinterpret_cast<Object**>(args[1]); | 7562 Object** parameters = reinterpret_cast<Object**>(args[1]); |
7887 const int argument_count = Smi::cast(args[2])->value(); | 7563 const int argument_count = Smi::cast(args[2])->value(); |
7888 | 7564 |
7889 Handle<JSObject> result = | 7565 Handle<JSObject> result = |
7890 isolate->factory()->NewArgumentsObject(callee, argument_count); | 7566 isolate->factory()->NewArgumentsObject(callee, argument_count); |
(...skipping 1452 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
9343 return isolate->heap()->null_value(); | 9019 return isolate->heap()->null_value(); |
9344 } | 9020 } |
9345 } | 9021 } |
9346 | 9022 |
9347 | 9023 |
9348 RUNTIME_FUNCTION(MaybeObject*, Runtime_DateLocalTimezone) { | 9024 RUNTIME_FUNCTION(MaybeObject*, Runtime_DateLocalTimezone) { |
9349 NoHandleAllocation ha; | 9025 NoHandleAllocation ha; |
9350 ASSERT(args.length() == 1); | 9026 ASSERT(args.length() == 1); |
9351 | 9027 |
9352 CONVERT_DOUBLE_ARG_CHECKED(x, 0); | 9028 CONVERT_DOUBLE_ARG_CHECKED(x, 0); |
9353 const char* zone = OS::LocalTimezone(x); | 9029 int64_t time = isolate->date_cache()->EquivalentTime(static_cast<int64_t>(x)); |
9030 const char* zone = OS::LocalTimezone(static_cast<double>(time)); | |
rossberg
2012/03/06 15:55:50
Do these conversions (here and below) actually req
ulan
2012/03/07 10:55:21
Done.
| |
9354 return isolate->heap()->AllocateStringFromUtf8(CStrVector(zone)); | 9031 return isolate->heap()->AllocateStringFromUtf8(CStrVector(zone)); |
9355 } | 9032 } |
9356 | 9033 |
9357 | 9034 |
9358 RUNTIME_FUNCTION(MaybeObject*, Runtime_DateLocalTimeOffset) { | 9035 RUNTIME_FUNCTION(MaybeObject*, Runtime_DateToUTC) { |
9359 NoHandleAllocation ha; | |
9360 ASSERT(args.length() == 0); | |
9361 | |
9362 return isolate->heap()->NumberFromDouble(OS::LocalTimeOffset()); | |
9363 } | |
9364 | |
9365 | |
9366 RUNTIME_FUNCTION(MaybeObject*, Runtime_DateDaylightSavingsOffset) { | |
9367 NoHandleAllocation ha; | 9036 NoHandleAllocation ha; |
9368 ASSERT(args.length() == 1); | 9037 ASSERT(args.length() == 1); |
9369 | 9038 |
9370 CONVERT_DOUBLE_ARG_CHECKED(x, 0); | 9039 CONVERT_DOUBLE_ARG_CHECKED(x, 0); |
9371 return isolate->heap()->NumberFromDouble(OS::DaylightSavingsOffset(x)); | 9040 int64_t time_ms = isolate->date_cache()->ToUTC(static_cast<int64_t>(x)); |
9041 | |
9042 return isolate->heap()->NumberFromDouble(static_cast<double>(time_ms)); | |
9372 } | 9043 } |
9373 | 9044 |
9374 | 9045 |
9375 RUNTIME_FUNCTION(MaybeObject*, Runtime_GlobalReceiver) { | 9046 RUNTIME_FUNCTION(MaybeObject*, Runtime_GlobalReceiver) { |
9376 ASSERT(args.length() == 1); | 9047 ASSERT(args.length() == 1); |
9377 Object* global = args[0]; | 9048 Object* global = args[0]; |
9378 if (!global->IsJSGlobalObject()) return isolate->heap()->null_value(); | 9049 if (!global->IsJSGlobalObject()) return isolate->heap()->null_value(); |
9379 return JSGlobalObject::cast(global)->global_receiver(); | 9050 return JSGlobalObject::cast(global)->global_receiver(); |
9380 } | 9051 } |
9381 | 9052 |
(...skipping 4239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
13621 // Handle last resort GC and make sure to allow future allocations | 13292 // Handle last resort GC and make sure to allow future allocations |
13622 // to grow the heap without causing GCs (if possible). | 13293 // to grow the heap without causing GCs (if possible). |
13623 isolate->counters()->gc_last_resort_from_js()->Increment(); | 13294 isolate->counters()->gc_last_resort_from_js()->Increment(); |
13624 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, | 13295 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, |
13625 "Runtime::PerformGC"); | 13296 "Runtime::PerformGC"); |
13626 } | 13297 } |
13627 } | 13298 } |
13628 | 13299 |
13629 | 13300 |
13630 } } // namespace v8::internal | 13301 } } // namespace v8::internal |
OLD | NEW |