Skip to content

Commit 0e29b86

Browse files
committed
[1.7>master] [1.6>1.7] [MERGE #3267 @Cellule] Asm.js check return type from last stmt
Merge pull request #3267 from Cellule:asmjs/last_return Fix how we check if the last asm.js stmt is a return and throw if the type doesn't match Fixes [OS#9592312](https://microsoft.visualstudio.com/os/_workitems?id=9592312)
2 parents 4f40834 + 120aa6f commit 0e29b86

File tree

18 files changed

+292
-253
lines changed

18 files changed

+292
-253
lines changed

lib/Runtime/Language/AsmJsByteCodeGenerator.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -426,18 +426,22 @@ namespace Js
426426
// Emit a function body. Only explicit returns and the implicit "undef" at the bottom
427427
// get copied to the return register.
428428

429+
ParseNode *stmt = nullptr;
429430
while (varStmts->nop == knopList)
430431
{
431-
ParseNode *stmt = ParserWrapper::GetBinaryLeft(varStmts);
432+
stmt = ParserWrapper::GetBinaryLeft(varStmts);
432433
EmitTopLevelStatement( stmt );
433434
varStmts = ParserWrapper::GetBinaryRight(varStmts);
434435
}
435436
Assert(!varStmts->CapturesSyms());
436437

437438
// if last statement isn't return, type must be void
438-
if (varStmts->nop != knopReturn)
439+
if (!stmt || stmt->nop != knopReturn)
439440
{
440-
mFunction->CheckAndSetReturnType(AsmJsRetType::Void);
441+
if (!mFunction->CheckAndSetReturnType(AsmJsRetType::Void))
442+
{
443+
throw AsmJsCompilationException(_u("Expected function return type to be void got %s instead"), mFunction->GetReturnType().toType().toChars());
444+
}
441445
}
442446
EmitTopLevelStatement(varStmts);
443447
}

test/AsmJs/JitToLoopBody.js

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
44
//-------------------------------------------------------------------------------------------------------
55

6-
// return double
6+
// return double
77
// do while and while loops
88
function AsmModule() {
9-
"use asm";
9+
"use asm";
1010
var x1 = 10;
1111
function f3(x,y){
1212
x = x|0;
@@ -25,28 +25,27 @@
2525
if((n|0) > 50)
2626
return +y;
2727
x = (x+1)|0;
28-
y = +(y * z)
28+
y = +(y * z)
2929
n = (n + 1)|0;
3030
}while((n|0) < 100)
31-
}
31+
}
3232
}
3333
return +y;
3434
}
35-
35+
3636
function bar(k)
3737
{
3838
k = k|0;
39-
if( (k|0) > 5)
40-
return +f3(1,1.5);
41-
else
42-
return 1.5;
39+
if( (k|0) > 5)
40+
return +f3(1,1.5);
41+
return 1.5;
4342
}
44-
43+
4544
return bar
4645
}
4746

4847
var bar = AsmModule();
49-
print(bar(1))
50-
print(bar(1))
51-
print(bar(10))
52-
print(bar(10))
48+
print(bar(1))
49+
print(bar(1))
50+
print(bar(10))
51+
print(bar(10))

test/AsmJs/constbrbug.baseline

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
Successfully compiled asm.js code
2-
0
1+
Successfully compiled asm.js code
2+
0

test/AsmJs/exports.baseline

Lines changed: 137 additions & 137 deletions
Original file line numberDiff line numberDiff line change
@@ -1,137 +1,137 @@
1-
Warning: redefining export
2-
Warning: redefining export
3-
Warning: redefining export
4-
Warning: redefining export
5-
Warning: redefining export
6-
Warning: redefining export
7-
Warning: redefining export
8-
Warning: redefining export
9-
Warning: redefining export
10-
Warning: redefining export
11-
Warning: redefining export
12-
Warning: redefining export
13-
Warning: redefining export
14-
Warning: redefining export
15-
Warning: redefining export
16-
Warning: redefining export
17-
Warning: redefining export
18-
Warning: redefining export
19-
Warning: redefining export
20-
Warning: redefining export
21-
Warning: redefining export
22-
Warning: redefining export
23-
Warning: redefining export
24-
Warning: redefining export
25-
Warning: redefining export
26-
Warning: redefining export
27-
Warning: redefining export
28-
Warning: redefining export
29-
Warning: redefining export
30-
Warning: redefining export
31-
Warning: redefining export
32-
Warning: redefining export
33-
Warning: redefining export
34-
Warning: redefining export
35-
Warning: redefining export
36-
Warning: redefining export
37-
Warning: redefining export
38-
Warning: redefining export
39-
Warning: redefining export
40-
Warning: redefining export
41-
Warning: redefining export
42-
Warning: redefining export
43-
Warning: redefining export
44-
Warning: redefining export
45-
Warning: redefining export
46-
Warning: redefining export
47-
Warning: redefining export
48-
Warning: redefining export
49-
Warning: redefining export
50-
Warning: redefining export
51-
Warning: redefining export
52-
Warning: redefining export
53-
Warning: redefining export
54-
Warning: redefining export
55-
Warning: redefining export
56-
Warning: redefining export
57-
Warning: redefining export
58-
Warning: redefining export
59-
Warning: redefining export
60-
Warning: redefining export
61-
Warning: redefining export
62-
Warning: redefining export
63-
Warning: redefining export
64-
Warning: redefining export
65-
Warning: redefining export
66-
Warning: redefining export
67-
Warning: redefining export
68-
Warning: redefining export
69-
Warning: redefining export
70-
Warning: redefining export
71-
Warning: redefining export
72-
Warning: redefining export
73-
Warning: redefining export
74-
Warning: redefining export
75-
Warning: redefining export
76-
Warning: redefining export
77-
Warning: redefining export
78-
Warning: redefining export
79-
Warning: redefining export
80-
Warning: redefining export
81-
Warning: redefining export
82-
Warning: redefining export
83-
Warning: redefining export
84-
Warning: redefining export
85-
Warning: redefining export
86-
Warning: redefining export
87-
Warning: redefining export
88-
Warning: redefining export
89-
Warning: redefining export
90-
Warning: redefining export
91-
Warning: redefining export
92-
Warning: redefining export
93-
Warning: redefining export
94-
Warning: redefining export
95-
Warning: redefining export
96-
Warning: redefining export
97-
Warning: redefining export
98-
Warning: redefining export
99-
Warning: redefining export
100-
Warning: redefining export
101-
Warning: redefining export
102-
Warning: redefining export
103-
Warning: redefining export
104-
Warning: redefining export
105-
Warning: redefining export
106-
Warning: redefining export
107-
Warning: redefining export
108-
Warning: redefining export
109-
Warning: redefining export
110-
Warning: redefining export
111-
Warning: redefining export
112-
Warning: redefining export
113-
Warning: redefining export
114-
Warning: redefining export
115-
Warning: redefining export
116-
Warning: redefining export
117-
Warning: redefining export
118-
Warning: redefining export
119-
Warning: redefining export
120-
Warning: redefining export
121-
Warning: redefining export
122-
Warning: redefining export
123-
Warning: redefining export
124-
Warning: redefining export
125-
Warning: redefining export
126-
Warning: redefining export
127-
Warning: redefining export
128-
Warning: redefining export
129-
Warning: redefining export
130-
Warning: redefining export
131-
Warning: redefining export
132-
Warning: redefining export
133-
Warning: redefining export
134-
Warning: redefining export
135-
Warning: redefining export
136-
Successfully compiled asm.js code
137-
10
1+
Warning: redefining export
2+
Warning: redefining export
3+
Warning: redefining export
4+
Warning: redefining export
5+
Warning: redefining export
6+
Warning: redefining export
7+
Warning: redefining export
8+
Warning: redefining export
9+
Warning: redefining export
10+
Warning: redefining export
11+
Warning: redefining export
12+
Warning: redefining export
13+
Warning: redefining export
14+
Warning: redefining export
15+
Warning: redefining export
16+
Warning: redefining export
17+
Warning: redefining export
18+
Warning: redefining export
19+
Warning: redefining export
20+
Warning: redefining export
21+
Warning: redefining export
22+
Warning: redefining export
23+
Warning: redefining export
24+
Warning: redefining export
25+
Warning: redefining export
26+
Warning: redefining export
27+
Warning: redefining export
28+
Warning: redefining export
29+
Warning: redefining export
30+
Warning: redefining export
31+
Warning: redefining export
32+
Warning: redefining export
33+
Warning: redefining export
34+
Warning: redefining export
35+
Warning: redefining export
36+
Warning: redefining export
37+
Warning: redefining export
38+
Warning: redefining export
39+
Warning: redefining export
40+
Warning: redefining export
41+
Warning: redefining export
42+
Warning: redefining export
43+
Warning: redefining export
44+
Warning: redefining export
45+
Warning: redefining export
46+
Warning: redefining export
47+
Warning: redefining export
48+
Warning: redefining export
49+
Warning: redefining export
50+
Warning: redefining export
51+
Warning: redefining export
52+
Warning: redefining export
53+
Warning: redefining export
54+
Warning: redefining export
55+
Warning: redefining export
56+
Warning: redefining export
57+
Warning: redefining export
58+
Warning: redefining export
59+
Warning: redefining export
60+
Warning: redefining export
61+
Warning: redefining export
62+
Warning: redefining export
63+
Warning: redefining export
64+
Warning: redefining export
65+
Warning: redefining export
66+
Warning: redefining export
67+
Warning: redefining export
68+
Warning: redefining export
69+
Warning: redefining export
70+
Warning: redefining export
71+
Warning: redefining export
72+
Warning: redefining export
73+
Warning: redefining export
74+
Warning: redefining export
75+
Warning: redefining export
76+
Warning: redefining export
77+
Warning: redefining export
78+
Warning: redefining export
79+
Warning: redefining export
80+
Warning: redefining export
81+
Warning: redefining export
82+
Warning: redefining export
83+
Warning: redefining export
84+
Warning: redefining export
85+
Warning: redefining export
86+
Warning: redefining export
87+
Warning: redefining export
88+
Warning: redefining export
89+
Warning: redefining export
90+
Warning: redefining export
91+
Warning: redefining export
92+
Warning: redefining export
93+
Warning: redefining export
94+
Warning: redefining export
95+
Warning: redefining export
96+
Warning: redefining export
97+
Warning: redefining export
98+
Warning: redefining export
99+
Warning: redefining export
100+
Warning: redefining export
101+
Warning: redefining export
102+
Warning: redefining export
103+
Warning: redefining export
104+
Warning: redefining export
105+
Warning: redefining export
106+
Warning: redefining export
107+
Warning: redefining export
108+
Warning: redefining export
109+
Warning: redefining export
110+
Warning: redefining export
111+
Warning: redefining export
112+
Warning: redefining export
113+
Warning: redefining export
114+
Warning: redefining export
115+
Warning: redefining export
116+
Warning: redefining export
117+
Warning: redefining export
118+
Warning: redefining export
119+
Warning: redefining export
120+
Warning: redefining export
121+
Warning: redefining export
122+
Warning: redefining export
123+
Warning: redefining export
124+
Warning: redefining export
125+
Warning: redefining export
126+
Warning: redefining export
127+
Warning: redefining export
128+
Warning: redefining export
129+
Warning: redefining export
130+
Warning: redefining export
131+
Warning: redefining export
132+
Warning: redefining export
133+
Warning: redefining export
134+
Warning: redefining export
135+
Warning: redefining export
136+
Successfully compiled asm.js code
137+
10

test/AsmJs/lambda.baseline

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
Lambda functions are not supported.
2-
Asm.js compilation failed.
1+
Lambda functions are not supported.
2+
Asm.js compilation failed.

test/AsmJs/return3.baseline

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
2+
return3.js(10, 7)
3+
Asm.js Compilation Error function : AsmModule::conditionnalReturn
4+
Expected function return type to be void got signed instead
5+
6+
Asm.js compilation failed.
7+
undefined

test/AsmJs/return3.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
//-------------------------------------------------------------------------------------------------------
2+
// Copyright (C) Microsoft. All rights reserved.
3+
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
4+
//-------------------------------------------------------------------------------------------------------
5+
6+
let asmModule = (function AsmModule() {
7+
'use asm';
8+
function conditionnalReturn() {
9+
if (0) {
10+
return 0;
11+
}
12+
}
13+
return conditionnalReturn;
14+
})();
15+
print(asmModule());

0 commit comments

Comments
 (0)