jscript: Run some SunSpider benchmarks in interactive mode.

This commit is contained in:
Jacek Caban 2013-04-23 15:03:35 +02:00 committed by Alexandre Julliard
parent 8541f94e2c
commit 6d8359fcc5
5 changed files with 2014 additions and 2 deletions

View File

@ -27,3 +27,12 @@ lang.js 40 "lang.js"
/* @makedep: regexp.js */ /* @makedep: regexp.js */
regexp.js 40 "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"

View File

@ -1777,13 +1777,12 @@ static void run_from_file(const char *filename)
ok(hres == S_OK, "parse_script failed: %08x\n", hres); 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; const char *data;
DWORD size, len; DWORD size, len;
BSTR str; BSTR str;
HRSRC src; HRSRC src;
HRESULT hres;
strict_dispid_check = FALSE; strict_dispid_check = FALSE;
test_name = name; test_name = name;
@ -1798,6 +1797,16 @@ static void run_from_res(const char *name)
str = SysAllocStringLen(NULL, len); str = SysAllocStringLen(NULL, len);
MultiByteToWideChar(CP_ACP, 0, data, size, str, 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_d);
SET_EXPECT(global_success_i); SET_EXPECT(global_success_i);
hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, str); 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); 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) static BOOL check_jscript(void)
{ {
IActiveScriptProperty *script_prop; IActiveScriptProperty *script_prop;
@ -2350,6 +2414,9 @@ START_TEST(run)
trace("ParseProcedureText tests...\n"); trace("ParseProcedureText tests...\n");
test_parse_proc(); test_parse_proc();
} }
if(winetest_interactive)
run_benchmarks();
} }
CoUninitialize(); CoUninitialize();

File diff suppressed because it is too large Load Diff

View File

@ -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;

View File

@ -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();