From a49bf8622fe396be232de7a9889e3d0d2d6ced29 Mon Sep 17 00:00:00 2001 From: Ryan Dahl Date: Thu, 25 Mar 2010 15:01:59 -0700 Subject: [PATCH] Finish V8 update --- deps/v8/SConstruct | 1 - deps/v8/src/date-delay.js | 1089 --------------- deps/v8/src/debug-delay.js | 2130 ----------------------------- deps/v8/src/json-delay.js | 268 ---- deps/v8/src/liveedit-delay.js | 431 ------ deps/v8/src/mirror-delay.js | 2369 --------------------------------- deps/v8/src/number-info.h | 190 --- deps/v8/src/regexp-delay.js | 497 ------- 8 files changed, 6975 deletions(-) delete mode 100644 deps/v8/src/date-delay.js delete mode 100644 deps/v8/src/debug-delay.js delete mode 100644 deps/v8/src/json-delay.js delete mode 100644 deps/v8/src/liveedit-delay.js delete mode 100644 deps/v8/src/mirror-delay.js delete mode 100644 deps/v8/src/number-info.h delete mode 100644 deps/v8/src/regexp-delay.js diff --git a/deps/v8/SConstruct b/deps/v8/SConstruct index bef64eb2d4..f9504094bf 100644 --- a/deps/v8/SConstruct +++ b/deps/v8/SConstruct @@ -275,7 +275,6 @@ V8_EXTRA_FLAGS = { 'gcc': { 'all': { 'WARNINGFLAGS': ['-Wall', - '-Werror', '-W', '-Wno-unused-parameter', '-Wnon-virtual-dtor'] diff --git a/deps/v8/src/date-delay.js b/deps/v8/src/date-delay.js deleted file mode 100644 index 6c27d6901d..0000000000 --- a/deps/v8/src/date-delay.js +++ /dev/null @@ -1,1089 +0,0 @@ -// Copyright 2006-2008 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -// This file relies on the fact that the following declarations have been made -// in v8natives.js: -// const $isFinite = GlobalIsFinite; - -// ------------------------------------------------------------------- - -// This file contains date support implemented in JavaScript. - - -// Keep reference to original values of some global properties. This -// has the added benefit that the code in this file is isolated from -// changes to these properties. -const $Date = global.Date; - -// Helper function to throw error. -function ThrowDateTypeError() { - throw new $TypeError('this is not a Date object.'); -} - -// ECMA 262 - 5.2 -function Modulo(value, remainder) { - var mod = value % remainder; - // Guard against returning -0. - if (mod == 0) return 0; - return mod >= 0 ? mod : mod + remainder; -} - - -function TimeWithinDay(time) { - return Modulo(time, msPerDay); -} - - -// ECMA 262 - 15.9.1.3 -function DaysInYear(year) { - if (year % 4 != 0) return 365; - if ((year % 100 == 0) && (year % 400 != 0)) return 365; - return 366; -} - - -function DayFromYear(year) { - return 365 * (year-1970) - + FLOOR((year-1969)/4) - - FLOOR((year-1901)/100) - + FLOOR((year-1601)/400); -} - - -function TimeFromYear(year) { - return msPerDay * DayFromYear(year); -} - - -function InLeapYear(time) { - return DaysInYear(YEAR_FROM_TIME(time)) == 366 ? 1 : 0; -} - - -function DayWithinYear(time) { - return DAY(time) - DayFromYear(YEAR_FROM_TIME(time)); -} - - -// ECMA 262 - 15.9.1.9 -function EquivalentYear(year) { - // Returns an equivalent year in the range [2008-2035] matching - // - leap year. - // - week day of first day. - var time = TimeFromYear(year); - var recent_year = (InLeapYear(time) == 0 ? 1967 : 1956) + - (WeekDay(time) * 12) % 28; - // Find the year in the range 2008..2037 that is equivalent mod 28. - // Add 3*28 to give a positive argument to the modulus operator. - return 2008 + (recent_year + 3*28 - 2008) % 28; -} - - -function EquivalentTime(t) { - // The issue here is that some library calls don't work right for dates - // that cannot be represented using a non-negative signed 32 bit integer - // (measured in whole seconds based on the 1970 epoch). - // We solve this by mapping the time to a year with same leap-year-ness - // and same starting day for the year. The ECMAscript specification says - // we must do this, but for compatibility with other browsers, we use - // the actual year if it is in the range 1970..2037 - if (t >= 0 && t <= 2.1e12) return t; - - var day = MakeDay(EquivalentYear(YEAR_FROM_TIME(t)), - MONTH_FROM_TIME(t), - DATE_FROM_TIME(t)); - return MakeDate(day, TimeWithinDay(t)); -} - - -// Because computing the DST offset is a pretty expensive operation -// we keep a cache of last computed offset along with a time interval -// where we know the cache is valid. -var DST_offset_cache = { - // Cached DST offset. - offset: 0, - // Time interval where the cached offset is valid. - start: 0, end: -1, - // Size of next interval expansion. - increment: 0 -}; - - -// NOTE: The implementation relies on the fact that no time zones have -// more than one daylight savings offset change per month. -// If this function is called with NaN it returns NaN. -function DaylightSavingsOffset(t) { - // Load the cache object from the builtins object. - var cache = DST_offset_cache; - - // Cache the start and the end in local variables for fast access. - var start = cache.start; - var end = cache.end; - - if (start <= t) { - // If the time fits in the cached interval, return the cached offset. - if (t <= end) return cache.offset; - - // Compute a possible new interval end. - var new_end = end + cache.increment; - - if (t <= new_end) { - var end_offset = %DateDaylightSavingsOffset(EquivalentTime(new_end)); - if (cache.offset == end_offset) { - // If the offset at the end of the new interval still matches - // the offset in the cache, we grow the cached time interval - // and return the offset. - cache.end = new_end; - cache.increment = msPerMonth; - return end_offset; - } else { - var offset = %DateDaylightSavingsOffset(EquivalentTime(t)); - if (offset == end_offset) { - // The offset at the given time is equal to the offset at the - // new end of the interval, so that means that we've just skipped - // the point in time where the DST offset change occurred. Updated - // the interval to reflect this and reset the increment. - cache.start = t; - cache.end = new_end; - cache.increment = msPerMonth; - } else { - // The interval contains a DST offset change and the given time is - // before it. Adjust the increment to avoid a linear search for - // the offset change point and change the end of the interval. - cache.increment /= 3; - cache.end = t; - } - // Update the offset in the cache and return it. - cache.offset = offset; - return offset; - } - } - } - - // Compute the DST offset for the time and shrink the cache interval - // to only contain the time. This allows fast repeated DST offset - // computations for the same time. - var offset = %DateDaylightSavingsOffset(EquivalentTime(t)); - cache.offset = offset; - cache.start = cache.end = t; - cache.increment = msPerMonth; - return offset; -} - - -var timezone_cache_time = $NaN; -var timezone_cache_timezone; - -function LocalTimezone(t) { - if (NUMBER_IS_NAN(t)) return ""; - if (t == timezone_cache_time) { - return timezone_cache_timezone; - } - var timezone = %DateLocalTimezone(EquivalentTime(t)); - timezone_cache_time = t; - timezone_cache_timezone = timezone; - return timezone; -} - - -function WeekDay(time) { - return Modulo(DAY(time) + 4, 7); -} - -var local_time_offset = %DateLocalTimeOffset(); - -function LocalTime(time) { - if (NUMBER_IS_NAN(time)) return time; - return time + local_time_offset + DaylightSavingsOffset(time); -} - -function LocalTimeNoCheck(time) { - // Inline the DST offset cache checks for speed. - var cache = DST_offset_cache; - if (cache.start <= time && time <= cache.end) { - var dst_offset = cache.offset; - } else { - var dst_offset = DaylightSavingsOffset(time); - } - return time + local_time_offset + dst_offset; -} - - -function UTC(time) { - if (NUMBER_IS_NAN(time)) return time; - var tmp = time - local_time_offset; - return tmp - DaylightSavingsOffset(tmp); -} - - -// ECMA 262 - 15.9.1.11 -function MakeTime(hour, min, sec, ms) { - if (!$isFinite(hour)) return $NaN; - if (!$isFinite(min)) return $NaN; - if (!$isFinite(sec)) return $NaN; - if (!$isFinite(ms)) return $NaN; - return TO_INTEGER(hour) * msPerHour - + TO_INTEGER(min) * msPerMinute - + TO_INTEGER(sec) * msPerSecond - + TO_INTEGER(ms); -} - - -// ECMA 262 - 15.9.1.12 -function TimeInYear(year) { - return DaysInYear(year) * msPerDay; -} - - -var ymd_from_time_cache = [$NaN, $NaN, $NaN]; -var ymd_from_time_cached_time = $NaN; - -function YearFromTime(t) { - if (t !== ymd_from_time_cached_time) { - // Limits according to ECMA 262 15.9.1.1 - if (!$isFinite(t) || t < -8640000000000000 || t > 8640000000000000) { - return $NaN; - } - - %DateYMDFromTime(t, ymd_from_time_cache); - ymd_from_time_cached_time = t - } - - return ymd_from_time_cache[0]; -} - -function MonthFromTime(t) { - if (t !== ymd_from_time_cached_time) { - // Limits according to ECMA 262 15.9.1.1 - if (!$isFinite(t) || t < -8640000000000000 || t > 8640000000000000) { - return $NaN; - } - %DateYMDFromTime(t, ymd_from_time_cache); - ymd_from_time_cached_time = t - } - - return ymd_from_time_cache[1]; -} - -function DateFromTime(t) { - if (t !== ymd_from_time_cached_time) { - // Limits according to ECMA 262 15.9.1.1 - if (!$isFinite(t) || t < -8640000000000000 || t > 8640000000000000) { - return $NaN; - } - - %DateYMDFromTime(t, ymd_from_time_cache); - ymd_from_time_cached_time = t - } - - return ymd_from_time_cache[2]; -} - - -// Compute number of days given a year, month, date. -// Note that month and date can lie outside the normal range. -// For example: -// MakeDay(2007, -4, 20) --> MakeDay(2006, 8, 20) -// MakeDay(2007, -33, 1) --> MakeDay(2004, 3, 1) -// MakeDay(2007, 14, -50) --> MakeDay(2007, 8, 11) -function MakeDay(year, month, date) { - if (!$isFinite(year) || !$isFinite(month) || !$isFinite(date)) return $NaN; - - year = TO_INTEGER(year); - month = TO_INTEGER(month); - date = TO_INTEGER(date); - - if (year < kMinYear || year > kMaxYear || - month < kMinMonth || month > kMaxMonth || - date < kMinDate || date > kMaxDate) { - return $NaN; - } - - // Now we rely on year, month and date being SMIs. - return %DateMakeDay(year, month, date); -} - - -// ECMA 262 - 15.9.1.13 -function MakeDate(day, time) { - if (!$isFinite(day)) return $NaN; - if (!$isFinite(time)) return $NaN; - return day * msPerDay + time; -} - - -// ECMA 262 - 15.9.1.14 -function TimeClip(time) { - if (!$isFinite(time)) return $NaN; - if ($abs(time) > 8.64E15) return $NaN; - return TO_INTEGER(time); -} - - -// The Date cache is used to limit the cost of parsing the same Date -// strings over and over again. -var Date_cache = { - // Cached time value. - time: $NaN, - // Cached year when interpreting the time as a local time. Only - // valid when the time matches cached time. - year: $NaN, - // String input for which the cached time is valid. - string: null -}; - - -%SetCode($Date, function(year, month, date, hours, minutes, seconds, ms) { - if (!%_IsConstructCall()) { - // ECMA 262 - 15.9.2 - return (new $Date()).toString(); - } - - // ECMA 262 - 15.9.3 - var argc = %_ArgumentsLength(); - var value; - if (argc == 0) { - value = %DateCurrentTime(); - - } else if (argc == 1) { - if (IS_NUMBER(year)) { - value = TimeClip(year); - - } else if (IS_STRING(year)) { - // Probe the Date cache. If we already have a time value for the - // given time, we re-use that instead of parsing the string again. - var cache = Date_cache; - if (cache.string === year) { - value = cache.time; - } else { - value = DateParse(year); - if (!NUMBER_IS_NAN(value)) { - cache.time = value; - cache.year = YEAR_FROM_TIME(LocalTimeNoCheck(value)); - cache.string = year; - } - } - - } else { - // According to ECMA 262, no hint should be given for this - // conversion. However, ToPrimitive defaults to STRING_HINT for - // Date objects which will lose precision when the Date - // constructor is called with another Date object as its - // argument. We therefore use NUMBER_HINT for the conversion, - // which is the default for everything else than Date objects. - // This makes us behave like KJS and SpiderMonkey. - var time = ToPrimitive(year, NUMBER_HINT); - value = IS_STRING(time) ? DateParse(time) : TimeClip(ToNumber(time)); - } - - } else { - year = ToNumber(year); - month = ToNumber(month); - date = argc > 2 ? ToNumber(date) : 1; - hours = argc > 3 ? ToNumber(hours) : 0; - minutes = argc > 4 ? ToNumber(minutes) : 0; - seconds = argc > 5 ? ToNumber(seconds) : 0; - ms = argc > 6 ? ToNumber(ms) : 0; - year = (!NUMBER_IS_NAN(year) && 0 <= TO_INTEGER(year) && TO_INTEGER(year) <= 99) - ? 1900 + TO_INTEGER(year) : year; - var day = MakeDay(year, month, date); - var time = MakeTime(hours, minutes, seconds, ms); - value = TimeClip(UTC(MakeDate(day, time))); - } - %_SetValueOf(this, value); -}); - - -// Helper functions. -function GetTimeFrom(aDate) { - return DATE_VALUE(aDate); -} - -function GetMillisecondsFrom(aDate) { - var t = DATE_VALUE(aDate); - if (NUMBER_IS_NAN(t)) return t; - return MS_FROM_TIME(LocalTimeNoCheck(t)); -} - - -function GetUTCMillisecondsFrom(aDate) { - var t = DATE_VALUE(aDate); - if (NUMBER_IS_NAN(t)) return t; - return MS_FROM_TIME(t); -} - - -function GetSecondsFrom(aDate) { - var t = DATE_VALUE(aDate); - if (NUMBER_IS_NAN(t)) return t; - return SEC_FROM_TIME(LocalTimeNoCheck(t)); -} - - -function GetUTCSecondsFrom(aDate) { - var t = DATE_VALUE(aDate); - if (NUMBER_IS_NAN(t)) return t; - return SEC_FROM_TIME(t); -} - - -function GetMinutesFrom(aDate) { - var t = DATE_VALUE(aDate); - if (NUMBER_IS_NAN(t)) return t; - return MIN_FROM_TIME(LocalTimeNoCheck(t)); -} - - -function GetUTCMinutesFrom(aDate) { - var t = DATE_VALUE(aDate); - if (NUMBER_IS_NAN(t)) return t; - return MIN_FROM_TIME(t); -} - - -function GetHoursFrom(aDate) { - var t = DATE_VALUE(aDate); - if (NUMBER_IS_NAN(t)) return t; - return HOUR_FROM_TIME(LocalTimeNoCheck(t)); -} - - -function GetUTCHoursFrom(aDate) { - var t = DATE_VALUE(aDate); - if (NUMBER_IS_NAN(t)) return t; - return HOUR_FROM_TIME(t); -} - - -function GetFullYearFrom(aDate) { - var t = DATE_VALUE(aDate); - if (NUMBER_IS_NAN(t)) return t; - var cache = Date_cache; - if (cache.time === t) return cache.year; - return YEAR_FROM_TIME(LocalTimeNoCheck(t)); -} - - -function GetUTCFullYearFrom(aDate) { - var t = DATE_VALUE(aDate); - if (NUMBER_IS_NAN(t)) return t; - return YEAR_FROM_TIME(t); -} - - -function GetMonthFrom(aDate) { - var t = DATE_VALUE(aDate); - if (NUMBER_IS_NAN(t)) return t; - return MONTH_FROM_TIME(LocalTimeNoCheck(t)); -} - - -function GetUTCMonthFrom(aDate) { - var t = DATE_VALUE(aDate); - if (NUMBER_IS_NAN(t)) return t; - return MONTH_FROM_TIME(t); -} - - -function GetDateFrom(aDate) { - var t = DATE_VALUE(aDate); - if (NUMBER_IS_NAN(t)) return t; - return DATE_FROM_TIME(LocalTimeNoCheck(t)); -} - - -function GetUTCDateFrom(aDate) { - var t = DATE_VALUE(aDate); - if (NUMBER_IS_NAN(t)) return t; - return DATE_FROM_TIME(t); -} - - -%FunctionSetPrototype($Date, new $Date($NaN)); - - -var WeekDays = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']; -var Months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; - - -function TwoDigitString(value) { - return value < 10 ? "0" + value : "" + value; -} - - -function DateString(time) { - return WeekDays[WeekDay(time)] + ' ' - + Months[MonthFromTime(time)] + ' ' - + TwoDigitString(DateFromTime(time)) + ' ' - + YearFromTime(time); -} - - -var LongWeekDays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']; -var LongMonths = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; - - -function LongDateString(time) { - return LongWeekDays[WeekDay(time)] + ', ' - + LongMonths[MonthFromTime(time)] + ' ' - + TwoDigitString(DateFromTime(time)) + ', ' - + YearFromTime(time); -} - - -function TimeString(time) { - return TwoDigitString(HOUR_FROM_TIME(time)) + ':' - + TwoDigitString(MIN_FROM_TIME(time)) + ':' - + TwoDigitString(SEC_FROM_TIME(time)); -} - - -function LocalTimezoneString(time) { - var timezoneOffset = - (local_time_offset + DaylightSavingsOffset(time)) / msPerMinute; - var sign = (timezoneOffset >= 0) ? 1 : -1; - var hours = FLOOR((sign * timezoneOffset)/60); - var min = FLOOR((sign * timezoneOffset)%60); - var gmt = ' GMT' + ((sign == 1) ? '+' : '-') + - TwoDigitString(hours) + TwoDigitString(min); - return gmt + ' (' + LocalTimezone(time) + ')'; -} - - -function DatePrintString(time) { - return DateString(time) + ' ' + TimeString(time); -} - -// ------------------------------------------------------------------- - -// Reused output buffer. Used when parsing date strings. -var parse_buffer = $Array(7); - -// ECMA 262 - 15.9.4.2 -function DateParse(string) { - var arr = %DateParseString(ToString(string), parse_buffer); - if (IS_NULL(arr)) return $NaN; - - var day = MakeDay(arr[0], arr[1], arr[2]); - var time = MakeTime(arr[3], arr[4], arr[5], 0); - var date = MakeDate(day, time); - - if (IS_NULL(arr[6])) { - return TimeClip(UTC(date)); - } else { - return TimeClip(date - arr[6] * 1000); - } -} - - -// ECMA 262 - 15.9.4.3 -function DateUTC(year, month, date, hours, minutes, seconds, ms) { - year = ToNumber(year); - month = ToNumber(month); - var argc = %_ArgumentsLength(); - date = argc > 2 ? ToNumber(date) : 1; - hours = argc > 3 ? ToNumber(hours) : 0; - minutes = argc > 4 ? ToNumber(minutes) : 0; - seconds = argc > 5 ? ToNumber(seconds) : 0; - ms = argc > 6 ? ToNumber(ms) : 0; - year = (!NUMBER_IS_NAN(year) && 0 <= TO_INTEGER(year) && TO_INTEGER(year) <= 99) - ? 1900 + TO_INTEGER(year) : year; - var day = MakeDay(year, month, date); - var time = MakeTime(hours, minutes, seconds, ms); - return %_SetValueOf(this, TimeClip(MakeDate(day, time))); -} - - -// Mozilla-specific extension. Returns the number of milliseconds -// elapsed since 1 January 1970 00:00:00 UTC. -function DateNow() { - return %DateCurrentTime(); -} - - -// ECMA 262 - 15.9.5.2 -function DateToString() { - var t = DATE_VALUE(this); - if (NUMBER_IS_NAN(t)) return kInvalidDate; - return DatePrintString(LocalTimeNoCheck(t)) + LocalTimezoneString(t); -} - - -// ECMA 262 - 15.9.5.3 -function DateToDateString() { - var t = DATE_VALUE(this); - if (NUMBER_IS_NAN(t)) return kInvalidDate; - return DateString(LocalTimeNoCheck(t)); -} - - -// ECMA 262 - 15.9.5.4 -function DateToTimeString() { - var t = DATE_VALUE(this); - if (NUMBER_IS_NAN(t)) return kInvalidDate; - var lt = LocalTimeNoCheck(t); - return TimeString(lt) + LocalTimezoneString(lt); -} - - -// ECMA 262 - 15.9.5.5 -function DateToLocaleString() { - return DateToString.call(this); -} - - -// ECMA 262 - 15.9.5.6 -function DateToLocaleDateString() { - var t = DATE_VALUE(this); - if (NUMBER_IS_NAN(t)) return kInvalidDate; - return LongDateString(LocalTimeNoCheck(t)); -} - - -// ECMA 262 - 15.9.5.7 -function DateToLocaleTimeString() { - var t = DATE_VALUE(this); - if (NUMBER_IS_NAN(t)) return kInvalidDate; - var lt = LocalTimeNoCheck(t); - return TimeString(lt); -} - - -// ECMA 262 - 15.9.5.8 -function DateValueOf() { - return DATE_VALUE(this); -} - - -// ECMA 262 - 15.9.5.9 -function DateGetTime() { - return DATE_VALUE(this); -} - - -// ECMA 262 - 15.9.5.10 -function DateGetFullYear() { - return GetFullYearFrom(this) -} - - -// ECMA 262 - 15.9.5.11 -function DateGetUTCFullYear() { - return GetUTCFullYearFrom(this) -} - - -// ECMA 262 - 15.9.5.12 -function DateGetMonth() { - return GetMonthFrom(this); -} - - -// ECMA 262 - 15.9.5.13 -function DateGetUTCMonth() { - return GetUTCMonthFrom(this); -} - - -// ECMA 262 - 15.9.5.14 -function DateGetDate() { - return GetDateFrom(this); -} - - -// ECMA 262 - 15.9.5.15 -function DateGetUTCDate() { - return GetUTCDateFrom(this); -} - - -// ECMA 262 - 15.9.5.16 -function DateGetDay() { - var t = %_ValueOf(this); - if (NUMBER_IS_NAN(t)) return t; - return WeekDay(LocalTimeNoCheck(t)); -} - - -// ECMA 262 - 15.9.5.17 -function DateGetUTCDay() { - var t = %_ValueOf(this); - if (NUMBER_IS_NAN(t)) return t; - return WeekDay(t); -} - - -// ECMA 262 - 15.9.5.18 -function DateGetHours() { - return GetHoursFrom(this); -} - - -// ECMA 262 - 15.9.5.19 -function DateGetUTCHours() { - return GetUTCHoursFrom(this); -} - - -// ECMA 262 - 15.9.5.20 -function DateGetMinutes() { - return GetMinutesFrom(this); -} - - -// ECMA 262 - 15.9.5.21 -function DateGetUTCMinutes() { - return GetUTCMinutesFrom(this); -} - - -// ECMA 262 - 15.9.5.22 -function DateGetSeconds() { - return GetSecondsFrom(this); -} - - -// ECMA 262 - 15.9.5.23 -function DateGetUTCSeconds() { - return GetUTCSecondsFrom(this); -} - - -// ECMA 262 - 15.9.5.24 -function DateGetMilliseconds() { - return GetMillisecondsFrom(this); -} - - -// ECMA 262 - 15.9.5.25 -function DateGetUTCMilliseconds() { - return GetUTCMillisecondsFrom(this); -} - - -// ECMA 262 - 15.9.5.26 -function DateGetTimezoneOffset() { - var t = DATE_VALUE(this); - if (NUMBER_IS_NAN(t)) return t; - return (t - LocalTimeNoCheck(t)) / msPerMinute; -} - - -// ECMA 262 - 15.9.5.27 -function DateSetTime(ms) { - if (!IS_DATE(this)) ThrowDateTypeError(); - return %_SetValueOf(this, TimeClip(ToNumber(ms))); -} - - -// ECMA 262 - 15.9.5.28 -function DateSetMilliseconds(ms) { - var t = LocalTime(DATE_VALUE(this)); - ms = ToNumber(ms); - var time = MakeTime(HOUR_FROM_TIME(t), MIN_FROM_TIME(t), SEC_FROM_TIME(t), ms); - return %_SetValueOf(this, TimeClip(UTC(MakeDate(DAY(t), time)))); -} - - -// ECMA 262 - 15.9.5.29 -function DateSetUTCMilliseconds(ms) { - var t = DATE_VALUE(this); - ms = ToNumber(ms); - var time = MakeTime(HOUR_FROM_TIME(t), MIN_FROM_TIME(t), SEC_FROM_TIME(t), ms); - return %_SetValueOf(this, TimeClip(MakeDate(DAY(t), time))); -} - - -// ECMA 262 - 15.9.5.30 -function DateSetSeconds(sec, ms) { - var t = LocalTime(DATE_VALUE(this)); - sec = ToNumber(sec); - ms = %_ArgumentsLength() < 2 ? GetMillisecondsFrom(this) : ToNumber(ms); - var time = MakeTime(HOUR_FROM_TIME(t), MIN_FROM_TIME(t), sec, ms); - return %_SetValueOf(this, TimeClip(UTC(MakeDate(DAY(t), time)))); -} - - -// ECMA 262 - 15.9.5.31 -function DateSetUTCSeconds(sec, ms) { - var t = DATE_VALUE(this); - sec = ToNumber(sec); - ms = %_ArgumentsLength() < 2 ? GetUTCMillisecondsFrom(this) : ToNumber(ms); - var time = MakeTime(HOUR_FROM_TIME(t), MIN_FROM_TIME(t), sec, ms); - return %_SetValueOf(this, TimeClip(MakeDate(DAY(t), time))); -} - - -// ECMA 262 - 15.9.5.33 -function DateSetMinutes(min, sec, ms) { - var t = LocalTime(DATE_VALUE(this)); - min = ToNumber(min); - var argc = %_ArgumentsLength(); - sec = argc < 2 ? GetSecondsFrom(this) : ToNumber(sec); - ms = argc < 3 ? GetMillisecondsFrom(this) : ToNumber(ms); - var time = MakeTime(HOUR_FROM_TIME(t), min, sec, ms); - return %_SetValueOf(this, TimeClip(UTC(MakeDate(DAY(t), time)))); -} - - -// ECMA 262 - 15.9.5.34 -function DateSetUTCMinutes(min, sec, ms) { - var t = DATE_VALUE(this); - min = ToNumber(min); - var argc = %_ArgumentsLength(); - sec = argc < 2 ? GetUTCSecondsFrom(this) : ToNumber(sec); - ms = argc < 3 ? GetUTCMillisecondsFrom(this) : ToNumber(ms); - var time = MakeTime(HOUR_FROM_TIME(t), min, sec, ms); - return %_SetValueOf(this, TimeClip(MakeDate(DAY(t), time))); -} - - -// ECMA 262 - 15.9.5.35 -function DateSetHours(hour, min, sec, ms) { - var t = LocalTime(DATE_VALUE(this)); - hour = ToNumber(hour); - var argc = %_ArgumentsLength(); - min = argc < 2 ? GetMinutesFrom(this) : ToNumber(min); - sec = argc < 3 ? GetSecondsFrom(this) : ToNumber(sec); - ms = argc < 4 ? GetMillisecondsFrom(this) : ToNumber(ms); - var time = MakeTime(hour, min, sec, ms); - return %_SetValueOf(this, TimeClip(UTC(MakeDate(DAY(t), time)))); -} - - -// ECMA 262 - 15.9.5.34 -function DateSetUTCHours(hour, min, sec, ms) { - var t = DATE_VALUE(this); - hour = ToNumber(hour); - var argc = %_ArgumentsLength(); - min = argc < 2 ? GetUTCMinutesFrom(this) : ToNumber(min); - sec = argc < 3 ? GetUTCSecondsFrom(this) : ToNumber(sec); - ms = argc < 4 ? GetUTCMillisecondsFrom(this) : ToNumber(ms); - var time = MakeTime(hour, min, sec, ms); - return %_SetValueOf(this, TimeClip(MakeDate(DAY(t), time))); -} - - -// ECMA 262 - 15.9.5.36 -function DateSetDate(date) { - var t = LocalTime(DATE_VALUE(this)); - date = ToNumber(date); - var day = MakeDay(YEAR_FROM_TIME(t), MONTH_FROM_TIME(t), date); - return %_SetValueOf(this, TimeClip(UTC(MakeDate(day, TimeWithinDay(t))))); -} - - -// ECMA 262 - 15.9.5.37 -function DateSetUTCDate(date) { - var t = DATE_VALUE(this); - date = ToNumber(date); - var day = MakeDay(YEAR_FROM_TIME(t), MONTH_FROM_TIME(t), date); - return %_SetValueOf(this, TimeClip(MakeDate(day, TimeWithinDay(t)))); -} - - -// ECMA 262 - 15.9.5.38 -function DateSetMonth(month, date) { - var t = LocalTime(DATE_VALUE(this)); - month = ToNumber(month); - date = %_ArgumentsLength() < 2 ? GetDateFrom(this) : ToNumber(date); - var day = MakeDay(YEAR_FROM_TIME(t), month, date); - return %_SetValueOf(this, TimeClip(UTC(MakeDate(day, TimeWithinDay(t))))); -} - - -// ECMA 262 - 15.9.5.39 -function DateSetUTCMonth(month, date) { - var t = DATE_VALUE(this); - month = ToNumber(month); - date = %_ArgumentsLength() < 2 ? GetUTCDateFrom(this) : ToNumber(date); - var day = MakeDay(YEAR_FROM_TIME(t), month, date); - return %_SetValueOf(this, TimeClip(MakeDate(day, TimeWithinDay(t)))); -} - - -// ECMA 262 - 15.9.5.40 -function DateSetFullYear(year, month, date) { - var t = DATE_VALUE(this); - t = NUMBER_IS_NAN(t) ? 0 : LocalTimeNoCheck(t); - year = ToNumber(year); - var argc = %_ArgumentsLength(); - month = argc < 2 ? MONTH_FROM_TIME(t) : ToNumber(month); - date = argc < 3 ? DATE_FROM_TIME(t) : ToNumber(date); - var day = MakeDay(year, month, date); - return %_SetValueOf(this, TimeClip(UTC(MakeDate(day, TimeWithinDay(t))))); -} - - -// ECMA 262 - 15.9.5.41 -function DateSetUTCFullYear(year, month, date) { - var t = DATE_VALUE(this); - if (NUMBER_IS_NAN(t)) t = 0; - var argc = %_ArgumentsLength(); - year = ToNumber(year); - month = argc < 2 ? MONTH_FROM_TIME(t) : ToNumber(month); - date = argc < 3 ? DATE_FROM_TIME(t) : ToNumber(date); - var day = MakeDay(year, month, date); - return %_SetValueOf(this, TimeClip(MakeDate(day, TimeWithinDay(t)))); -} - - -// ECMA 262 - 15.9.5.42 -function DateToUTCString() { - var t = DATE_VALUE(this); - if (NUMBER_IS_NAN(t)) return kInvalidDate; - // Return UTC string of the form: Sat, 31 Jan 1970 23:00:00 GMT - return WeekDays[WeekDay(t)] + ', ' - + TwoDigitString(DATE_FROM_TIME(t)) + ' ' - + Months[MONTH_FROM_TIME(t)] + ' ' - + YEAR_FROM_TIME(t) + ' ' - + TimeString(t) + ' GMT'; -} - - -// ECMA 262 - B.2.4 -function DateGetYear() { - var t = DATE_VALUE(this); - if (NUMBER_IS_NAN(t)) return $NaN; - return YEAR_FROM_TIME(LocalTimeNoCheck(t)) - 1900; -} - - -// ECMA 262 - B.2.5 -function DateSetYear(year) { - var t = LocalTime(DATE_VALUE(this)); - if (NUMBER_IS_NAN(t)) t = 0; - year = ToNumber(year); - if (NUMBER_IS_NAN(year)) return %_SetValueOf(this, $NaN); - year = (0 <= TO_INTEGER(year) && TO_INTEGER(year) <= 99) - ? 1900 + TO_INTEGER(year) : year; - var day = MakeDay(year, MONTH_FROM_TIME(t), DATE_FROM_TIME(t)); - return %_SetValueOf(this, TimeClip(UTC(MakeDate(day, TimeWithinDay(t))))); -} - - -// ECMA 262 - B.2.6 -// -// Notice that this does not follow ECMA 262 completely. ECMA 262 -// says that toGMTString should be the same Function object as -// toUTCString. JSC does not do this, so for compatibility we do not -// do that either. Instead, we create a new function whose name -// property will return toGMTString. -function DateToGMTString() { - return DateToUTCString.call(this); -} - - -function PadInt(n, digits) { - if (digits == 1) return n; - return n < MathPow(10, digits - 1) ? '0' + PadInt(n, digits - 1) : n; -} - - -function DateToISOString() { - var t = DATE_VALUE(this); - if (NUMBER_IS_NAN(t)) return kInvalidDate; - return this.getUTCFullYear() + '-' + PadInt(this.getUTCMonth() + 1, 2) + - '-' + PadInt(this.getUTCDate(), 2) + 'T' + PadInt(this.getUTCHours(), 2) + - ':' + PadInt(this.getUTCMinutes(), 2) + ':' + PadInt(this.getUTCSeconds(), 2) + - '.' + PadInt(this.getUTCMilliseconds(), 3) + - 'Z'; -} - - -function DateToJSON(key) { - return CheckJSONPrimitive(this.toISOString()); -} - - -// ------------------------------------------------------------------- - -function SetupDate() { - // Setup non-enumerable properties of the Date object itself. - InstallFunctions($Date, DONT_ENUM, $Array( - "UTC", DateUTC, - "parse", DateParse, - "now", DateNow - )); - - // Setup non-enumerable constructor property of the Date prototype object. - %SetProperty($Date.prototype, "constructor", $Date, DONT_ENUM); - - // Setup non-enumerable functions of the Date prototype object and - // set their names. - InstallFunctionsOnHiddenPrototype($Date.prototype, DONT_ENUM, $Array( - "toString", DateToString, - "toDateString", DateToDateString, - "toTimeString", DateToTimeString, - "toLocaleString", DateToLocaleString, - "toLocaleDateString", DateToLocaleDateString, - "toLocaleTimeString", DateToLocaleTimeString, - "valueOf", DateValueOf, - "getTime", DateGetTime, - "getFullYear", DateGetFullYear, - "getUTCFullYear", DateGetUTCFullYear, - "getMonth", DateGetMonth, - "getUTCMonth", DateGetUTCMonth, - "getDate", DateGetDate, - "getUTCDate", DateGetUTCDate, - "getDay", DateGetDay, - "getUTCDay", DateGetUTCDay, - "getHours", DateGetHours, - "getUTCHours", DateGetUTCHours, - "getMinutes", DateGetMinutes, - "getUTCMinutes", DateGetUTCMinutes, - "getSeconds", DateGetSeconds, - "getUTCSeconds", DateGetUTCSeconds, - "getMilliseconds", DateGetMilliseconds, - "getUTCMilliseconds", DateGetUTCMilliseconds, - "getTimezoneOffset", DateGetTimezoneOffset, - "setTime", DateSetTime, - "setMilliseconds", DateSetMilliseconds, - "setUTCMilliseconds", DateSetUTCMilliseconds, - "setSeconds", DateSetSeconds, - "setUTCSeconds", DateSetUTCSeconds, - "setMinutes", DateSetMinutes, - "setUTCMinutes", DateSetUTCMinutes, - "setHours", DateSetHours, - "setUTCHours", DateSetUTCHours, - "setDate", DateSetDate, - "setUTCDate", DateSetUTCDate, - "setMonth", DateSetMonth, - "setUTCMonth", DateSetUTCMonth, - "setFullYear", DateSetFullYear, - "setUTCFullYear", DateSetUTCFullYear, - "toGMTString", DateToGMTString, - "toUTCString", DateToUTCString, - "getYear", DateGetYear, - "setYear", DateSetYear, - "toISOString", DateToISOString, - "toJSON", DateToJSON - )); -} - -SetupDate(); diff --git a/deps/v8/src/debug-delay.js b/deps/v8/src/debug-delay.js deleted file mode 100644 index 5ba5a3bb73..0000000000 --- a/deps/v8/src/debug-delay.js +++ /dev/null @@ -1,2130 +0,0 @@ -// Copyright 2006-2008 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// Default number of frames to include in the response to backtrace request. -const kDefaultBacktraceLength = 10; - -const Debug = {}; - -// Regular expression to skip "crud" at the beginning of a source line which is -// not really code. Currently the regular expression matches whitespace and -// comments. -const sourceLineBeginningSkip = /^(?:\s*(?:\/\*.*?\*\/)*)*/; - -// Debug events which can occour in the V8 JavaScript engine. These originate -// from the API include file debug.h. -Debug.DebugEvent = { Break: 1, - Exception: 2, - NewFunction: 3, - BeforeCompile: 4, - AfterCompile: 5, - ScriptCollected: 6 }; - -// Types of exceptions that can be broken upon. -Debug.ExceptionBreak = { All : 0, - Uncaught: 1 }; - -// The different types of steps. -Debug.StepAction = { StepOut: 0, - StepNext: 1, - StepIn: 2, - StepMin: 3, - StepInMin: 4 }; - -// The different types of scripts matching enum ScriptType in objects.h. -Debug.ScriptType = { Native: 0, - Extension: 1, - Normal: 2 }; - -// The different types of script compilations matching enum -// Script::CompilationType in objects.h. -Debug.ScriptCompilationType = { Host: 0, - Eval: 1, - JSON: 2 }; - -// The different script break point types. -Debug.ScriptBreakPointType = { ScriptId: 0, - ScriptName: 1 }; - -function ScriptTypeFlag(type) { - return (1 << type); -} - -// Globals. -var next_response_seq = 0; -var next_break_point_number = 1; -var break_points = []; -var script_break_points = []; - - -// Create a new break point object and add it to the list of break points. -function MakeBreakPoint(source_position, opt_line, opt_column, opt_script_break_point) { - var break_point = new BreakPoint(source_position, opt_line, opt_column, opt_script_break_point); - break_points.push(break_point); - return break_point; -} - - -// Object representing a break point. -// NOTE: This object does not have a reference to the function having break -// point as this would cause function not to be garbage collected when it is -// not used any more. We do not want break points to keep functions alive. -function BreakPoint(source_position, opt_line, opt_column, opt_script_break_point) { - this.source_position_ = source_position; - this.source_line_ = opt_line; - this.source_column_ = opt_column; - if (opt_script_break_point) { - this.script_break_point_ = opt_script_break_point; - } else { - this.number_ = next_break_point_number++; - } - this.hit_count_ = 0; - this.active_ = true; - this.condition_ = null; - this.ignoreCount_ = 0; -} - - -BreakPoint.prototype.number = function() { - return this.number_; -}; - - -BreakPoint.prototype.func = function() { - return this.func_; -}; - - -BreakPoint.prototype.source_position = function() { - return this.source_position_; -}; - - -BreakPoint.prototype.hit_count = function() { - return this.hit_count_; -}; - - -BreakPoint.prototype.active = function() { - if (this.script_break_point()) { - return this.script_break_point().active(); - } - return this.active_; -}; - - -BreakPoint.prototype.condition = function() { - if (this.script_break_point() && this.script_break_point().condition()) { - return this.script_break_point().condition(); - } - return this.condition_; -}; - - -BreakPoint.prototype.ignoreCount = function() { - return this.ignoreCount_; -}; - - -BreakPoint.prototype.script_break_point = function() { - return this.script_break_point_; -}; - - -BreakPoint.prototype.enable = function() { - this.active_ = true; -}; - - -BreakPoint.prototype.disable = function() { - this.active_ = false; -}; - - -BreakPoint.prototype.setCondition = function(condition) { - this.condition_ = condition; -}; - - -BreakPoint.prototype.setIgnoreCount = function(ignoreCount) { - this.ignoreCount_ = ignoreCount; -}; - - -BreakPoint.prototype.isTriggered = function(exec_state) { - // Break point not active - not triggered. - if (!this.active()) return false; - - // Check for conditional break point. - if (this.condition()) { - // If break point has condition try to evaluate it in the top frame. - try { - var mirror = exec_state.frame(0).evaluate(this.condition()); - // If no sensible mirror or non true value break point not triggered. - if (!(mirror instanceof ValueMirror) || !%ToBoolean(mirror.value_)) { - return false; - } - } catch (e) { - // Exception evaluating condition counts as not triggered. - return false; - } - } - - // Update the hit count. - this.hit_count_++; - if (this.script_break_point_) { - this.script_break_point_.hit_count_++; - } - - // If the break point has an ignore count it is not triggered. - if (this.ignoreCount_ > 0) { - this.ignoreCount_--; - return false; - } - - // Break point triggered. - return true; -}; - - -// Function called from the runtime when a break point is hit. Returns true if -// the break point is triggered and supposed to break execution. -function IsBreakPointTriggered(break_id, break_point) { - return break_point.isTriggered(MakeExecutionState(break_id)); -} - - -// Object representing a script break point. The script is referenced by its -// script name or script id and the break point is represented as line and -// column. -function ScriptBreakPoint(type, script_id_or_name, opt_line, opt_column, - opt_groupId) { - this.type_ = type; - if (type == Debug.ScriptBreakPointType.ScriptId) { - this.script_id_ = script_id_or_name; - } else { // type == Debug.ScriptBreakPointType.ScriptName - this.script_name_ = script_id_or_name; - } - this.line_ = opt_line || 0; - this.column_ = opt_column; - this.groupId_ = opt_groupId; - this.hit_count_ = 0; - this.active_ = true; - this.condition_ = null; - this.ignoreCount_ = 0; -} - - -ScriptBreakPoint.prototype.number = function() { - return this.number_; -}; - - -ScriptBreakPoint.prototype.groupId = function() { - return this.groupId_; -}; - - -ScriptBreakPoint.prototype.type = function() { - return this.type_; -}; - - -ScriptBreakPoint.prototype.script_id = function() { - return this.script_id_; -}; - - -ScriptBreakPoint.prototype.script_name = function() { - return this.script_name_; -}; - - -ScriptBreakPoint.prototype.line = function() { - return this.line_; -}; - - -ScriptBreakPoint.prototype.column = function() { - return this.column_; -}; - - -ScriptBreakPoint.prototype.hit_count = function() { - return this.hit_count_; -}; - - -ScriptBreakPoint.prototype.active = function() { - return this.active_; -}; - - -ScriptBreakPoint.prototype.condition = function() { - return this.condition_; -}; - - -ScriptBreakPoint.prototype.ignoreCount = function() { - return this.ignoreCount_; -}; - - -ScriptBreakPoint.prototype.enable = function() { - this.active_ = true; -}; - - -ScriptBreakPoint.prototype.disable = function() { - this.active_ = false; -}; - - -ScriptBreakPoint.prototype.setCondition = function(condition) { - this.condition_ = condition; -}; - - -ScriptBreakPoint.prototype.setIgnoreCount = function(ignoreCount) { - this.ignoreCount_ = ignoreCount; - - // Set ignore count on all break points created from this script break point. - for (var i = 0; i < break_points.length; i++) { - if (break_points[i].script_break_point() === this) { - break_points[i].setIgnoreCount(ignoreCount); - } - } -}; - - -// Check whether a script matches this script break point. Currently this is -// only based on script name. -ScriptBreakPoint.prototype.matchesScript = function(script) { - if (this.type_ == Debug.ScriptBreakPointType.ScriptId) { - return this.script_id_ == script.id; - } else { // this.type_ == Debug.ScriptBreakPointType.ScriptName - return this.script_name_ == script.name && - script.line_offset <= this.line_ && - this.line_ < script.line_offset + script.lineCount(); - } -}; - - -// Set the script break point in a script. -ScriptBreakPoint.prototype.set = function (script) { - var column = this.column(); - var line = this.line(); - // If the column is undefined the break is on the line. To help locate the - // first piece of breakable code on the line try to find the column on the - // line which contains some source. - if (IS_UNDEFINED(column)) { - var source_line = script.sourceLine(this.line()); - - // Allocate array for caching the columns where the actual source starts. - if (!script.sourceColumnStart_) { - script.sourceColumnStart_ = new Array(script.lineCount()); - } - - // Fill cache if needed and get column where the actual source starts. - if (IS_UNDEFINED(script.sourceColumnStart_[line])) { - script.sourceColumnStart_[line] = - source_line.match(sourceLineBeginningSkip)[0].length; - } - column = script.sourceColumnStart_[line]; - } - - // Convert the line and column into an absolute position within the script. - var pos = Debug.findScriptSourcePosition(script, this.line(), column); - - // If the position is not found in the script (the script might be shorter - // than it used to be) just ignore it. - if (pos === null) return; - - // Create a break point object and set the break point. - break_point = MakeBreakPoint(pos, this.line(), this.column(), this); - break_point.setIgnoreCount(this.ignoreCount()); - %SetScriptBreakPoint(script, pos, break_point); - - return break_point; -}; - - -// Clear all the break points created from this script break point -ScriptBreakPoint.prototype.clear = function () { - var remaining_break_points = []; - for (var i = 0; i < break_points.length; i++) { - if (break_points[i].script_break_point() && - break_points[i].script_break_point() === this) { - %ClearBreakPoint(break_points[i]); - } else { - remaining_break_points.push(break_points[i]); - } - } - break_points = remaining_break_points; -}; - - -// Function called from runtime when a new script is compiled to set any script -// break points set in this script. -function UpdateScriptBreakPoints(script) { - for (var i = 0; i < script_break_points.length; i++) { - if (script_break_points[i].type() == Debug.ScriptBreakPointType.ScriptName && - script_break_points[i].matchesScript(script)) { - script_break_points[i].set(script); - } - } -} - - -Debug.setListener = function(listener, opt_data) { - if (!IS_FUNCTION(listener) && !IS_UNDEFINED(listener) && !IS_NULL(listener)) { - throw new Error('Parameters have wrong types.'); - } - %SetDebugEventListener(listener, opt_data); -}; - - -Debug.breakExecution = function(f) { - %Break(); -}; - -Debug.breakLocations = function(f) { - if (!IS_FUNCTION(f)) throw new Error('Parameters have wrong types.'); - return %GetBreakLocations(f); -}; - -// Returns a Script object. If the parameter is a function the return value -// is the script in which the function is defined. If the parameter is a string -// the return value is the script for which the script name has that string -// value. If it is a regexp and there is a unique script whose name matches -// we return that, otherwise undefined. -Debug.findScript = function(func_or_script_name) { - if (IS_FUNCTION(func_or_script_name)) { - return %FunctionGetScript(func_or_script_name); - } else if (IS_REGEXP(func_or_script_name)) { - var scripts = Debug.scripts(); - var last_result = null; - var result_count = 0; - for (var i in scripts) { - var script = scripts[i]; - if (func_or_script_name.test(script.name)) { - last_result = script; - result_count++; - } - } - // Return the unique script matching the regexp. If there are more - // than one we don't return a value since there is no good way to - // decide which one to return. Returning a "random" one, say the - // first, would introduce nondeterminism (or something close to it) - // because the order is the heap iteration order. - if (result_count == 1) { - return last_result; - } else { - return undefined; - } - } else { - return %GetScript(func_or_script_name); - } -}; - -// Returns the script source. If the parameter is a function the return value -// is the script source for the script in which the function is defined. If the -// parameter is a string the return value is the script for which the script -// name has that string value. -Debug.scriptSource = function(func_or_script_name) { - return this.findScript(func_or_script_name).source; -}; - -Debug.source = function(f) { - if (!IS_FUNCTION(f)) throw new Error('Parameters have wrong types.'); - return %FunctionGetSourceCode(f); -}; - -Debug.disassemble = function(f) { - if (!IS_FUNCTION(f)) throw new Error('Parameters have wrong types.'); - return %DebugDisassembleFunction(f); -}; - -Debug.disassembleConstructor = function(f) { - if (!IS_FUNCTION(f)) throw new Error('Parameters have wrong types.'); - return %DebugDisassembleConstructor(f); -}; - -Debug.sourcePosition = function(f) { - if (!IS_FUNCTION(f)) throw new Error('Parameters have wrong types.'); - return %FunctionGetScriptSourcePosition(f); -}; - - -Debug.findFunctionSourceLocation = function(func, opt_line, opt_column) { - var script = %FunctionGetScript(func); - var script_offset = %FunctionGetScriptSourcePosition(func); - return script.locationFromLine(opt_line, opt_column, script_offset); -} - - -// Returns the character position in a script based on a line number and an -// optional position within that line. -Debug.findScriptSourcePosition = function(script, opt_line, opt_column) { - var location = script.locationFromLine(opt_line, opt_column); - return location ? location.position : null; -} - - -Debug.findBreakPoint = function(break_point_number, remove) { - var break_point; - for (var i = 0; i < break_points.length; i++) { - if (break_points[i].number() == break_point_number) { - break_point = break_points[i]; - // Remove the break point from the list if requested. - if (remove) { - break_points.splice(i, 1); - } - break; - } - } - if (break_point) { - return break_point; - } else { - return this.findScriptBreakPoint(break_point_number, remove); - } -}; - - -Debug.setBreakPoint = function(func, opt_line, opt_column, opt_condition) { - if (!IS_FUNCTION(func)) throw new Error('Parameters have wrong types.'); - // Break points in API functions are not supported. - if (%FunctionIsAPIFunction(func)) { - throw new Error('Cannot set break point in native code.'); - } - // Find source position relative to start of the function - var break_position = - this.findFunctionSourceLocation(func, opt_line, opt_column).position; - var source_position = break_position - this.sourcePosition(func); - // Find the script for the function. - var script = %FunctionGetScript(func); - // Break in builtin JavaScript code is not supported. - if (script.type == Debug.ScriptType.Native) { - throw new Error('Cannot set break point in native code.'); - } - // If the script for the function has a name convert this to a script break - // point. - if (script && script.id) { - // Adjust the source position to be script relative. - source_position += %FunctionGetScriptSourcePosition(func); - // Find line and column for the position in the script and set a script - // break point from that. - var location = script.locationFromPosition(source_position, false); - return this.setScriptBreakPointById(script.id, - location.line, location.column, - opt_condition); - } else { - // Set a break point directly on the function. - var break_point = MakeBreakPoint(source_position, opt_line, opt_column); - %SetFunctionBreakPoint(func, source_position, break_point); - break_point.setCondition(opt_condition); - return break_point.number(); - } -}; - - -Debug.enableBreakPoint = function(break_point_number) { - var break_point = this.findBreakPoint(break_point_number, false); - break_point.enable(); -}; - - -Debug.disableBreakPoint = function(break_point_number) { - var break_point = this.findBreakPoint(break_point_number, false); - break_point.disable(); -}; - - -Debug.changeBreakPointCondition = function(break_point_number, condition) { - var break_point = this.findBreakPoint(break_point_number, false); - break_point.setCondition(condition); -}; - - -Debug.changeBreakPointIgnoreCount = function(break_point_number, ignoreCount) { - if (ignoreCount < 0) { - throw new Error('Invalid argument'); - } - var break_point = this.findBreakPoint(break_point_number, false); - break_point.setIgnoreCount(ignoreCount); -}; - - -Debug.clearBreakPoint = function(break_point_number) { - var break_point = this.findBreakPoint(break_point_number, true); - if (break_point) { - return %ClearBreakPoint(break_point); - } else { - break_point = this.findScriptBreakPoint(break_point_number, true); - if (!break_point) { - throw new Error('Invalid breakpoint'); - } - } -}; - - -Debug.clearAllBreakPoints = function() { - for (var i = 0; i < break_points.length; i++) { - break_point = break_points[i]; - %ClearBreakPoint(break_point); - } - break_points = []; -}; - - -Debug.findScriptBreakPoint = function(break_point_number, remove) { - var script_break_point; - for (var i = 0; i < script_break_points.length; i++) { - if (script_break_points[i].number() == break_point_number) { - script_break_point = script_break_points[i]; - // Remove the break point from the list if requested. - if (remove) { - script_break_point.clear(); - script_break_points.splice(i,1); - } - break; - } - } - return script_break_point; -} - - -// Sets a breakpoint in a script identified through id or name at the -// specified source line and column within that line. -Debug.setScriptBreakPoint = function(type, script_id_or_name, - opt_line, opt_column, opt_condition, - opt_groupId) { - // Create script break point object. - var script_break_point = - new ScriptBreakPoint(type, script_id_or_name, opt_line, opt_column, - opt_groupId); - - // Assign number to the new script break point and add it. - script_break_point.number_ = next_break_point_number++; - script_break_point.setCondition(opt_condition); - script_break_points.push(script_break_point); - - // Run through all scripts to see if this script break point matches any - // loaded scripts. - var scripts = this.scripts(); - for (var i = 0; i < scripts.length; i++) { - if (script_break_point.matchesScript(scripts[i])) { - script_break_point.set(scripts[i]); - } - } - - return script_break_point.number(); -} - - -Debug.setScriptBreakPointById = function(script_id, - opt_line, opt_column, - opt_condition, opt_groupId) { - return this.setScriptBreakPoint(Debug.ScriptBreakPointType.ScriptId, - script_id, opt_line, opt_column, - opt_condition, opt_groupId); -} - - -Debug.setScriptBreakPointByName = function(script_name, - opt_line, opt_column, - opt_condition, opt_groupId) { - return this.setScriptBreakPoint(Debug.ScriptBreakPointType.ScriptName, - script_name, opt_line, opt_column, - opt_condition, opt_groupId); -} - - -Debug.enableScriptBreakPoint = function(break_point_number) { - var script_break_point = this.findScriptBreakPoint(break_point_number, false); - script_break_point.enable(); -}; - - -Debug.disableScriptBreakPoint = function(break_point_number) { - var script_break_point = this.findScriptBreakPoint(break_point_number, false); - script_break_point.disable(); -}; - - -Debug.changeScriptBreakPointCondition = function(break_point_number, condition) { - var script_break_point = this.findScriptBreakPoint(break_point_number, false); - script_break_point.setCondition(condition); -}; - - -Debug.changeScriptBreakPointIgnoreCount = function(break_point_number, ignoreCount) { - if (ignoreCount < 0) { - throw new Error('Invalid argument'); - } - var script_break_point = this.findScriptBreakPoint(break_point_number, false); - script_break_point.setIgnoreCount(ignoreCount); -}; - - -Debug.scriptBreakPoints = function() { - return script_break_points; -} - - -Debug.clearStepping = function() { - %ClearStepping(); -} - -Debug.setBreakOnException = function() { - return %ChangeBreakOnException(Debug.ExceptionBreak.All, true); -}; - -Debug.clearBreakOnException = function() { - return %ChangeBreakOnException(Debug.ExceptionBreak.All, false); -}; - -Debug.setBreakOnUncaughtException = function() { - return %ChangeBreakOnException(Debug.ExceptionBreak.Uncaught, true); -}; - -Debug.clearBreakOnUncaughtException = function() { - return %ChangeBreakOnException(Debug.ExceptionBreak.Uncaught, false); -}; - -Debug.showBreakPoints = function(f, full) { - if (!IS_FUNCTION(f)) throw new Error('Parameters have wrong types.'); - var source = full ? this.scriptSource(f) : this.source(f); - var offset = full ? this.sourcePosition(f) : 0; - var locations = this.breakLocations(f); - if (!locations) return source; - locations.sort(function(x, y) { return x - y; }); - var result = ""; - var prev_pos = 0; - var pos; - for (var i = 0; i < locations.length; i++) { - pos = locations[i] - offset; - result += source.slice(prev_pos, pos); - result += "[B" + i + "]"; - prev_pos = pos; - } - pos = source.length; - result += source.substring(prev_pos, pos); - return result; -}; - - -// Get all the scripts currently loaded. Locating all the scripts is based on -// scanning the heap. -Debug.scripts = function() { - // Collect all scripts in the heap. - return %DebugGetLoadedScripts(); -} - -function MakeExecutionState(break_id) { - return new ExecutionState(break_id); -} - -function ExecutionState(break_id) { - this.break_id = break_id; - this.selected_frame = 0; -} - -ExecutionState.prototype.prepareStep = function(opt_action, opt_count) { - var action = Debug.StepAction.StepIn; - if (!IS_UNDEFINED(opt_action)) action = %ToNumber(opt_action); - var count = opt_count ? %ToNumber(opt_count) : 1; - - return %PrepareStep(this.break_id, action, count); -} - -ExecutionState.prototype.evaluateGlobal = function(source, disable_break) { - return MakeMirror( - %DebugEvaluateGlobal(this.break_id, source, Boolean(disable_break))); -}; - -ExecutionState.prototype.frameCount = function() { - return %GetFrameCount(this.break_id); -}; - -ExecutionState.prototype.threadCount = function() { - return %GetThreadCount(this.break_id); -}; - -ExecutionState.prototype.frame = function(opt_index) { - // If no index supplied return the selected frame. - if (opt_index == null) opt_index = this.selected_frame; - return new FrameMirror(this.break_id, opt_index); -}; - -ExecutionState.prototype.cframesValue = function(opt_from_index, opt_to_index) { - return %GetCFrames(this.break_id); -}; - -ExecutionState.prototype.setSelectedFrame = function(index) { - var i = %ToNumber(index); - if (i < 0 || i >= this.frameCount()) throw new Error('Illegal frame index.'); - this.selected_frame = i; -}; - -ExecutionState.prototype.selectedFrame = function() { - return this.selected_frame; -}; - -ExecutionState.prototype.debugCommandProcessor = function(opt_is_running) { - return new DebugCommandProcessor(this, opt_is_running); -}; - - -function MakeBreakEvent(exec_state, break_points_hit) { - return new BreakEvent(exec_state, break_points_hit); -} - - -function BreakEvent(exec_state, break_points_hit) { - this.exec_state_ = exec_state; - this.break_points_hit_ = break_points_hit; -} - - -BreakEvent.prototype.executionState = function() { - return this.exec_state_; -}; - - -BreakEvent.prototype.eventType = function() { - return Debug.DebugEvent.Break; -}; - - -BreakEvent.prototype.func = function() { - return this.exec_state_.frame(0).func(); -}; - - -BreakEvent.prototype.sourceLine = function() { - return this.exec_state_.frame(0).sourceLine(); -}; - - -BreakEvent.prototype.sourceColumn = function() { - return this.exec_state_.frame(0).sourceColumn(); -}; - - -BreakEvent.prototype.sourceLineText = function() { - return this.exec_state_.frame(0).sourceLineText(); -}; - - -BreakEvent.prototype.breakPointsHit = function() { - return this.break_points_hit_; -}; - - -BreakEvent.prototype.toJSONProtocol = function() { - var o = { seq: next_response_seq++, - type: "event", - event: "break", - body: { invocationText: this.exec_state_.frame(0).invocationText(), - } - }; - - // Add script related information to the event if available. - var script = this.func().script(); - if (script) { - o.body.sourceLine = this.sourceLine(), - o.body.sourceColumn = this.sourceColumn(), - o.body.sourceLineText = this.sourceLineText(), - o.body.script = MakeScriptObject_(script, false); - } - - // Add an Array of break points hit if any. - if (this.breakPointsHit()) { - o.body.breakpoints = []; - for (var i = 0; i < this.breakPointsHit().length; i++) { - // Find the break point number. For break points originating from a - // script break point supply the script break point number. - var breakpoint = this.breakPointsHit()[i]; - var script_break_point = breakpoint.script_break_point(); - var number; - if (script_break_point) { - number = script_break_point.number(); - } else { - number = breakpoint.number(); - } - o.body.breakpoints.push(number); - } - } - return JSON.stringify(ObjectToProtocolObject_(o)); -}; - - -function MakeExceptionEvent(exec_state, exception, uncaught) { - return new ExceptionEvent(exec_state, exception, uncaught); -} - - -function ExceptionEvent(exec_state, exception, uncaught) { - this.exec_state_ = exec_state; - this.exception_ = exception; - this.uncaught_ = uncaught; -} - - -ExceptionEvent.prototype.executionState = function() { - return this.exec_state_; -}; - - -ExceptionEvent.prototype.eventType = function() { - return Debug.DebugEvent.Exception; -}; - - -ExceptionEvent.prototype.exception = function() { - return this.exception_; -} - - -ExceptionEvent.prototype.uncaught = function() { - return this.uncaught_; -} - - -ExceptionEvent.prototype.func = function() { - return this.exec_state_.frame(0).func(); -}; - - -ExceptionEvent.prototype.sourceLine = function() { - return this.exec_state_.frame(0).sourceLine(); -}; - - -ExceptionEvent.prototype.sourceColumn = function() { - return this.exec_state_.frame(0).sourceColumn(); -}; - - -ExceptionEvent.prototype.sourceLineText = function() { - return this.exec_state_.frame(0).sourceLineText(); -}; - - -ExceptionEvent.prototype.toJSONProtocol = function() { - var o = new ProtocolMessage(); - o.event = "exception"; - o.body = { uncaught: this.uncaught_, - exception: MakeMirror(this.exception_) - }; - - // Exceptions might happen whithout any JavaScript frames. - if (this.exec_state_.frameCount() > 0) { - o.body.sourceLine = this.sourceLine(); - o.body.sourceColumn = this.sourceColumn(); - o.body.sourceLineText = this.sourceLineText(); - - // Add script information to the event if available. - var script = this.func().script(); - if (script) { - o.body.script = MakeScriptObject_(script, false); - } - } else { - o.body.sourceLine = -1; - } - - return o.toJSONProtocol(); -}; - - -function MakeCompileEvent(exec_state, script, before) { - return new CompileEvent(exec_state, script, before); -} - - -function CompileEvent(exec_state, script, before) { - this.exec_state_ = exec_state; - this.script_ = MakeMirror(script); - this.before_ = before; -} - - -CompileEvent.prototype.executionState = function() { - return this.exec_state_; -}; - - -CompileEvent.prototype.eventType = function() { - if (this.before_) { - return Debug.DebugEvent.BeforeCompile; - } else { - return Debug.DebugEvent.AfterCompile; - } -}; - - -CompileEvent.prototype.script = function() { - return this.script_; -}; - - -CompileEvent.prototype.toJSONProtocol = function() { - var o = new ProtocolMessage(); - o.running = true; - if (this.before_) { - o.event = "beforeCompile"; - } else { - o.event = "afterCompile"; - } - o.body = {}; - o.body.script = this.script_; - - return o.toJSONProtocol(); -} - - -function MakeNewFunctionEvent(func) { - return new NewFunctionEvent(func); -} - - -function NewFunctionEvent(func) { - this.func = func; -} - - -NewFunctionEvent.prototype.eventType = function() { - return Debug.DebugEvent.NewFunction; -}; - - -NewFunctionEvent.prototype.name = function() { - return this.func.name; -}; - - -NewFunctionEvent.prototype.setBreakPoint = function(p) { - Debug.setBreakPoint(this.func, p || 0); -}; - - -function MakeScriptCollectedEvent(exec_state, id) { - return new ScriptCollectedEvent(exec_state, id); -} - - -function ScriptCollectedEvent(exec_state, id) { - this.exec_state_ = exec_state; - this.id_ = id; -} - - -ScriptCollectedEvent.prototype.id = function() { - return this.id_; -}; - - -ScriptCollectedEvent.prototype.executionState = function() { - return this.exec_state_; -}; - - -ScriptCollectedEvent.prototype.toJSONProtocol = function() { - var o = new ProtocolMessage(); - o.running = true; - o.event = "scriptCollected"; - o.body = {}; - o.body.script = { id: this.id() }; - return o.toJSONProtocol(); -} - - -function MakeScriptObject_(script, include_source) { - var o = { id: script.id(), - name: script.name(), - lineOffset: script.lineOffset(), - columnOffset: script.columnOffset(), - lineCount: script.lineCount(), - }; - if (!IS_UNDEFINED(script.data())) { - o.data = script.data(); - } - if (include_source) { - o.source = script.source(); - } - return o; -}; - - -function DebugCommandProcessor(exec_state, opt_is_running) { - this.exec_state_ = exec_state; - this.running_ = opt_is_running || false; -}; - - -DebugCommandProcessor.prototype.processDebugRequest = function (request) { - return this.processDebugJSONRequest(request); -} - - -function ProtocolMessage(request) { - // Update sequence number. - this.seq = next_response_seq++; - - if (request) { - // If message is based on a request this is a response. Fill the initial - // response from the request. - this.type = 'response'; - this.request_seq = request.seq; - this.command = request.command; - } else { - // If message is not based on a request it is a dabugger generated event. - this.type = 'event'; - } - this.success = true; - // Handler may set this field to control debugger state. - this.running = undefined; -} - - -ProtocolMessage.prototype.setOption = function(name, value) { - if (!this.options_) { - this.options_ = {}; - } - this.options_[name] = value; -} - - -ProtocolMessage.prototype.failed = function(message) { - this.success = false; - this.message = message; -} - - -ProtocolMessage.prototype.toJSONProtocol = function() { - // Encode the protocol header. - var json = {}; - json.seq= this.seq; - if (this.request_seq) { - json.request_seq = this.request_seq; - } - json.type = this.type; - if (this.event) { - json.event = this.event; - } - if (this.command) { - json.command = this.command; - } - if (this.success) { - json.success = this.success; - } else { - json.success = false; - } - if (this.body) { - // Encode the body part. - var bodyJson; - var serializer = MakeMirrorSerializer(true, this.options_); - if (this.body instanceof Mirror) { - bodyJson = serializer.serializeValue(this.body); - } else if (this.body instanceof Array) { - bodyJson = []; - for (var i = 0; i < this.body.length; i++) { - if (this.body[i] instanceof Mirror) { - bodyJson.push(serializer.serializeValue(this.body[i])); - } else { - bodyJson.push(ObjectToProtocolObject_(this.body[i], serializer)); - } - } - } else { - bodyJson = ObjectToProtocolObject_(this.body, serializer); - } - json.body = bodyJson; - json.refs = serializer.serializeReferencedObjects(); - } - if (this.message) { - json.message = this.message; - } - json.running = this.running; - return JSON.stringify(json); -} - - -DebugCommandProcessor.prototype.createResponse = function(request) { - return new ProtocolMessage(request); -}; - - -DebugCommandProcessor.prototype.processDebugJSONRequest = function(json_request) { - var request; // Current request. - var response; // Generated response. - try { - try { - // Convert the JSON string to an object. - request = %CompileString('(' + json_request + ')', false)(); - - // Create an initial response. - response = this.createResponse(request); - - if (!request.type) { - throw new Error('Type not specified'); - } - - if (request.type != 'request') { - throw new Error("Illegal type '" + request.type + "' in request"); - } - - if (!request.command) { - throw new Error('Command not specified'); - } - - if (request.arguments) { - var args = request.arguments; - // TODO(yurys): remove request.arguments.compactFormat check once - // ChromeDevTools are switched to 'inlineRefs' - if (args.inlineRefs || args.compactFormat) { - response.setOption('inlineRefs', true); - } - if (!IS_UNDEFINED(args.maxStringLength)) { - response.setOption('maxStringLength', args.maxStringLength); - } - } - - if (request.command == 'continue') { - this.continueRequest_(request, response); - } else if (request.command == 'break') { - this.breakRequest_(request, response); - } else if (request.command == 'setbreakpoint') { - this.setBreakPointRequest_(request, response); - } else if (request.command == 'changebreakpoint') { - this.changeBreakPointRequest_(request, response); - } else if (request.command == 'clearbreakpoint') { - this.clearBreakPointRequest_(request, response); - } else if (request.command == 'clearbreakpointgroup') { - this.clearBreakPointGroupRequest_(request, response); - } else if (request.command == 'backtrace') { - this.backtraceRequest_(request, response); - } else if (request.command == 'frame') { - this.frameRequest_(request, response); - } else if (request.command == 'scopes') { - this.scopesRequest_(request, response); - } else if (request.command == 'scope') { - this.scopeRequest_(request, response); - } else if (request.command == 'evaluate') { - this.evaluateRequest_(request, response); - } else if (request.command == 'lookup') { - this.lookupRequest_(request, response); - } else if (request.command == 'references') { - this.referencesRequest_(request, response); - } else if (request.command == 'source') { - this.sourceRequest_(request, response); - } else if (request.command == 'scripts') { - this.scriptsRequest_(request, response); - } else if (request.command == 'threads') { - this.threadsRequest_(request, response); - } else if (request.command == 'suspend') { - this.suspendRequest_(request, response); - } else if (request.command == 'version') { - this.versionRequest_(request, response); - } else if (request.command == 'profile') { - this.profileRequest_(request, response); - } else if (request.command == 'changelive') { - this.changeLiveRequest_(request, response); - } else { - throw new Error('Unknown command "' + request.command + '" in request'); - } - } catch (e) { - // If there is no response object created one (without command). - if (!response) { - response = this.createResponse(); - } - response.success = false; - response.message = %ToString(e); - } - - // Return the response as a JSON encoded string. - try { - if (!IS_UNDEFINED(response.running)) { - // Response controls running state. - this.running_ = response.running; - } - response.running = this.running_; - return response.toJSONProtocol(); - } catch (e) { - // Failed to generate response - return generic error. - return '{"seq":' + response.seq + ',' + - '"request_seq":' + request.seq + ',' + - '"type":"response",' + - '"success":false,' + - '"message":"Internal error: ' + %ToString(e) + '"}'; - } - } catch (e) { - // Failed in one of the catch blocks above - most generic error. - return '{"seq":0,"type":"response","success":false,"message":"Internal error"}'; - } -}; - - -DebugCommandProcessor.prototype.continueRequest_ = function(request, response) { - // Check for arguments for continue. - if (request.arguments) { - var count = 1; - var action = Debug.StepAction.StepIn; - - // Pull out arguments. - var stepaction = request.arguments.stepaction; - var stepcount = request.arguments.stepcount; - - // Get the stepcount argument if any. - if (stepcount) { - count = %ToNumber(stepcount); - if (count < 0) { - throw new Error('Invalid stepcount argument "' + stepcount + '".'); - } - } - - // Get the stepaction argument. - if (stepaction) { - if (stepaction == 'in') { - action = Debug.StepAction.StepIn; - } else if (stepaction == 'min') { - action = Debug.StepAction.StepMin; - } else if (stepaction == 'next') { - action = Debug.StepAction.StepNext; - } else if (stepaction == 'out') { - action = Debug.StepAction.StepOut; - } else { - throw new Error('Invalid stepaction argument "' + stepaction + '".'); - } - } - - // Setup the VM for stepping. - this.exec_state_.prepareStep(action, count); - } - - // VM should be running after executing this request. - response.running = true; -}; - - -DebugCommandProcessor.prototype.breakRequest_ = function(request, response) { - // Ignore as break command does not do anything when broken. -}; - - -DebugCommandProcessor.prototype.setBreakPointRequest_ = - function(request, response) { - // Check for legal request. - if (!request.arguments) { - response.failed('Missing arguments'); - return; - } - - // Pull out arguments. - var type = request.arguments.type; - var target = request.arguments.target; - var line = request.arguments.line; - var column = request.arguments.column; - var enabled = IS_UNDEFINED(request.arguments.enabled) ? - true : request.arguments.enabled; - var condition = request.arguments.condition; - var ignoreCount = request.arguments.ignoreCount; - var groupId = request.arguments.groupId; - - // Check for legal arguments. - if (!type || IS_UNDEFINED(target)) { - response.failed('Missing argument "type" or "target"'); - return; - } - if (type != 'function' && type != 'handle' && - type != 'script' && type != 'scriptId') { - response.failed('Illegal type "' + type + '"'); - return; - } - - // Either function or script break point. - var break_point_number; - if (type == 'function') { - // Handle function break point. - if (!IS_STRING(target)) { - response.failed('Argument "target" is not a string value'); - return; - } - var f; - try { - // Find the function through a global evaluate. - f = this.exec_state_.evaluateGlobal(target).value(); - } catch (e) { - response.failed('Error: "' + %ToString(e) + - '" evaluating "' + target + '"'); - return; - } - if (!IS_FUNCTION(f)) { - response.failed('"' + target + '" does not evaluate to a function'); - return; - } - - // Set function break point. - break_point_number = Debug.setBreakPoint(f, line, column, condition); - } else if (type == 'handle') { - // Find the object pointed by the specified handle. - var handle = parseInt(target, 10); - var mirror = LookupMirror(handle); - if (!mirror) { - return response.failed('Object #' + handle + '# not found'); - } - if (!mirror.isFunction()) { - return response.failed('Object #' + handle + '# is not a function'); - } - - // Set function break point. - break_point_number = Debug.setBreakPoint(mirror.value(), - line, column, condition); - } else if (type == 'script') { - // set script break point. - break_point_number = - Debug.setScriptBreakPointByName(target, line, column, condition, - groupId); - } else { // type == 'scriptId. - break_point_number = - Debug.setScriptBreakPointById(target, line, column, condition, groupId); - } - - // Set additional break point properties. - var break_point = Debug.findBreakPoint(break_point_number); - if (ignoreCount) { - Debug.changeBreakPointIgnoreCount(break_point_number, ignoreCount); - } - if (!enabled) { - Debug.disableBreakPoint(break_point_number); - } - - // Add the break point number to the response. - response.body = { type: type, - breakpoint: break_point_number } - - // Add break point information to the response. - if (break_point instanceof ScriptBreakPoint) { - if (break_point.type() == Debug.ScriptBreakPointType.ScriptId) { - response.body.type = 'scriptId'; - response.body.script_id = break_point.script_id(); - } else { - response.body.type = 'scriptName'; - response.body.script_name = break_point.script_name(); - } - response.body.line = break_point.line(); - response.body.column = break_point.column(); - } else { - response.body.type = 'function'; - } -}; - - -DebugCommandProcessor.prototype.changeBreakPointRequest_ = function(request, response) { - // Check for legal request. - if (!request.arguments) { - response.failed('Missing arguments'); - return; - } - - // Pull out arguments. - var break_point = %ToNumber(request.arguments.breakpoint); - var enabled = request.arguments.enabled; - var condition = request.arguments.condition; - var ignoreCount = request.arguments.ignoreCount; - - // Check for legal arguments. - if (!break_point) { - response.failed('Missing argument "breakpoint"'); - return; - } - - // Change enabled state if supplied. - if (!IS_UNDEFINED(enabled)) { - if (enabled) { - Debug.enableBreakPoint(break_point); - } else { - Debug.disableBreakPoint(break_point); - } - } - - // Change condition if supplied - if (!IS_UNDEFINED(condition)) { - Debug.changeBreakPointCondition(break_point, condition); - } - - // Change ignore count if supplied - if (!IS_UNDEFINED(ignoreCount)) { - Debug.changeBreakPointIgnoreCount(break_point, ignoreCount); - } -} - - -DebugCommandProcessor.prototype.clearBreakPointGroupRequest_ = function(request, response) { - // Check for legal request. - if (!request.arguments) { - response.failed('Missing arguments'); - return; - } - - // Pull out arguments. - var group_id = request.arguments.groupId; - - // Check for legal arguments. - if (!group_id) { - response.failed('Missing argument "groupId"'); - return; - } - - var cleared_break_points = []; - var new_script_break_points = []; - for (var i = 0; i < script_break_points.length; i++) { - var next_break_point = script_break_points[i]; - if (next_break_point.groupId() == group_id) { - cleared_break_points.push(next_break_point.number()); - next_break_point.clear(); - } else { - new_script_break_points.push(next_break_point); - } - } - script_break_points = new_script_break_points; - - // Add the cleared break point numbers to the response. - response.body = { breakpoints: cleared_break_points }; -} - - -DebugCommandProcessor.prototype.clearBreakPointRequest_ = function(request, response) { - // Check for legal request. - if (!request.arguments) { - response.failed('Missing arguments'); - return; - } - - // Pull out arguments. - var break_point = %ToNumber(request.arguments.breakpoint); - - // Check for legal arguments. - if (!break_point) { - response.failed('Missing argument "breakpoint"'); - return; - } - - // Clear break point. - Debug.clearBreakPoint(break_point); - - // Add the cleared break point number to the response. - response.body = { breakpoint: break_point } -} - - -DebugCommandProcessor.prototype.backtraceRequest_ = function(request, response) { - // Get the number of frames. - var total_frames = this.exec_state_.frameCount(); - - // Create simple response if there are no frames. - if (total_frames == 0) { - response.body = { - totalFrames: total_frames - } - return; - } - - // Default frame range to include in backtrace. - var from_index = 0 - var to_index = kDefaultBacktraceLength; - - // Get the range from the arguments. - if (request.arguments) { - if (request.arguments.fromFrame) { - from_index = request.arguments.fromFrame; - } - if (request.arguments.toFrame) { - to_index = request.arguments.toFrame; - } - if (request.arguments.bottom) { - var tmp_index = total_frames - from_index; - from_index = total_frames - to_index - to_index = tmp_index; - } - if (from_index < 0 || to_index < 0) { - return response.failed('Invalid frame number'); - } - } - - // Adjust the index. - to_index = Math.min(total_frames, to_index); - - if (to_index <= from_index) { - var error = 'Invalid frame range'; - return response.failed(error); - } - - // Create the response body. - var frames = []; - for (var i = from_index; i < to_index; i++) { - frames.push(this.exec_state_.frame(i)); - } - response.body = { - fromFrame: from_index, - toFrame: to_index, - totalFrames: total_frames, - frames: frames - } -}; - - -DebugCommandProcessor.prototype.backtracec = function(cmd, args) { - return this.exec_state_.cframesValue(); -}; - - -DebugCommandProcessor.prototype.frameRequest_ = function(request, response) { - // No frames no source. - if (this.exec_state_.frameCount() == 0) { - return response.failed('No frames'); - } - - // With no arguments just keep the selected frame. - if (request.arguments) { - var index = request.arguments.number; - if (index < 0 || this.exec_state_.frameCount() <= index) { - return response.failed('Invalid frame number'); - } - - this.exec_state_.setSelectedFrame(request.arguments.number); - } - response.body = this.exec_state_.frame(); -}; - - -DebugCommandProcessor.prototype.frameForScopeRequest_ = function(request) { - // Get the frame for which the scope or scopes are requested. With no frameNumber - // argument use the currently selected frame. - if (request.arguments && !IS_UNDEFINED(request.arguments.frameNumber)) { - frame_index = request.arguments.frameNumber; - if (frame_index < 0 || this.exec_state_.frameCount() <= frame_index) { - return response.failed('Invalid frame number'); - } - return this.exec_state_.frame(frame_index); - } else { - return this.exec_state_.frame(); - } -} - - -DebugCommandProcessor.prototype.scopesRequest_ = function(request, response) { - // No frames no scopes. - if (this.exec_state_.frameCount() == 0) { - return response.failed('No scopes'); - } - - // Get the frame for which the scopes are requested. - var frame = this.frameForScopeRequest_(request); - - // Fill all scopes for this frame. - var total_scopes = frame.scopeCount(); - var scopes = []; - for (var i = 0; i < total_scopes; i++) { - scopes.push(frame.scope(i)); - } - response.body = { - fromScope: 0, - toScope: total_scopes, - totalScopes: total_scopes, - scopes: scopes - } -}; - - -DebugCommandProcessor.prototype.scopeRequest_ = function(request, response) { - // No frames no scopes. - if (this.exec_state_.frameCount() == 0) { - return response.failed('No scopes'); - } - - // Get the frame for which the scope is requested. - var frame = this.frameForScopeRequest_(request); - - // With no scope argument just return top scope. - var scope_index = 0; - if (request.arguments && !IS_UNDEFINED(request.arguments.number)) { - scope_index = %ToNumber(request.arguments.number); - if (scope_index < 0 || frame.scopeCount() <= scope_index) { - return response.failed('Invalid scope number'); - } - } - - response.body = frame.scope(scope_index); -}; - - -DebugCommandProcessor.prototype.evaluateRequest_ = function(request, response) { - if (!request.arguments) { - return response.failed('Missing arguments'); - } - - // Pull out arguments. - var expression = request.arguments.expression; - var frame = request.arguments.frame; - var global = request.arguments.global; - var disable_break = request.arguments.disable_break; - - // The expression argument could be an integer so we convert it to a - // string. - try { - expression = String(expression); - } catch(e) { - return response.failed('Failed to convert expression argument to string'); - } - - // Check for legal arguments. - if (!IS_UNDEFINED(frame) && global) { - return response.failed('Arguments "frame" and "global" are exclusive'); - } - - // Global evaluate. - if (global) { - // Evaluate in the global context. - response.body = - this.exec_state_.evaluateGlobal(expression, Boolean(disable_break)); - return; - } - - // Default value for disable_break is true. - if (IS_UNDEFINED(disable_break)) { - disable_break = true; - } - - // No frames no evaluate in frame. - if (this.exec_state_.frameCount() == 0) { - return response.failed('No frames'); - } - - // Check whether a frame was specified. - if (!IS_UNDEFINED(frame)) { - var frame_number = %ToNumber(frame); - if (frame_number < 0 || frame_number >= this.exec_state_.frameCount()) { - return response.failed('Invalid frame "' + frame + '"'); - } - // Evaluate in the specified frame. - response.body = this.exec_state_.frame(frame_number).evaluate( - expression, Boolean(disable_break)); - return; - } else { - // Evaluate in the selected frame. - response.body = this.exec_state_.frame().evaluate( - expression, Boolean(disable_break)); - return; - } -}; - - -DebugCommandProcessor.prototype.lookupRequest_ = function(request, response) { - if (!request.arguments) { - return response.failed('Missing arguments'); - } - - // Pull out arguments. - var handles = request.arguments.handles; - - // Check for legal arguments. - if (IS_UNDEFINED(handles)) { - return response.failed('Argument "handles" missing'); - } - - // Set 'includeSource' option for script lookup. - if (!IS_UNDEFINED(request.arguments.includeSource)) { - includeSource = %ToBoolean(request.arguments.includeSource); - response.setOption('includeSource', includeSource); - } - - // Lookup handles. - var mirrors = {}; - for (var i = 0; i < handles.length; i++) { - var handle = handles[i]; - var mirror = LookupMirror(handle); - if (!mirror) { - return response.failed('Object #' + handle + '# not found'); - } - mirrors[handle] = mirror; - } - response.body = mirrors; -}; - - -DebugCommandProcessor.prototype.referencesRequest_ = - function(request, response) { - if (!request.arguments) { - return response.failed('Missing arguments'); - } - - // Pull out arguments. - var type = request.arguments.type; - var handle = request.arguments.handle; - - // Check for legal arguments. - if (IS_UNDEFINED(type)) { - return response.failed('Argument "type" missing'); - } - if (IS_UNDEFINED(handle)) { - return response.failed('Argument "handle" missing'); - } - if (type != 'referencedBy' && type != 'constructedBy') { - return response.failed('Invalid type "' + type + '"'); - } - - // Lookup handle and return objects with references the object. - var mirror = LookupMirror(handle); - if (mirror) { - if (type == 'referencedBy') { - response.body = mirror.referencedBy(); - } else { - response.body = mirror.constructedBy(); - } - } else { - return response.failed('Object #' + handle + '# not found'); - } -}; - - -DebugCommandProcessor.prototype.sourceRequest_ = function(request, response) { - // No frames no source. - if (this.exec_state_.frameCount() == 0) { - return response.failed('No source'); - } - - var from_line; - var to_line; - var frame = this.exec_state_.frame(); - if (request.arguments) { - // Pull out arguments. - from_line = request.arguments.fromLine; - to_line = request.arguments.toLine; - - if (!IS_UNDEFINED(request.arguments.frame)) { - var frame_number = %ToNumber(request.arguments.frame); - if (frame_number < 0 || frame_number >= this.exec_state_.frameCount()) { - return response.failed('Invalid frame "' + frame + '"'); - } - frame = this.exec_state_.frame(frame_number); - } - } - - // Get the script selected. - var script = frame.func().script(); - if (!script) { - return response.failed('No source'); - } - - // Get the source slice and fill it into the response. - var slice = script.sourceSlice(from_line, to_line); - if (!slice) { - return response.failed('Invalid line interval'); - } - response.body = {}; - response.body.source = slice.sourceText(); - response.body.fromLine = slice.from_line; - response.body.toLine = slice.to_line; - response.body.fromPosition = slice.from_position; - response.body.toPosition = slice.to_position; - response.body.totalLines = script.lineCount(); -}; - - -DebugCommandProcessor.prototype.scriptsRequest_ = function(request, response) { - var types = ScriptTypeFlag(Debug.ScriptType.Normal); - var includeSource = false; - var idsToInclude = null; - if (request.arguments) { - // Pull out arguments. - if (!IS_UNDEFINED(request.arguments.types)) { - types = %ToNumber(request.arguments.types); - if (isNaN(types) || types < 0) { - return response.failed('Invalid types "' + request.arguments.types + '"'); - } - } - - if (!IS_UNDEFINED(request.arguments.includeSource)) { - includeSource = %ToBoolean(request.arguments.includeSource); - response.setOption('includeSource', includeSource); - } - - if (IS_ARRAY(request.arguments.ids)) { - idsToInclude = {}; - var ids = request.arguments.ids; - for (var i = 0; i < ids.length; i++) { - idsToInclude[ids[i]] = true; - } - } - } - - // Collect all scripts in the heap. - var scripts = %DebugGetLoadedScripts(); - - response.body = []; - - for (var i = 0; i < scripts.length; i++) { - if (idsToInclude && !idsToInclude[scripts[i].id]) { - continue; - } - if (types & ScriptTypeFlag(scripts[i].type)) { - response.body.push(MakeMirror(scripts[i])); - } - } -}; - - -DebugCommandProcessor.prototype.threadsRequest_ = function(request, response) { - // Get the number of threads. - var total_threads = this.exec_state_.threadCount(); - - // Get information for all threads. - var threads = []; - for (var i = 0; i < total_threads; i++) { - var details = %GetThreadDetails(this.exec_state_.break_id, i); - var thread_info = { current: details[0], - id: details[1] - } - threads.push(thread_info); - } - - // Create the response body. - response.body = { - totalThreads: total_threads, - threads: threads - } -}; - - -DebugCommandProcessor.prototype.suspendRequest_ = function(request, response) { - response.running = false; -}; - - -DebugCommandProcessor.prototype.versionRequest_ = function(request, response) { - response.body = { - V8Version: %GetV8Version() - } -}; - - -DebugCommandProcessor.prototype.profileRequest_ = function(request, response) { - if (!request.arguments) { - return response.failed('Missing arguments'); - } - var modules = parseInt(request.arguments.modules); - if (isNaN(modules)) { - return response.failed('Modules is not an integer'); - } - var tag = parseInt(request.arguments.tag); - if (isNaN(tag)) { - tag = 0; - } - if (request.arguments.command == 'resume') { - %ProfilerResume(modules, tag); - } else if (request.arguments.command == 'pause') { - %ProfilerPause(modules, tag); - } else { - return response.failed('Unknown command'); - } - response.body = {}; -}; - - -DebugCommandProcessor.prototype.changeLiveRequest_ = function(request, response) { - if (!Debug.LiveEditChangeScript) { - return response.failed('LiveEdit feature is not supported'); - } - if (!request.arguments) { - return response.failed('Missing arguments'); - } - var script_id = request.arguments.script_id; - var change_pos = parseInt(request.arguments.change_pos); - var change_len = parseInt(request.arguments.change_len); - var new_string = request.arguments.new_string; - if (!IS_STRING(new_string)) { - response.failed('Argument "new_string" is not a string value'); - return; - } - - var scripts = %DebugGetLoadedScripts(); - - var the_script = null; - for (var i = 0; i < scripts.length; i++) { - if (scripts[i].id == script_id) { - the_script = scripts[i]; - } - } - if (!the_script) { - response.failed('Script not found'); - return; - } - - var change_log = new Array(); - try { - Debug.LiveEditChangeScript(the_script, change_pos, change_len, new_string, - change_log); - } catch (e) { - if (e instanceof Debug.LiveEditChangeScript.Failure) { - // Let's treat it as a "success" so that body with change_log will be - // sent back. "change_log" will have "failure" field set. - change_log.push( { failure: true } ); - } else { - throw e; - } - } - response.body = {change_log: change_log}; -}; - - -// Check whether the previously processed command caused the VM to become -// running. -DebugCommandProcessor.prototype.isRunning = function() { - return this.running_; -} - - -DebugCommandProcessor.prototype.systemBreak = function(cmd, args) { - return %SystemBreak(); -}; - - -function NumberToHex8Str(n) { - var r = ""; - for (var i = 0; i < 8; ++i) { - var c = hexCharArray[n & 0x0F]; // hexCharArray is defined in uri.js - r = c + r; - n = n >>> 4; - } - return r; -}; - -DebugCommandProcessor.prototype.formatCFrames = function(cframes_value) { - var result = ""; - if (cframes_value == null || cframes_value.length == 0) { - result += "(stack empty)"; - } else { - for (var i = 0; i < cframes_value.length; ++i) { - if (i != 0) result += "\n"; - result += this.formatCFrame(cframes_value[i]); - } - } - return result; -}; - - -DebugCommandProcessor.prototype.formatCFrame = function(cframe_value) { - var result = ""; - result += "0x" + NumberToHex8Str(cframe_value.address); - if (!IS_UNDEFINED(cframe_value.text)) { - result += " " + cframe_value.text; - } - return result; -} - - -/** - * Convert an Object to its debugger protocol representation. The representation - * may be serilized to a JSON object using JSON.stringify(). - * This implementation simply runs through all string property names, converts - * each property value to a protocol value and adds the property to the result - * object. For type "object" the function will be called recursively. Note that - * circular structures will cause infinite recursion. - * @param {Object} object The object to format as protocol object. - * @param {MirrorSerializer} mirror_serializer The serializer to use if any - * mirror objects are encountered. - * @return {Object} Protocol object value. - */ -function ObjectToProtocolObject_(object, mirror_serializer) { - var content = {}; - for (var key in object) { - // Only consider string keys. - if (typeof key == 'string') { - // Format the value based on its type. - var property_value_json = ValueToProtocolValue_(object[key], - mirror_serializer); - // Add the property if relevant. - if (!IS_UNDEFINED(property_value_json)) { - content[key] = property_value_json; - } - } - } - - return content; -} - - -/** - * Convert an array to its debugger protocol representation. It will convert - * each array element to a protocol value. - * @param {Array} array The array to format as protocol array. - * @param {MirrorSerializer} mirror_serializer The serializer to use if any - * mirror objects are encountered. - * @return {Array} Protocol array value. - */ -function ArrayToProtocolArray_(array, mirror_serializer) { - var json = []; - for (var i = 0; i < array.length; i++) { - json.push(ValueToProtocolValue_(array[i], mirror_serializer)); - } - return json; -} - - -/** - * Convert a value to its debugger protocol representation. - * @param {*} value The value to format as protocol value. - * @param {MirrorSerializer} mirror_serializer The serializer to use if any - * mirror objects are encountered. - * @return {*} Protocol value. - */ -function ValueToProtocolValue_(value, mirror_serializer) { - // Format the value based on its type. - var json; - switch (typeof value) { - case 'object': - if (value instanceof Mirror) { - json = mirror_serializer.serializeValue(value); - } else if (IS_ARRAY(value)){ - json = ArrayToProtocolArray_(value, mirror_serializer); - } else { - json = ObjectToProtocolObject_(value, mirror_serializer); - } - break; - - case 'boolean': - case 'string': - case 'number': - json = value; - break - - default: - json = null; - } - return json; -} diff --git a/deps/v8/src/json-delay.js b/deps/v8/src/json-delay.js deleted file mode 100644 index 3e42d36609..0000000000 --- a/deps/v8/src/json-delay.js +++ /dev/null @@ -1,268 +0,0 @@ -// Copyright 2009 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -var $JSON = global.JSON; - -function ParseJSONUnfiltered(text) { - var s = $String(text); - var f = %CompileString(text, true); - return f(); -} - -function Revive(holder, name, reviver) { - var val = holder[name]; - if (IS_OBJECT(val)) { - if (IS_ARRAY(val)) { - var length = val.length; - for (var i = 0; i < length; i++) { - var newElement = Revive(val, $String(i), reviver); - val[i] = newElement; - } - } else { - for (var p in val) { - if (ObjectHasOwnProperty.call(val, p)) { - var newElement = Revive(val, p, reviver); - if (IS_UNDEFINED(newElement)) { - delete val[p]; - } else { - val[p] = newElement; - } - } - } - } - } - return reviver.call(holder, name, val); -} - -function JSONParse(text, reviver) { - var unfiltered = ParseJSONUnfiltered(text); - if (IS_FUNCTION(reviver)) { - return Revive({'': unfiltered}, '', reviver); - } else { - return unfiltered; - } -} - -var characterQuoteCache = { - '\"': '\\"', - '\\': '\\\\', - '/': '\\/', - '\b': '\\b', - '\f': '\\f', - '\n': '\\n', - '\r': '\\r', - '\t': '\\t', - '\x0B': '\\u000b' -}; - -function QuoteSingleJSONCharacter(c) { - if (c in characterQuoteCache) { - return characterQuoteCache[c]; - } - var charCode = c.charCodeAt(0); - var result; - if (charCode < 16) result = '\\u000'; - else if (charCode < 256) result = '\\u00'; - else if (charCode < 4096) result = '\\u0'; - else result = '\\u'; - result += charCode.toString(16); - characterQuoteCache[c] = result; - return result; -} - -function QuoteJSONString(str) { - var quotable = /[\\\"\x00-\x1f\x80-\uffff]/g; - return '"' + str.replace(quotable, QuoteSingleJSONCharacter) + '"'; -} - -function StackContains(stack, val) { - var length = stack.length; - for (var i = 0; i < length; i++) { - if (stack[i] === val) { - return true; - } - } - return false; -} - -function SerializeArray(value, replacer, stack, indent, gap) { - if (StackContains(stack, value)) { - throw MakeTypeError('circular_structure', []); - } - stack.push(value); - var stepback = indent; - indent += gap; - var partial = []; - var len = value.length; - for (var i = 0; i < len; i++) { - var strP = JSONSerialize($String(i), value, replacer, stack, - indent, gap); - if (IS_UNDEFINED(strP)) { - strP = "null"; - } - partial.push(strP); - } - var final; - if (gap == "") { - final = "[" + partial.join(",") + "]"; - } else if (partial.length > 0) { - var separator = ",\n" + indent; - final = "[\n" + indent + partial.join(separator) + "\n" + - stepback + "]"; - } else { - final = "[]"; - } - stack.pop(); - return final; -} - -function SerializeObject(value, replacer, stack, indent, gap) { - if (StackContains(stack, value)) { - throw MakeTypeError('circular_structure', []); - } - stack.push(value); - var stepback = indent; - indent += gap; - var partial = []; - if (IS_ARRAY(replacer)) { - var length = replacer.length; - for (var i = 0; i < length; i++) { - if (ObjectHasOwnProperty.call(replacer, i)) { - var p = replacer[i]; - var strP = JSONSerialize(p, value, replacer, stack, indent, gap); - if (!IS_UNDEFINED(strP)) { - var member = QuoteJSONString(p) + ":"; - if (gap != "") member += " "; - member += strP; - partial.push(member); - } - } - } - } else { - for (var p in value) { - if (ObjectHasOwnProperty.call(value, p)) { - var strP = JSONSerialize(p, value, replacer, stack, indent, gap); - if (!IS_UNDEFINED(strP)) { - var member = QuoteJSONString(p) + ":"; - if (gap != "") member += " "; - member += strP; - partial.push(member); - } - } - } - } - var final; - if (gap == "") { - final = "{" + partial.join(",") + "}"; - } else if (partial.length > 0) { - var separator = ",\n" + indent; - final = "{\n" + indent + partial.join(separator) + "\n" + - stepback + "}"; - } else { - final = "{}"; - } - stack.pop(); - return final; -} - -function JSONSerialize(key, holder, replacer, stack, indent, gap) { - var value = holder[key]; - if (IS_OBJECT(value) && value) { - var toJSON = value.toJSON; - if (IS_FUNCTION(toJSON)) { - value = toJSON.call(value, key); - } - } - if (IS_FUNCTION(replacer)) { - value = replacer.call(holder, key, value); - } - // Unwrap value if necessary - if (IS_OBJECT(value)) { - if (IS_NUMBER_WRAPPER(value)) { - value = $Number(value); - } else if (IS_STRING_WRAPPER(value)) { - value = $String(value); - } else if (IS_BOOLEAN_WRAPPER(value)) { - value = $Boolean(value); - } - } - switch (typeof value) { - case "string": - return QuoteJSONString(value); - case "object": - if (!value) { - return "null"; - } else if (IS_ARRAY(value)) { - return SerializeArray(value, replacer, stack, indent, gap); - } else { - return SerializeObject(value, replacer, stack, indent, gap); - } - case "number": - return $isFinite(value) ? $String(value) : "null"; - case "boolean": - return value ? "true" : "false"; - } -} - -function JSONStringify(value, replacer, space) { - var stack = []; - var indent = ""; - if (IS_OBJECT(space)) { - // Unwrap 'space' if it is wrapped - if (IS_NUMBER_WRAPPER(space)) { - space = $Number(space); - } else if (IS_STRING_WRAPPER(space)) { - space = $String(space); - } - } - var gap; - if (IS_NUMBER(space)) { - space = $Math.min(space, 10); - gap = ""; - for (var i = 0; i < space; i++) { - gap += " "; - } - } else if (IS_STRING(space)) { - if (space.length > 10) { - gap = space.substring(0, 10); - } else { - gap = space; - } - } else { - gap = ""; - } - return JSONSerialize('', {'': value}, replacer, stack, indent, gap); -} - -function SetupJSON() { - InstallFunctions($JSON, DONT_ENUM, $Array( - "parse", JSONParse, - "stringify", JSONStringify - )); -} - -SetupJSON(); diff --git a/deps/v8/src/liveedit-delay.js b/deps/v8/src/liveedit-delay.js deleted file mode 100644 index 41f894a213..0000000000 --- a/deps/v8/src/liveedit-delay.js +++ /dev/null @@ -1,431 +0,0 @@ -// Copyright 2010 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// LiveEdit feature implementation. The script should be executed after -// debug-delay.js. - - -// Changes script text and recompiles all relevant functions if possible. -// The change is always a substring (change_pos, change_pos + change_len) -// being replaced with a completely different string new_str. -// -// Only one function will have its Code changed in result of this function. -// All nested functions (should they have any instances at the moment) are left -// unchanged and re-linked to a newly created script instance representing old -// version of the source. (Generally speaking, -// during the change all nested functions are erased and completely different -// set of nested functions are introduced.) All other functions just have -// their positions updated. -// -// @param {Script} script that is being changed -// @param {Array} change_log a list that collects engineer-readable description -// of what happened. -Debug.LiveEditChangeScript = function(script, change_pos, change_len, new_str, - change_log) { - - // So far the function works as namespace. - var liveedit = Debug.LiveEditChangeScript; - var Assert = liveedit.Assert; - - // Fully compiles source string as a script. Returns Array of - // FunctionCompileInfo -- a descriptions of all functions of the script. - // Elements of array are ordered by start positions of functions (from top - // to bottom) in the source. Fields outer_index and next_sibling_index help - // to navigate the nesting structure of functions. - // - // The script is used for compilation, because it produces code that - // needs to be linked with some particular script (for nested functions). - function DebugGatherCompileInfo(source) { - // Get function info, elements are partially sorted (it is a tree - // of nested functions serialized as parent followed by serialized children. - var raw_compile_info = %LiveEditGatherCompileInfo(script, source); - - // Sort function infos by start position field. - var compile_info = new Array(); - var old_index_map = new Array(); - for (var i = 0; i < raw_compile_info.length; i++) { - compile_info.push(new liveedit.FunctionCompileInfo(raw_compile_info[i])); - old_index_map.push(i); - } - - for (var i = 0; i < compile_info.length; i++) { - var k = i; - for (var j = i + 1; j < compile_info.length; j++) { - if (compile_info[k].start_position > compile_info[j].start_position) { - k = j; - } - } - if (k != i) { - var temp_info = compile_info[k]; - var temp_index = old_index_map[k]; - compile_info[k] = compile_info[i]; - old_index_map[k] = old_index_map[i]; - compile_info[i] = temp_info; - old_index_map[i] = temp_index; - } - } - - // After sorting update outer_inder field using old_index_map. Also - // set next_sibling_index field. - var current_index = 0; - - // The recursive function, that goes over all children of a particular - // node (i.e. function info). - function ResetIndexes(new_parent_index, old_parent_index) { - var previous_sibling = -1; - while (current_index < compile_info.length && - compile_info[current_index].outer_index == old_parent_index) { - var saved_index = current_index; - compile_info[saved_index].outer_index = new_parent_index; - if (previous_sibling != -1) { - compile_info[previous_sibling].next_sibling_index = saved_index; - } - previous_sibling = saved_index; - current_index++; - ResetIndexes(saved_index, old_index_map[saved_index]); - } - if (previous_sibling != -1) { - compile_info[previous_sibling].next_sibling_index = -1; - } - } - - ResetIndexes(-1, -1); - Assert(current_index == compile_info.length); - - return compile_info; - } - - // Given a positions, finds a function that fully includes the entire change. - function FindChangedFunction(compile_info, offset, len) { - // First condition: function should start before the change region. - // Function #0 (whole-script function) always does, but we want - // one, that is later in this list. - var index = 0; - while (index + 1 < compile_info.length && - compile_info[index + 1].start_position <= offset) { - index++; - } - // Now we are at the last function that begins before the change - // region. The function that covers entire change region is either - // this function or the enclosing one. - for (; compile_info[index].end_position < offset + len; - index = compile_info[index].outer_index) { - Assert(index != -1); - } - return index; - } - - // Variable forward declarations. Preprocessor "Minifier" needs them. - var old_compile_info; - var shared_infos; - // Finds SharedFunctionInfo that corresponds compile info with index - // in old version of the script. - function FindFunctionInfo(index) { - var old_info = old_compile_info[index]; - for (var i = 0; i < shared_infos.length; i++) { - var info = shared_infos[i]; - if (info.start_position == old_info.start_position && - info.end_position == old_info.end_position) { - return info; - } - } - } - - // Replaces function's Code. - function PatchCode(new_info, shared_info) { - %LiveEditReplaceFunctionCode(new_info.raw_array, shared_info.raw_array); - - change_log.push( {function_patched: new_info.function_name} ); - } - - var change_len_old; - var change_len_new; - // Translate position in old version of script into position in new - // version of script. - function PosTranslator(old_pos) { - if (old_pos <= change_pos) { - return old_pos; - } - if (old_pos >= change_pos + change_len_old) { - return old_pos + change_len_new - change_len_old; - } - return -1; - } - - var position_change_array; - var position_patch_report; - function PatchPositions(new_info, shared_info) { - if (!shared_info) { - // TODO: explain what is happening. - return; - } - %LiveEditPatchFunctionPositions(shared_info.raw_array, - position_change_array); - position_patch_report.push( { name: new_info.function_name } ); - } - - var link_to_old_script_report; - var old_script; - // Makes a function associated with another instance of a script (the - // one representing its old version). This way the function still - // may access its own text. - function LinkToOldScript(shared_info) { - %LiveEditRelinkFunctionToScript(shared_info.raw_array, old_script); - - link_to_old_script_report.push( { name: shared_info.function_name } ); - } - - - - var old_source = script.source; - var change_len_old = change_len; - var change_len_new = new_str.length; - - // Prepare new source string. - var new_source = old_source.substring(0, change_pos) + - new_str + old_source.substring(change_pos + change_len); - - // Find all SharedFunctionInfo's that are compiled from this script. - var shared_raw_list = %LiveEditFindSharedFunctionInfosForScript(script); - - var shared_infos = new Array(); - - for (var i = 0; i < shared_raw_list.length; i++) { - shared_infos.push(new liveedit.SharedInfoWrapper(shared_raw_list[i])); - } - - // Gather compile information about old version of script. - var old_compile_info = DebugGatherCompileInfo(old_source); - - // Gather compile information about new version of script. - var new_compile_info; - try { - new_compile_info = DebugGatherCompileInfo(new_source); - } catch (e) { - throw new liveedit.Failure("Failed to compile new version of script: " + e); - } - - // An index of a single function, that is going to have its code replaced. - var function_being_patched = - FindChangedFunction(old_compile_info, change_pos, change_len_old); - - // In old and new script versions function with a change should have the - // same indexes. - var function_being_patched2 = - FindChangedFunction(new_compile_info, change_pos, change_len_new); - Assert(function_being_patched == function_being_patched2, - "inconsistent old/new compile info"); - - // Check that function being patched has the same expectations in a new - // version. Otherwise we cannot safely patch its behavior and should - // choose the outer function instead. - while (!liveedit.CompareFunctionExpectations( - old_compile_info[function_being_patched], - new_compile_info[function_being_patched])) { - - Assert(old_compile_info[function_being_patched].outer_index == - new_compile_info[function_being_patched].outer_index); - function_being_patched = - old_compile_info[function_being_patched].outer_index; - Assert(function_being_patched != -1); - } - - // Check that function being patched is not currently on stack. - liveedit.CheckStackActivations( - [ FindFunctionInfo(function_being_patched) ], change_log ); - - - // Committing all changes. - var old_script_name = liveedit.CreateNameForOldScript(script); - - // Update the script text and create a new script representing an old - // version of the script. - var old_script = %LiveEditReplaceScript(script, new_source, old_script_name); - - PatchCode(new_compile_info[function_being_patched], - FindFunctionInfo(function_being_patched)); - - var position_patch_report = new Array(); - change_log.push( {position_patched: position_patch_report} ); - - var position_change_array = [ change_pos, - change_pos + change_len_old, - change_pos + change_len_new ]; - - // Update positions of all outer functions (i.e. all functions, that - // are partially below the function being patched). - for (var i = new_compile_info[function_being_patched].outer_index; - i != -1; - i = new_compile_info[i].outer_index) { - PatchPositions(new_compile_info[i], FindFunctionInfo(i)); - } - - // Update positions of all functions that are fully below the function - // being patched. - var old_next_sibling = - old_compile_info[function_being_patched].next_sibling_index; - var new_next_sibling = - new_compile_info[function_being_patched].next_sibling_index; - - // We simply go over the tail of both old and new lists. Their tails should - // have an identical structure. - if (old_next_sibling == -1) { - Assert(new_next_sibling == -1); - } else { - Assert(old_compile_info.length - old_next_sibling == - new_compile_info.length - new_next_sibling); - - for (var i = old_next_sibling, j = new_next_sibling; - i < old_compile_info.length; i++, j++) { - PatchPositions(new_compile_info[j], FindFunctionInfo(i)); - } - } - - var link_to_old_script_report = new Array(); - change_log.push( { linked_to_old_script: link_to_old_script_report } ); - - // We need to link to old script all former nested functions. - for (var i = function_being_patched + 1; i < old_next_sibling; i++) { - LinkToOldScript(FindFunctionInfo(i), old_script); - } -} - -Debug.LiveEditChangeScript.Assert = function(condition, message) { - if (!condition) { - if (message) { - throw "Assert " + message; - } else { - throw "Assert"; - } - } -} - -// An object describing function compilation details. Its index fields -// apply to indexes inside array that stores these objects. -Debug.LiveEditChangeScript.FunctionCompileInfo = function(raw_array) { - this.function_name = raw_array[0]; - this.start_position = raw_array[1]; - this.end_position = raw_array[2]; - this.param_num = raw_array[3]; - this.code = raw_array[4]; - this.scope_info = raw_array[5]; - this.outer_index = raw_array[6]; - this.next_sibling_index = null; - this.raw_array = raw_array; -} - -// A structure describing SharedFunctionInfo. -Debug.LiveEditChangeScript.SharedInfoWrapper = function(raw_array) { - this.function_name = raw_array[0]; - this.start_position = raw_array[1]; - this.end_position = raw_array[2]; - this.info = raw_array[3]; - this.raw_array = raw_array; -} - -// Adds a suffix to script name to mark that it is old version. -Debug.LiveEditChangeScript.CreateNameForOldScript = function(script) { - // TODO(635): try better than this; support several changes. - return script.name + " (old)"; -} - -// Compares a function interface old and new version, whether it -// changed or not. -Debug.LiveEditChangeScript.CompareFunctionExpectations = - function(function_info1, function_info2) { - // Check that function has the same number of parameters (there may exist - // an adapter, that won't survive function parameter number change). - if (function_info1.param_num != function_info2.param_num) { - return false; - } - var scope_info1 = function_info1.scope_info; - var scope_info2 = function_info2.scope_info; - - if (!scope_info1) { - return !scope_info2; - } - - if (scope_info1.length != scope_info2.length) { - return false; - } - - // Check that outer scope structure is not changed. Otherwise the function - // will not properly work with existing scopes. - return scope_info1.toString() == scope_info2.toString(); -} - -// For array of wrapped shared function infos checks that none of them -// have activations on stack (of any thread). Throws a Failure exception -// if this proves to be false. -Debug.LiveEditChangeScript.CheckStackActivations = function(shared_wrapper_list, - change_log) { - var liveedit = Debug.LiveEditChangeScript; - - var shared_list = new Array(); - for (var i = 0; i < shared_wrapper_list.length; i++) { - shared_list[i] = shared_wrapper_list[i].info; - } - var result = %LiveEditCheckStackActivations(shared_list); - var problems = new Array(); - for (var i = 0; i < shared_list.length; i++) { - if (result[i] == liveedit.FunctionPatchabilityStatus.FUNCTION_BLOCKED_ON_STACK) { - var shared = shared_list[i]; - var description = { - name: shared.function_name, - start_pos: shared.start_position, - end_pos: shared.end_position - }; - problems.push(description); - } - } - if (problems.length > 0) { - change_log.push( { functions_on_stack: problems } ); - throw new liveedit.Failure("Blocked by functions on stack"); - } -} - -// A copy of the FunctionPatchabilityStatus enum from liveedit.h -Debug.LiveEditChangeScript.FunctionPatchabilityStatus = { - FUNCTION_AVAILABLE_FOR_PATCH: 0, - FUNCTION_BLOCKED_ON_STACK: 1 -} - - -// A logical failure in liveedit process. This means that change_log -// is valid and consistent description of what happened. -Debug.LiveEditChangeScript.Failure = function(message) { - this.message = message; -} - -Debug.LiveEditChangeScript.Failure.prototype.toString = function() { - return "LiveEdit Failure: " + this.message; -} - -// A testing entry. -Debug.LiveEditChangeScript.GetPcFromSourcePos = function(func, source_pos) { - return %GetFunctionCodePositionFromSource(func, source_pos); -} diff --git a/deps/v8/src/mirror-delay.js b/deps/v8/src/mirror-delay.js deleted file mode 100644 index 7c743ec2cd..0000000000 --- a/deps/v8/src/mirror-delay.js +++ /dev/null @@ -1,2369 +0,0 @@ -// Copyright 2006-2008 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// Touch the RegExp and Date functions to make sure that date-delay.js and -// regexp-delay.js has been loaded. This is required as the mirrors use -// functions within these files through the builtins object. -RegExp; -Date; - - -// Handle id counters. -var next_handle_ = 0; -var next_transient_handle_ = -1; - -// Mirror cache. -var mirror_cache_ = []; - - -/** - * Clear the mirror handle cache. - */ -function ClearMirrorCache() { - next_handle_ = 0; - mirror_cache_ = []; -} - - -/** - * Returns the mirror for a specified value or object. - * - * @param {value or Object} value the value or object to retreive the mirror for - * @param {boolean} transient indicate whether this object is transient and - * should not be added to the mirror cache. The default is not transient. - * @returns {Mirror} the mirror reflects the passed value or object - */ -function MakeMirror(value, opt_transient) { - var mirror; - - // Look for non transient mirrors in the mirror cache. - if (!opt_transient) { - for (id in mirror_cache_) { - mirror = mirror_cache_[id]; - if (mirror.value() === value) { - return mirror; - } - // Special check for NaN as NaN == NaN is false. - if (mirror.isNumber() && isNaN(mirror.value()) && - typeof value == 'number' && isNaN(value)) { - return mirror; - } - } - } - - if (IS_UNDEFINED(value)) { - mirror = new UndefinedMirror(); - } else if (IS_NULL(value)) { - mirror = new NullMirror(); - } else if (IS_BOOLEAN(value)) { - mirror = new BooleanMirror(value); - } else if (IS_NUMBER(value)) { - mirror = new NumberMirror(value); - } else if (IS_STRING(value)) { - mirror = new StringMirror(value); - } else if (IS_ARRAY(value)) { - mirror = new ArrayMirror(value); - } else if (IS_DATE(value)) { - mirror = new DateMirror(value); - } else if (IS_FUNCTION(value)) { - mirror = new FunctionMirror(value); - } else if (IS_REGEXP(value)) { - mirror = new RegExpMirror(value); - } else if (IS_ERROR(value)) { - mirror = new ErrorMirror(value); - } else if (IS_SCRIPT(value)) { - mirror = new ScriptMirror(value); - } else { - mirror = new ObjectMirror(value, OBJECT_TYPE, opt_transient); - } - - mirror_cache_[mirror.handle()] = mirror; - return mirror; -} - - -/** - * Returns the mirror for a specified mirror handle. - * - * @param {number} handle the handle to find the mirror for - * @returns {Mirror or undefiend} the mirror with the requested handle or - * undefined if no mirror with the requested handle was found - */ -function LookupMirror(handle) { - return mirror_cache_[handle]; -} - - -/** - * Returns the mirror for the undefined value. - * - * @returns {Mirror} the mirror reflects the undefined value - */ -function GetUndefinedMirror() { - return MakeMirror(void 0); -} - - -/** - * Inherit the prototype methods from one constructor into another. - * - * The Function.prototype.inherits from lang.js rewritten as a standalone - * function (not on Function.prototype). NOTE: If this file is to be loaded - * during bootstrapping this function needs to be revritten using some native - * functions as prototype setup using normal JavaScript does not work as - * expected during bootstrapping (see mirror.js in r114903). - * - * @param {function} ctor Constructor function which needs to inherit the - * prototype - * @param {function} superCtor Constructor function to inherit prototype from - */ -function inherits(ctor, superCtor) { - var tempCtor = function(){}; - tempCtor.prototype = superCtor.prototype; - ctor.super_ = superCtor.prototype; - ctor.prototype = new tempCtor(); - ctor.prototype.constructor = ctor; -} - - -// Type names of the different mirrors. -const UNDEFINED_TYPE = 'undefined'; -const NULL_TYPE = 'null'; -const BOOLEAN_TYPE = 'boolean'; -const NUMBER_TYPE = 'number'; -const STRING_TYPE = 'string'; -const OBJECT_TYPE = 'object'; -const FUNCTION_TYPE = 'function'; -const REGEXP_TYPE = 'regexp'; -const ERROR_TYPE = 'error'; -const PROPERTY_TYPE = 'property'; -const FRAME_TYPE = 'frame'; -const SCRIPT_TYPE = 'script'; -const CONTEXT_TYPE = 'context'; -const SCOPE_TYPE = 'scope'; - -// Maximum length when sending strings through the JSON protocol. -const kMaxProtocolStringLength = 80; - -// Different kind of properties. -PropertyKind = {}; -PropertyKind.Named = 1; -PropertyKind.Indexed = 2; - - -// A copy of the PropertyType enum from global.h -PropertyType = {}; -PropertyType.Normal = 0; -PropertyType.Field = 1; -PropertyType.ConstantFunction = 2; -PropertyType.Callbacks = 3; -PropertyType.Interceptor = 4; -PropertyType.MapTransition = 5; -PropertyType.ConstantTransition = 6; -PropertyType.NullDescriptor = 7; - - -// Different attributes for a property. -PropertyAttribute = {}; -PropertyAttribute.None = NONE; -PropertyAttribute.ReadOnly = READ_ONLY; -PropertyAttribute.DontEnum = DONT_ENUM; -PropertyAttribute.DontDelete = DONT_DELETE; - - -// A copy of the scope types from runtime.cc. -ScopeType = { Global: 0, - Local: 1, - With: 2, - Closure: 3, - Catch: 4 }; - - -// Mirror hierarchy: -// - Mirror -// - ValueMirror -// - UndefinedMirror -// - NullMirror -// - NumberMirror -// - StringMirror -// - ObjectMirror -// - FunctionMirror -// - UnresolvedFunctionMirror -// - ArrayMirror -// - DateMirror -// - RegExpMirror -// - ErrorMirror -// - PropertyMirror -// - FrameMirror -// - ScriptMirror - - -/** - * Base class for all mirror objects. - * @param {string} type The type of the mirror - * @constructor - */ -function Mirror(type) { - this.type_ = type; -}; - - -Mirror.prototype.type = function() { - return this.type_; -}; - - -/** - * Check whether the mirror reflects a value. - * @returns {boolean} True if the mirror reflects a value. - */ -Mirror.prototype.isValue = function() { - return this instanceof ValueMirror; -} - - -/** - * Check whether the mirror reflects the undefined value. - * @returns {boolean} True if the mirror reflects the undefined value. - */ -Mirror.prototype.isUndefined = function() { - return this instanceof UndefinedMirror; -} - - -/** - * Check whether the mirror reflects the null value. - * @returns {boolean} True if the mirror reflects the null value - */ -Mirror.prototype.isNull = function() { - return this instanceof NullMirror; -} - - -/** - * Check whether the mirror reflects a boolean value. - * @returns {boolean} True if the mirror reflects a boolean value - */ -Mirror.prototype.isBoolean = function() { - return this instanceof BooleanMirror; -} - - -/** - * Check whether the mirror reflects a number value. - * @returns {boolean} True if the mirror reflects a number value - */ -Mirror.prototype.isNumber = function() { - return this instanceof NumberMirror; -} - - -/** - * Check whether the mirror reflects a string value. - * @returns {boolean} True if the mirror reflects a string value - */ -Mirror.prototype.isString = function() { - return this instanceof StringMirror; -} - - -/** - * Check whether the mirror reflects an object. - * @returns {boolean} True if the mirror reflects an object - */ -Mirror.prototype.isObject = function() { - return this instanceof ObjectMirror; -} - - -/** - * Check whether the mirror reflects a function. - * @returns {boolean} True if the mirror reflects a function - */ -Mirror.prototype.isFunction = function() { - return this instanceof FunctionMirror; -} - - -/** - * Check whether the mirror reflects an unresolved function. - * @returns {boolean} True if the mirror reflects an unresolved function - */ -Mirror.prototype.isUnresolvedFunction = function() { - return this instanceof UnresolvedFunctionMirror; -} - - -/** - * Check whether the mirror reflects an array. - * @returns {boolean} True if the mirror reflects an array - */ -Mirror.prototype.isArray = function() { - return this instanceof ArrayMirror; -} - - -/** - * Check whether the mirror reflects a date. - * @returns {boolean} True if the mirror reflects a date - */ -Mirror.prototype.isDate = function() { - return this instanceof DateMirror; -} - - -/** - * Check whether the mirror reflects a regular expression. - * @returns {boolean} True if the mirror reflects a regular expression - */ -Mirror.prototype.isRegExp = function() { - return this instanceof RegExpMirror; -} - - -/** - * Check whether the mirror reflects an error. - * @returns {boolean} True if the mirror reflects an error - */ -Mirror.prototype.isError = function() { - return this instanceof ErrorMirror; -} - - -/** - * Check whether the mirror reflects a property. - * @returns {boolean} True if the mirror reflects a property - */ -Mirror.prototype.isProperty = function() { - return this instanceof PropertyMirror; -} - - -/** - * Check whether the mirror reflects a stack frame. - * @returns {boolean} True if the mirror reflects a stack frame - */ -Mirror.prototype.isFrame = function() { - return this instanceof FrameMirror; -} - - -/** - * Check whether the mirror reflects a script. - * @returns {boolean} True if the mirror reflects a script - */ -Mirror.prototype.isScript = function() { - return this instanceof ScriptMirror; -} - - -/** - * Check whether the mirror reflects a context. - * @returns {boolean} True if the mirror reflects a context - */ -Mirror.prototype.isContext = function() { - return this instanceof ContextMirror; -} - - -/** - * Check whether the mirror reflects a scope. - * @returns {boolean} True if the mirror reflects a scope - */ -Mirror.prototype.isScope = function() { - return this instanceof ScopeMirror; -} - - -/** - * Allocate a handle id for this object. - */ -Mirror.prototype.allocateHandle_ = function() { - this.handle_ = next_handle_++; -} - - -/** - * Allocate a transient handle id for this object. Transient handles are - * negative. - */ -Mirror.prototype.allocateTransientHandle_ = function() { - this.handle_ = next_transient_handle_--; -} - - -Mirror.prototype.toText = function() { - // Simpel to text which is used when on specialization in subclass. - return "#<" + builtins.GetInstanceName(this.constructor.name) + ">"; -} - - -/** - * Base class for all value mirror objects. - * @param {string} type The type of the mirror - * @param {value} value The value reflected by this mirror - * @param {boolean} transient indicate whether this object is transient with a - * transient handle - * @constructor - * @extends Mirror - */ -function ValueMirror(type, value, transient) { - Mirror.call(this, type); - this.value_ = value; - if (!transient) { - this.allocateHandle_(); - } else { - this.allocateTransientHandle_(); - } -} -inherits(ValueMirror, Mirror); - - -Mirror.prototype.handle = function() { - return this.handle_; -}; - - -/** - * Check whether this is a primitive value. - * @return {boolean} True if the mirror reflects a primitive value - */ -ValueMirror.prototype.isPrimitive = function() { - var type = this.type(); - return type === 'undefined' || - type === 'null' || - type === 'boolean' || - type === 'number' || - type === 'string'; -}; - - -/** - * Get the actual value reflected by this mirror. - * @return {value} The value reflected by this mirror - */ -ValueMirror.prototype.value = function() { - return this.value_; -}; - - -/** - * Mirror object for Undefined. - * @constructor - * @extends ValueMirror - */ -function UndefinedMirror() { - ValueMirror.call(this, UNDEFINED_TYPE, void 0); -} -inherits(UndefinedMirror, ValueMirror); - - -UndefinedMirror.prototype.toText = function() { - return 'undefined'; -} - - -/** - * Mirror object for null. - * @constructor - * @extends ValueMirror - */ -function NullMirror() { - ValueMirror.call(this, NULL_TYPE, null); -} -inherits(NullMirror, ValueMirror); - - -NullMirror.prototype.toText = function() { - return 'null'; -} - - -/** - * Mirror object for boolean values. - * @param {boolean} value The boolean value reflected by this mirror - * @constructor - * @extends ValueMirror - */ -function BooleanMirror(value) { - ValueMirror.call(this, BOOLEAN_TYPE, value); -} -inherits(BooleanMirror, ValueMirror); - - -BooleanMirror.prototype.toText = function() { - return this.value_ ? 'true' : 'false'; -} - - -/** - * Mirror object for number values. - * @param {number} value The number value reflected by this mirror - * @constructor - * @extends ValueMirror - */ -function NumberMirror(value) { - ValueMirror.call(this, NUMBER_TYPE, value); -} -inherits(NumberMirror, ValueMirror); - - -NumberMirror.prototype.toText = function() { - return %NumberToString(this.value_); -} - - -/** - * Mirror object for string values. - * @param {string} value The string value reflected by this mirror - * @constructor - * @extends ValueMirror - */ -function StringMirror(value) { - ValueMirror.call(this, STRING_TYPE, value); -} -inherits(StringMirror, ValueMirror); - - -StringMirror.prototype.length = function() { - return this.value_.length; -}; - -StringMirror.prototype.getTruncatedValue = function(maxLength) { - if (maxLength != -1 && this.length() > maxLength) { - return this.value_.substring(0, maxLength) + - '... (length: ' + this.length() + ')'; - } - return this.value_; -} - -StringMirror.prototype.toText = function() { - return this.getTruncatedValue(kMaxProtocolStringLength); -} - - -/** - * Mirror object for objects. - * @param {object} value The object reflected by this mirror - * @param {boolean} transient indicate whether this object is transient with a - * transient handle - * @constructor - * @extends ValueMirror - */ -function ObjectMirror(value, type, transient) { - ValueMirror.call(this, type || OBJECT_TYPE, value, transient); -} -inherits(ObjectMirror, ValueMirror); - - -ObjectMirror.prototype.className = function() { - return %_ClassOf(this.value_); -}; - - -ObjectMirror.prototype.constructorFunction = function() { - return MakeMirror(%DebugGetProperty(this.value_, 'constructor')); -}; - - -ObjectMirror.prototype.prototypeObject = function() { - return MakeMirror(%DebugGetProperty(this.value_, 'prototype')); -}; - - -ObjectMirror.prototype.protoObject = function() { - return MakeMirror(%DebugGetPrototype(this.value_)); -}; - - -ObjectMirror.prototype.hasNamedInterceptor = function() { - // Get information on interceptors for this object. - var x = %GetInterceptorInfo(this.value_); - return (x & 2) != 0; -}; - - -ObjectMirror.prototype.hasIndexedInterceptor = function() { - // Get information on interceptors for this object. - var x = %GetInterceptorInfo(this.value_); - return (x & 1) != 0; -}; - - -/** - * Return the property names for this object. - * @param {number} kind Indicate whether named, indexed or both kinds of - * properties are requested - * @param {number} limit Limit the number of names returend to the specified - value - * @return {Array} Property names for this object - */ -ObjectMirror.prototype.propertyNames = function(kind, limit) { - // Find kind and limit and allocate array for the result - kind = kind || PropertyKind.Named | PropertyKind.Indexed; - - var propertyNames; - var elementNames; - var total = 0; - - // Find all the named properties. - if (kind & PropertyKind.Named) { - // Get the local property names. - propertyNames = %GetLocalPropertyNames(this.value_); - total += propertyNames.length; - - // Get names for named interceptor properties if any. - if (this.hasNamedInterceptor() && (kind & PropertyKind.Named)) { - var namedInterceptorNames = - %GetNamedInterceptorPropertyNames(this.value_); - if (namedInterceptorNames) { - propertyNames = propertyNames.concat(namedInterceptorNames); - total += namedInterceptorNames.length; - } - } - } - - // Find all the indexed properties. - if (kind & PropertyKind.Indexed) { - // Get the local element names. - elementNames = %GetLocalElementNames(this.value_); - total += elementNames.length; - - // Get names for indexed interceptor properties. - if (this.hasIndexedInterceptor() && (kind & PropertyKind.Indexed)) { - var indexedInterceptorNames = - %GetIndexedInterceptorElementNames(this.value_); - if (indexedInterceptorNames) { - elementNames = elementNames.concat(indexedInterceptorNames); - total += indexedInterceptorNames.length; - } - } - } - limit = Math.min(limit || total, total); - - var names = new Array(limit); - var index = 0; - - // Copy names for named properties. - if (kind & PropertyKind.Named) { - for (var i = 0; index < limit && i < propertyNames.length; i++) { - names[index++] = propertyNames[i]; - } - } - - // Copy names for indexed properties. - if (kind & PropertyKind.Indexed) { - for (var i = 0; index < limit && i < elementNames.length; i++) { - names[index++] = elementNames[i]; - } - } - - return names; -}; - - -/** - * Return the properties for this object as an array of PropertyMirror objects. - * @param {number} kind Indicate whether named, indexed or both kinds of - * properties are requested - * @param {number} limit Limit the number of properties returend to the - specified value - * @return {Array} Property mirrors for this object - */ -ObjectMirror.prototype.properties = function(kind, limit) { - var names = this.propertyNames(kind, limit); - var properties = new Array(names.length); - for (var i = 0; i < names.length; i++) { - properties[i] = this.property(names[i]); - } - - return properties; -}; - - -ObjectMirror.prototype.property = function(name) { - var details = %DebugGetPropertyDetails(this.value_, %ToString(name)); - if (details) { - return new PropertyMirror(this, name, details); - } - - // Nothing found. - return GetUndefinedMirror(); -}; - - - -/** - * Try to find a property from its value. - * @param {Mirror} value The property value to look for - * @return {PropertyMirror} The property with the specified value. If no - * property was found with the specified value UndefinedMirror is returned - */ -ObjectMirror.prototype.lookupProperty = function(value) { - var properties = this.properties(); - - // Look for property value in properties. - for (var i = 0; i < properties.length; i++) { - - // Skip properties which are defined through assessors. - var property = properties[i]; - if (property.propertyType() != PropertyType.Callbacks) { - if (%_ObjectEquals(property.value_, value.value_)) { - return property; - } - } - } - - // Nothing found. - return GetUndefinedMirror(); -}; - - -/** - * Returns objects which has direct references to this object - * @param {number} opt_max_objects Optional parameter specifying the maximum - * number of referencing objects to return. - * @return {Array} The objects which has direct references to this object. - */ -ObjectMirror.prototype.referencedBy = function(opt_max_objects) { - // Find all objects with direct references to this object. - var result = %DebugReferencedBy(this.value_, - Mirror.prototype, opt_max_objects || 0); - - // Make mirrors for all the references found. - for (var i = 0; i < result.length; i++) { - result[i] = MakeMirror(result[i]); - } - - return result; -}; - - -ObjectMirror.prototype.toText = function() { - var name; - var ctor = this.constructorFunction(); - if (!ctor.isFunction()) { - name = this.className(); - } else { - name = ctor.name(); - if (!name) { - name = this.className(); - } - } - return '#<' + builtins.GetInstanceName(name) + '>'; -}; - - -/** - * Mirror object for functions. - * @param {function} value The function object reflected by this mirror. - * @constructor - * @extends ObjectMirror - */ -function FunctionMirror(value) { - ObjectMirror.call(this, value, FUNCTION_TYPE); - this.resolved_ = true; -} -inherits(FunctionMirror, ObjectMirror); - - -/** - * Returns whether the function is resolved. - * @return {boolean} True if the function is resolved. Unresolved functions can - * only originate as functions from stack frames - */ -FunctionMirror.prototype.resolved = function() { - return this.resolved_; -}; - - -/** - * Returns the name of the function. - * @return {string} Name of the function - */ -FunctionMirror.prototype.name = function() { - return %FunctionGetName(this.value_); -}; - - -/** - * Returns the inferred name of the function. - * @return {string} Name of the function - */ -FunctionMirror.prototype.inferredName = function() { - return %FunctionGetInferredName(this.value_); -}; - - -/** - * Returns the source code for the function. - * @return {string or undefined} The source code for the function. If the - * function is not resolved undefined will be returned. - */ -FunctionMirror.prototype.source = function() { - // Return source if function is resolved. Otherwise just fall through to - // return undefined. - if (this.resolved()) { - return builtins.FunctionSourceString(this.value_); - } -}; - - -/** - * Returns the script object for the function. - * @return {ScriptMirror or undefined} Script object for the function or - * undefined if the function has no script - */ -FunctionMirror.prototype.script = function() { - // Return script if function is resolved. Otherwise just fall through - // to return undefined. - if (this.resolved()) { - var script = %FunctionGetScript(this.value_); - if (script) { - return MakeMirror(script); - } - } -}; - - -/** - * Returns the script source position for the function. Only makes sense - * for functions which has a script defined. - * @return {Number or undefined} in-script position for the function - */ -FunctionMirror.prototype.sourcePosition_ = function() { - // Return script if function is resolved. Otherwise just fall through - // to return undefined. - if (this.resolved()) { - return %FunctionGetScriptSourcePosition(this.value_); - } -}; - - -/** - * Returns the script source location object for the function. Only makes sense - * for functions which has a script defined. - * @return {Location or undefined} in-script location for the function begin - */ -FunctionMirror.prototype.sourceLocation = function() { - if (this.resolved() && this.script()) { - return this.script().locationFromPosition(this.sourcePosition_(), - true); - } -}; - - -/** - * Returns objects constructed by this function. - * @param {number} opt_max_instances Optional parameter specifying the maximum - * number of instances to return. - * @return {Array or undefined} The objects constructed by this function. - */ -FunctionMirror.prototype.constructedBy = function(opt_max_instances) { - if (this.resolved()) { - // Find all objects constructed from this function. - var result = %DebugConstructedBy(this.value_, opt_max_instances || 0); - - // Make mirrors for all the instances found. - for (var i = 0; i < result.length; i++) { - result[i] = MakeMirror(result[i]); - } - - return result; - } else { - return []; - } -}; - - -FunctionMirror.prototype.toText = function() { - return this.source(); -} - - -/** - * Mirror object for unresolved functions. - * @param {string} value The name for the unresolved function reflected by this - * mirror. - * @constructor - * @extends ObjectMirror - */ -function UnresolvedFunctionMirror(value) { - // Construct this using the ValueMirror as an unresolved function is not a - // real object but just a string. - ValueMirror.call(this, FUNCTION_TYPE, value); - this.propertyCount_ = 0; - this.elementCount_ = 0; - this.resolved_ = false; -} -inherits(UnresolvedFunctionMirror, FunctionMirror); - - -UnresolvedFunctionMirror.prototype.className = function() { - return 'Function'; -}; - - -UnresolvedFunctionMirror.prototype.constructorFunction = function() { - return GetUndefinedMirror(); -}; - - -UnresolvedFunctionMirror.prototype.prototypeObject = function() { - return GetUndefinedMirror(); -}; - - -UnresolvedFunctionMirror.prototype.protoObject = function() { - return GetUndefinedMirror(); -}; - - -UnresolvedFunctionMirror.prototype.name = function() { - return this.value_; -}; - - -UnresolvedFunctionMirror.prototype.inferredName = function() { - return undefined; -}; - - -UnresolvedFunctionMirror.prototype.propertyNames = function(kind, limit) { - return []; -} - - -/** - * Mirror object for arrays. - * @param {Array} value The Array object reflected by this mirror - * @constructor - * @extends ObjectMirror - */ -function ArrayMirror(value) { - ObjectMirror.call(this, value); -} -inherits(ArrayMirror, ObjectMirror); - - -ArrayMirror.prototype.length = function() { - return this.value_.length; -}; - - -ArrayMirror.prototype.indexedPropertiesFromRange = function(opt_from_index, opt_to_index) { - var from_index = opt_from_index || 0; - var to_index = opt_to_index || this.length() - 1; - if (from_index > to_index) return new Array(); - var values = new Array(to_index - from_index + 1); - for (var i = from_index; i <= to_index; i++) { - var details = %DebugGetPropertyDetails(this.value_, %ToString(i)); - var value; - if (details) { - value = new PropertyMirror(this, i, details); - } else { - value = GetUndefinedMirror(); - } - values[i - from_index] = value; - } - return values; -} - - -/** - * Mirror object for dates. - * @param {Date} value The Date object reflected by this mirror - * @constructor - * @extends ObjectMirror - */ -function DateMirror(value) { - ObjectMirror.call(this, value); -} -inherits(DateMirror, ObjectMirror); - - -DateMirror.prototype.toText = function() { - var s = JSON.stringify(this.value_); - return s.substring(1, s.length - 1); // cut quotes -} - - -/** - * Mirror object for regular expressions. - * @param {RegExp} value The RegExp object reflected by this mirror - * @constructor - * @extends ObjectMirror - */ -function RegExpMirror(value) { - ObjectMirror.call(this, value, REGEXP_TYPE); -} -inherits(RegExpMirror, ObjectMirror); - - -/** - * Returns the source to the regular expression. - * @return {string or undefined} The source to the regular expression - */ -RegExpMirror.prototype.source = function() { - return this.value_.source; -}; - - -/** - * Returns whether this regular expression has the global (g) flag set. - * @return {boolean} Value of the global flag - */ -RegExpMirror.prototype.global = function() { - return this.value_.global; -}; - - -/** - * Returns whether this regular expression has the ignore case (i) flag set. - * @return {boolean} Value of the ignore case flag - */ -RegExpMirror.prototype.ignoreCase = function() { - return this.value_.ignoreCase; -}; - - -/** - * Returns whether this regular expression has the multiline (m) flag set. - * @return {boolean} Value of the multiline flag - */ -RegExpMirror.prototype.multiline = function() { - return this.value_.multiline; -}; - - -RegExpMirror.prototype.toText = function() { - // Simpel to text which is used when on specialization in subclass. - return "/" + this.source() + "/"; -} - - -/** - * Mirror object for error objects. - * @param {Error} value The error object reflected by this mirror - * @constructor - * @extends ObjectMirror - */ -function ErrorMirror(value) { - ObjectMirror.call(this, value, ERROR_TYPE); -} -inherits(ErrorMirror, ObjectMirror); - - -/** - * Returns the message for this eror object. - * @return {string or undefined} The message for this eror object - */ -ErrorMirror.prototype.message = function() { - return this.value_.message; -}; - - -ErrorMirror.prototype.toText = function() { - // Use the same text representation as in messages.js. - var text; - try { - str = builtins.ToDetailString(this.value_); - } catch (e) { - str = '#'; - } - return str; -} - - -/** - * Base mirror object for properties. - * @param {ObjectMirror} mirror The mirror object having this property - * @param {string} name The name of the property - * @param {Array} details Details about the property - * @constructor - * @extends Mirror - */ -function PropertyMirror(mirror, name, details) { - Mirror.call(this, PROPERTY_TYPE); - this.mirror_ = mirror; - this.name_ = name; - this.value_ = details[0]; - this.details_ = details[1]; - if (details.length > 2) { - this.exception_ = details[2] - this.getter_ = details[3]; - this.setter_ = details[4]; - } -} -inherits(PropertyMirror, Mirror); - - -PropertyMirror.prototype.isReadOnly = function() { - return (this.attributes() & PropertyAttribute.ReadOnly) != 0; -} - - -PropertyMirror.prototype.isEnum = function() { - return (this.attributes() & PropertyAttribute.DontEnum) == 0; -} - - -PropertyMirror.prototype.canDelete = function() { - return (this.attributes() & PropertyAttribute.DontDelete) == 0; -} - - -PropertyMirror.prototype.name = function() { - return this.name_; -} - - -PropertyMirror.prototype.isIndexed = function() { - for (var i = 0; i < this.name_.length; i++) { - if (this.name_[i] < '0' || '9' < this.name_[i]) { - return false; - } - } - return true; -} - - -PropertyMirror.prototype.value = function() { - return MakeMirror(this.value_, false); -} - - -/** - * Returns whether this property value is an exception. - * @return {booolean} True if this property value is an exception - */ -PropertyMirror.prototype.isException = function() { - return this.exception_ ? true : false; -} - - -PropertyMirror.prototype.attributes = function() { - return %DebugPropertyAttributesFromDetails(this.details_); -} - - -PropertyMirror.prototype.propertyType = function() { - return %DebugPropertyTypeFromDetails(this.details_); -} - - -PropertyMirror.prototype.insertionIndex = function() { - return %DebugPropertyIndexFromDetails(this.details_); -} - - -/** - * Returns whether this property has a getter defined through __defineGetter__. - * @return {booolean} True if this property has a getter - */ -PropertyMirror.prototype.hasGetter = function() { - return this.getter_ ? true : false; -} - - -/** - * Returns whether this property has a setter defined through __defineSetter__. - * @return {booolean} True if this property has a setter - */ -PropertyMirror.prototype.hasSetter = function() { - return this.setter_ ? true : false; -} - - -/** - * Returns the getter for this property defined through __defineGetter__. - * @return {Mirror} FunctionMirror reflecting the getter function or - * UndefinedMirror if there is no getter for this property - */ -PropertyMirror.prototype.getter = function() { - if (this.hasGetter()) { - return MakeMirror(this.getter_); - } else { - return GetUndefinedMirror(); - } -} - - -/** - * Returns the setter for this property defined through __defineSetter__. - * @return {Mirror} FunctionMirror reflecting the setter function or - * UndefinedMirror if there is no setter for this property - */ -PropertyMirror.prototype.setter = function() { - if (this.hasSetter()) { - return MakeMirror(this.setter_); - } else { - return GetUndefinedMirror(); - } -} - - -/** - * Returns whether this property is natively implemented by the host or a set - * through JavaScript code. - * @return {boolean} True if the property is - * UndefinedMirror if there is no setter for this property - */ -PropertyMirror.prototype.isNative = function() { - return (this.propertyType() == PropertyType.Interceptor) || - ((this.propertyType() == PropertyType.Callbacks) && - !this.hasGetter() && !this.hasSetter()); -} - - -const kFrameDetailsFrameIdIndex = 0; -const kFrameDetailsReceiverIndex = 1; -const kFrameDetailsFunctionIndex = 2; -const kFrameDetailsArgumentCountIndex = 3; -const kFrameDetailsLocalCountIndex = 4; -const kFrameDetailsSourcePositionIndex = 5; -const kFrameDetailsConstructCallIndex = 6; -const kFrameDetailsDebuggerFrameIndex = 7; -const kFrameDetailsFirstDynamicIndex = 8; - -const kFrameDetailsNameIndex = 0; -const kFrameDetailsValueIndex = 1; -const kFrameDetailsNameValueSize = 2; - -/** - * Wrapper for the frame details information retreived from the VM. The frame - * details from the VM is an array with the following content. See runtime.cc - * Runtime_GetFrameDetails. - * 0: Id - * 1: Receiver - * 2: Function - * 3: Argument count - * 4: Local count - * 5: Source position - * 6: Construct call - * Arguments name, value - * Locals name, value - * @param {number} break_id Current break id - * @param {number} index Frame number - * @constructor - */ -function FrameDetails(break_id, index) { - this.break_id_ = break_id; - this.details_ = %GetFrameDetails(break_id, index); -} - - -FrameDetails.prototype.frameId = function() { - %CheckExecutionState(this.break_id_); - return this.details_[kFrameDetailsFrameIdIndex]; -} - - -FrameDetails.prototype.receiver = function() { - %CheckExecutionState(this.break_id_); - return this.details_[kFrameDetailsReceiverIndex]; -} - - -FrameDetails.prototype.func = function() { - %CheckExecutionState(this.break_id_); - return this.details_[kFrameDetailsFunctionIndex]; -} - - -FrameDetails.prototype.isConstructCall = function() { - %CheckExecutionState(this.break_id_); - return this.details_[kFrameDetailsConstructCallIndex]; -} - - -FrameDetails.prototype.isDebuggerFrame = function() { - %CheckExecutionState(this.break_id_); - return this.details_[kFrameDetailsDebuggerFrameIndex]; -} - - -FrameDetails.prototype.argumentCount = function() { - %CheckExecutionState(this.break_id_); - return this.details_[kFrameDetailsArgumentCountIndex]; -} - - -FrameDetails.prototype.argumentName = function(index) { - %CheckExecutionState(this.break_id_); - if (index >= 0 && index < this.argumentCount()) { - return this.details_[kFrameDetailsFirstDynamicIndex + - index * kFrameDetailsNameValueSize + - kFrameDetailsNameIndex] - } -} - - -FrameDetails.prototype.argumentValue = function(index) { - %CheckExecutionState(this.break_id_); - if (index >= 0 && index < this.argumentCount()) { - return this.details_[kFrameDetailsFirstDynamicIndex + - index * kFrameDetailsNameValueSize + - kFrameDetailsValueIndex] - } -} - - -FrameDetails.prototype.localCount = function() { - %CheckExecutionState(this.break_id_); - return this.details_[kFrameDetailsLocalCountIndex]; -} - - -FrameDetails.prototype.sourcePosition = function() { - %CheckExecutionState(this.break_id_); - return this.details_[kFrameDetailsSourcePositionIndex]; -} - - -FrameDetails.prototype.localName = function(index) { - %CheckExecutionState(this.break_id_); - if (index >= 0 && index < this.localCount()) { - var locals_offset = kFrameDetailsFirstDynamicIndex + this.argumentCount() * kFrameDetailsNameValueSize - return this.details_[locals_offset + - index * kFrameDetailsNameValueSize + - kFrameDetailsNameIndex] - } -} - - -FrameDetails.prototype.localValue = function(index) { - %CheckExecutionState(this.break_id_); - if (index >= 0 && index < this.localCount()) { - var locals_offset = kFrameDetailsFirstDynamicIndex + this.argumentCount() * kFrameDetailsNameValueSize - return this.details_[locals_offset + - index * kFrameDetailsNameValueSize + - kFrameDetailsValueIndex] - } -} - - -FrameDetails.prototype.scopeCount = function() { - return %GetScopeCount(this.break_id_, this.frameId()); -} - - -/** - * Mirror object for stack frames. - * @param {number} break_id The break id in the VM for which this frame is - valid - * @param {number} index The frame index (top frame is index 0) - * @constructor - * @extends Mirror - */ -function FrameMirror(break_id, index) { - Mirror.call(this, FRAME_TYPE); - this.break_id_ = break_id; - this.index_ = index; - this.details_ = new FrameDetails(break_id, index); -} -inherits(FrameMirror, Mirror); - - -FrameMirror.prototype.index = function() { - return this.index_; -}; - - -FrameMirror.prototype.func = function() { - // Get the function for this frame from the VM. - var f = this.details_.func(); - - // Create a function mirror. NOTE: MakeMirror cannot be used here as the - // value returned from the VM might be a string if the function for the - // frame is unresolved. - if (IS_FUNCTION(f)) { - return MakeMirror(f); - } else { - return new UnresolvedFunctionMirror(f); - } -}; - - -FrameMirror.prototype.receiver = function() { - return MakeMirror(this.details_.receiver()); -}; - - -FrameMirror.prototype.isConstructCall = function() { - return this.details_.isConstructCall(); -}; - - -FrameMirror.prototype.isDebuggerFrame = function() { - return this.details_.isDebuggerFrame(); -}; - - -FrameMirror.prototype.argumentCount = function() { - return this.details_.argumentCount(); -}; - - -FrameMirror.prototype.argumentName = function(index) { - return this.details_.argumentName(index); -}; - - -FrameMirror.prototype.argumentValue = function(index) { - return MakeMirror(this.details_.argumentValue(index)); -}; - - -FrameMirror.prototype.localCount = function() { - return this.details_.localCount(); -}; - - -FrameMirror.prototype.localName = function(index) { - return this.details_.localName(index); -}; - - -FrameMirror.prototype.localValue = function(index) { - return MakeMirror(this.details_.localValue(index)); -}; - - -FrameMirror.prototype.sourcePosition = function() { - return this.details_.sourcePosition(); -}; - - -FrameMirror.prototype.sourceLocation = function() { - if (this.func().resolved() && this.func().script()) { - return this.func().script().locationFromPosition(this.sourcePosition(), - true); - } -}; - - -FrameMirror.prototype.sourceLine = function() { - if (this.func().resolved()) { - var location = this.sourceLocation(); - if (location) { - return location.line; - } - } -}; - - -FrameMirror.prototype.sourceColumn = function() { - if (this.func().resolved()) { - var location = this.sourceLocation(); - if (location) { - return location.column; - } - } -}; - - -FrameMirror.prototype.sourceLineText = function() { - if (this.func().resolved()) { - var location = this.sourceLocation(); - if (location) { - return location.sourceText(); - } - } -}; - - -FrameMirror.prototype.scopeCount = function() { - return this.details_.scopeCount(); -}; - - -FrameMirror.prototype.scope = function(index) { - return new ScopeMirror(this, index); -}; - - -FrameMirror.prototype.evaluate = function(source, disable_break) { - var result = %DebugEvaluate(this.break_id_, this.details_.frameId(), - source, Boolean(disable_break)); - return MakeMirror(result); -}; - - -FrameMirror.prototype.invocationText = function() { - // Format frame invoaction (receiver, function and arguments). - var result = ''; - var func = this.func(); - var receiver = this.receiver(); - if (this.isConstructCall()) { - // For constructor frames display new followed by the function name. - result += 'new '; - result += func.name() ? func.name() : '[anonymous]'; - } else if (this.isDebuggerFrame()) { - result += '[debugger]'; - } else { - // If the receiver has a className which is 'global' don't display it. - var display_receiver = !receiver.className || receiver.className() != 'global'; - if (display_receiver) { - result += receiver.toText(); - } - // Try to find the function as a property in the receiver. Include the - // prototype chain in the lookup. - var property = GetUndefinedMirror(); - if (!receiver.isUndefined()) { - for (var r = receiver; !r.isNull() && property.isUndefined(); r = r.protoObject()) { - property = r.lookupProperty(func); - } - } - if (!property.isUndefined()) { - // The function invoked was found on the receiver. Use the property name - // for the backtrace. - if (!property.isIndexed()) { - if (display_receiver) { - result += '.'; - } - result += property.name(); - } else { - result += '['; - result += property.name(); - result += ']'; - } - // Also known as - if the name in the function doesn't match the name - // under which it was looked up. - if (func.name() && func.name() != property.name()) { - result += '(aka ' + func.name() + ')'; - } - } else { - // The function invoked was not found on the receiver. Use the function - // name if available for the backtrace. - if (display_receiver) { - result += '.'; - } - result += func.name() ? func.name() : '[anonymous]'; - } - } - - // Render arguments for normal frames. - if (!this.isDebuggerFrame()) { - result += '('; - for (var i = 0; i < this.argumentCount(); i++) { - if (i != 0) result += ', '; - if (this.argumentName(i)) { - result += this.argumentName(i); - result += '='; - } - result += this.argumentValue(i).toText(); - } - result += ')'; - } - - return result; -} - - -FrameMirror.prototype.sourceAndPositionText = function() { - // Format source and position. - var result = ''; - var func = this.func(); - if (func.resolved()) { - if (func.script()) { - if (func.script().name()) { - result += func.script().name(); - } else { - result += '[unnamed]'; - } - if (!this.isDebuggerFrame()) { - var location = this.sourceLocation(); - result += ' line '; - result += !IS_UNDEFINED(location) ? (location.line + 1) : '?'; - result += ' column '; - result += !IS_UNDEFINED(location) ? (location.column + 1) : '?'; - if (!IS_UNDEFINED(this.sourcePosition())) { - result += ' (position ' + (this.sourcePosition() + 1) + ')'; - } - } - } else { - result += '[no source]'; - } - } else { - result += '[unresolved]'; - } - - return result; -} - - -FrameMirror.prototype.localsText = function() { - // Format local variables. - var result = ''; - var locals_count = this.localCount() - if (locals_count > 0) { - for (var i = 0; i < locals_count; ++i) { - result += ' var '; - result += this.localName(i); - result += ' = '; - result += this.localValue(i).toText(); - if (i < locals_count - 1) result += '\n'; - } - } - - return result; -} - - -FrameMirror.prototype.toText = function(opt_locals) { - var result = ''; - result += '#' + (this.index() <= 9 ? '0' : '') + this.index(); - result += ' '; - result += this.invocationText(); - result += ' '; - result += this.sourceAndPositionText(); - if (opt_locals) { - result += '\n'; - result += this.localsText(); - } - return result; -} - - -const kScopeDetailsTypeIndex = 0; -const kScopeDetailsObjectIndex = 1; - -function ScopeDetails(frame, index) { - this.break_id_ = frame.break_id_; - this.details_ = %GetScopeDetails(frame.break_id_, - frame.details_.frameId(), - index); -} - - -ScopeDetails.prototype.type = function() { - %CheckExecutionState(this.break_id_); - return this.details_[kScopeDetailsTypeIndex]; -} - - -ScopeDetails.prototype.object = function() { - %CheckExecutionState(this.break_id_); - return this.details_[kScopeDetailsObjectIndex]; -} - - -/** - * Mirror object for scope. - * @param {FrameMirror} frame The frame this scope is a part of - * @param {number} index The scope index in the frame - * @constructor - * @extends Mirror - */ -function ScopeMirror(frame, index) { - Mirror.call(this, SCOPE_TYPE); - this.frame_index_ = frame.index_; - this.scope_index_ = index; - this.details_ = new ScopeDetails(frame, index); -} -inherits(ScopeMirror, Mirror); - - -ScopeMirror.prototype.frameIndex = function() { - return this.frame_index_; -}; - - -ScopeMirror.prototype.scopeIndex = function() { - return this.scope_index_; -}; - - -ScopeMirror.prototype.scopeType = function() { - return this.details_.type(); -}; - - -ScopeMirror.prototype.scopeObject = function() { - // For local and closure scopes create a transient mirror as these objects are - // created on the fly materializing the local or closure scopes and - // therefore will not preserve identity. - var transient = this.scopeType() == ScopeType.Local || - this.scopeType() == ScopeType.Closure; - return MakeMirror(this.details_.object(), transient); -}; - - -/** - * Mirror object for script source. - * @param {Script} script The script object - * @constructor - * @extends Mirror - */ -function ScriptMirror(script) { - Mirror.call(this, SCRIPT_TYPE); - this.script_ = script; - this.context_ = new ContextMirror(script.context_data); - this.allocateHandle_(); -} -inherits(ScriptMirror, Mirror); - - -ScriptMirror.prototype.value = function() { - return this.script_; -}; - - -ScriptMirror.prototype.name = function() { - // If we have name, we trust it more than sourceURL from comments - return this.script_.name || this.sourceUrlFromComment_(); -}; - - -ScriptMirror.prototype.id = function() { - return this.script_.id; -}; - - -ScriptMirror.prototype.source = function() { - return this.script_.source; -}; - - -ScriptMirror.prototype.lineOffset = function() { - return this.script_.line_offset; -}; - - -ScriptMirror.prototype.columnOffset = function() { - return this.script_.column_offset; -}; - - -ScriptMirror.prototype.data = function() { - return this.script_.data; -}; - - -ScriptMirror.prototype.scriptType = function() { - return this.script_.type; -}; - - -ScriptMirror.prototype.compilationType = function() { - return this.script_.compilation_type; -}; - - -ScriptMirror.prototype.lineCount = function() { - return this.script_.lineCount(); -}; - - -ScriptMirror.prototype.locationFromPosition = function( - position, include_resource_offset) { - return this.script_.locationFromPosition(position, include_resource_offset); -} - - -ScriptMirror.prototype.sourceSlice = function (opt_from_line, opt_to_line) { - return this.script_.sourceSlice(opt_from_line, opt_to_line); -} - - -ScriptMirror.prototype.context = function() { - return this.context_; -}; - - -ScriptMirror.prototype.evalFromScript = function() { - return MakeMirror(this.script_.eval_from_script); -}; - - -ScriptMirror.prototype.evalFromFunctionName = function() { - return MakeMirror(this.script_.eval_from_function_name); -}; - - -ScriptMirror.prototype.evalFromLocation = function() { - var eval_from_script = this.evalFromScript(); - if (!eval_from_script.isUndefined()) { - var position = this.script_.eval_from_script_position; - return eval_from_script.locationFromPosition(position, true); - } -}; - - -ScriptMirror.prototype.toText = function() { - var result = ''; - result += this.name(); - result += ' (lines: '; - if (this.lineOffset() > 0) { - result += this.lineOffset(); - result += '-'; - result += this.lineOffset() + this.lineCount() - 1; - } else { - result += this.lineCount(); - } - result += ')'; - return result; -} - - -/** - * Returns a suggested script URL from comments in script code (if found), - * undefined otherwise. Used primarily by debuggers for identifying eval()'ed - * scripts. See - * http://fbug.googlecode.com/svn/branches/firebug1.1/docs/ReleaseNotes_1.1.txt - * for details. - * - * @return {?string} value for //@ sourceURL comment - */ -ScriptMirror.prototype.sourceUrlFromComment_ = function() { - if (!('sourceUrl_' in this) && this.source()) { - // TODO(608): the spaces in a regexp below had to be escaped as \040 - // because this file is being processed by js2c whose handling of spaces - // in regexps is broken. - // We're not using \s here to prevent \n from matching. - var sourceUrlPattern = /\/\/@[\040\t]sourceURL=[\040\t]*(\S+)[\040\t]*$/m; - var match = sourceUrlPattern.exec(this.source()); - this.sourceUrl_ = match ? match[1] : undefined; - } - return this.sourceUrl_; -}; - - -/** - * Mirror object for context. - * @param {Object} data The context data - * @constructor - * @extends Mirror - */ -function ContextMirror(data) { - Mirror.call(this, CONTEXT_TYPE); - this.data_ = data; - this.allocateHandle_(); -} -inherits(ContextMirror, Mirror); - - -ContextMirror.prototype.data = function() { - return this.data_; -}; - - -/** - * Returns a mirror serializer - * - * @param {boolean} details Set to true to include details - * @param {Object} options Options comtrolling the serialization - * The following options can be set: - * includeSource: include ths full source of scripts - * @returns {MirrorSerializer} mirror serializer - */ -function MakeMirrorSerializer(details, options) { - return new JSONProtocolSerializer(details, options); -} - - -/** - * Object for serializing a mirror objects and its direct references. - * @param {boolean} details Indicates whether to include details for the mirror - * serialized - * @constructor - */ -function JSONProtocolSerializer(details, options) { - this.details_ = details; - this.options_ = options; - this.mirrors_ = [ ]; -} - - -/** - * Returns a serialization of an object reference. The referenced object are - * added to the serialization state. - * - * @param {Mirror} mirror The mirror to serialize - * @returns {String} JSON serialization - */ -JSONProtocolSerializer.prototype.serializeReference = function(mirror) { - return this.serialize_(mirror, true, true); -} - - -/** - * Returns a serialization of an object value. The referenced objects are - * added to the serialization state. - * - * @param {Mirror} mirror The mirror to serialize - * @returns {String} JSON serialization - */ -JSONProtocolSerializer.prototype.serializeValue = function(mirror) { - var json = this.serialize_(mirror, false, true); - return json; -} - - -/** - * Returns a serialization of all the objects referenced. - * - * @param {Mirror} mirror The mirror to serialize. - * @returns {Array.} Array of the referenced objects converted to - * protcol objects. - */ -JSONProtocolSerializer.prototype.serializeReferencedObjects = function() { - // Collect the protocol representation of the referenced objects in an array. - var content = []; - - // Get the number of referenced objects. - var count = this.mirrors_.length; - - for (var i = 0; i < count; i++) { - content.push(this.serialize_(this.mirrors_[i], false, false)); - } - - return content; -} - - -JSONProtocolSerializer.prototype.includeSource_ = function() { - return this.options_ && this.options_.includeSource; -} - - -JSONProtocolSerializer.prototype.inlineRefs_ = function() { - return this.options_ && this.options_.inlineRefs; -} - - -JSONProtocolSerializer.prototype.maxStringLength_ = function() { - if (IS_UNDEFINED(this.options_) || - IS_UNDEFINED(this.options_.maxStringLength)) { - return kMaxProtocolStringLength; - } - return this.options_.maxStringLength; -} - - -JSONProtocolSerializer.prototype.add_ = function(mirror) { - // If this mirror is already in the list just return. - for (var i = 0; i < this.mirrors_.length; i++) { - if (this.mirrors_[i] === mirror) { - return; - } - } - - // Add the mirror to the list of mirrors to be serialized. - this.mirrors_.push(mirror); -} - - -/** - * Formats mirror object to protocol reference object with some data that can - * be used to display the value in debugger. - * @param {Mirror} mirror Mirror to serialize. - * @return {Object} Protocol reference object. - */ -JSONProtocolSerializer.prototype.serializeReferenceWithDisplayData_ = - function(mirror) { - var o = {}; - o.ref = mirror.handle(); - o.type = mirror.type(); - switch (mirror.type()) { - case UNDEFINED_TYPE: - case NULL_TYPE: - case BOOLEAN_TYPE: - case NUMBER_TYPE: - o.value = mirror.value(); - break; - case STRING_TYPE: - o.value = mirror.getTruncatedValue(this.maxStringLength_()); - break; - case FUNCTION_TYPE: - o.name = mirror.name(); - o.inferredName = mirror.inferredName(); - if (mirror.script()) { - o.scriptId = mirror.script().id(); - } - break; - case ERROR_TYPE: - case REGEXP_TYPE: - o.value = mirror.toText(); - break; - case OBJECT_TYPE: - o.className = mirror.className(); - break; - } - return o; -}; - - -JSONProtocolSerializer.prototype.serialize_ = function(mirror, reference, - details) { - // If serializing a reference to a mirror just return the reference and add - // the mirror to the referenced mirrors. - if (reference && - (mirror.isValue() || mirror.isScript() || mirror.isContext())) { - if (this.inlineRefs_() && mirror.isValue()) { - return this.serializeReferenceWithDisplayData_(mirror); - } else { - this.add_(mirror); - return {'ref' : mirror.handle()}; - } - } - - // Collect the JSON property/value pairs. - var content = {}; - - // Add the mirror handle. - if (mirror.isValue() || mirror.isScript() || mirror.isContext()) { - content.handle = mirror.handle(); - } - - // Always add the type. - content.type = mirror.type(); - - switch (mirror.type()) { - case UNDEFINED_TYPE: - case NULL_TYPE: - // Undefined and null are represented just by their type. - break; - - case BOOLEAN_TYPE: - // Boolean values are simply represented by their value. - content.value = mirror.value(); - break; - - case NUMBER_TYPE: - // Number values are simply represented by their value. - content.value = NumberToJSON_(mirror.value()); - break; - - case STRING_TYPE: - // String values might have their value cropped to keep down size. - if (this.maxStringLength_() != -1 && - mirror.length() > this.maxStringLength_()) { - var str = mirror.getTruncatedValue(this.maxStringLength_()); - content.value = str; - content.fromIndex = 0; - content.toIndex = this.maxStringLength_(); - } else { - content.value = mirror.value(); - } - content.length = mirror.length(); - break; - - case OBJECT_TYPE: - case FUNCTION_TYPE: - case ERROR_TYPE: - case REGEXP_TYPE: - // Add object representation. - this.serializeObject_(mirror, content, details); - break; - - case PROPERTY_TYPE: - throw new Error('PropertyMirror cannot be serialized independeltly') - break; - - case FRAME_TYPE: - // Add object representation. - this.serializeFrame_(mirror, content); - break; - - case SCOPE_TYPE: - // Add object representation. - this.serializeScope_(mirror, content); - break; - - case SCRIPT_TYPE: - // Script is represented by id, name and source attributes. - if (mirror.name()) { - content.name = mirror.name(); - } - content.id = mirror.id(); - content.lineOffset = mirror.lineOffset(); - content.columnOffset = mirror.columnOffset(); - content.lineCount = mirror.lineCount(); - if (mirror.data()) { - content.data = mirror.data(); - } - if (this.includeSource_()) { - content.source = mirror.source(); - } else { - var sourceStart = mirror.source().substring(0, 80); - content.sourceStart = sourceStart; - } - content.sourceLength = mirror.source().length; - content.scriptType = mirror.scriptType(); - content.compilationType = mirror.compilationType(); - // For compilation type eval emit information on the script from which - // eval was called if a script is present. - if (mirror.compilationType() == 1 && - mirror.evalFromScript()) { - content.evalFromScript = - this.serializeReference(mirror.evalFromScript()); - var evalFromLocation = mirror.evalFromLocation() - if (evalFromLocation) { - content.evalFromLocation = { line: evalFromLocation.line, - column: evalFromLocation.column }; - } - if (mirror.evalFromFunctionName()) { - content.evalFromFunctionName = mirror.evalFromFunctionName(); - } - } - if (mirror.context()) { - content.context = this.serializeReference(mirror.context()); - } - break; - - case CONTEXT_TYPE: - content.data = mirror.data(); - break; - } - - // Always add the text representation. - content.text = mirror.toText(); - - // Create and return the JSON string. - return content; -} - - -/** - * Serialize object information to the following JSON format. - * - * {"className":"", - * "constructorFunction":{"ref":}, - * "protoObject":{"ref":}, - * "prototypeObject":{"ref":}, - * "namedInterceptor":, - * "indexedInterceptor":, - * "properties":[]} - */ -JSONProtocolSerializer.prototype.serializeObject_ = function(mirror, content, - details) { - // Add general object properties. - content.className = mirror.className(); - content.constructorFunction = - this.serializeReference(mirror.constructorFunction()); - content.protoObject = this.serializeReference(mirror.protoObject()); - content.prototypeObject = this.serializeReference(mirror.prototypeObject()); - - // Add flags to indicate whether there are interceptors. - if (mirror.hasNamedInterceptor()) { - content.namedInterceptor = true; - } - if (mirror.hasIndexedInterceptor()) { - content.indexedInterceptor = true; - } - - // Add function specific properties. - if (mirror.isFunction()) { - // Add function specific properties. - content.name = mirror.name(); - if (!IS_UNDEFINED(mirror.inferredName())) { - content.inferredName = mirror.inferredName(); - } - content.resolved = mirror.resolved(); - if (mirror.resolved()) { - content.source = mirror.source(); - } - if (mirror.script()) { - content.script = this.serializeReference(mirror.script()); - content.scriptId = mirror.script().id(); - - serializeLocationFields(mirror.sourceLocation(), content); - } - } - - // Add date specific properties. - if (mirror.isDate()) { - // Add date specific properties. - content.value = mirror.value(); - } - - // Add actual properties - named properties followed by indexed properties. - var propertyNames = mirror.propertyNames(PropertyKind.Named); - var propertyIndexes = mirror.propertyNames(PropertyKind.Indexed); - var p = new Array(propertyNames.length + propertyIndexes.length); - for (var i = 0; i < propertyNames.length; i++) { - var propertyMirror = mirror.property(propertyNames[i]); - p[i] = this.serializeProperty_(propertyMirror); - if (details) { - this.add_(propertyMirror.value()); - } - } - for (var i = 0; i < propertyIndexes.length; i++) { - var propertyMirror = mirror.property(propertyIndexes[i]); - p[propertyNames.length + i] = this.serializeProperty_(propertyMirror); - if (details) { - this.add_(propertyMirror.value()); - } - } - content.properties = p; -} - - -/** - * Serialize location information to the following JSON format: - * - * "position":"", - * "line":"", - * "column":"", - * - * @param {SourceLocation} location The location to serialize, may be undefined. - */ -function serializeLocationFields (location, content) { - if (!location) { - return; - } - content.position = location.position; - var line = location.line; - if (!IS_UNDEFINED(line)) { - content.line = line; - } - var column = location.column; - if (!IS_UNDEFINED(column)) { - content.column = column; - } -} - - -/** - * Serialize property information to the following JSON format for building the - * array of properties. - * - * {"name":"", - * "attributes":, - * "propertyType":, - * "ref":} - * - * If the attribute for the property is PropertyAttribute.None it is not added. - * If the propertyType for the property is PropertyType.Normal it is not added. - * Here are a couple of examples. - * - * {"name":"hello","ref":1} - * {"name":"length","attributes":7,"propertyType":3,"ref":2} - * - * @param {PropertyMirror} propertyMirror The property to serialize. - * @returns {Object} Protocol object representing the property. - */ -JSONProtocolSerializer.prototype.serializeProperty_ = function(propertyMirror) { - var result = {}; - - result.name = propertyMirror.name(); - var propertyValue = propertyMirror.value(); - if (this.inlineRefs_() && propertyValue.isValue()) { - result.value = this.serializeReferenceWithDisplayData_(propertyValue); - } else { - if (propertyMirror.attributes() != PropertyAttribute.None) { - result.attributes = propertyMirror.attributes(); - } - if (propertyMirror.propertyType() != PropertyType.Normal) { - result.propertyType = propertyMirror.propertyType(); - } - result.ref = propertyValue.handle(); - } - return result; -} - - -JSONProtocolSerializer.prototype.serializeFrame_ = function(mirror, content) { - content.index = mirror.index(); - content.receiver = this.serializeReference(mirror.receiver()); - var func = mirror.func(); - content.func = this.serializeReference(func); - if (func.script()) { - content.script = this.serializeReference(func.script()); - } - content.constructCall = mirror.isConstructCall(); - content.debuggerFrame = mirror.isDebuggerFrame(); - var x = new Array(mirror.argumentCount()); - for (var i = 0; i < mirror.argumentCount(); i++) { - var arg = {}; - var argument_name = mirror.argumentName(i) - if (argument_name) { - arg.name = argument_name; - } - arg.value = this.serializeReference(mirror.argumentValue(i)); - x[i] = arg; - } - content.arguments = x; - var x = new Array(mirror.localCount()); - for (var i = 0; i < mirror.localCount(); i++) { - var local = {}; - local.name = mirror.localName(i); - local.value = this.serializeReference(mirror.localValue(i)); - x[i] = local; - } - content.locals = x; - serializeLocationFields(mirror.sourceLocation(), content); - var source_line_text = mirror.sourceLineText(); - if (!IS_UNDEFINED(source_line_text)) { - content.sourceLineText = source_line_text; - } - - content.scopes = []; - for (var i = 0; i < mirror.scopeCount(); i++) { - var scope = mirror.scope(i); - content.scopes.push({ - type: scope.scopeType(), - index: i - }); - } -} - - -JSONProtocolSerializer.prototype.serializeScope_ = function(mirror, content) { - content.index = mirror.scopeIndex(); - content.frameIndex = mirror.frameIndex(); - content.type = mirror.scopeType(); - content.object = this.inlineRefs_() ? - this.serializeValue(mirror.scopeObject()) : - this.serializeReference(mirror.scopeObject()); -} - - -/** - * Convert a number to a protocol value. For all finite numbers the number - * itself is returned. For non finite numbers NaN, Infinite and - * -Infinite the string representation "NaN", "Infinite" or "-Infinite" - * (not including the quotes) is returned. - * - * @param {number} value The number value to convert to a protocol value. - * @returns {number|string} Protocol value. - */ -function NumberToJSON_(value) { - if (isNaN(value)) { - return 'NaN'; - } - if (!isFinite(value)) { - if (value > 0) { - return 'Infinity'; - } else { - return '-Infinity'; - } - } - return value; -} diff --git a/deps/v8/src/number-info.h b/deps/v8/src/number-info.h deleted file mode 100644 index bfc0d9fd2d..0000000000 --- a/deps/v8/src/number-info.h +++ /dev/null @@ -1,190 +0,0 @@ -// Copyright 2010 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#ifndef V8_NUMBER_INFO_H_ -#define V8_NUMBER_INFO_H_ - -namespace v8 { -namespace internal { - -// Unknown -// | -// Number -// / | -// HeapNumber Integer32 -// | | -// | Smi -// | / -// Uninitialized. - -class NumberInfo { - public: - NumberInfo() { } - - static inline NumberInfo Unknown(); - // We know it's a number of some sort. - static inline NumberInfo Number(); - // We know it's signed or unsigned 32 bit integer. - static inline NumberInfo Integer32(); - // We know it's a Smi. - static inline NumberInfo Smi(); - // We know it's a heap number. - static inline NumberInfo HeapNumber(); - // We haven't started collecting info yet. - static inline NumberInfo Uninitialized(); - - // Return compact representation. Very sensitive to enum values below! - int ThreeBitRepresentation() { - ASSERT(type_ != kUninitializedType); - int answer = type_ > 6 ? type_ -2 : type_; - ASSERT(answer >= 0); - ASSERT(answer <= 7); - return answer; - } - - // Decode compact representation. Very sensitive to enum values below! - static NumberInfo ExpandedRepresentation(int three_bit_representation) { - Type t = static_cast(three_bit_representation >= 6 ? - three_bit_representation + 2 : - three_bit_representation); - ASSERT(t == kUnknownType || - t == kNumberType || - t == kInteger32Type || - t == kSmiType || - t == kHeapNumberType); - return NumberInfo(t); - } - - int ToInt() { - return type_; - } - - static NumberInfo FromInt(int bit_representation) { - Type t = static_cast(bit_representation); - ASSERT(t == kUnknownType || - t == kNumberType || - t == kInteger32Type || - t == kSmiType || - t == kHeapNumberType); - return NumberInfo(t); - } - - // Return the weakest (least precise) common type. - static NumberInfo Combine(NumberInfo a, NumberInfo b) { - return NumberInfo(static_cast(a.type_ & b.type_)); - } - - inline bool IsUnknown() { - return type_ == kUnknownType; - } - - inline bool IsNumber() { - ASSERT(type_ != kUninitializedType); - return ((type_ & kNumberType) == kNumberType); - } - - inline bool IsSmi() { - ASSERT(type_ != kUninitializedType); - return ((type_ & kSmiType) == kSmiType); - } - - inline bool IsInteger32() { - ASSERT(type_ != kUninitializedType); - return ((type_ & kInteger32Type) == kInteger32Type); - } - - inline bool IsHeapNumber() { - ASSERT(type_ != kUninitializedType); - return ((type_ & kHeapNumberType) == kHeapNumberType); - } - - inline bool IsUninitialized() { - return type_ == kUninitializedType; - } - - const char* ToString() { - switch (type_) { - case kUnknownType: return "UnknownType"; - case kNumberType: return "NumberType"; - case kSmiType: return "SmiType"; - case kHeapNumberType: return "HeapNumberType"; - case kInteger32Type: return "Integer32Type"; - case kUninitializedType: - UNREACHABLE(); - return "UninitializedType"; - } - UNREACHABLE(); - return "Unreachable code"; - } - - private: - enum Type { - kUnknownType = 0, - kNumberType = 1, - kInteger32Type = 3, - kSmiType = 7, - kHeapNumberType = 9, - kUninitializedType = 15 - }; - explicit inline NumberInfo(Type t) : type_(t) { } - - Type type_; -}; - - -NumberInfo NumberInfo::Unknown() { - return NumberInfo(kUnknownType); -} - - -NumberInfo NumberInfo::Number() { - return NumberInfo(kNumberType); -} - - -NumberInfo NumberInfo::Integer32() { - return NumberInfo(kInteger32Type); -} - - -NumberInfo NumberInfo::Smi() { - return NumberInfo(kSmiType); -} - - -NumberInfo NumberInfo::HeapNumber() { - return NumberInfo(kHeapNumberType); -} - - -NumberInfo NumberInfo::Uninitialized() { - return NumberInfo(kUninitializedType); -} - -} } // namespace v8::internal - -#endif // V8_NUMBER_INFO_H_ diff --git a/deps/v8/src/regexp-delay.js b/deps/v8/src/regexp-delay.js deleted file mode 100644 index e2492f7245..0000000000 --- a/deps/v8/src/regexp-delay.js +++ /dev/null @@ -1,497 +0,0 @@ -// Copyright 2006-2009 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// Expect $Object = global.Object; -// Expect $Array = global.Array; - -const $RegExp = global.RegExp; - -// A recursive descent parser for Patterns according to the grammar of -// ECMA-262 15.10.1, with deviations noted below. -function DoConstructRegExp(object, pattern, flags, isConstructorCall) { - // RegExp : Called as constructor; see ECMA-262, section 15.10.4. - if (IS_REGEXP(pattern)) { - if (!IS_UNDEFINED(flags)) { - throw MakeTypeError('regexp_flags', []); - } - flags = (pattern.global ? 'g' : '') - + (pattern.ignoreCase ? 'i' : '') - + (pattern.multiline ? 'm' : ''); - pattern = pattern.source; - } - - pattern = IS_UNDEFINED(pattern) ? '' : ToString(pattern); - flags = IS_UNDEFINED(flags) ? '' : ToString(flags); - - var global = false; - var ignoreCase = false; - var multiline = false; - - for (var i = 0; i < flags.length; i++) { - var c = StringCharAt.call(flags, i); - switch (c) { - case 'g': - // Allow duplicate flags to be consistent with JSC and others. - global = true; - break; - case 'i': - ignoreCase = true; - break; - case 'm': - multiline = true; - break; - default: - // Ignore flags that have no meaning to be consistent with - // JSC. - break; - } - } - - if (isConstructorCall) { - // ECMA-262, section 15.10.7.1. - %SetProperty(object, 'source', pattern, - DONT_DELETE | READ_ONLY | DONT_ENUM); - - // ECMA-262, section 15.10.7.2. - %SetProperty(object, 'global', global, DONT_DELETE | READ_ONLY | DONT_ENUM); - - // ECMA-262, section 15.10.7.3. - %SetProperty(object, 'ignoreCase', ignoreCase, - DONT_DELETE | READ_ONLY | DONT_ENUM); - - // ECMA-262, section 15.10.7.4. - %SetProperty(object, 'multiline', multiline, - DONT_DELETE | READ_ONLY | DONT_ENUM); - - // ECMA-262, section 15.10.7.5. - %SetProperty(object, 'lastIndex', 0, DONT_DELETE | DONT_ENUM); - } else { // RegExp is being recompiled via RegExp.prototype.compile. - %IgnoreAttributesAndSetProperty(object, 'source', pattern); - %IgnoreAttributesAndSetProperty(object, 'global', global); - %IgnoreAttributesAndSetProperty(object, 'ignoreCase', ignoreCase); - %IgnoreAttributesAndSetProperty(object, 'multiline', multiline); - %IgnoreAttributesAndSetProperty(object, 'lastIndex', 0); - regExpCache.type = 'none'; - } - - // Call internal function to compile the pattern. - %RegExpCompile(object, pattern, flags); -} - - -function RegExpConstructor(pattern, flags) { - if (%_IsConstructCall()) { - DoConstructRegExp(this, pattern, flags, true); - } else { - // RegExp : Called as function; see ECMA-262, section 15.10.3.1. - if (IS_REGEXP(pattern) && IS_UNDEFINED(flags)) { - return pattern; - } - return new $RegExp(pattern, flags); - } -} - - -// Deprecated RegExp.prototype.compile method. We behave like the constructor -// were called again. In SpiderMonkey, this method returns the regexp object. -// In JSC, it returns undefined. For compatibility with JSC, we match their -// behavior. -function CompileRegExp(pattern, flags) { - // Both JSC and SpiderMonkey treat a missing pattern argument as the - // empty subject string, and an actual undefined value passed as the - // pattern as the string 'undefined'. Note that JSC is inconsistent - // here, treating undefined values differently in - // RegExp.prototype.compile and in the constructor, where they are - // the empty string. For compatibility with JSC, we match their - // behavior. - if (IS_UNDEFINED(pattern) && %_ArgumentsLength() != 0) { - DoConstructRegExp(this, 'undefined', flags, false); - } else { - DoConstructRegExp(this, pattern, flags, false); - } -} - - -function DoRegExpExec(regexp, string, index) { - return %_RegExpExec(regexp, string, index, lastMatchInfo); -} - - -function RegExpCache() { - this.type = 'none'; - this.regExp = 0; - this.subject = 0; - this.replaceString = 0; - this.lastIndex = 0; - this.answer = 0; -} - - -var regExpCache = new RegExpCache(); - - -function CloneRegexpAnswer(array) { - var len = array.length; - var answer = new $Array(len); - for (var i = 0; i < len; i++) { - answer[i] = array[i]; - } - answer.index = array.index; - answer.input = array.input; - return answer; -} - - -function RegExpExec(string) { - if (!IS_REGEXP(this)) { - throw MakeTypeError('incompatible_method_receiver', - ['RegExp.prototype.exec', this]); - } - - var cache = regExpCache; - - if (%_ObjectEquals(cache.type, 'exec') && - %_ObjectEquals(cache.lastIndex, this.lastIndex) && - %_ObjectEquals(cache.regExp, this) && - %_ObjectEquals(cache.subject, string)) { - var last = cache.answer; - if (last == null) { - return last; - } else { - return CloneRegexpAnswer(last); - } - } - - if (%_ArgumentsLength() == 0) { - var regExpInput = LAST_INPUT(lastMatchInfo); - if (IS_UNDEFINED(regExpInput)) { - throw MakeError('no_input_to_regexp', [this]); - } - string = regExpInput; - } - var s; - if (IS_STRING(string)) { - s = string; - } else { - s = ToString(string); - } - var lastIndex = this.lastIndex; - - var i = this.global ? TO_INTEGER(lastIndex) : 0; - - if (i < 0 || i > s.length) { - this.lastIndex = 0; - return null; - } - - %_Log('regexp', 'regexp-exec,%0r,%1S,%2i', [this, s, lastIndex]); - // matchIndices is either null or the lastMatchInfo array. - var matchIndices = %_RegExpExec(this, s, i, lastMatchInfo); - - if (matchIndices == null) { - if (this.global) this.lastIndex = 0; - cache.lastIndex = lastIndex; - cache.regExp = this; - cache.subject = s; - cache.answer = matchIndices; // Null. - cache.type = 'exec'; - return matchIndices; // No match. - } - - var numResults = NUMBER_OF_CAPTURES(lastMatchInfo) >> 1; - var result; - if (numResults === 1) { - var matchStart = lastMatchInfo[CAPTURE(0)]; - var matchEnd = lastMatchInfo[CAPTURE(1)]; - result = [SubString(s, matchStart, matchEnd)]; - } else { - result = new $Array(numResults); - for (var i = 0; i < numResults; i++) { - var matchStart = lastMatchInfo[CAPTURE(i << 1)]; - var matchEnd = lastMatchInfo[CAPTURE((i << 1) + 1)]; - if (matchStart != -1 && matchEnd != -1) { - result[i] = SubString(s, matchStart, matchEnd); - } else { - // Make sure the element is present. Avoid reading the undefined - // property from the global object since this may change. - result[i] = void 0; - } - } - } - - result.index = lastMatchInfo[CAPTURE0]; - result.input = s; - if (this.global) { - this.lastIndex = lastMatchInfo[CAPTURE1]; - return result; - } else { - cache.regExp = this; - cache.subject = s; - cache.lastIndex = lastIndex; - cache.answer = result; - cache.type = 'exec'; - return CloneRegexpAnswer(result); - } -} - - -// Section 15.10.6.3 doesn't actually make sense, but the intention seems to be -// that test is defined in terms of String.prototype.exec. However, it probably -// means the original value of String.prototype.exec, which is what everybody -// else implements. -function RegExpTest(string) { - if (!IS_REGEXP(this)) { - throw MakeTypeError('incompatible_method_receiver', - ['RegExp.prototype.test', this]); - } - if (%_ArgumentsLength() == 0) { - var regExpInput = LAST_INPUT(lastMatchInfo); - if (IS_UNDEFINED(regExpInput)) { - throw MakeError('no_input_to_regexp', [this]); - } - string = regExpInput; - } - var s; - if (IS_STRING(string)) { - s = string; - } else { - s = ToString(string); - } - - var lastIndex = this.lastIndex; - - var cache = regExpCache; - - if (%_ObjectEquals(cache.type, 'test') && - %_ObjectEquals(cache.regExp, this) && - %_ObjectEquals(cache.subject, string) && - %_ObjectEquals(cache.lastIndex, lastIndex)) { - return cache.answer; - } - - var length = s.length; - var i = this.global ? TO_INTEGER(lastIndex) : 0; - - cache.type = 'test'; - cache.regExp = this; - cache.subject = s; - cache.lastIndex = i; - - if (i < 0 || i > s.length) { - this.lastIndex = 0; - cache.answer = false; - return false; - } - - %_Log('regexp', 'regexp-exec,%0r,%1S,%2i', [this, s, lastIndex]); - // matchIndices is either null or the lastMatchInfo array. - var matchIndices = %_RegExpExec(this, s, i, lastMatchInfo); - - if (matchIndices == null) { - if (this.global) this.lastIndex = 0; - cache.answer = false; - return false; - } - - if (this.global) this.lastIndex = lastMatchInfo[CAPTURE1]; - cache.answer = true; - return true; -} - - -function RegExpToString() { - // If this.source is an empty string, output /(?:)/. - // http://bugzilla.mozilla.org/show_bug.cgi?id=225550 - // ecma_2/RegExp/properties-001.js. - var src = this.source ? this.source : '(?:)'; - var result = '/' + src + '/'; - if (this.global) - result += 'g'; - if (this.ignoreCase) - result += 'i'; - if (this.multiline) - result += 'm'; - return result; -} - - -// Getters for the static properties lastMatch, lastParen, leftContext, and -// rightContext of the RegExp constructor. The properties are computed based -// on the captures array of the last successful match and the subject string -// of the last successful match. -function RegExpGetLastMatch() { - var regExpSubject = LAST_SUBJECT(lastMatchInfo); - return SubString(regExpSubject, - lastMatchInfo[CAPTURE0], - lastMatchInfo[CAPTURE1]); -} - - -function RegExpGetLastParen() { - var length = NUMBER_OF_CAPTURES(lastMatchInfo); - if (length <= 2) return ''; // There were no captures. - // We match the SpiderMonkey behavior: return the substring defined by the - // last pair (after the first pair) of elements of the capture array even if - // it is empty. - var regExpSubject = LAST_SUBJECT(lastMatchInfo); - var start = lastMatchInfo[CAPTURE(length - 2)]; - var end = lastMatchInfo[CAPTURE(length - 1)]; - if (start != -1 && end != -1) { - return SubString(regExpSubject, start, end); - } - return ""; -} - - -function RegExpGetLeftContext() { - return SubString(LAST_SUBJECT(lastMatchInfo), - 0, - lastMatchInfo[CAPTURE0]); -} - - -function RegExpGetRightContext() { - var subject = LAST_SUBJECT(lastMatchInfo); - return SubString(subject, - lastMatchInfo[CAPTURE1], - subject.length); -} - - -// The properties $1..$9 are the first nine capturing substrings of the last -// successful match, or ''. The function RegExpMakeCaptureGetter will be -// called with indices from 1 to 9. -function RegExpMakeCaptureGetter(n) { - return function() { - var index = n * 2; - if (index >= NUMBER_OF_CAPTURES(lastMatchInfo)) return ''; - var matchStart = lastMatchInfo[CAPTURE(index)]; - var matchEnd = lastMatchInfo[CAPTURE(index + 1)]; - if (matchStart == -1 || matchEnd == -1) return ''; - return SubString(LAST_SUBJECT(lastMatchInfo), matchStart, matchEnd); - }; -} - - -// Property of the builtins object for recording the result of the last -// regexp match. The property lastMatchInfo includes the matchIndices -// array of the last successful regexp match (an array of start/end index -// pairs for the match and all the captured substrings), the invariant is -// that there are at least two capture indeces. The array also contains -// the subject string for the last successful match. -var lastMatchInfo = [ - 2, // REGEXP_NUMBER_OF_CAPTURES - "", // Last subject. - void 0, // Last input - settable with RegExpSetInput. - 0, // REGEXP_FIRST_CAPTURE + 0 - 0, // REGEXP_FIRST_CAPTURE + 1 -]; - -// ------------------------------------------------------------------- - -function SetupRegExp() { - %FunctionSetInstanceClassName($RegExp, 'RegExp'); - %FunctionSetPrototype($RegExp, new $Object()); - %SetProperty($RegExp.prototype, 'constructor', $RegExp, DONT_ENUM); - %SetCode($RegExp, RegExpConstructor); - - InstallFunctions($RegExp.prototype, DONT_ENUM, $Array( - "exec", RegExpExec, - "test", RegExpTest, - "toString", RegExpToString, - "compile", CompileRegExp - )); - - // The length of compile is 1 in SpiderMonkey. - %FunctionSetLength($RegExp.prototype.compile, 1); - - // The properties input, $input, and $_ are aliases for each other. When this - // value is set the value it is set to is coerced to a string. - // Getter and setter for the input. - function RegExpGetInput() { - var regExpInput = LAST_INPUT(lastMatchInfo); - return IS_UNDEFINED(regExpInput) ? "" : regExpInput; - } - function RegExpSetInput(string) { - regExpCache.type = 'none'; - LAST_INPUT(lastMatchInfo) = ToString(string); - }; - - %DefineAccessor($RegExp, 'input', GETTER, RegExpGetInput, DONT_DELETE); - %DefineAccessor($RegExp, 'input', SETTER, RegExpSetInput, DONT_DELETE); - %DefineAccessor($RegExp, '$_', GETTER, RegExpGetInput, DONT_ENUM | DONT_DELETE); - %DefineAccessor($RegExp, '$_', SETTER, RegExpSetInput, DONT_ENUM | DONT_DELETE); - %DefineAccessor($RegExp, '$input', GETTER, RegExpGetInput, DONT_ENUM | DONT_DELETE); - %DefineAccessor($RegExp, '$input', SETTER, RegExpSetInput, DONT_ENUM | DONT_DELETE); - - // The properties multiline and $* are aliases for each other. When this - // value is set in SpiderMonkey, the value it is set to is coerced to a - // boolean. We mimic that behavior with a slight difference: in SpiderMonkey - // the value of the expression 'RegExp.multiline = null' (for instance) is the - // boolean false (ie, the value after coercion), while in V8 it is the value - // null (ie, the value before coercion). - - // Getter and setter for multiline. - var multiline = false; - function RegExpGetMultiline() { return multiline; }; - function RegExpSetMultiline(flag) { multiline = flag ? true : false; }; - - %DefineAccessor($RegExp, 'multiline', GETTER, RegExpGetMultiline, DONT_DELETE); - %DefineAccessor($RegExp, 'multiline', SETTER, RegExpSetMultiline, DONT_DELETE); - %DefineAccessor($RegExp, '$*', GETTER, RegExpGetMultiline, DONT_ENUM | DONT_DELETE); - %DefineAccessor($RegExp, '$*', SETTER, RegExpSetMultiline, DONT_ENUM | DONT_DELETE); - - - function NoOpSetter(ignored) {} - - - // Static properties set by a successful match. - %DefineAccessor($RegExp, 'lastMatch', GETTER, RegExpGetLastMatch, DONT_DELETE); - %DefineAccessor($RegExp, 'lastMatch', SETTER, NoOpSetter, DONT_DELETE); - %DefineAccessor($RegExp, '$&', GETTER, RegExpGetLastMatch, DONT_ENUM | DONT_DELETE); - %DefineAccessor($RegExp, '$&', SETTER, NoOpSetter, DONT_ENUM | DONT_DELETE); - %DefineAccessor($RegExp, 'lastParen', GETTER, RegExpGetLastParen, DONT_DELETE); - %DefineAccessor($RegExp, 'lastParen', SETTER, NoOpSetter, DONT_DELETE); - %DefineAccessor($RegExp, '$+', GETTER, RegExpGetLastParen, DONT_ENUM | DONT_DELETE); - %DefineAccessor($RegExp, '$+', SETTER, NoOpSetter, DONT_ENUM | DONT_DELETE); - %DefineAccessor($RegExp, 'leftContext', GETTER, RegExpGetLeftContext, DONT_DELETE); - %DefineAccessor($RegExp, 'leftContext', SETTER, NoOpSetter, DONT_DELETE); - %DefineAccessor($RegExp, '$`', GETTER, RegExpGetLeftContext, DONT_ENUM | DONT_DELETE); - %DefineAccessor($RegExp, '$`', SETTER, NoOpSetter, DONT_ENUM | DONT_DELETE); - %DefineAccessor($RegExp, 'rightContext', GETTER, RegExpGetRightContext, DONT_DELETE); - %DefineAccessor($RegExp, 'rightContext', SETTER, NoOpSetter, DONT_DELETE); - %DefineAccessor($RegExp, "$'", GETTER, RegExpGetRightContext, DONT_ENUM | DONT_DELETE); - %DefineAccessor($RegExp, "$'", SETTER, NoOpSetter, DONT_ENUM | DONT_DELETE); - - for (var i = 1; i < 10; ++i) { - %DefineAccessor($RegExp, '$' + i, GETTER, RegExpMakeCaptureGetter(i), DONT_DELETE); - %DefineAccessor($RegExp, '$' + i, SETTER, NoOpSetter, DONT_DELETE); - } -} - - -SetupRegExp();