static bool DecodeFunctionBodies(JSContext* cx, Decoder& d, ModuleGenerator& mg) { if (!mg.startFuncDefs()) return false; uint32_t sectionStart; if (!d.startSection(FunctionBodiesId, §ionStart)) return Fail(cx, d, "failed to start section"); if (sectionStart == Decoder::NotStarted) { if (mg.numFuncSigs() != 0) return Fail(cx, d, "expected function bodies"); return mg.finishFuncDefs(); } uint32_t numFuncBodies; if (!d.readVarU32(&numFuncBodies)) return Fail(cx, d, "expected function body count"); if (numFuncBodies != mg.numFuncSigs()) return Fail(cx, d, "function body count does not match function signature count"); for (uint32_t funcIndex = 0; funcIndex < numFuncBodies; funcIndex++) { if (!DecodeFunctionBody(cx, d, mg, funcIndex)) return false; } if (!d.finishSection(sectionStart)) return Fail(cx, d, "function section byte size mismatch"); return mg.finishFuncDefs(); }
static bool DecodeCodeSection(const ModuleEnvironment& env, DecoderT& d, ModuleGenerator& mg) { if (!env.codeSection) { if (env.numFuncDefs() != 0) return d.fail("expected code section"); return mg.finishFuncDefs(); } uint32_t numFuncDefs; if (!d.readVarU32(&numFuncDefs)) return d.fail("expected function body count"); if (numFuncDefs != env.numFuncDefs()) return d.fail("function body count does not match function signature count"); for (uint32_t funcDefIndex = 0; funcDefIndex < numFuncDefs; funcDefIndex++) { if (!DecodeFunctionBody(d, mg, env.numFuncImports() + funcDefIndex)) return false; } if (!d.finishSection(*env.codeSection, "code")) return false; return mg.finishFuncDefs(); }
static bool DecodeCodeSection(JSContext* cx, Decoder& d, ModuleGenerator& mg) { if (!mg.startFuncDefs()) return false; uint32_t funcIndex = 0; while (d.readCStringIf(CodeSection)) { uint32_t sectionStart; if (!d.startSection(§ionStart)) return Fail(cx, d, "expected code section byte size"); uint32_t numFuncs; if (!d.readVarU32(&numFuncs)) return Fail(cx, d, "expected number of functions"); if (funcIndex + numFuncs > mg.numFuncSigs()) return Fail(cx, d, "more function definitions than declarations"); for (uint32_t i = 0; i < numFuncs; i++) { if (!DecodeFunc(cx, d, mg, funcIndex++)) return false; } if (!d.finishSection(sectionStart)) return Fail(cx, d, "code section byte size mismatch"); } if (funcIndex != mg.numFuncSigs()) return Fail(cx, d, "fewer function definitions than declarations"); if (!mg.finishFuncDefs()) return false; return true; }
static bool DecodeFunctionSections(JSContext* cx, Decoder& d, ModuleGenerator& mg) { if (!mg.startFuncDefs()) return false; uint32_t funcIndex = 0; for (; d.readCStringIf(FuncLabel); funcIndex++) { if (funcIndex >= mg.numFuncSigs()) return Fail(cx, d, "more function definitions than declarations"); if (!DecodeFunctionSection(cx, d, mg, funcIndex)) return false; } if (funcIndex < mg.numFuncSigs()) return Fail(cx, d, "fewer function definitions than declarations"); if (!mg.finishFuncDefs()) return false; return true; }