[asm.js] Fix names for forward declared functions.

This fixes the name stored with functions where the declaration was
hoisted above the actual function definition. It also extends test
coverage and emits proper source position mapping for such cases.

R=clemensh@chromium.org
TEST=mjsunit/wasm/asm-wasm-stack
BUG=v8:6127

Change-Id: I675a98b244fe2157925e799b5c46b7f6bd53c9da
Reviewed-on: https://chromium-review.googlesource.com/466247
Reviewed-by: Clemens Hammacher <clemensh@chromium.org>
Commit-Queue: Michael Starzinger <mstarzinger@chromium.org>
Cr-Commit-Position: refs/heads/master@{#44361}
This commit is contained in:
Michael Starzinger 2017-04-03 17:48:03 +02:00 committed by Commit Bot
parent 31700b7fbd
commit 6a3756f9de
2 changed files with 24 additions and 22 deletions

View File

@ -723,19 +723,17 @@ void AsmJsParser::ValidateFunction() {
if (function_info->kind == VarKind::kUnused) {
function_info->kind = VarKind::kFunction;
function_info->function_builder = module_builder_->AddFunction();
// TODO(bradnelson): Cleanup memory management here.
// WasmModuleBuilder should own these.
char* function_name = zone()->NewArray<char>(function_name_raw.size());
memcpy(function_name, function_name_raw.data(), function_name_raw.size());
function_info->function_builder->SetName(
{function_name, static_cast<int>(function_name_raw.size())});
function_info->index = function_info->function_builder->func_index();
function_info->function_defined = true;
} else if (function_info->function_defined) {
FAIL("Function redefined");
} else {
function_info->function_defined = true;
}
function_info->function_defined = true;
// TODO(bradnelson): Cleanup memory management here.
// WasmModuleBuilder should own these.
char* function_name_chr = zone()->NewArray<char>(function_name_raw.size());
memcpy(function_name_chr, function_name_raw.data(), function_name_raw.size());
function_info->function_builder->SetName(
{function_name_chr, static_cast<int>(function_name_raw.size())});
current_function_builder_ = function_info->function_builder;
return_type_ = nullptr;
@ -2088,10 +2086,8 @@ AsmType* AsmJsParser::ValidateCall() {
function_info->function_builder = module_builder_->AddFunction();
function_info->index = function_info->function_builder->func_index();
function_info->type = function_type;
// TODO(bradnelson): Figure out the right debug scanner offset and
// re-enable.
// current_function_builder_->AddAsmWasmOffset(scanner_.GetPosition(),
// scanner_.GetPosition());
// TODO(mstarzinger): Fix the {to_number_position} and test it.
current_function_builder_->AddAsmWasmOffset(pos, pos);
current_function_builder_->Emit(kExprCallFunction);
current_function_builder_->EmitDirectCallIndex(function_info->index);
} else if (function_info->kind == VarKind::kImportedFunction) {

View File

@ -69,8 +69,12 @@ function generateWasmFromAsmJs(stdlib, foreign) {
case 1: redirectFun(0); break;
case 2: redirectFun(1); break;
case 3: funTable[i & 0](2); break;
case 4: forwardFun(); break;
}
}
function forwardFun() {
redirectFun(3);
}
var funTable = [ redirectFun ];
return redirectFun;
}
@ -90,8 +94,8 @@ function generateWasmFromAsmJs(stdlib, foreign) {
'^ *at throwException \\(' + filename + ':56:9\\)$',
'^ *at callThrow \\(' + filename + ':63:5\\)$',
'^ *at redirectFun \\(' + filename + ':68:15\\)$',
'^ *at PreformattedStackTraceFromJS \\(' + filename + ':83:5\\)$',
'^ *at ' + filename + ':96:3$'
'^ *at PreformattedStackTraceFromJS \\(' + filename + ':87:5\\)$',
'^ *at ' + filename + ':100:3$'
]);
})();
@ -105,7 +109,7 @@ Error.prepareStackTrace = function(error, frames) {
assertTrue(%IsWasmCode(fun));
var e = null;
try {
fun(3);
fun(4);
} catch (ex) {
e = ex;
}
@ -117,8 +121,10 @@ Error.prepareStackTrace = function(error, frames) {
['redirectFun', 69, 15], // --
['redirectFun', 70, 15], // --
['redirectFun', 71, 30], // --
['CallsiteObjectsFromJS', 108, 5], // --
[null, 123, 3]
['forwardFun', 76, 5], // --
['redirectFun', 72, 15], // --
['CallsiteObjectsFromJS', 112, 5], // --
[null, 129, 3]
]);
})();
@ -142,9 +148,9 @@ function generateOverflowWasmFromAsmJs() {
}
assertInstanceof(e, RangeError, 'RangeError should have been thrown');
checkTopFunctionsOnCallsites(e, [
['f', 127, 13], // --
['f', 129, 12], // --
['f', 129, 12], // --
['f', 129, 12] // --
['f', 133, 13], // --
['f', 135, 12], // --
['f', 135, 12], // --
['f', 135, 12] // --
]);
})();