1
0

RESTORE (式)に対応

This commit is contained in:
otya128
2015-08-25 19:52:40 +09:00
parent 40b06463de
commit 750fedcbfc
4 changed files with 51 additions and 3 deletions

View File

@@ -1332,6 +1332,26 @@ class RestoreCode : Code
return "restore " ~ label.to!string;
}
}
class RestoreExprCode : Code
{
DataTable datatable;
this(DataTable datatable)
{
this.datatable = datatable;
}
override void execute(VM vm)
{
Value label;
vm.pop(label);
if(!label.isString)
throw new TypeMismatch();
datatable.dataIndex = datatable.label[label.stringValue];
}
override string toString(VM vm)
{
return "restore expr";
}
}
class PushSystemVariable : Code
{
SystemVariable var;

View File

@@ -699,6 +699,18 @@ class BuiltinFunction
{
p.getBG(layer).rot(rot);
}
static void EFCON()
{
}
static void EFCOFF()
{
}
static void EFCSET(Value[])
{
}
static void EFCWET(Value[])
{
}
//alias void function(PetitComputer, Value[], Value[]) BuiltinFunc;
static BuiltinFunction[wstring] builtinFunctions;
static this()
@@ -1066,7 +1078,6 @@ template AddFuncArg(int L, int N, int M, int O, T, string NAME, P...)
}
template OutArgsInit(T, string N, int I = 0, int J = 0)
{
enum tuple = ParameterStorageClassTuple!(__traits(getMember, T, N))[I];
alias param = ParameterTypeTuple!(__traits(getMember, T, N));
static if(!param.length)
{
@@ -1074,6 +1085,7 @@ template OutArgsInit(T, string N, int I = 0, int J = 0)
}
else
{
enum tuple = ParameterStorageClassTuple!(__traits(getMember, T, N))[I];
static if(tuple & ParameterStorageClass.out_)
{
enum add = 1;

View File

@@ -847,7 +847,22 @@ class Compiler
compileRead(cast(Read)i, s);
break;
case NodeType.Restore:
genCode(new RestoreCodeS((cast(Constant)(cast(Restore)i).label).value.stringValue));
{
Restore restore = cast(Restore)i;
Expression label = restore.label;
if(label.type == NodeType.Constant)
{
Constant cons = cast(Constant)label;
if(cons.value.isString)
{
genCode(new RestoreCodeS(cons.value.stringValue));
break;
//文字列じゃないならば定数でも実行時エラー
}
}
compileExpression(label, s);
genCode(new RestoreExprCode(s.data));
}
break;
case NodeType.On:
compileOn(cast(On)i, s);

View File

@@ -856,10 +856,11 @@ class PetitComputer
//とりあえず
auto parser = new Parser(
//readText("./SYS/GAME6TALK.TXT").to!wstring
readText("./SYS/GAME4SHOOTER.TXT").to!wstring
//readText("./SYS/GAME2RPG.TXT").to!wstring
//readText("./SYS/GAME1DOTRC.TXT").to!wstring
//readText(input("LOAD PROGRAM:", true).to!string).to!wstring
readText("./SYS/EX8TECDEMO.TXT").to!wstring
//readText("./SYS/EX8TECDEMO.TXT").to!wstring
//readText("./SYS/EX1TEXT.TXT").to!wstring
//readText("FIZZBUZZ.TXT").to!wstring
//readText("TEST.TXT").to!wstring