Browse Source

Implemented StringLiteral Value-kind-of instruction with string interning

constants
Tristan B. V. Kildaire 7 months ago
parent
commit
7e9e303a1c
  1. 37
      source/tlang/compiler/codegen/instruction.d

37
source/tlang/compiler/codegen/instruction.d

@ -2,6 +2,7 @@ module compiler.codegen.instruction;
import std.conv : to;
import compiler.typecheck.dependency.core : Context;
import std.string : cmp;
public class Instruction
{
@ -118,9 +119,43 @@ public final class LiteralValue : Value
*/
public final class StringLiteral : Value
{
this()
/* String interning pool */
private static int[string] internmentCamp;
private static int rollCount = 0;
private string stringLiteral;
this(string stringLiteral)
{
this.stringLiteral = stringLiteral;
/* Intern the string */
intern(stringLiteral);
addInfo = "StrLit: `"~stringLiteral~"`, InternID: "~to!(string)(intern(stringLiteral));
}
public static int intern(string strLit)
{
/* Search for the string (if it exists return it's pool ID) */
foreach(string curStrLit; internmentCamp.keys())
{
if(cmp(strLit, curStrLit) == 0)
{
return internmentCamp[strLit];
}
}
/* If not, create a new entry (pool it) and return */
internmentCamp[strLit] = rollCount;
rollCount++; /* TODO: Overflow check */
return rollCount-1;
}
public string getStringLiteral()
{
return stringLiteral;
}
}

Loading…
Cancel
Save