| Index: src/asmjs/asm-parser.cc
|
| diff --git a/src/asmjs/asm-parser.cc b/src/asmjs/asm-parser.cc
|
| index d2ab53eb43192b4067ad35d55bf5b12fbe2afeb2..59745c191de58d175f74820421d266403568142e 100644
|
| --- a/src/asmjs/asm-parser.cc
|
| +++ b/src/asmjs/asm-parser.cc
|
| @@ -238,25 +238,21 @@
|
| void AsmJsParser::AddGlobalImport(std::string name, AsmType* type,
|
| ValueType vtype, bool mutable_variable,
|
| VarInfo* info) {
|
| - // TODO(bradnelson): Refactor memory management here.
|
| - // AsmModuleBuilder should really own import names.
|
| - char* name_data = zone()->NewArray<char>(name.size());
|
| - memcpy(name_data, name.data(), name.size());
|
| if (mutable_variable) {
|
| // Allocate a separate variable for the import.
|
| DeclareGlobal(info, true, type, vtype);
|
| // Record the need to initialize the global from the import.
|
| - global_imports_.push_back({name_data, name.size(), 0, info->index, true});
|
| + global_imports_.push_back({name, 0, info->index, true});
|
| } else {
|
| // Just use the import directly.
|
| - global_imports_.push_back({name_data, name.size(), 0, info->index, false});
|
| + global_imports_.push_back({name, 0, info->index, false});
|
| }
|
| GlobalImport& gi = global_imports_.back();
|
| // TODO(bradnelson): Reuse parse buffer memory / make wasm-module-builder
|
| // managed the memory for the import name (currently have to keep our
|
| // own memory for it).
|
| gi.import_index = module_builder_->AddGlobalImport(
|
| - name_data, static_cast<int>(name.size()), vtype);
|
| + name.data(), static_cast<int>(name.size()), vtype);
|
| if (!mutable_variable) {
|
| info->DeclareGlobalImport(type, gi.import_index);
|
| }
|
| @@ -366,16 +362,6 @@
|
| }
|
| RECURSE(ValidateExport());
|
|
|
| - // Check that all functions were eventually defined.
|
| - for (auto info : global_var_info_) {
|
| - if (info.kind != VarKind::kFunction) {
|
| - continue;
|
| - }
|
| - if (!info.function_defined) {
|
| - FAIL("Undefined function");
|
| - }
|
| - }
|
| -
|
| // Add start function to init things.
|
| WasmFunctionBuilder* start = module_builder_->AddFunction();
|
| module_builder_->MarkStartFunction(start);
|
| @@ -461,9 +447,8 @@
|
| if (uvalue > 0x7fffffff) {
|
| FAIL("Numeric literal out of range");
|
| }
|
| - DeclareGlobal(info, mutable_variable,
|
| - mutable_variable ? AsmType::Int() : AsmType::Signed(),
|
| - kWasmI32, WasmInitExpr(static_cast<int32_t>(uvalue)));
|
| + DeclareGlobal(info, mutable_variable, AsmType::Int(), kWasmI32,
|
| + WasmInitExpr(static_cast<int32_t>(uvalue)));
|
| } else if (Check('-')) {
|
| if (CheckForDouble(&dvalue)) {
|
| DeclareGlobal(info, mutable_variable, AsmType::Double(), kWasmF64,
|
| @@ -472,9 +457,8 @@
|
| if (uvalue > 0x7fffffff) {
|
| FAIL("Numeric literal out of range");
|
| }
|
| - DeclareGlobal(info, mutable_variable,
|
| - mutable_variable ? AsmType::Int() : AsmType::Signed(),
|
| - kWasmI32, WasmInitExpr(-static_cast<int32_t>(uvalue)));
|
| + DeclareGlobal(info, mutable_variable, AsmType::Int(), kWasmI32,
|
| + WasmInitExpr(-static_cast<int32_t>(uvalue)));
|
| } else {
|
| FAIL("Expected numeric literal");
|
| }
|
| @@ -486,33 +470,16 @@
|
| } else if (ValidateModuleVarImport(info, mutable_variable)) {
|
| // Handled inside.
|
| } else if (scanner_.IsGlobal()) {
|
| - RECURSE(ValidateModuleVarFromGlobal(info, mutable_variable));
|
| + RECURSE(ValidateModuleVarFloat(info, mutable_variable));
|
| } else {
|
| FAIL("Bad variable declaration");
|
| }
|
| }
|
|
|
| // 6.1 ValidateModule - global float declaration
|
| -void AsmJsParser::ValidateModuleVarFromGlobal(VarInfo* info,
|
| - bool mutable_variable) {
|
| - VarInfo* src_info = GetVarInfo(Consume());
|
| - if (!src_info->type->IsA(stdlib_fround_)) {
|
| - if (src_info->mutable_variable) {
|
| - FAIL("Can only use immutable variables in global definition");
|
| - }
|
| - if (mutable_variable) {
|
| - FAIL("Can only define immutable variables with other immutables");
|
| - }
|
| - if (!src_info->type->IsA(AsmType::Int()) &&
|
| - !src_info->type->IsA(AsmType::Float()) &&
|
| - !src_info->type->IsA(AsmType::Double())) {
|
| - FAIL("Expected int, float, double, or fround for global definition");
|
| - }
|
| - info->kind = VarKind::kGlobal;
|
| - info->type = src_info->type;
|
| - info->index = src_info->index;
|
| - info->mutable_variable = false;
|
| - return;
|
| +void AsmJsParser::ValidateModuleVarFloat(VarInfo* info, bool mutable_variable) {
|
| + if (!GetVarInfo(Consume())->type->IsA(stdlib_fround_)) {
|
| + FAIL("Expected fround");
|
| }
|
| EXPECT_TOKEN('(');
|
| bool negate = false;
|
| @@ -565,11 +532,7 @@
|
| info->kind = VarKind::kImportedFunction;
|
| function_import_info_.resize(function_import_info_.size() + 1);
|
| info->import = &function_import_info_.back();
|
| - // TODO(bradnelson): Refactor memory management here.
|
| - // AsmModuleBuilder should really own import names.
|
| - info->import->function_name = zone()->NewArray<char>(import_name.size());
|
| - memcpy(info->import->function_name, import_name.data(), import_name.size());
|
| - info->import->function_name_size = import_name.size();
|
| + info->import->name = import_name;
|
| return true;
|
| }
|
| return false;
|
| @@ -606,7 +569,6 @@
|
| case TOK(name): \
|
| DeclareGlobal(info, false, AsmType::Double(), kWasmF64, \
|
| WasmInitExpr(M_##name)); \
|
| - stdlib_uses_.insert(AsmTyper::kMath##name); \
|
| break;
|
| STDLIB_MATH_VALUE_LIST(V)
|
| #undef V
|
| @@ -623,11 +585,9 @@
|
| } else if (Check(TOK(Infinity))) {
|
| DeclareGlobal(info, false, AsmType::Double(), kWasmF64,
|
| WasmInitExpr(std::numeric_limits<double>::infinity()));
|
| - stdlib_uses_.insert(AsmTyper::kInfinity);
|
| } else if (Check(TOK(NaN))) {
|
| DeclareGlobal(info, false, AsmType::Double(), kWasmF64,
|
| WasmInitExpr(std::numeric_limits<double>::quiet_NaN()));
|
| - stdlib_uses_.insert(AsmTyper::kNaN);
|
| } else {
|
| FAIL("Invalid member of stdlib");
|
| }
|
| @@ -735,18 +695,13 @@
|
| 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_name_raw.c_str(),
|
| + 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;
|
| }
|
| current_function_builder_ = function_info->function_builder;
|
| return_type_ = nullptr;
|
| @@ -900,7 +855,7 @@
|
| info->type = AsmType::Double();
|
| info->index = static_cast<uint32_t>(param_count + locals->size());
|
| locals->push_back(kWasmF64);
|
| - byte code[] = {WASM_F64(-dvalue)};
|
| + byte code[] = {WASM_F64(dvalue)};
|
| current_function_builder_->EmitCode(code, sizeof(code));
|
| current_function_builder_->EmitSetLocal(info->index);
|
| } else if (CheckForUnsigned(&uvalue)) {
|
| @@ -2108,9 +2063,8 @@
|
| uint32_t index;
|
| if (cache_index >= function_info->import->cache_index.size()) {
|
| index = module_builder_->AddImport(
|
| - function_info->import->function_name,
|
| - static_cast<uint32_t>(function_info->import->function_name_size),
|
| - sig);
|
| + function_info->import->name.data(),
|
| + static_cast<uint32_t>(function_info->import->name.size()), sig);
|
| function_info->import->cache_index.push_back(index);
|
| } else {
|
| index = function_info->import->cache_index[cache_index];
|
|
|