Use SkSpan for dehydrated module data.

This code was written before we had spans.

Change-Id: Ic4356dbb2c93a27b4f39e6614a7cd9996e6b144b
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/584227
Commit-Queue: Brian Osman <brianosman@google.com>
Auto-Submit: John Stiles <johnstiles@google.com>
Commit-Queue: John Stiles <johnstiles@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
diff --git a/src/sksl/SkSLCompiler.cpp b/src/sksl/SkSLCompiler.cpp
index 3896df9..afa7bb7 100644
--- a/src/sksl/SkSLCompiler.cpp
+++ b/src/sksl/SkSLCompiler.cpp
@@ -185,8 +185,8 @@
     config.fIsBuiltinCode = true;
     config.fKind = kind;
     AutoProgramConfig autoConfig(fContext, &config);
-    SkASSERT(data.fData && (data.fSize != 0));
-    Rehydrator rehydrator(*this, data.fData, data.fSize, std::move(base));
+    SkASSERT(!data.fData.empty());
+    Rehydrator rehydrator(*this, data.fData, std::move(base));
     LoadedModule module = {kind, rehydrator.symbolTable(), rehydrator.elements()};
 #else
     SkASSERT(this->errorCount() == 0);
diff --git a/src/sksl/SkSLCompiler.h b/src/sksl/SkSLCompiler.h
index bbfbfc0..ec8305c 100644
--- a/src/sksl/SkSLCompiler.h
+++ b/src/sksl/SkSLCompiler.h
@@ -9,6 +9,7 @@
 #define SKSL_COMPILER
 
 #include "include/core/SkSize.h"
+#include "include/core/SkSpan.h"
 #include "include/core/SkTypes.h"
 #include "include/private/SkSLDefines.h"
 #include "include/private/SkSLProgramElement.h"
@@ -19,7 +20,6 @@
 #include "src/sksl/SkSLParsedModule.h"
 
 #include <array>
-#include <cstddef>
 #include <cstdint>
 #include <memory>
 #include <string>
@@ -101,7 +101,7 @@
     }
 
     /**
-     * Uniform values  by the compiler to implement origin-neutral dFdy, sk_Clockwise, and
+     * Uniform values used by the compiler to implement origin-neutral dFdy, sk_Clockwise, and
      * sk_FragCoord.
      */
     static std::array<float, 2> GetRTFlipVector(int rtHeight, bool flipY) {
@@ -195,20 +195,18 @@
         return fSymbolTable;
     }
 
-    // When  SKSL_STANDALONE, fPath is used. (fData, fSize) will be (nullptr, 0)
-    // When !SKSL_STANDALONE, fData and fSize are used. fPath will be nullptr.
+    // When  SKSL_STANDALONE, fPath is used. fData will be empty.
+    // When !SKSL_STANDALONE, fData is used. fPath will be nullptr.
     struct ModuleData {
-        const char*    fPath;
-
-        const uint8_t* fData;
-        size_t         fSize;
+        const char*           fPath;
+        SkSpan<const uint8_t> fData;
     };
 
     static ModuleData MakeModulePath(const char* path) {
-        return ModuleData{path, /*fData=*/nullptr, /*fSize=*/0};
+        return ModuleData{path, /*fData=*/{}};
     }
-    static ModuleData MakeModuleData(const uint8_t* data, size_t size) {
-        return ModuleData{/*fPath=*/nullptr, data, size};
+    static ModuleData MakeModuleData(SkSpan<const uint8_t> data) {
+        return ModuleData{/*fPath=*/nullptr, data};
     }
 
     LoadedModule loadModule(ProgramKind kind, ModuleData data, ModifiersPool& modifiersPool,
diff --git a/src/sksl/SkSLModuleLoader.cpp b/src/sksl/SkSLModuleLoader.cpp
index 5ea65f3..6768336 100644
--- a/src/sksl/SkSLModuleLoader.cpp
+++ b/src/sksl/SkSLModuleLoader.cpp
@@ -5,6 +5,7 @@
  * found in the LICENSE file.
  */
 
+#include "include/core/SkSpan.h"
 #include "include/private/SkMutex.h"
 #include "include/private/SkSLModifiers.h"
 #include "include/private/SkSLProgramKind.h"
@@ -41,8 +42,7 @@
     #include "src/sksl/generated/sksl_graphite_vert.dehydrated.sksl"
     #endif
 
-    #define MODULE_DATA(name) Compiler::MakeModuleData(SKSL_INCLUDE_sksl_##name,\
-                                                       SKSL_INCLUDE_sksl_##name##_LENGTH)
+    #define MODULE_DATA(name) Compiler::MakeModuleData(SkSpan(SKSL_INCLUDE_sksl_##name))
 
 #endif
 
diff --git a/src/sksl/SkSLRehydrator.cpp b/src/sksl/SkSLRehydrator.cpp
index 803c3b4..fd95edc 100644
--- a/src/sksl/SkSLRehydrator.cpp
+++ b/src/sksl/SkSLRehydrator.cpp
@@ -100,17 +100,18 @@
     std::shared_ptr<SymbolTable> fOldSymbols;
 };
 
-Rehydrator::Rehydrator(Compiler& compiler, const uint8_t* src, size_t length)
-        : Rehydrator(compiler, src, length, ModuleLoader::Get().rootSymbolTableWithPublicTypes()) {}
+Rehydrator::Rehydrator(Compiler& compiler, SkSpan<const uint8_t> src)
+        : Rehydrator(compiler, src, ModuleLoader::Get().rootSymbolTableWithPublicTypes()) {}
 
-Rehydrator::Rehydrator(Compiler& compiler, const uint8_t* src, size_t length,
+Rehydrator::Rehydrator(Compiler& compiler,
+                       SkSpan<const uint8_t> src,
                        std::shared_ptr<SymbolTable> symbols)
-    : fCompiler(compiler)
-    , fSymbolTable(std::move(symbols))
-    SkDEBUGCODE(, fEnd(src + length)) {
+        : fCompiler(compiler)
+        , fSymbolTable(std::move(symbols))
+        SkDEBUGCODE(, fEnd(src.data() + src.size())) {
     SkASSERT(fSymbolTable);
     SkASSERT(fSymbolTable->isBuiltin());
-    fIP = src;
+    fIP = src.data();
     [[maybe_unused]] uint16_t version = this->readU16();
     SkASSERTF(version == kVersion, "Dehydrated file is an unsupported version (current version is "
             "%d, found version %d)", kVersion, version);
diff --git a/src/sksl/SkSLRehydrator.h b/src/sksl/SkSLRehydrator.h
index a279fc6..af4f0a2 100644
--- a/src/sksl/SkSLRehydrator.h
+++ b/src/sksl/SkSLRehydrator.h
@@ -8,6 +8,7 @@
 #ifndef SKSL_REHYDRATOR
 #define SKSL_REHYDRATOR
 
+#include "include/core/SkSpan.h"
 #include "include/core/SkTypes.h"
 #include "include/private/SkSLDefines.h"
 #include "include/private/SkSLLayout.h"
@@ -105,11 +106,13 @@
         kVoid_Command,
     };
 
-    // src must remain in memory as long as the objects created from it do
-    Rehydrator(Compiler& compiler, const uint8_t* src, size_t length);
+    // The source data (`src`) must remain in memory as long as any rehydrated objects exist.
+    Rehydrator(Compiler& compiler, SkSpan<const uint8_t> src, std::shared_ptr<SymbolTable> base);
 
-    Rehydrator(Compiler& compiler, const uint8_t* src, size_t length,
-               std::shared_ptr<SymbolTable> base);
+    // FOR TESTING ONLY: the base symbol table is assumed to be the root table with public types.
+    // As above, `src` must remain alive for the lifetime of the rehydrated objects.
+    Rehydrator(Compiler& compiler, SkSpan<const uint8_t> src);
+
 
 #ifdef SK_DEBUG
     ~Rehydrator();
diff --git a/src/sksl/generated/sksl_compute.dehydrated.sksl b/src/sksl/generated/sksl_compute.dehydrated.sksl
index eaa04bb..c22197a 100644
--- a/src/sksl/generated/sksl_compute.dehydrated.sksl
+++ b/src/sksl/generated/sksl_compute.dehydrated.sksl
@@ -79,4 +79,3 @@
 51,255,255,20,0,0,
 57,
 21,};
-static constexpr size_t SKSL_INCLUDE_sksl_compute_LENGTH = sizeof(SKSL_INCLUDE_sksl_compute);
diff --git a/src/sksl/generated/sksl_frag.dehydrated.sksl b/src/sksl/generated/sksl_frag.dehydrated.sksl
index fc3a7d5..47be0b3 100644
--- a/src/sksl/generated/sksl_frag.dehydrated.sksl
+++ b/src/sksl/generated/sksl_frag.dehydrated.sksl
@@ -55,4 +55,3 @@
 51,255,255,53,0,0,
 57,
 21,};
-static constexpr size_t SKSL_INCLUDE_sksl_frag_LENGTH = sizeof(SKSL_INCLUDE_sksl_frag);
diff --git a/src/sksl/generated/sksl_gpu.dehydrated.sksl b/src/sksl/generated/sksl_gpu.dehydrated.sksl
index 0a61ead..c67543d 100644
--- a/src/sksl/generated/sksl_gpu.dehydrated.sksl
+++ b/src/sksl/generated/sksl_gpu.dehydrated.sksl
@@ -2869,4 +2869,3 @@
 56,24,1,0,
 56,25,1,0,1,
 21,};
-static constexpr size_t SKSL_INCLUDE_sksl_gpu_LENGTH = sizeof(SKSL_INCLUDE_sksl_gpu);
diff --git a/src/sksl/generated/sksl_graphite_frag.dehydrated.sksl b/src/sksl/generated/sksl_graphite_frag.dehydrated.sksl
index 398c341..39763f8 100644
--- a/src/sksl/generated/sksl_graphite_frag.dehydrated.sksl
+++ b/src/sksl/generated/sksl_graphite_frag.dehydrated.sksl
@@ -3475,4 +3475,3 @@
 51,255,255,120,0,1,
 56,227,0,0,1,
 21,};
-static constexpr size_t SKSL_INCLUDE_sksl_graphite_frag_LENGTH = sizeof(SKSL_INCLUDE_sksl_graphite_frag);
diff --git a/src/sksl/generated/sksl_graphite_vert.dehydrated.sksl b/src/sksl/generated/sksl_graphite_vert.dehydrated.sksl
index 326e86a..dd207f0 100644
--- a/src/sksl/generated/sksl_graphite_vert.dehydrated.sksl
+++ b/src/sksl/generated/sksl_graphite_vert.dehydrated.sksl
@@ -2741,4 +2741,3 @@
 56,71,0,0,
 56,135,0,0,1,1,
 21,};
-static constexpr size_t SKSL_INCLUDE_sksl_graphite_vert_LENGTH = sizeof(SKSL_INCLUDE_sksl_graphite_vert);
diff --git a/src/sksl/generated/sksl_public.dehydrated.sksl b/src/sksl/generated/sksl_public.dehydrated.sksl
index 4217ec1..135f925 100644
--- a/src/sksl/generated/sksl_public.dehydrated.sksl
+++ b/src/sksl/generated/sksl_public.dehydrated.sksl
@@ -76,4 +76,3 @@
 1,0,
 20,
 21,};
-static constexpr size_t SKSL_INCLUDE_sksl_public_LENGTH = sizeof(SKSL_INCLUDE_sksl_public);
diff --git a/src/sksl/generated/sksl_rt_shader.dehydrated.sksl b/src/sksl/generated/sksl_rt_shader.dehydrated.sksl
index 7c73a67..fbc86d0 100644
--- a/src/sksl/generated/sksl_rt_shader.dehydrated.sksl
+++ b/src/sksl/generated/sksl_rt_shader.dehydrated.sksl
@@ -13,4 +13,3 @@
 51,255,255,15,0,0,
 57,
 21,};
-static constexpr size_t SKSL_INCLUDE_sksl_rt_shader_LENGTH = sizeof(SKSL_INCLUDE_sksl_rt_shader);
diff --git a/src/sksl/generated/sksl_shared.dehydrated.sksl b/src/sksl/generated/sksl_shared.dehydrated.sksl
index 2c3b6df..692195b 100644
--- a/src/sksl/generated/sksl_shared.dehydrated.sksl
+++ b/src/sksl/generated/sksl_shared.dehydrated.sksl
@@ -2705,4 +2705,3 @@
 56,5,2,0,
 56,5,2,0,1,
 21,};
-static constexpr size_t SKSL_INCLUDE_sksl_shared_LENGTH = sizeof(SKSL_INCLUDE_sksl_shared);
diff --git a/src/sksl/generated/sksl_vert.dehydrated.sksl b/src/sksl/generated/sksl_vert.dehydrated.sksl
index 8ccf3ee..231e8f9 100644
--- a/src/sksl/generated/sksl_vert.dehydrated.sksl
+++ b/src/sksl/generated/sksl_vert.dehydrated.sksl
@@ -46,4 +46,3 @@
 51,255,255,65,0,0,
 57,
 21,};
-static constexpr size_t SKSL_INCLUDE_sksl_vert_LENGTH = sizeof(SKSL_INCLUDE_sksl_vert);
diff --git a/tests/SkSLTest.cpp b/tests/SkSLTest.cpp
index 2f4b65e..9f109fa 100644
--- a/tests/SkSLTest.cpp
+++ b/tests/SkSLTest.cpp
@@ -338,9 +338,9 @@
     SkSL::StringStream stream;
     dehydrator.finish(stream);
 
-    SkSL::Rehydrator rehydrator(compiler,
-                                reinterpret_cast<const uint8_t*>(stream.str().data()),
-                                stream.str().length());
+    SkSpan<const uint8_t> dehydratedData(reinterpret_cast<const uint8_t*>(stream.str().data()),
+                                         stream.str().size());
+    SkSL::Rehydrator rehydrator(compiler, dehydratedData);
     std::unique_ptr<SkSL::Program> rehydrated = rehydrator.program();
     REPORTER_ASSERT(r, rehydrated->description() == program->description(),
                     "%s: Mismatch between original and dehydrated/rehydrated:\n"
diff --git a/tools/sksl-precompile/SkSLPrecompile.cpp b/tools/sksl-precompile/SkSLPrecompile.cpp
index 657782e..c891817 100644
--- a/tools/sksl-precompile/SkSLPrecompile.cpp
+++ b/tools/sksl-precompile/SkSLPrecompile.cpp
@@ -130,8 +130,6 @@
         out.printf("%s%d,", dehydrator.prefixAtOffset(i), uint8_t(data[i]));
     }
     out.printf("};\n");
-    out.printf("static constexpr size_t SKSL_INCLUDE_%s_LENGTH = sizeof(SKSL_INCLUDE_%s);\n",
-               baseName.c_str(), baseName.c_str());
     if (!out.close()) {
         printf("error writing '%s'\n", outputPath.c_str());
         return ResultCode::kOutputError;