Skip to content

Commit

Permalink
Fix C importer macro.
Browse files Browse the repository at this point in the history
  • Loading branch information
FeepingCreature committed Sep 11, 2021
1 parent 68dd7a7 commit 55d138b
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 29 deletions.
4 changes: 2 additions & 2 deletions demos/glfw.nt
Original file line number Diff line number Diff line change
Expand Up @@ -246,8 +246,8 @@ void main() {
glViewport(0, 0, size.width, size.height);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

auto m = mat4x4_identity.rotateX(1).rotateZ(rotate);
auto p = mat4x4_ortho(-ratio * 5, ratio * 5, -5, 5, 1, -1);
auto m = mat4x4.identity.rotateX(1).rotateZ(rotate);
auto p = mat4x4.ortho(-ratio * 5, ratio * 5, -5, 5, 1, -1);
auto mvp = p.mul(m);

glUseProgram(program.handle);
Expand Down
61 changes: 34 additions & 27 deletions src/neat/macros/cimport.nt
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ class CImportMacro : Macro
}
}

ASTModuleBase parse(Parser parser, LexicalContext lexicalContext) {
nullable ASTModuleBase parse(Parser parser, LexicalContext lexicalContext) {
import std.string : replace;

auto loc = parser.loc;
Expand Down Expand Up @@ -65,7 +65,7 @@ class CImportMacro : Macro
auto cparserHelper = new CParserHelper(cparser);

auto pak = new Package("c_header", "", []);
cparserHelper.mod = new ASTModule(cparser.loc, modName, pak, null, null);
cparserHelper.mod = new ASTModule(cparser.loc, modName, pak, new MacroState, null);

void add(string name, (ASTExtern | ASTSymbol) symbol) {
if (false)
Expand Down Expand Up @@ -111,7 +111,7 @@ class CImportMacro : Macro
|| cparser.accept("# 0 \"<command-line>\""))) {
// start of actual include
cparserHelper.sysmod = cparserHelper.mod;
cparserHelper.mod = new ASTModule(cparser.loc, modName, pak, null, null);
cparserHelper.mod = new ASTModule(cparser.loc, modName, pak, new MacroState, null);
}
if (cparser.accept("#define ")) {
auto identifier = cparser.parseIdentifier;
Expand Down Expand Up @@ -152,10 +152,11 @@ class CImportMacro : Macro
if (cparser.accept("typedef")) {
auto type = cparserHelper.parseType;
if (!type) { cparser.eatline; continue; }
auto type = notNull!ASTSymbol(type);
auto decl = cparserHelper.parseTypedDecl(type);
if (!decl.type) { cparser.eatline; continue; }
if (!cparser.accept(";")) { cparser.eatline; continue; }
add(decl.name, decl.type);
add(decl.name, notNull!ASTSymbol(decl.type));
continue;
}
// match struct foo { }; as "foo"
Expand All @@ -180,8 +181,7 @@ class CImportMacro : Macro
}
auto loc = cparser.loc;
cparser.begin;
auto retBase = cparserHelper.parseType;
if (retBase) {
if (auto retBase = cparserHelper.parseType) {
auto retDecl = cparserHelper.parseTypedDecl(retBase);
if (retDecl.type && retDecl.name.length > 0 && cparser.accept("(")) {
mut ASTParameter[] params;
Expand All @@ -195,17 +195,19 @@ class CImportMacro : Macro
params = [];
}
}
add(retDecl.name, new ASTExtern(retDecl.name, retDecl.type, params, loc));
add(retDecl.name, new ASTExtern(
retDecl.name, notNull!ASTSymbol(retDecl.type), params, loc));
success = true;
break;
}
if (params.length && !cparser.accept(",")) break;
auto argloc = cparser.loc;
auto argBasetype = cparserHelper.parseType;
if (!argBasetype) break;
auto argDecl = cparserHelper.parseTypedDecl(argBasetype);
if (!argDecl.type) break;
params ~= ASTParameter(argDecl.name, false, argDecl.type, argloc);
if (auto argBasetype = cparserHelper.parseType) {
auto argDecl = cparserHelper.parseTypedDecl(argBasetype);
if (!argDecl.type) break;
params ~= ASTParameter(
argDecl.name, false, notNull!ASTSymbol(argDecl.type), argloc);
} else break;
}
if (success) continue;
// print("fail " ~ retDecl.name ~ ": " ~ cparser.text[0 .. 100]);
Expand Down Expand Up @@ -274,7 +276,7 @@ class CParserHelper {

this(this.parser) { }

ASTSymbol parseType() {
nullable ASTSymbol parseType() {
parser.acceptIdentifier("const");
if (auto ret = parseBasicCType) {
return ret;
Expand All @@ -294,11 +296,11 @@ class CParserHelper {
return null;
}

(ASTSymbol type, string name) parseTypedDecl(ASTSymbol baseType) {
(nullable ASTSymbol type, string name) parseTypedDecl(ASTSymbol baseType) {
mut auto current = baseType;
assert(!!current);
// TODO polysemous null type
ASTSymbol nullSymbol;
nullable ASTSymbol nullSymbol;
auto loc = parser.loc;
while (true) {
if (parser.accept("*") || parser.accept("[]")) {
Expand Down Expand Up @@ -327,8 +329,12 @@ class CParserHelper {
parser.revert;
return (nullSymbol, "");
}
auto arg = parseTypedDecl(argtype);
params ~= arg.type;
auto arg = parseTypedDecl(notNull!ASTSymbol(argtype));
if (!arg.type) {
parser.revert;
return (nullSymbol, "");
}
params ~= notNull!ASTSymbol(arg.type);
}
parser.commit;
return (new ASTFunctionPointer(current, params, loc), name);
Expand All @@ -354,10 +360,8 @@ class CParserHelper {
return (current, name);
}

ASTSymbol parseBasicCType() {
// TODO fix refcount again
// with (parser) {
void begin() parser.begin; void revert() parser.revert; void commit() parser.commit;
nullable ASTSymbol parseBasicCType() {
with (parser) {
begin;
auto loc = parser.loc;
if (parser.acceptIdentifier("void")) { commit; return new ASTBasicType("void", loc); }
Expand All @@ -384,14 +388,14 @@ class CParserHelper {
if (signed || unsigned || int_) { commit; return new ASTBasicType("int", loc); }
revert;
return null;
// }
}
}

ASTSymbol parseStructType() {
auto loc = parser.loc;
auto name = parser.parseIdentifier;
mut (string name, Protection prot, ASTSymbol)[] members;
auto emptyStruct = new ASTStructDeclSym(new ASTStructDecl(name, [], [], loc)); // opaque
mut ASTStructEntry[] entries;
auto emptyStruct = new ASTStructDeclSym(new ASTStructDecl(name, [], loc)); // opaque
if (!parser.accept("{")) {
if (auto definedSym = this.mod.getSymbolAlias(name)) return definedSym;
if (auto definedSym = this.sysmod.getSymbolAlias(name)) return definedSym;
Expand All @@ -418,23 +422,26 @@ class CParserHelper {
if (parser.accept("#define ")) { parser.eatline; parser.commit; continue; }
auto baseType = parseType;
if (!baseType) { parser.revert; scanToClosingBracket; return emptyStruct; }
auto baseType = notNull!ASTSymbol(baseType);
mut auto memberDecl = parseTypedDecl(baseType);
void flush() {
members ~= (memberDecl.name, Protection.public_, memberDecl.type);
entries ~= (memberDecl.name, Protection.public_, notNull!ASTSymbol(memberDecl.type));
}
while (parser.accept(",")) {
if (!memberDecl.type) { parser.revert; scanToClosingBracket; return emptyStruct; }
flush;
memberDecl = parseTypedDecl(baseType);
}
if (!memberDecl.type) { parser.revert; scanToClosingBracket; return emptyStruct; }
flush;
// parser.expect(";");
if (!parser.accept(";")) { parser.revert; scanToClosingBracket; return emptyStruct; }
parser.commit;
}
return new ASTStructDeclSym(new ASTStructDecl(name, members, [], loc));
return new ASTStructDeclSym(new ASTStructDecl(name, entries, loc));
}

ASTSymbol parseEnumType() {
nullable ASTSymbol parseEnumType() {
// TODO export enum members as aliases
auto loc = parser.loc;
parser.parseIdentifier;
Expand Down

0 comments on commit 55d138b

Please sign in to comment.