jscript: Run some SunSpider benchmarks in interactive mode.
This commit is contained in:
parent
8541f94e2c
commit
6d8359fcc5
|
@ -27,3 +27,12 @@ lang.js 40 "lang.js"
|
|||
|
||||
/* @makedep: regexp.js */
|
||||
regexp.js 40 "regexp.js"
|
||||
|
||||
/* @makedep: sunspider-regexp-dna.js */
|
||||
dna.js 40 "sunspider-regexp-dna.js"
|
||||
|
||||
/* @makedep: sunspider-string-base64.js */
|
||||
base64.js 40 "sunspider-string-base64.js"
|
||||
|
||||
/* @makedep: sunspider-string-validate-input.js */
|
||||
validateinput.js 40 "sunspider-string-validate-input.js"
|
||||
|
|
|
@ -1777,13 +1777,12 @@ static void run_from_file(const char *filename)
|
|||
ok(hres == S_OK, "parse_script failed: %08x\n", hres);
|
||||
}
|
||||
|
||||
static void run_from_res(const char *name)
|
||||
static BSTR load_res(const char *name)
|
||||
{
|
||||
const char *data;
|
||||
DWORD size, len;
|
||||
BSTR str;
|
||||
HRSRC src;
|
||||
HRESULT hres;
|
||||
|
||||
strict_dispid_check = FALSE;
|
||||
test_name = name;
|
||||
|
@ -1798,6 +1797,16 @@ static void run_from_res(const char *name)
|
|||
str = SysAllocStringLen(NULL, len);
|
||||
MultiByteToWideChar(CP_ACP, 0, data, size, str, len);
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
static void run_from_res(const char *name)
|
||||
{
|
||||
BSTR str;
|
||||
HRESULT hres;
|
||||
|
||||
str = load_res(name);
|
||||
|
||||
SET_EXPECT(global_success_d);
|
||||
SET_EXPECT(global_success_i);
|
||||
hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, str);
|
||||
|
@ -2304,6 +2313,61 @@ static void run_encoded_tests(void)
|
|||
ok(hres == JS_E_INVALID_CHAR, "parse_script failed %08x\n", hres);
|
||||
}
|
||||
|
||||
static void run_benchmark(const char *script_name)
|
||||
{
|
||||
IActiveScriptParse *parser;
|
||||
IActiveScript *engine;
|
||||
ULONG start, end;
|
||||
BSTR src;
|
||||
HRESULT hres;
|
||||
|
||||
engine = create_script();
|
||||
if(!engine)
|
||||
return;
|
||||
|
||||
hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
|
||||
ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
|
||||
if (FAILED(hres)) {
|
||||
IActiveScript_Release(engine);
|
||||
return;
|
||||
}
|
||||
|
||||
hres = IActiveScriptParse_InitNew(parser);
|
||||
ok(hres == S_OK, "InitNew failed: %08x\n", hres);
|
||||
|
||||
hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
|
||||
ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
|
||||
|
||||
hres = IActiveScript_AddNamedItem(engine, testW,
|
||||
SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE);
|
||||
ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
|
||||
|
||||
hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
|
||||
ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
|
||||
|
||||
src = load_res(script_name);
|
||||
|
||||
start = GetTickCount();
|
||||
hres = IActiveScriptParse_ParseScriptText(parser, src, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
|
||||
end = GetTickCount();
|
||||
ok(hres == S_OK, "%s: ParseScriptText failed: %08x\n", script_name, hres);
|
||||
|
||||
trace("%s ran in %u ms\n", script_name, end-start);
|
||||
|
||||
IActiveScript_Release(engine);
|
||||
IActiveScriptParse_Release(parser);
|
||||
SysFreeString(src);
|
||||
}
|
||||
|
||||
static void run_benchmarks(void)
|
||||
{
|
||||
trace("Running benchmarks...\n");
|
||||
|
||||
run_benchmark("dna.js");
|
||||
run_benchmark("base64.js");
|
||||
run_benchmark("validateinput.js");
|
||||
}
|
||||
|
||||
static BOOL check_jscript(void)
|
||||
{
|
||||
IActiveScriptProperty *script_prop;
|
||||
|
@ -2350,6 +2414,9 @@ START_TEST(run)
|
|||
trace("ParseProcedureText tests...\n");
|
||||
test_parse_proc();
|
||||
}
|
||||
|
||||
if(winetest_interactive)
|
||||
run_benchmarks();
|
||||
}
|
||||
|
||||
CoUninitialize();
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,135 @@
|
|||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is Mozilla XML-RPC Client component.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Digital Creations 2, Inc.
|
||||
* Portions created by the Initial Developer are Copyright (C) 2000
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Martijn Pieters <mj@digicool.com> (original author)
|
||||
* Samuel Sieb <samuel@sieb.net>
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
// From: http://lxr.mozilla.org/mozilla/source/extensions/xml-rpc/src/nsXmlRpcClient.js#956
|
||||
|
||||
/* Convert data (an array of integers) to a Base64 string. */
|
||||
var toBase64Table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
|
||||
var base64Pad = '=';
|
||||
|
||||
function toBase64(data) {
|
||||
var result = '';
|
||||
var length = data.length;
|
||||
var i;
|
||||
// Convert every three bytes to 4 ascii characters.
|
||||
for (i = 0; i < (length - 2); i += 3) {
|
||||
result += toBase64Table[data.charCodeAt(i) >> 2];
|
||||
result += toBase64Table[((data.charCodeAt(i) & 0x03) << 4) + (data.charCodeAt(i+1) >> 4)];
|
||||
result += toBase64Table[((data.charCodeAt(i+1) & 0x0f) << 2) + (data.charCodeAt(i+2) >> 6)];
|
||||
result += toBase64Table[data.charCodeAt(i+2) & 0x3f];
|
||||
}
|
||||
|
||||
// Convert the remaining 1 or 2 bytes, pad out to 4 characters.
|
||||
if (length%3) {
|
||||
i = length - (length%3);
|
||||
result += toBase64Table[data.charCodeAt(i) >> 2];
|
||||
if ((length%3) == 2) {
|
||||
result += toBase64Table[((data.charCodeAt(i) & 0x03) << 4) + (data.charCodeAt(i+1) >> 4)];
|
||||
result += toBase64Table[(data.charCodeAt(i+1) & 0x0f) << 2];
|
||||
result += base64Pad;
|
||||
} else {
|
||||
result += toBase64Table[(data.charCodeAt(i) & 0x03) << 4];
|
||||
result += base64Pad + base64Pad;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/* Convert Base64 data to a string */
|
||||
var toBinaryTable = [
|
||||
-1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
|
||||
-1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
|
||||
-1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,62, -1,-1,-1,63,
|
||||
52,53,54,55, 56,57,58,59, 60,61,-1,-1, -1, 0,-1,-1,
|
||||
-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11,12,13,14,
|
||||
15,16,17,18, 19,20,21,22, 23,24,25,-1, -1,-1,-1,-1,
|
||||
-1,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40,
|
||||
41,42,43,44, 45,46,47,48, 49,50,51,-1, -1,-1,-1,-1
|
||||
];
|
||||
|
||||
function base64ToString(data) {
|
||||
var result = '';
|
||||
var leftbits = 0; // number of bits decoded, but yet to be appended
|
||||
var leftdata = 0; // bits decoded, but yet to be appended
|
||||
|
||||
// Convert one by one.
|
||||
for (var i = 0; i < data.length; i++) {
|
||||
var c = toBinaryTable[data.charCodeAt(i) & 0x7f];
|
||||
var padding = (data.charCodeAt(i) == base64Pad.charCodeAt(0));
|
||||
// Skip illegal characters and whitespace
|
||||
if (c == -1) continue;
|
||||
|
||||
// Collect data into leftdata, update bitcount
|
||||
leftdata = (leftdata << 6) | c;
|
||||
leftbits += 6;
|
||||
|
||||
// If we have 8 or more bits, append 8 bits to the result
|
||||
if (leftbits >= 8) {
|
||||
leftbits -= 8;
|
||||
// Append if not padding.
|
||||
if (!padding)
|
||||
result += String.fromCharCode((leftdata >> leftbits) & 0xff);
|
||||
leftdata &= (1 << leftbits) - 1;
|
||||
}
|
||||
}
|
||||
|
||||
// If there are any bits left, the base64 string was corrupted
|
||||
if (leftbits)
|
||||
throw Components.Exception('Corrupted base64 string');
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
var str = "";
|
||||
|
||||
for ( var i = 0; i < 8192; i++ )
|
||||
str += String.fromCharCode( (25 * Math.random()) + 97 );
|
||||
|
||||
for ( var i = 8192; i <= 16384; i *= 2 ) {
|
||||
|
||||
var base64;
|
||||
|
||||
base64 = toBase64(str);
|
||||
base64ToString(base64);
|
||||
|
||||
// Double the string
|
||||
str += str;
|
||||
}
|
||||
|
||||
toBinaryTable = null;
|
|
@ -0,0 +1,89 @@
|
|||
letters = new Array("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z");
|
||||
numbers = new Array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26);
|
||||
colors = new Array("FF","CC","99","66","33","00");
|
||||
|
||||
var endResult;
|
||||
|
||||
function doTest()
|
||||
{
|
||||
endResult = "";
|
||||
|
||||
// make up email address
|
||||
for (var k=0;k<4000;k++)
|
||||
{
|
||||
username = makeName(6);
|
||||
(k%2)?email=username+"@mac.com":email=username+"(at)mac.com";
|
||||
|
||||
// validate the email address
|
||||
var pattern = /^[a-zA-Z0-9\-\._]+@[a-zA-Z0-9\-_]+(\.?[a-zA-Z0-9\-_]*)\.[a-zA-Z]{2,3}$/;
|
||||
|
||||
if(pattern.test(email))
|
||||
{
|
||||
var r = email + " appears to be a valid email address.";
|
||||
addResult(r);
|
||||
}
|
||||
else
|
||||
{
|
||||
r = email + " does NOT appear to be a valid email address.";
|
||||
addResult(r);
|
||||
}
|
||||
}
|
||||
|
||||
// make up ZIP codes
|
||||
for (var s=0;s<4000;s++)
|
||||
{
|
||||
var zipGood = true;
|
||||
var zip = makeNumber(4);
|
||||
(s%2)?zip=zip+"xyz":zip=zip.concat("7");
|
||||
|
||||
// validate the zip code
|
||||
for (var i = 0; i < zip.length; i++) {
|
||||
var ch = zip.charAt(i);
|
||||
if (ch < "0" || ch > "9") {
|
||||
zipGood = false;
|
||||
r = zip + " contains letters.";
|
||||
addResult(r);
|
||||
}
|
||||
}
|
||||
if (zipGood && zip.length>5)
|
||||
{
|
||||
zipGood = false;
|
||||
r = zip + " is longer than five characters.";
|
||||
addResult(r);
|
||||
}
|
||||
if (zipGood)
|
||||
{
|
||||
r = zip + " appears to be a valid ZIP code.";
|
||||
addResult(r);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function makeName(n)
|
||||
{
|
||||
var tmp = "";
|
||||
for (var i=0;i<n;i++)
|
||||
{
|
||||
var l = Math.floor(26*Math.random());
|
||||
tmp += letters[l];
|
||||
}
|
||||
return tmp;
|
||||
}
|
||||
|
||||
function makeNumber(n)
|
||||
{
|
||||
var tmp = "";
|
||||
for (var i=0;i<n;i++)
|
||||
{
|
||||
var l = Math.floor(9*Math.random());
|
||||
tmp = tmp.concat(l);
|
||||
}
|
||||
return tmp;
|
||||
}
|
||||
|
||||
function addResult(r)
|
||||
{
|
||||
endResult += "\n" + r;
|
||||
}
|
||||
|
||||
doTest();
|
Loading…
Reference in New Issue