summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rw-r--r--tools/gfx-unit-test/gfx-test-util.cpp2
-rw-r--r--tools/slang-fiddle/slang-fiddle-diagnostic-defs.h7
-rw-r--r--tools/slang-fiddle/slang-fiddle-scrape.cpp6
-rw-r--r--tools/slang-fiddle/slang-fiddle-script.cpp71
-rw-r--r--tools/slang-fiddle/slang-fiddle-script.h6
-rw-r--r--tools/slang-fiddle/slang-fiddle-template.cpp36
-rw-r--r--tools/slang-fiddle/slang-fiddle-template.h1
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;
};