| Index: src/messages.js
 | 
| diff --git a/src/messages.js b/src/messages.js
 | 
| index e9a88ece74f78660f4d8d59ed2eee8a31682cf62..4c3d1e70e07ad11736f2dbcf3065fc221c305754 100644
 | 
| --- a/src/messages.js
 | 
| +++ b/src/messages.js
 | 
| @@ -55,7 +55,8 @@ var kMessages = 0;
 | 
|  var kReplacementMarkers =
 | 
|      [ "%0", "%1", "%2", "%3" ]
 | 
|  
 | 
| -function FormatString(format, args) {
 | 
| +function FormatString(format, message) {
 | 
| +  var args = %MessageGetArguments(message);
 | 
|    var result = "";
 | 
|    var arg_num = 0;
 | 
|    for (var i = 0; i < format.length; i++) {
 | 
| @@ -227,15 +228,18 @@ function FormatMessage(message) {
 | 
|        strict_lhs_prefix:            ["Prefix increment/decrement may not have eval or arguments operand in strict mode"],
 | 
|      };
 | 
|    }
 | 
| -  var format = kMessages[message.type];
 | 
| -  if (!format) return "<unknown message " + message.type + ">";
 | 
| -  return FormatString(format, message.args);
 | 
| +  var message_type = %MessageGetType(message);
 | 
| +  var format = kMessages[message_type];
 | 
| +  if (!format) return "<unknown message " + message_type + ">";
 | 
| +  return FormatString(format, message);
 | 
|  }
 | 
|  
 | 
|  
 | 
|  function GetLineNumber(message) {
 | 
| -  if (message.startPos == -1) return kNoLineNumberInfo;
 | 
| -  var location = message.script.locationFromPosition(message.startPos, true);
 | 
| +  var start_position = %MessageGetStartPosition(message);
 | 
| +  if (start_position == -1) return kNoLineNumberInfo;
 | 
| +  var script = %MessageGetScript(message);
 | 
| +  var location = script.locationFromPosition(start_position, true);
 | 
|    if (location == null) return kNoLineNumberInfo;
 | 
|    return location.line + 1;
 | 
|  }
 | 
| @@ -244,7 +248,9 @@ function GetLineNumber(message) {
 | 
|  // Returns the source code line containing the given source
 | 
|  // position, or the empty string if the position is invalid.
 | 
|  function GetSourceLine(message) {
 | 
| -  var location = message.script.locationFromPosition(message.startPos, true);
 | 
| +  var script = %MessageGetScript(message);
 | 
| +  var start_position = %MessageGetStartPosition(message);
 | 
| +  var location = script.locationFromPosition(start_position, true);
 | 
|    if (location == null) return "";
 | 
|    location.restrict();
 | 
|    return location.sourceText();
 | 
| @@ -623,29 +629,12 @@ SourceSlice.prototype.sourceText = function () {
 | 
|  // Returns the offset of the given position within the containing
 | 
|  // line.
 | 
|  function GetPositionInLine(message) {
 | 
| -  var location = message.script.locationFromPosition(message.startPos, false);
 | 
| +  var script = %MessageGetScript(message);
 | 
| +  var start_position = %MessageGetStartPosition(message);
 | 
| +  var location = script.locationFromPosition(start_position, false);
 | 
|    if (location == null) return -1;
 | 
|    location.restrict();
 | 
| -  return message.startPos - location.start;
 | 
| -}
 | 
| -
 | 
| -
 | 
| -function ErrorMessage(type, args, startPos, endPos, script, stackTrace,
 | 
| -                      stackFrames) {
 | 
| -  this.startPos = startPos;
 | 
| -  this.endPos = endPos;
 | 
| -  this.type = type;
 | 
| -  this.args = args;
 | 
| -  this.script = script;
 | 
| -  this.stackTrace = stackTrace;
 | 
| -  this.stackFrames = stackFrames;
 | 
| -}
 | 
| -
 | 
| -
 | 
| -function MakeMessage(type, args, startPos, endPos, script, stackTrace,
 | 
| -                     stackFrames) {
 | 
| -  return new ErrorMessage(type, args, startPos, endPos, script, stackTrace,
 | 
| -                          stackFrames);
 | 
| +  return start_position - location.start;
 | 
|  }
 | 
|  
 | 
|  
 | 
| @@ -992,7 +981,7 @@ function DefineError(f) {
 | 
|          // DefineOneShotAccessor always inserts a message property and
 | 
|          // ignores setters.
 | 
|          DefineOneShotAccessor(this, 'message', function (obj) {
 | 
| -          return FormatMessage({type: obj.type, args: obj.arguments});
 | 
| +            return FormatMessage(%NewMessageObject(obj.type, obj.arguments));
 | 
|          });
 | 
|        } else if (!IS_UNDEFINED(m)) {
 | 
|          %IgnoreAttributesAndSetProperty(this, 'message', ToString(m));
 | 
| @@ -1006,11 +995,12 @@ function DefineError(f) {
 | 
|  
 | 
|  function captureStackTrace(obj, cons_opt) {
 | 
|    var stackTraceLimit = $Error.stackTraceLimit;
 | 
| -  if (!stackTraceLimit) return;
 | 
| +  if (!stackTraceLimit || !IS_NUMBER(stackTraceLimit)) return;
 | 
|    if (stackTraceLimit < 0 || stackTraceLimit > 10000)
 | 
|      stackTraceLimit = 10000;
 | 
| -  var raw_stack = %CollectStackTrace(cons_opt ? cons_opt : captureStackTrace,
 | 
| -      stackTraceLimit);
 | 
| +  var raw_stack = %CollectStackTrace(cons_opt
 | 
| +                                     ? cons_opt
 | 
| +                                     : captureStackTrace, stackTraceLimit);
 | 
|    DefineOneShotAccessor(obj, 'stack', function (obj) {
 | 
|      return FormatRawStackTrace(obj, raw_stack);
 | 
|    });
 | 
| @@ -1041,7 +1031,7 @@ function errorToStringDetectCycle() {
 | 
|    try {
 | 
|      var type = this.type;
 | 
|      if (type && !%_CallFunction(this, "message", ObjectHasOwnProperty)) {
 | 
| -      var formatted = FormatMessage({ type: type, args: this.arguments });
 | 
| +      var formatted = FormatMessage(%NewMessageObject(type, this.arguments));
 | 
|        return this.name + ": " + formatted;
 | 
|      }
 | 
|      var message = %_CallFunction(this, "message", ObjectHasOwnProperty)
 | 
| 
 |