/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
/*
 * Any copyright is dedicated to the Public Domain.
 * http://creativecommons.org/licenses/publicdomain/
 * Contributor: Robert Sayre
 */

//-----------------------------------------------------------------------------
var BUGNUMBER = 449627;
var summary = 'Crash with JIT in js_FillPropertyCache';
var actual = 'No Crash';
var expect = 'No Crash';

printBugNumber(BUGNUMBER);
printStatus (summary);

jit(true);

/************************ BROWSER DETECT (http://www.quirksmode.org/js/detect.html) ************************/

if (typeof navigator == 'undefined')
{
  navigator = {
    userAgent: "Firefox",
    vendor: "Mozilla",
    platform: "Mac"
  };
}

global = this;

var BrowserDetect = {
    init: function _init()
    {
      this.browser=this.searchString(this.dataBrowser) || "An unknown browser";

      this.OS= this.searchString(this.dataOS)||"an unknown OS";
    },
    searchString: function _searchString(a)
    {
      for(var i=0; i < a.length; i++)
      {
	var b=a[i].string;
	var c=a[i].prop;
	this.versionSearchString=a[i].versionSearch||a[i].identity;
	if(b)
	{
	  if(b.indexOf(a[i].subString)!=-1)
	    return a[i].identity;
        }
	else if(c)
	return a[i].identity;
      }
    },

    searchVersion:function _searchVersion(a)
    {
      var b=a.indexOf(this.versionSearchString);
      if(b==-1)
      	return;
      return parseFloat(a.substring(b+this.versionSearchString.length+1));
    },

    dataBrowser:[
      {
	string:navigator.userAgent,subString:"OmniWeb",versionSearch:"OmniWeb/",identity:"OmniWeb"
      },
      {
	string:navigator.vendor,subString:"Apple",identity:"Safari"
      },
      {
	prop:global.opera,identity:"Opera"
      },
      {
	string:navigator.vendor,subString:"iCab",identity:"iCab"
      },
      {
	string:navigator.vendor,subString:"KDE",identity:"Konqueror"
      },
      {
	string:navigator.userAgent,subString:"Firefox",identity:"Firefox"
      },
      {
	string:navigator.vendor,subString:"Camino",identity:"Camino"
      },
      {
	string:navigator.userAgent,subString:"Netscape",identity:"Netscape"
      },
      {
	string:navigator.userAgent,subString:"MSIE",identity:"Explorer",versionSearch:"MSIE"
      },
      {
	string:navigator.userAgent,subString:"Gecko",identity:"Mozilla",versionSearch:"rv"
      },
      {
	string:navigator.userAgent,subString:"Mozilla",identity:"Netscape",versionSearch:"Mozilla"
      }
    ],
    dataOS:[
      {
	string:navigator.platform,subString:"Win",identity:"Windows"
      },
      {
	string:navigator.platform,subString:"Mac",identity:"Mac"
      },
      {
	string:navigator.platform,subString:"Linux",identity:"Linux"
      }
    ]
  };

BrowserDetect.init();

jit(false);

reportCompare(expect, actual, summary);
