| Index: frog/minfrog | 
| diff --git a/frog/minfrog b/frog/minfrog | 
| index 95c2eb608f24a45bb35a8a49f2209fa14ce38531..3ff28c8783eb80c9e6b78e9fb7c6682b30e11637 100755 | 
| --- a/frog/minfrog | 
| +++ b/frog/minfrog | 
| @@ -1874,30 +1874,55 @@ EnvMap.prototype.$index = function(key) { | 
| } | 
| // ********** Code for ReadableStream ************** | 
| // ********** Code for WritableStream ************** | 
| -$defProp(Object.prototype, '$typeNameOf', function() { | 
| -  var constructor = this.constructor; | 
| -  if (typeof(constructor) == 'function') { | 
| -    // The constructor isn't null or undefined at this point. Try | 
| -    // to grab hold of its name. | 
| -    var name = constructor.name; | 
| -    // If the name is a non-empty string, we use that as the type | 
| -    // name of this object. On Firefox, we often get 'Object' as | 
| -    // the constructor name even for more specialized objects so | 
| -    // we have to fall through to the toString() based implementation | 
| -    // below in that case. | 
| -    if (name && typeof(name) == 'string' && name != 'Object') return name; | 
| -  } | 
| -  var string = Object.prototype.toString.call(this); | 
| -  var name = string.substring(8, string.length - 1); | 
| -  if (name == 'Window') { | 
| -    name = 'DOMWindow'; | 
| -  } else if (name == 'Document') { | 
| -    name = 'HTMLDocument'; | 
| -  } else if (name == 'XMLDocument') { | 
| -    name = 'Document'; | 
| -  } | 
| -  return name; | 
| -}); | 
| +$defProp(Object.prototype, '$typeNameOf', (function() { | 
| +  function constructorNameWithFallback(obj) { | 
| +    var constructor = obj.constructor; | 
| +    if (typeof(constructor) == 'function') { | 
| +      // The constructor isn't null or undefined at this point. Try | 
| +      // to grab hold of its name. | 
| +      var name = constructor.name; | 
| +      // If the name is a non-empty string, we use that as the type | 
| +      // name of this object. On Firefox, we often get 'Object' as | 
| +      // the constructor name even for more specialized objects so | 
| +      // we have to fall through to the toString() based implementation | 
| +      // below in that case. | 
| +      if (typeof(name) == 'string' && name && name != 'Object') return name; | 
| +    } | 
| +    var string = Object.prototype.toString.call(obj); | 
| +    return string.substring(8, string.length - 1); | 
| +  } | 
| + | 
| +  function chrome$typeNameOf() { | 
| +    return this.constructor.name; | 
| +  } | 
| + | 
| +  function firefox$typeNameOf() { | 
| +    var name = constructorNameWithFallback(this); | 
| +    if (name == 'Window') return 'DOMWindow'; | 
| +    if (name == 'Document') return 'HTMLDocument'; | 
| +    if (name == 'XMLDocument') return 'Document'; | 
| +    return name; | 
| +  } | 
| + | 
| +  function ie$typeNameOf() { | 
| +    var name = constructorNameWithFallback(this); | 
| +    if (name == 'Window') return 'DOMWindow'; | 
| +    // IE calls both HTML and XML documents 'Document', so we check for the | 
| +    // xmlVersion property, which is the empty string on HTML documents. | 
| +    if (name == 'Document' && this.xmlVersion) return 'Document'; | 
| +    if (name == 'Document') return 'HTMLDocument'; | 
| +    return name; | 
| +  } | 
| + | 
| +  // If we're not in the browser, we're almost certainly running on v8. | 
| +  if (typeof(navigator) != 'object') return chrome$typeNameOf; | 
| + | 
| +  var userAgent = navigator.userAgent; | 
| +  if (/Chrome/.test(userAgent)) return chrome$typeNameOf; | 
| +  if (/Firefox/.test(userAgent)) return firefox$typeNameOf; | 
| +  if (/MSIE/.test(userAgent)) return ie$typeNameOf; | 
| +  return function() { return constructorNameWithFallback(this); }; | 
| +})()); | 
| function $dynamic(name) { | 
| var f = Object.prototype[name]; | 
| if (f && f.methods) return f.methods; | 
| @@ -3083,7 +3108,7 @@ CoreJs.prototype.ensureTypeNameOf = function() { | 
| if (this._generatedTypeNameOf) return; | 
| this._generatedTypeNameOf = true; | 
| this.ensureDefProp(); | 
| -  this.writer.writeln("$defProp(Object.prototype, '$typeNameOf', function() {\n  var constructor = this.constructor;\n  if (typeof(constructor) == 'function') {\n    // The constructor isn't null or undefined at this point. Try\n    // to grab hold of its name.\n    var name = constructor.name;\n    // If the name is a non-empty string, we use that as the type\n    // name of this object. On Firefox, we often get 'Object' as\n    // the constructor name even for more specialized objects so\n    // we have to fall through to the toString() based implementation\n    // below in that case.\n    if (name && typeof(name) == 'string' && name != 'Object') return name;\n  }\n  var string = Object.prototype.toString.call(this);\n  var name = string.substring(8, string.length - 1);\n  if (name == 'Window') {\n    name = 'DOMWindow';\n  } else if (name == 'Document') {\n    name = 'HTMLDocument';\n  } else if (name == 'XMLDocument') {\n    name = 'Document';\n  }\n  return name;\n});"); | 
| +  this.writer.writeln("$defProp(Object.prototype, '$typeNameOf', (function() {\n  function constructorNameWithFallback(obj) {\n    var constructor = obj.constructor;\n    if (typeof(constructor) == 'function') {\n      // The constructor isn't null or undefined at this point. Try\n      // to grab hold of its name.\n      var name = constructor.name;\n      // If the name is a non-empty string, we use that as the type\n      // name of this object. On Firefox, we often get 'Object' as\n      // the constructor name even for more specialized objects so\n      // we have to fall through to the toString() based implementation\n      // below in that case.\n      if (typeof(name) == 'string' && name && name != 'Object') return name;\n    }\n    var string = Object.prototype.toString.call(obj);\n    return string.substring(8, string.length - 1);\n  }\n\n  function chrome$typeNameOf() {\n    return this.constructor.name;\n  }\n\n  function firefox$typeNameOf() {\n    var name = constructorNameWithFallback(this);\n    if (name == 'Window') return 'DOMWindow';\n    if (name == 'Document') return 'HTMLDocument';\n    if (name == 'XMLDocument') return 'Document';\n    return name;\n  }\n\n  function ie$typeNameOf() {\n    var name = constructorNameWithFallback(this);\n    if (name == 'Window') return 'DOMWindow';\n    // IE calls both HTML and XML documents 'Document', so we check for the\n    // xmlVersion property, which is the empty string on HTML documents.\n    if (name == 'Document' && this.xmlVersion) return 'Document';\n    if (name == 'Document') return 'HTMLDocument';\n    return name;\n  }\n\n  // If we're not in the browser, we're almost certainly running on v8.\n  if (typeof(navigator) != 'object') return chrome$typeNameOf;\n\n  var userAgent = navigator.userAgent;\n  if (/Chrome/.test(userAgent)) return chrome$typeNameOf;\n  if (/Firefox/.test(userAgent)) return firefox$typeNameOf;\n  if (/MSIE/.test(userAgent)) return ie$typeNameOf;\n  return function() { return constructorNameWithFallback(this); };\n})());"); | 
| } | 
| CoreJs.prototype.ensureInheritsHelper = function() { | 
| if (this._generatedInherits) return; | 
|  |