mirror of https://github.com/svaarala/duktape.git
Browse Source
* CSVAR compiler shuffle (replaces CSVARI indirect opcode). * Testcase for normal and constructor call argument limits.pull/896/head
Sami Vaarala
8 years ago
2 changed files with 409 additions and 0 deletions
@ -0,0 +1,75 @@ |
|||
/* |
|||
* Demonstrate current argument limits for normal and constructor calls. |
|||
*/ |
|||
|
|||
/*--- |
|||
{ |
|||
"custom": true |
|||
} |
|||
---*/ |
|||
|
|||
/*=== |
|||
function |
|||
255 normal called-with-255-arguments |
|||
255 constr called-with-255-arguments |
|||
256 normal RangeError |
|||
256 constr RangeError |
|||
511 normal RangeError |
|||
511 constr RangeError |
|||
512 normal RangeError |
|||
512 constr RangeError |
|||
===*/ |
|||
|
|||
function createCall(count, isConstructor) { |
|||
var res = []; |
|||
res.push(isConstructor ? 'new func(' : 'func('); |
|||
for (var i = 0; i < count; i++) { |
|||
if (i > 0) { |
|||
res.push(','); |
|||
} |
|||
res.push(123); |
|||
} |
|||
res.push(');'); |
|||
return res.join(''); |
|||
} |
|||
|
|||
function test() { |
|||
function func() { |
|||
// Return a String object so that even with a constructor call
|
|||
// a useful message gets printed.
|
|||
//print('func called with ' + arguments.length + ' arguments');
|
|||
return new String('called-with-' + arguments.length + '-arguments'); |
|||
} |
|||
|
|||
print(eval('typeof func')); |
|||
|
|||
function f(count, isConstructor) { |
|||
var label = isConstructor ? 'constr' : 'normal'; |
|||
try { |
|||
print(count, label, eval(createCall(count, isConstructor))); |
|||
} catch (e) { |
|||
//print(e.stack || e);
|
|||
print(count, label, e.name); |
|||
} |
|||
} |
|||
|
|||
// 255 is the limit in Duktape 2.x
|
|||
f(255, false); |
|||
f(255, true); |
|||
|
|||
f(256, false); |
|||
f(256, true); |
|||
|
|||
// 511 was the limit in Duktape 1.x
|
|||
f(511, false); |
|||
f(511, true); |
|||
|
|||
f(512, false); |
|||
f(512, true); |
|||
} |
|||
|
|||
try { |
|||
test(); |
|||
} catch (e) { |
|||
print(e.stack || e); |
|||
} |
@ -0,0 +1,334 @@ |
|||
/* |
|||
* Test compiler handling of CSVAR output shuffling. |
|||
*/ |
|||
|
|||
/*--- |
|||
{ |
|||
"custom": true |
|||
} |
|||
---*/ |
|||
|
|||
/*=== |
|||
globalFunc called: 0 |
|||
globalFunc called: 1 |
|||
globalFunc called: 2 |
|||
globalFunc called: 3 |
|||
globalFunc called: 4 |
|||
globalFunc called: 5 |
|||
globalFunc called: 6 |
|||
globalFunc called: 7 |
|||
globalFunc called: 8 |
|||
globalFunc called: 9 |
|||
globalFunc called: 10 |
|||
globalFunc called: 11 |
|||
globalFunc called: 12 |
|||
globalFunc called: 13 |
|||
globalFunc called: 14 |
|||
globalFunc called: 15 |
|||
globalFunc called: 16 |
|||
globalFunc called: 17 |
|||
globalFunc called: 18 |
|||
globalFunc called: 19 |
|||
globalFunc called: 20 |
|||
globalFunc called: 21 |
|||
globalFunc called: 22 |
|||
globalFunc called: 23 |
|||
globalFunc called: 24 |
|||
globalFunc called: 25 |
|||
globalFunc called: 26 |
|||
globalFunc called: 27 |
|||
globalFunc called: 28 |
|||
globalFunc called: 29 |
|||
globalFunc called: 30 |
|||
globalFunc called: 31 |
|||
globalFunc called: 32 |
|||
globalFunc called: 33 |
|||
globalFunc called: 34 |
|||
globalFunc called: 35 |
|||
globalFunc called: 36 |
|||
globalFunc called: 37 |
|||
globalFunc called: 38 |
|||
globalFunc called: 39 |
|||
globalFunc called: 40 |
|||
globalFunc called: 41 |
|||
globalFunc called: 42 |
|||
globalFunc called: 43 |
|||
globalFunc called: 44 |
|||
globalFunc called: 45 |
|||
globalFunc called: 46 |
|||
globalFunc called: 47 |
|||
globalFunc called: 48 |
|||
globalFunc called: 49 |
|||
globalFunc called: 50 |
|||
globalFunc called: 51 |
|||
globalFunc called: 52 |
|||
globalFunc called: 53 |
|||
globalFunc called: 54 |
|||
globalFunc called: 55 |
|||
globalFunc called: 56 |
|||
globalFunc called: 57 |
|||
globalFunc called: 58 |
|||
globalFunc called: 59 |
|||
globalFunc called: 60 |
|||
globalFunc called: 61 |
|||
globalFunc called: 62 |
|||
globalFunc called: 63 |
|||
globalFunc called: 64 |
|||
globalFunc called: 65 |
|||
globalFunc called: 66 |
|||
globalFunc called: 67 |
|||
globalFunc called: 68 |
|||
globalFunc called: 69 |
|||
globalFunc called: 70 |
|||
globalFunc called: 71 |
|||
globalFunc called: 72 |
|||
globalFunc called: 73 |
|||
globalFunc called: 74 |
|||
globalFunc called: 75 |
|||
globalFunc called: 76 |
|||
globalFunc called: 77 |
|||
globalFunc called: 78 |
|||
globalFunc called: 79 |
|||
globalFunc called: 80 |
|||
globalFunc called: 81 |
|||
globalFunc called: 82 |
|||
globalFunc called: 83 |
|||
globalFunc called: 84 |
|||
globalFunc called: 85 |
|||
globalFunc called: 86 |
|||
globalFunc called: 87 |
|||
globalFunc called: 88 |
|||
globalFunc called: 89 |
|||
globalFunc called: 90 |
|||
globalFunc called: 91 |
|||
globalFunc called: 92 |
|||
globalFunc called: 93 |
|||
globalFunc called: 94 |
|||
globalFunc called: 95 |
|||
globalFunc called: 96 |
|||
globalFunc called: 97 |
|||
globalFunc called: 98 |
|||
globalFunc called: 99 |
|||
globalFunc called: 100 |
|||
globalFunc called: 101 |
|||
globalFunc called: 102 |
|||
globalFunc called: 103 |
|||
globalFunc called: 104 |
|||
globalFunc called: 105 |
|||
globalFunc called: 106 |
|||
globalFunc called: 107 |
|||
globalFunc called: 108 |
|||
globalFunc called: 109 |
|||
globalFunc called: 110 |
|||
globalFunc called: 111 |
|||
globalFunc called: 112 |
|||
globalFunc called: 113 |
|||
globalFunc called: 114 |
|||
globalFunc called: 115 |
|||
globalFunc called: 116 |
|||
globalFunc called: 117 |
|||
globalFunc called: 118 |
|||
globalFunc called: 119 |
|||
globalFunc called: 120 |
|||
globalFunc called: 121 |
|||
globalFunc called: 122 |
|||
globalFunc called: 123 |
|||
globalFunc called: 124 |
|||
globalFunc called: 125 |
|||
globalFunc called: 126 |
|||
globalFunc called: 127 |
|||
globalFunc called: 128 |
|||
globalFunc called: 129 |
|||
globalFunc called: 130 |
|||
globalFunc called: 131 |
|||
globalFunc called: 132 |
|||
globalFunc called: 133 |
|||
globalFunc called: 134 |
|||
globalFunc called: 135 |
|||
globalFunc called: 136 |
|||
globalFunc called: 137 |
|||
globalFunc called: 138 |
|||
globalFunc called: 139 |
|||
globalFunc called: 140 |
|||
globalFunc called: 141 |
|||
globalFunc called: 142 |
|||
globalFunc called: 143 |
|||
globalFunc called: 144 |
|||
globalFunc called: 145 |
|||
globalFunc called: 146 |
|||
globalFunc called: 147 |
|||
globalFunc called: 148 |
|||
globalFunc called: 149 |
|||
globalFunc called: 150 |
|||
globalFunc called: 151 |
|||
globalFunc called: 152 |
|||
globalFunc called: 153 |
|||
globalFunc called: 154 |
|||
globalFunc called: 155 |
|||
globalFunc called: 156 |
|||
globalFunc called: 157 |
|||
globalFunc called: 158 |
|||
globalFunc called: 159 |
|||
globalFunc called: 160 |
|||
globalFunc called: 161 |
|||
globalFunc called: 162 |
|||
globalFunc called: 163 |
|||
globalFunc called: 164 |
|||
globalFunc called: 165 |
|||
globalFunc called: 166 |
|||
globalFunc called: 167 |
|||
globalFunc called: 168 |
|||
globalFunc called: 169 |
|||
globalFunc called: 170 |
|||
globalFunc called: 171 |
|||
globalFunc called: 172 |
|||
globalFunc called: 173 |
|||
globalFunc called: 174 |
|||
globalFunc called: 175 |
|||
globalFunc called: 176 |
|||
globalFunc called: 177 |
|||
globalFunc called: 178 |
|||
globalFunc called: 179 |
|||
globalFunc called: 180 |
|||
globalFunc called: 181 |
|||
globalFunc called: 182 |
|||
globalFunc called: 183 |
|||
globalFunc called: 184 |
|||
globalFunc called: 185 |
|||
globalFunc called: 186 |
|||
globalFunc called: 187 |
|||
globalFunc called: 188 |
|||
globalFunc called: 189 |
|||
globalFunc called: 190 |
|||
globalFunc called: 191 |
|||
globalFunc called: 192 |
|||
globalFunc called: 193 |
|||
globalFunc called: 194 |
|||
globalFunc called: 195 |
|||
globalFunc called: 196 |
|||
globalFunc called: 197 |
|||
globalFunc called: 198 |
|||
globalFunc called: 199 |
|||
globalFunc called: 200 |
|||
globalFunc called: 201 |
|||
globalFunc called: 202 |
|||
globalFunc called: 203 |
|||
globalFunc called: 204 |
|||
globalFunc called: 205 |
|||
globalFunc called: 206 |
|||
globalFunc called: 207 |
|||
globalFunc called: 208 |
|||
globalFunc called: 209 |
|||
globalFunc called: 210 |
|||
globalFunc called: 211 |
|||
globalFunc called: 212 |
|||
globalFunc called: 213 |
|||
globalFunc called: 214 |
|||
globalFunc called: 215 |
|||
globalFunc called: 216 |
|||
globalFunc called: 217 |
|||
globalFunc called: 218 |
|||
globalFunc called: 219 |
|||
globalFunc called: 220 |
|||
globalFunc called: 221 |
|||
globalFunc called: 222 |
|||
globalFunc called: 223 |
|||
globalFunc called: 224 |
|||
globalFunc called: 225 |
|||
globalFunc called: 226 |
|||
globalFunc called: 227 |
|||
globalFunc called: 228 |
|||
globalFunc called: 229 |
|||
globalFunc called: 230 |
|||
globalFunc called: 231 |
|||
globalFunc called: 232 |
|||
globalFunc called: 233 |
|||
globalFunc called: 234 |
|||
globalFunc called: 235 |
|||
globalFunc called: 236 |
|||
globalFunc called: 237 |
|||
globalFunc called: 238 |
|||
globalFunc called: 239 |
|||
globalFunc called: 240 |
|||
globalFunc called: 241 |
|||
globalFunc called: 242 |
|||
globalFunc called: 243 |
|||
globalFunc called: 244 |
|||
globalFunc called: 245 |
|||
globalFunc called: 246 |
|||
globalFunc called: 247 |
|||
globalFunc called: 248 |
|||
globalFunc called: 249 |
|||
globalFunc called: 250 |
|||
globalFunc called: 251 |
|||
globalFunc called: 252 |
|||
globalFunc called: 253 |
|||
globalFunc called: 254 |
|||
globalFunc called: 255 |
|||
262130 RangeError |
|||
262131 RangeError |
|||
262132 RangeError |
|||
262133 RangeError |
|||
262134 RangeError |
|||
262135 RangeError |
|||
262136 RangeError |
|||
262137 RangeError |
|||
262138 RangeError |
|||
262139 RangeError |
|||
262140 RangeError |
|||
262141 RangeError |
|||
262142 RangeError |
|||
262143 RangeError |
|||
262144 RangeError |
|||
262145 RangeError |
|||
262146 RangeError |
|||
262147 RangeError |
|||
262148 RangeError |
|||
262149 RangeError |
|||
===*/ |
|||
|
|||
function createFunc(count) { |
|||
var res = []; |
|||
var i; |
|||
|
|||
res.push('(function test' + count + '() {'); |
|||
for (i = 0; i < count; i++) { |
|||
// Use dummy variables to control where the call setup target
|
|||
// (CSVAR 'a' field) goes. We must cross the shuffle boundary
|
|||
// exactly, and also exercise the BC limit for shuffling which
|
|||
// has special handling in the compiler.
|
|||
res.push('var unused' + i + ' = 123;'); |
|||
} |
|||
res.push('globalFunc(' + i + ');'); |
|||
res.push('})'); |
|||
return eval(res.join('\n')); |
|||
} |
|||
|
|||
function test() { |
|||
var i; |
|||
|
|||
globalFunc = function globalFunc(arg) { |
|||
print('globalFunc called:', arg); |
|||
}; |
|||
|
|||
function test(count) { |
|||
try { |
|||
createFunc(count)(); |
|||
} catch (e) { |
|||
print(count, e.name); |
|||
} |
|||
} |
|||
|
|||
for (i = 0; i < 256; i++) { |
|||
test(i); |
|||
} |
|||
for (i = 262130; i < 262150; i++) { |
|||
test(i); |
|||
} |
|||
} |
|||
|
|||
try { |
|||
test(); |
|||
} catch (e) { |
|||
print(e.stack || e); |
|||
} |
Loading…
Reference in new issue