diff options
Diffstat (limited to 'tools')
| -rw-r--r-- | tools/gfx-unit-test/gfx-test-util.cpp | 2 | ||||
| -rw-r--r-- | tools/slang-fiddle/slang-fiddle-diagnostic-defs.h | 7 | ||||
| -rw-r--r-- | tools/slang-fiddle/slang-fiddle-scrape.cpp | 6 | ||||
| -rw-r--r-- | tools/slang-fiddle/slang-fiddle-script.cpp | 71 | ||||
| -rw-r--r-- | tools/slang-fiddle/slang-fiddle-script.h | 6 | ||||
| -rw-r--r-- | tools/slang-fiddle/slang-fiddle-template.cpp | 36 | ||||
| -rw-r--r-- | tools/slang-fiddle/slang-fiddle-template.h | 1 |
7 files changed, 99 insertions, 30 deletions
diff --git a/tools/gfx-unit-test/gfx-test-util.cpp b/tools/gfx-unit-test/gfx-test-util.cpp index bd1b2a891..688bf048e 100644 --- a/tools/gfx-unit-test/gfx-test-util.cpp +++ b/tools/gfx-unit-test/gfx-test-util.cpp @@ -69,6 +69,8 @@ Slang::Result loadComputeProgram( programDesc.slangGlobalScope = composedProgram.get(); auto shaderProgram = device->createProgram(programDesc); + if (!shaderProgram) + return SLANG_FAIL; outShaderProgram = shaderProgram; return SLANG_OK; diff --git a/tools/slang-fiddle/slang-fiddle-diagnostic-defs.h b/tools/slang-fiddle/slang-fiddle-diagnostic-defs.h index 204185b1c..df9a8dbe9 100644 --- a/tools/slang-fiddle/slang-fiddle-diagnostic-defs.h +++ b/tools/slang-fiddle/slang-fiddle-diagnostic-defs.h @@ -44,6 +44,13 @@ DIAGNOSTIC( "start line for template not followed by a line marking output with '$0'") DIAGNOSTIC(300002, Error, expectedEndMarker, "expected a template end line ('$0')") +// Template Lua Parsing/Execution + +DIAGNOSTIC(400001, Fatal, scriptLoadError, "failure while loading lua script: $0") + +DIAGNOSTIC(400002, Fatal, scriptExecutionError, "failure while executing lua script: $0") + + // Scraper: Parsing DIAGNOSTIC(500001, Error, unexpected, "unexpected $0, expected $1") diff --git a/tools/slang-fiddle/slang-fiddle-scrape.cpp b/tools/slang-fiddle/slang-fiddle-scrape.cpp index f2b2a39a8..763ef8f48 100644 --- a/tools/slang-fiddle/slang-fiddle-scrape.cpp +++ b/tools/slang-fiddle/slang-fiddle-scrape.cpp @@ -144,6 +144,7 @@ public: break; case TokenType::IntegerLiteral: + case TokenType::StringLiteral: { auto token = read(); return new LiteralExpr(token); @@ -1630,11 +1631,14 @@ int _indexVal(lua_State* L) push(L, classDecl->directBaseType); return 1; } + } + if (auto aggTypeDecl = as<AggTypeDecl>(val)) + { if (strcmp(name, "directFields") == 0) { List<RefPtr<Decl>> fields; - for (auto m : classDecl->members) + for (auto m : aggTypeDecl->members) { if (auto f = as<VarDecl>(m)) fields.add(f); diff --git a/tools/slang-fiddle/slang-fiddle-script.cpp b/tools/slang-fiddle/slang-fiddle-script.cpp index 0bee052d8..246488199 100644 --- a/tools/slang-fiddle/slang-fiddle-script.cpp +++ b/tools/slang-fiddle/slang-fiddle-script.cpp @@ -11,15 +11,11 @@ DiagnosticSink* _sink = nullptr; StringBuilder* _builder = nullptr; Count _templateCounter = 0; -void diagnoseLuaError(lua_State* L) +static void _writeLuaMessage(Severity severity, String const& message) { - size_t size = 0; - char const* buffer = lua_tolstring(L, -1, &size); - String message = UnownedStringSlice(buffer, size); - message = message + "\n"; if (_sink) { - _sink->diagnoseRaw(Severity::Error, message.getBuffer()); + _sink->diagnoseRaw(severity, message.getUnownedSlice()); } else { @@ -27,10 +23,35 @@ void diagnoseLuaError(lua_State* L) } } -int _handleLuaError(lua_State* L) +int _trace(lua_State* L) { - diagnoseLuaError(L); - return lua_error(L); + int argCount = lua_gettop(L); + + for (int i = 0; i < argCount; ++i) + { + lua_pushliteral(L, " "); + luaL_tolstring(L, i + 1, nullptr); + } + lua_concat(L, 2 * argCount); + + size_t size = 0; + char const* buffer = lua_tolstring(L, -1, &size); + + String message; + message.append("fiddle:"); + message.append(UnownedStringSlice(buffer, size)); + message.append("\n"); + + _writeLuaMessage(Severity::Note, message); + return 0; +} + +int _handleLuaErrorRaised(lua_State* L) +{ + lua_pushliteral(L, "\n"); + luaL_traceback(L, L, nullptr, 1); + lua_concat(L, 3); + return 1; } int _original(lua_State* L) @@ -57,15 +78,10 @@ int _splice(lua_State* L) _builder = &spliceBuilder; lua_pushvalue(L, 1); - auto result = lua_pcall(L, 0, 1, 0); + lua_call(L, 0, 1); _builder = savedBuilder; - if (result != LUA_OK) - { - return _handleLuaError(L); - } - // The actual string value follows whatever // got printed to the output (unless it is // nil). @@ -89,11 +105,7 @@ int _template(lua_State* L) _builder->append("\n"); lua_pushvalue(L, 1); - auto result = lua_pcall(L, 0, 0, 0); - if (result != LUA_OK) - { - return _handleLuaError(L); - } + lua_call(L, 0, 0); _builder->append("\n#endif\n"); @@ -110,6 +122,9 @@ void ensureLuaInitialized() L = luaL_newstate(); luaL_openlibs(L); + lua_pushcclosure(L, &_trace, 0); + lua_setglobal(L, "TRACE"); + lua_pushcclosure(L, &_original, 0); lua_setglobal(L, "ORIGINAL"); @@ -132,7 +147,11 @@ lua_State* getLuaState() } -String evaluateScriptCode(String originalFileName, String scriptSource, DiagnosticSink* sink) +String evaluateScriptCode( + SourceLoc loc, + String originalFileName, + String scriptSource, + DiagnosticSink* sink) { StringBuilder builder; _builder = &builder; @@ -142,6 +161,8 @@ String evaluateScriptCode(String originalFileName, String scriptSource, Diagnost String luaChunkName = "@" + originalFileName; + lua_pushcfunction(L, &_handleLuaErrorRaised); + if (LUA_OK != luaL_loadbuffer( L, scriptSource.getBuffer(), @@ -152,17 +173,19 @@ String evaluateScriptCode(String originalFileName, String scriptSource, Diagnost char const* buffer = lua_tolstring(L, -1, &size); String message = UnownedStringSlice(buffer, size); message = message + "\n"; - sink->diagnoseRaw(Severity::Error, message.getBuffer()); + + sink->diagnose(loc, fiddle::Diagnostics::scriptLoadError, message); SLANG_ABORT_COMPILATION("fiddle failed during Lua script loading"); } - if (LUA_OK != lua_pcall(L, 0, 0, 0)) + if (LUA_OK != lua_pcall(L, 0, 0, -2)) { size_t size = 0; char const* buffer = lua_tolstring(L, -1, &size); String message = UnownedStringSlice(buffer, size); message = message + "\n"; - sink->diagnoseRaw(Severity::Error, message.getBuffer()); + + sink->diagnose(loc, fiddle::Diagnostics::scriptExecutionError, message); SLANG_ABORT_COMPILATION("fiddle failed during Lua script execution"); } diff --git a/tools/slang-fiddle/slang-fiddle-script.h b/tools/slang-fiddle/slang-fiddle-script.h index 4b77b32be..98cdfa148 100644 --- a/tools/slang-fiddle/slang-fiddle-script.h +++ b/tools/slang-fiddle/slang-fiddle-script.h @@ -15,5 +15,9 @@ using namespace Slang; lua_State* getLuaState(); -String evaluateScriptCode(String originalFileName, String scriptSource, DiagnosticSink* sink); +String evaluateScriptCode( + SourceLoc loc, + String originalFileName, + String scriptSource, + DiagnosticSink* sink); } // namespace fiddle diff --git a/tools/slang-fiddle/slang-fiddle-template.cpp b/tools/slang-fiddle/slang-fiddle-template.cpp index c70029d6f..b8e07f933 100644 --- a/tools/slang-fiddle/slang-fiddle-template.cpp +++ b/tools/slang-fiddle/slang-fiddle-template.cpp @@ -252,6 +252,7 @@ public: RefPtr<TextTemplateFile> parseTextTemplateFile() { auto textTemplateFile = RefPtr(new TextTemplateFile()); + textTemplateFile->loc = _inputSourceView->getRange().begin; textTemplateFile->originalFileContent = _inputSourceView->getContent(); while (!atEnd()) { @@ -423,6 +424,25 @@ private: _builder.append(" end)"); } + bool isEntirelyWhitespace(UnownedStringSlice const& text) + { + for (auto c : text) + { + switch (c) + { + default: + return false; + + case ' ': + case '\t': + case '\r': + case '\n': + continue; + } + } + return true; + } + void evaluateTextTemplateStmt(TextTemplateStmt* stmt) { if (auto seqStmt = as<TextTemplateSeqStmt>(stmt)) @@ -432,9 +452,17 @@ private: } else if (auto rawStmt = as<TextTemplateRawStmt>(stmt)) { - _builder.append("RAW [==["); - _builder.append(rawStmt->text); - _builder.append("]==]"); + auto rawContent = rawStmt->text; + if (isEntirelyWhitespace(rawContent)) + { + _builder.append(rawContent); + } + else + { + _builder.append("RAW [==["); + _builder.append(rawContent); + _builder.append("]==]"); + } } else if (auto scriptStmt = as<TextTemplateScriptStmt>(stmt)) { @@ -471,7 +499,7 @@ void generateTextTemplateOutputs( TextTemplateScriptCodeEmitter emitter(file); String scriptCode = emitter.emitScriptCodeForTextTemplateFile(); - String output = evaluateScriptCode(originalFileName, scriptCode, sink); + String output = evaluateScriptCode(file->loc, originalFileName, scriptCode, sink); builder.append(output); builder.append("\n"); diff --git a/tools/slang-fiddle/slang-fiddle-template.h b/tools/slang-fiddle/slang-fiddle-template.h index 51798c902..f67166772 100644 --- a/tools/slang-fiddle/slang-fiddle-template.h +++ b/tools/slang-fiddle/slang-fiddle-template.h @@ -62,6 +62,7 @@ public: class TextTemplateFile : public RefObject { public: + SourceLoc loc; UnownedStringSlice originalFileContent; List<RefPtr<TextTemplate>> textTemplates; }; |
