Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1548)

Unified Diff: src/wasm/ast-decoder.cc

Issue 1787733002: [wasm] Fix OpcodeLength() calculation. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/wasm/ast-decoder.cc
diff --git a/src/wasm/ast-decoder.cc b/src/wasm/ast-decoder.cc
index b1d29d8654099c5958965094bf70d681eb8ca7a6..923b1018e4702689d97ab529889ab41956b4198b 100644
--- a/src/wasm/ast-decoder.cc
+++ b/src/wasm/ast-decoder.cc
@@ -335,12 +335,18 @@ class WasmDecoder : public Decoder {
BranchTableOperand operand(this, pc);
return 1 + operand.length;
}
+ case kExprI32Const: {
binji 2016/03/11 18:10:03 oops, sorry about this. Didn't notice!
+ ImmI32Operand operand(this, pc);
+ return 1 + operand.length;
+ }
+ case kExprI64Const: {
+ ImmI64Operand operand(this, pc);
+ return 1 + operand.length;
+ }
case kExprI8Const:
return 2;
- case kExprI32Const:
case kExprF32Const:
return 5;
- case kExprI64Const:
case kExprF64Const:
return 9;
@@ -664,7 +670,7 @@ class SR_WasmDecoder : public WasmDecoder {
PushBlock(break_env);
SsaEnv* cont_env = Steal(break_env);
// The continue environment is the inner environment.
- PrepareForLoop(cont_env);
+ PrepareForLoop(pc_, cont_env);
SetEnv("loop:start", Split(cont_env));
if (ssa_env_->go()) ssa_env_->state = SsaEnv::kReached;
PushBlock(cont_env);
@@ -1463,28 +1469,18 @@ class SR_WasmDecoder : public WasmDecoder {
return tnode;
}
- void BuildInfiniteLoop() {
- if (ssa_env_->go()) {
- PrepareForLoop(ssa_env_);
- SsaEnv* cont_env = ssa_env_;
- ssa_env_ = Split(ssa_env_);
- ssa_env_->state = SsaEnv::kReached;
- Goto(ssa_env_, cont_env);
- }
- }
-
- void PrepareForLoop(SsaEnv* env) {
- if (env->go()) {
- env->state = SsaEnv::kMerged;
- if (builder_) {
- env->control = builder_->Loop(env->control);
- env->effect = builder_->EffectPhi(1, &env->effect, env->control);
- builder_->Terminate(env->effect, env->control);
- for (int i = EnvironmentCount() - 1; i >= 0; i--) {
- env->locals[i] = builder_->Phi(local_type_vec_[i], 1, &env->locals[i],
- env->control);
- }
- }
+ void PrepareForLoop(const byte* pc, SsaEnv* env) {
Mircea Trofin 2016/03/11 17:15:41 Looks like the change below is aesthetic only. Wha
titzer 2016/03/11 17:17:35 Ah, an artifact of splitting this CL off. The next
+ if (!env->go()) return;
+ env->state = SsaEnv::kMerged;
+ if (!builder_) return;
+
+ env->control = builder_->Loop(env->control);
+ env->effect = builder_->EffectPhi(1, &env->effect, env->control);
+ builder_->Terminate(env->effect, env->control);
+ // Conservatively introduce phis for all local variables.
+ for (int i = EnvironmentCount() - 1; i >= 0; i--) {
+ env->locals[i] =
+ builder_->Phi(local_type_vec_[i], 1, &env->locals[i], env->control);
}
}
@@ -1603,6 +1599,9 @@ class SR_WasmDecoder : public WasmDecoder {
length = OpcodeLength(pc);
}
+ TRACE("loop-assign module+%-6d %s func+%d: 0x%02x %s (len=%d)\n",
+ baserel(pc), indentation(), startrel(pc), opcode,
+ WasmOpcodes::OpcodeName(opcode), length);
pc += length;
arity_stack.push_back(arity);
while (arity_stack.back() == 0) {
« no previous file with comments | « src/wasm/ast-decoder.h ('k') | src/wasm/wasm-macro-gen.h » ('j') | src/wasm/wasm-macro-gen.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698