This commit is contained in:
parent
c33c7f45a0
commit
696bfc55f4
@ -205,7 +205,9 @@ class ExprChecker {
|
|||||||
case "IntExpr":
|
case "IntExpr":
|
||||||
return this.checkIntExpr(node.as(tag));
|
return this.checkIntExpr(node.as(tag));
|
||||||
case "StrExpr":
|
case "StrExpr":
|
||||||
return Ty.create("Ptr", { ty: Ty.Str });
|
return Ty.create("Ptr", {
|
||||||
|
ty: Ty.create("Slice", { ty: Ty.U8 }),
|
||||||
|
});
|
||||||
case "ArrayExpr":
|
case "ArrayExpr":
|
||||||
return this.checkArrayExpr(node.as(tag));
|
return this.checkArrayExpr(node.as(tag));
|
||||||
case "IndexExpr":
|
case "IndexExpr":
|
||||||
@ -300,12 +302,6 @@ class ExprChecker {
|
|||||||
) {
|
) {
|
||||||
return Ty.create("Slice", { ty: exprTy.kind.ty });
|
return Ty.create("Slice", { ty: exprTy.kind.ty });
|
||||||
}
|
}
|
||||||
if (
|
|
||||||
exprTy.is("Str") &&
|
|
||||||
argTy.compatibleWith(Ty.I32)
|
|
||||||
) {
|
|
||||||
return Ty.I32;
|
|
||||||
}
|
|
||||||
this.cx.error(
|
this.cx.error(
|
||||||
node.loc,
|
node.loc,
|
||||||
`cannot use index operator on '${exprTy.pretty()}' with '${argTy.pretty()}'`,
|
`cannot use index operator on '${exprTy.pretty()}' with '${argTy.pretty()}'`,
|
||||||
@ -386,8 +382,7 @@ class ExprChecker {
|
|||||||
!(argTy.is("Array") ||
|
!(argTy.is("Array") ||
|
||||||
argTy.is("Ptr") &&
|
argTy.is("Ptr") &&
|
||||||
(argTy.kind.ty.is("Array") ||
|
(argTy.kind.ty.is("Array") ||
|
||||||
argTy.kind.ty.is("Slice") ||
|
argTy.kind.ty.is("Slice")))
|
||||||
argTy.kind.ty.is("Str")))
|
|
||||||
) {
|
) {
|
||||||
this.reportArgTypeNotCompatible(
|
this.reportArgTypeNotCompatible(
|
||||||
node,
|
node,
|
||||||
@ -530,8 +525,6 @@ class TyChecker {
|
|||||||
return Ty.Void;
|
return Ty.Void;
|
||||||
case "bool":
|
case "bool":
|
||||||
return Ty.Bool;
|
return Ty.Bool;
|
||||||
case "str":
|
|
||||||
return Ty.Str;
|
|
||||||
case "i8":
|
case "i8":
|
||||||
return Ty.I8;
|
return Ty.I8;
|
||||||
case "i16":
|
case "i16":
|
||||||
|
|||||||
@ -248,17 +248,6 @@ class FnLowerer {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (valueTy.is("Str")) {
|
|
||||||
const valueInst = this.lowerPlace(place.kind.value);
|
|
||||||
if (argTy.is("Int")) {
|
|
||||||
const argInst = this.lowerExpr(arg);
|
|
||||||
return this.pushInst(
|
|
||||||
Ty.create("Ptr", { ty: Ty.I32 }),
|
|
||||||
"GetElemPtr",
|
|
||||||
{ base: valueInst, offset: argInst },
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
throw new Error(
|
throw new Error(
|
||||||
`${place.kind.tag} with arg ${argTy.pretty()} not handled`,
|
`${place.kind.tag} with arg ${argTy.pretty()} not handled`,
|
||||||
);
|
);
|
||||||
|
|||||||
@ -199,12 +199,13 @@ export type InstKind =
|
|||||||
| { tag: "Jump"; target: BasicBlock }
|
| { tag: "Jump"; target: BasicBlock }
|
||||||
| { tag: "Branch"; cond: Inst; truthy: BasicBlock; falsy: BasicBlock }
|
| { tag: "Branch"; cond: Inst; truthy: BasicBlock; falsy: BasicBlock }
|
||||||
| { tag: "Return"; source: Inst }
|
| { tag: "Return"; source: Inst }
|
||||||
| { tag: "Not"; source: Inst }
|
| { tag: UnaryOp; source: Inst }
|
||||||
| { tag: "Negate"; source: Inst }
|
|
||||||
| { tag: BinaryOp; left: Inst; right: Inst }
|
| { tag: BinaryOp; left: Inst; right: Inst }
|
||||||
| { tag: "Len"; source: Inst }
|
| { tag: "Len"; source: Inst }
|
||||||
| { tag: "DebugPrint"; args: Inst[] };
|
| { tag: "DebugPrint"; args: Inst[] };
|
||||||
|
|
||||||
|
export type UnaryOp = "Not" | "Negate";
|
||||||
|
|
||||||
export type BinaryOp =
|
export type BinaryOp =
|
||||||
| "Eq"
|
| "Eq"
|
||||||
| "Ne"
|
| "Ne"
|
||||||
|
|||||||
@ -35,7 +35,6 @@ export class Ty {
|
|||||||
static U64 = Ty.create("Int", { intTy: "u64" });
|
static U64 = Ty.create("Int", { intTy: "u64" });
|
||||||
static USize = Ty.create("Int", { intTy: "usize" });
|
static USize = Ty.create("Int", { intTy: "usize" });
|
||||||
static Bool = Ty.create("Bool", {});
|
static Bool = Ty.create("Bool", {});
|
||||||
static Str = Ty.create("Str", {});
|
|
||||||
|
|
||||||
private internHash(): string {
|
private internHash(): string {
|
||||||
return JSON.stringify(this.kind);
|
return JSON.stringify(this.kind);
|
||||||
@ -75,9 +74,6 @@ export class Ty {
|
|||||||
if (this.is("Bool")) {
|
if (this.is("Bool")) {
|
||||||
return other.is("Bool");
|
return other.is("Bool");
|
||||||
}
|
}
|
||||||
if (this.is("Str")) {
|
|
||||||
return other.is("Str");
|
|
||||||
}
|
|
||||||
if (this.is("Ptr")) {
|
if (this.is("Ptr")) {
|
||||||
if (!other.is("Ptr")) {
|
if (!other.is("Ptr")) {
|
||||||
return false;
|
return false;
|
||||||
@ -142,7 +138,7 @@ export class Ty {
|
|||||||
}
|
}
|
||||||
|
|
||||||
isSized(): boolean {
|
isSized(): boolean {
|
||||||
if (this.is("Slice") || this.is("Str")) {
|
if (this.is("Slice")) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@ -160,8 +156,6 @@ export class Ty {
|
|||||||
return `${this.kind.intTy}`;
|
return `${this.kind.intTy}`;
|
||||||
case "Bool":
|
case "Bool":
|
||||||
return "bool";
|
return "bool";
|
||||||
case "Str":
|
|
||||||
return "str";
|
|
||||||
case "Ptr":
|
case "Ptr":
|
||||||
return `*${this.kind.ty.pretty()}`;
|
return `*${this.kind.ty.pretty()}`;
|
||||||
case "PtrMut":
|
case "PtrMut":
|
||||||
@ -199,7 +193,6 @@ export type TyKind =
|
|||||||
| { tag: "IntLiteral" }
|
| { tag: "IntLiteral" }
|
||||||
| { tag: "Int"; intTy: ast.IntTy }
|
| { tag: "Int"; intTy: ast.IntTy }
|
||||||
| { tag: "Bool" }
|
| { tag: "Bool" }
|
||||||
| { tag: "Str" }
|
|
||||||
| { tag: "Ptr"; ty: Ty }
|
| { tag: "Ptr"; ty: Ty }
|
||||||
| { tag: "PtrMut"; ty: Ty }
|
| { tag: "PtrMut"; ty: Ty }
|
||||||
| { tag: "Array"; ty: Ty; length: number }
|
| { tag: "Array"; ty: Ty; length: number }
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
fn main()
|
fn main()
|
||||||
{
|
{
|
||||||
let my_string: *str = "hello world";
|
let my_string: *[u8] = "hello world";
|
||||||
// expect: hello world
|
// expect: hello world
|
||||||
print(my_string);
|
print(my_string);
|
||||||
// expect: 104
|
// expect: 104
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user