1
0

Add sprite argument check

This commit is contained in:
otya128
2016-12-31 17:41:24 +09:00
parent 94876609de
commit bc11fddd02
2 changed files with 178 additions and 0 deletions

View File

@@ -96,6 +96,14 @@ class BuiltinFunctions
alias DefaultValue!(int, false) optionalint; alias DefaultValue!(int, false) optionalint;
alias DefaultValue!(int, false) optionaldouble; alias DefaultValue!(int, false) optionaldouble;
alias DefaultValue!(int, false) optionalstring; alias DefaultValue!(int, false) optionalstring;
template smilebasicFunctionName(string func = __FUNCTION__)
{
static fn = func[func.lastIndexOf('.') + 1..$];
auto smilebasicFunctionName()
{
return fn;
}
}
/** /**
ここに関数を定義すればコンパイル時にBuiltinFunctionに変換してくれる便利なクラス ここに関数を定義すればコンパイル時にBuiltinFunctionに変換してくれる便利なクラス
*/ */
@@ -1392,6 +1400,14 @@ class BuiltinFunction
} }
static void SPSET(PetitComputer p, int id, int defno, DefaultValue!(int, false) V, DefaultValue!(int, false) W, DefaultValue!(int, false) H, DefaultValue!(int, false) ATTR) static void SPSET(PetitComputer p, int id, int defno, DefaultValue!(int, false) V, DefaultValue!(int, false) W, DefaultValue!(int, false) H, DefaultValue!(int, false) ATTR)
{ {
if (!p.sprite.isValidSpriteId(id))
{
throw new OutOfRange(smilebasicFunctionName, 1);
}
if (!p.sprite.isValidDef(defno))
{
throw new OutOfRange(smilebasicFunctionName, 2);
}
if(!V.isDefault && !W.isDefault) if(!V.isDefault && !W.isDefault)
{ {
int u = defno; int u = defno;
@@ -1428,6 +1444,10 @@ class BuiltinFunction
throw new OutOfRange("SPSET", 2); throw new OutOfRange("SPSET", 2);
if (upper < lower) if (upper < lower)
throw new IllegalFunctionCall("SPSET", 2); throw new IllegalFunctionCall("SPSET", 2);
if (!p.sprite.isValidDef(defno))
{
throw new OutOfRange(smilebasicFunctionName, 3);
}
ix = p.sprite.allocSprite(lower, upper); ix = p.sprite.allocSprite(lower, upper);
if (ix == -1) if (ix == -1)
return; return;
@@ -1456,6 +1476,14 @@ class BuiltinFunction
} }
static void SPCHR(PetitComputer p, int id, int defno, DefaultValue!(int, false) V, DefaultValue!(int, false) W, DefaultValue!(int, false) H, DefaultValue!(int, false) ATTR) static void SPCHR(PetitComputer p, int id, int defno, DefaultValue!(int, false) V, DefaultValue!(int, false) W, DefaultValue!(int, false) H, DefaultValue!(int, false) ATTR)
{ {
if (!p.sprite.isValidSpriteId(id))
{
throw new OutOfRange(smilebasicFunctionName, 1);
}
if (!p.sprite.isValidDef(defno))
{
throw new OutOfRange(smilebasicFunctionName, 2);
}
if (!p.sprite.isSpriteDefined(id)) if (!p.sprite.isSpriteDefined(id))
{ {
throw new IllegalFunctionCall("SPCHR", 1); throw new IllegalFunctionCall("SPCHR", 1);
@@ -1490,6 +1518,14 @@ class BuiltinFunction
} }
static void SPCHR(PetitComputer p, int id, out int defno) static void SPCHR(PetitComputer p, int id, out int defno)
{ {
if (!p.sprite.isValidSpriteId(id))
{
throw new OutOfRange(smilebasicFunctionName, 1);
}
if (!p.sprite.isValidDef(defno))
{
throw new OutOfRange(smilebasicFunctionName, 2);
}
if (!p.sprite.isSpriteDefined(id)) if (!p.sprite.isSpriteDefined(id))
{ {
throw new IllegalFunctionCall("SPCHR", 1); throw new IllegalFunctionCall("SPCHR", 1);
@@ -1498,6 +1534,10 @@ class BuiltinFunction
} }
static void SPCHR(PetitComputer p, int id, out int u, out int v, out int w, out int h, out int attr) static void SPCHR(PetitComputer p, int id, out int u, out int v, out int w, out int h, out int attr)
{ {
if (!p.sprite.isValidSpriteId(id))
{
throw new OutOfRange(smilebasicFunctionName, 1);
}
if (!p.sprite.isSpriteDefined(id)) if (!p.sprite.isSpriteDefined(id))
{ {
throw new IllegalFunctionCall("SPCHR", 1); throw new IllegalFunctionCall("SPCHR", 1);
@@ -1518,6 +1558,10 @@ class BuiltinFunction
} }
static void SPHIDE(PetitComputer p, int id) static void SPHIDE(PetitComputer p, int id)
{ {
if (!p.sprite.isValidSpriteId(id))
{
throw new OutOfRange(smilebasicFunctionName, 1);
}
if (!p.sprite.isSpriteDefined(id)) if (!p.sprite.isSpriteDefined(id))
{ {
throw new IllegalFunctionCall("SPHIDE", 1); throw new IllegalFunctionCall("SPHIDE", 1);
@@ -1526,6 +1570,10 @@ class BuiltinFunction
} }
static void SPSHOW(PetitComputer p, int id) static void SPSHOW(PetitComputer p, int id)
{ {
if (!p.sprite.isValidSpriteId(id))
{
throw new OutOfRange(smilebasicFunctionName, 1);
}
if (!p.sprite.isSpriteDefined(id)) if (!p.sprite.isSpriteDefined(id))
{ {
throw new IllegalFunctionCall("SPSHOW", 1); throw new IllegalFunctionCall("SPSHOW", 1);
@@ -1534,6 +1582,10 @@ class BuiltinFunction
} }
static void SPOFS(PetitComputer p, int id, DefaultValue!double x, DefaultValue!double y, double z) static void SPOFS(PetitComputer p, int id, DefaultValue!double x, DefaultValue!double y, double z)
{ {
if (!p.sprite.isValidSpriteId(id))
{
throw new OutOfRange(smilebasicFunctionName, 1);
}
if (!p.sprite.isSpriteDefined(id)) if (!p.sprite.isSpriteDefined(id))
{ {
throw new IllegalFunctionCall("SPOFS", 1); throw new IllegalFunctionCall("SPOFS", 1);
@@ -1549,6 +1601,10 @@ class BuiltinFunction
} }
static void SPOFS(PetitComputer p, int id, DefaultValue!double x, DefaultValue!double y) static void SPOFS(PetitComputer p, int id, DefaultValue!double x, DefaultValue!double y)
{ {
if (!p.sprite.isValidSpriteId(id))
{
throw new OutOfRange(smilebasicFunctionName, 1);
}
if (!p.sprite.isSpriteDefined(id)) if (!p.sprite.isSpriteDefined(id))
{ {
throw new IllegalFunctionCall("SPOFS", 1); throw new IllegalFunctionCall("SPOFS", 1);
@@ -1565,6 +1621,10 @@ class BuiltinFunction
@StartOptional("z") @StartOptional("z")
static void SPOFS(PetitComputer p, int id, out double x, out double y, out double z) static void SPOFS(PetitComputer p, int id, out double x, out double y, out double z)
{ {
if (!p.sprite.isValidSpriteId(id))
{
throw new OutOfRange(smilebasicFunctionName, 1);
}
if (!p.sprite.isSpriteDefined(id)) if (!p.sprite.isSpriteDefined(id))
{ {
throw new IllegalFunctionCall("SPOFS", 1); throw new IllegalFunctionCall("SPOFS", 1);
@@ -1576,6 +1636,10 @@ class BuiltinFunction
//TODO:配列 //TODO:配列
auto args = retro(va_args); auto args = retro(va_args);
int no = args[0].castInteger; int no = args[0].castInteger;
if (!p.sprite.isValidSpriteId(no))
{
throw new OutOfRange(smilebasicFunctionName, 1);
}
if (!p.sprite.isSpriteDefined(no)) if (!p.sprite.isSpriteDefined(no))
{ {
throw new IllegalFunctionCall("SPANIM", 1); throw new IllegalFunctionCall("SPANIM", 1);
@@ -1620,26 +1684,46 @@ class BuiltinFunction
} }
static void SPDEF(PetitComputer p, int id, out int U, out int V, out int A) static void SPDEF(PetitComputer p, int id, out int U, out int V, out int A)
{ {
if (!p.sprite.isValidDef(id))
{
throw new OutOfRange(smilebasicFunctionName, 1);
}
int dummy; int dummy;
p.sprite.getspdef(id, U, V, dummy, dummy, dummy, dummy, A); p.sprite.getspdef(id, U, V, dummy, dummy, dummy, dummy, A);
} }
static void SPDEF(PetitComputer p, int id, out int U, out int V, out int W, out int H) static void SPDEF(PetitComputer p, int id, out int U, out int V, out int W, out int H)
{ {
if (!p.sprite.isValidDef(id))
{
throw new OutOfRange(smilebasicFunctionName, 1);
}
int dummy; int dummy;
p.sprite.getspdef(id, U, V, W, H, dummy, dummy, dummy); p.sprite.getspdef(id, U, V, W, H, dummy, dummy, dummy);
} }
static void SPDEF(PetitComputer p, int id, out int U, out int V, out int W, out int H, out int A) static void SPDEF(PetitComputer p, int id, out int U, out int V, out int W, out int H, out int A)
{ {
if (!p.sprite.isValidDef(id))
{
throw new OutOfRange(smilebasicFunctionName, 1);
}
int dummy; int dummy;
p.sprite.getspdef(id, U, V, W, H, dummy, dummy, A); p.sprite.getspdef(id, U, V, W, H, dummy, dummy, A);
} }
static void SPDEF(PetitComputer p, int id, out int U, out int V, out int W, out int H, out int HX, out int HY) static void SPDEF(PetitComputer p, int id, out int U, out int V, out int W, out int H, out int HX, out int HY)
{ {
if (!p.sprite.isValidDef(id))
{
throw new OutOfRange(smilebasicFunctionName, 1);
}
int dummy; int dummy;
p.sprite.getspdef(id, U, V, W, H, HX, HY, dummy); p.sprite.getspdef(id, U, V, W, H, HX, HY, dummy);
} }
static void SPDEF(PetitComputer p, int id, out int U, out int V, out int W, out int H, out int HX, out int HY, out int A) static void SPDEF(PetitComputer p, int id, out int U, out int V, out int W, out int H, out int HX, out int HY, out int A)
{ {
if (!p.sprite.isValidDef(id))
{
throw new OutOfRange(smilebasicFunctionName, 1);
}
p.sprite.getspdef(id, U, V, W, H, HX, HY, A); p.sprite.getspdef(id, U, V, W, H, HX, HY, A);
} }
static void SPDEF(PetitComputer p, Value[] va_args2) static void SPDEF(PetitComputer p, Value[] va_args2)
@@ -1685,6 +1769,10 @@ class BuiltinFunction
} }
{ {
int defno = va_args[0].castInteger; int defno = va_args[0].castInteger;
if (!p.sprite.isValidDef(defno))
{
throw new OutOfRange(smilebasicFunctionName, 1);
}
int U = va_args[1].castInteger; int U = va_args[1].castInteger;
int V = va_args[2].castInteger; int V = va_args[2].castInteger;
int W = 16, H = 16, HX = 0, HY = 0, ATTR = 1; int W = 16, H = 16, HX = 0, HY = 0, ATTR = 1;
@@ -1731,10 +1819,20 @@ class BuiltinFunction
if(i.isDefault) if(i.isDefault)
p.sprite.spclr(); p.sprite.spclr();
else else
{
if (!p.sprite.isValidSpriteId(cast(int)i))
{
throw new OutOfRange(smilebasicFunctionName, 1);
}
p.sprite.spclr(cast(int)i); p.sprite.spclr(cast(int)i);
} }
}
static void SPHOME(PetitComputer p, int i, int hx, int hy) static void SPHOME(PetitComputer p, int i, int hx, int hy)
{ {
if (!p.sprite.isValidSpriteId(i))
{
throw new OutOfRange(smilebasicFunctionName, 1);
}
if (!p.sprite.isSpriteDefined(i)) if (!p.sprite.isSpriteDefined(i))
{ {
throw new IllegalFunctionCall("SPHOME", 1); throw new IllegalFunctionCall("SPHOME", 1);
@@ -1743,6 +1841,10 @@ class BuiltinFunction
} }
static void SPSCALE(PetitComputer p, int i, double x, double y) static void SPSCALE(PetitComputer p, int i, double x, double y)
{ {
if (!p.sprite.isValidSpriteId(i))
{
throw new OutOfRange(smilebasicFunctionName, 1);
}
if (!p.sprite.isSpriteDefined(i)) if (!p.sprite.isSpriteDefined(i))
{ {
throw new IllegalFunctionCall("SPSCALE", 1); throw new IllegalFunctionCall("SPSCALE", 1);
@@ -1751,6 +1853,10 @@ class BuiltinFunction
} }
static void SPROT(PetitComputer p, int i, double rot) static void SPROT(PetitComputer p, int i, double rot)
{ {
if (!p.sprite.isValidSpriteId(i))
{
throw new OutOfRange(smilebasicFunctionName, 1);
}
if (!p.sprite.isSpriteDefined(i)) if (!p.sprite.isSpriteDefined(i))
{ {
throw new IllegalFunctionCall("SPROT", 1); throw new IllegalFunctionCall("SPROT", 1);
@@ -1759,6 +1865,10 @@ class BuiltinFunction
} }
static void SPCOLOR(PetitComputer p, int id, int color) static void SPCOLOR(PetitComputer p, int id, int color)
{ {
if (!p.sprite.isValidSpriteId(id))
{
throw new OutOfRange(smilebasicFunctionName, 1);
}
if (!p.sprite.isSpriteDefined(id)) if (!p.sprite.isSpriteDefined(id))
{ {
throw new IllegalFunctionCall("SPCOLOR", 1); throw new IllegalFunctionCall("SPCOLOR", 1);
@@ -1767,14 +1877,30 @@ class BuiltinFunction
} }
static void SPLINK(PetitComputer p, int child, int parent) static void SPLINK(PetitComputer p, int child, int parent)
{ {
if (!p.sprite.isValidSpriteId(child))
{
throw new OutOfRange(smilebasicFunctionName, 1);
}
if (!p.sprite.isValidSpriteId(parent))
{
throw new OutOfRange(smilebasicFunctionName, 2);
}
p.sprite.splink(child, parent); p.sprite.splink(child, parent);
} }
static int SPLINK(PetitComputer p, int id) static int SPLINK(PetitComputer p, int id)
{ {
if (!p.sprite.isValidSpriteId(id))
{
throw new OutOfRange("SPLINK", 1);
}
return p.sprite.splink(id); return p.sprite.splink(id);
} }
static void SPUNLINK(PetitComputer p, int id) static void SPUNLINK(PetitComputer p, int id)
{ {
if (!p.sprite.isValidSpriteId(id))
{
throw new OutOfRange(smilebasicFunctionName, 1);
}
if (!p.sprite.isSpriteDefined(id)) if (!p.sprite.isSpriteDefined(id))
{ {
throw new IllegalFunctionCall("SPUNLINK", 1); throw new IllegalFunctionCall("SPUNLINK", 1);
@@ -1783,6 +1909,10 @@ class BuiltinFunction
} }
static void SPCOL(PetitComputer p, int id, DefaultValue!(int, false) scale) static void SPCOL(PetitComputer p, int id, DefaultValue!(int, false) scale)
{ {
if (!p.sprite.isValidSpriteId(id))
{
throw new OutOfRange(smilebasicFunctionName, 1);
}
if (!p.sprite.isSpriteDefined(id)) if (!p.sprite.isSpriteDefined(id))
{ {
throw new IllegalFunctionCall("SPCOL", 1); throw new IllegalFunctionCall("SPCOL", 1);
@@ -1792,6 +1922,10 @@ class BuiltinFunction
} }
static void SPCOL(PetitComputer p, int id, DefaultValue!int scale, int mask) static void SPCOL(PetitComputer p, int id, DefaultValue!int scale, int mask)
{ {
if (!p.sprite.isValidSpriteId(id))
{
throw new OutOfRange(smilebasicFunctionName, 1);
}
if (!p.sprite.isSpriteDefined(id)) if (!p.sprite.isSpriteDefined(id))
{ {
throw new IllegalFunctionCall("SPCOL", 1); throw new IllegalFunctionCall("SPCOL", 1);
@@ -1801,6 +1935,10 @@ class BuiltinFunction
} }
static void SPCOL(PetitComputer p, int id, int x, int y, int w, int h, int scale) static void SPCOL(PetitComputer p, int id, int x, int y, int w, int h, int scale)
{ {
if (!p.sprite.isValidSpriteId(id))
{
throw new OutOfRange(smilebasicFunctionName, 1);
}
if (!p.sprite.isSpriteDefined(id)) if (!p.sprite.isSpriteDefined(id))
{ {
throw new IllegalFunctionCall("SPCOL", 1); throw new IllegalFunctionCall("SPCOL", 1);
@@ -1809,6 +1947,10 @@ class BuiltinFunction
} }
static void SPCOL(PetitComputer p, int id, int x, int y, int w, int h, DefaultValue!int scale, int mask) static void SPCOL(PetitComputer p, int id, int x, int y, int w, int h, DefaultValue!int scale, int mask)
{ {
if (!p.sprite.isValidSpriteId(id))
{
throw new OutOfRange(smilebasicFunctionName, 1);
}
if (!p.sprite.isSpriteDefined(id)) if (!p.sprite.isSpriteDefined(id))
{ {
throw new IllegalFunctionCall("SPCOL", 1); throw new IllegalFunctionCall("SPCOL", 1);
@@ -1818,6 +1960,10 @@ class BuiltinFunction
} }
static void SPCOL(PetitComputer p, int id, int x, int y, int w, int h, DefaultValue!int scale) static void SPCOL(PetitComputer p, int id, int x, int y, int w, int h, DefaultValue!int scale)
{ {
if (!p.sprite.isValidSpriteId(id))
{
throw new OutOfRange(smilebasicFunctionName, 1);
}
if (!p.sprite.isSpriteDefined(id)) if (!p.sprite.isSpriteDefined(id))
{ {
throw new IllegalFunctionCall("SPCOL", 1); throw new IllegalFunctionCall("SPCOL", 1);
@@ -1827,6 +1973,10 @@ class BuiltinFunction
} }
static void SPCOL(PetitComputer p, int id, int x, int y, int w, int h) static void SPCOL(PetitComputer p, int id, int x, int y, int w, int h)
{ {
if (!p.sprite.isValidSpriteId(id))
{
throw new OutOfRange(smilebasicFunctionName, 1);
}
if (!p.sprite.isSpriteDefined(id)) if (!p.sprite.isSpriteDefined(id))
{ {
throw new IllegalFunctionCall("SPCOL", 1); throw new IllegalFunctionCall("SPCOL", 1);
@@ -1835,28 +1985,52 @@ class BuiltinFunction
} }
static int SPHITSP(PetitComputer p, int id) static int SPHITSP(PetitComputer p, int id)
{ {
if (!p.sprite.isValidSpriteId(id))
{
throw new OutOfRange(smilebasicFunctionName, 1);
}
//spset is not checked //spset is not checked
return p.sprite.sphitsp(id); return p.sprite.sphitsp(id);
} }
static int SPHITSP(PetitComputer p, int id, int min) static int SPHITSP(PetitComputer p, int id, int min)
{ {
if (!p.sprite.isValidSpriteId(id))
{
throw new OutOfRange(smilebasicFunctionName, 1);
}
return p.sprite.sphitsp(id, min, 511);//? return p.sprite.sphitsp(id, min, 511);//?
} }
static int SPHITSP(PetitComputer p, int id, int min, int max) static int SPHITSP(PetitComputer p, int id, int min, int max)
{ {
if (!p.sprite.isValidSpriteId(id))
{
throw new OutOfRange(smilebasicFunctionName, 1);
}
return p.sprite.sphitsp(id, min, max); return p.sprite.sphitsp(id, min, max);
} }
static void SPVAR(PetitComputer p, int id, int var, double val) static void SPVAR(PetitComputer p, int id, int var, double val)
{ {
if (!p.sprite.isValidSpriteId(id))
{
throw new OutOfRange(smilebasicFunctionName, 1);
}
//spset is not checked //spset is not checked
p.sprite.spvar(id, var, val); p.sprite.spvar(id, var, val);
} }
static double SPVAR(PetitComputer p, int id, int var) static double SPVAR(PetitComputer p, int id, int var)
{ {
if (!p.sprite.isValidSpriteId(id))
{
throw new OutOfRange(smilebasicFunctionName, 1);
}
return p.sprite.spvar(id, var); return p.sprite.spvar(id, var);
} }
static int SPCHK(PetitComputer p, int id) static int SPCHK(PetitComputer p, int id)
{ {
if (!p.sprite.isValidSpriteId(id))
{
throw new OutOfRange(smilebasicFunctionName, 1);
}
return p.sprite.spchk(id); return p.sprite.spchk(id);
} }
static void SPPAGE(PetitComputer p, int page) static void SPPAGE(PetitComputer p, int page)

View File

@@ -1204,6 +1204,10 @@ class Sprite
return sprites.length > id + spmax; return sprites.length > id + spmax;
} }
} }
bool isValidDef(int def)
{
return def >= 0 && def < SPDEFTable.length;
}
bool spused(int id) bool spused(int id)
{ {
id = spid(id); id = spid(id);