Merge pull request #194 from alliedmodders/keyword-this
Define 'this' as a keyword.
This commit is contained in:
commit
801b7ec9e2
@ -434,6 +434,7 @@ enum TokenKind {
|
|||||||
tSWITCH,
|
tSWITCH,
|
||||||
tTAGOF,
|
tTAGOF,
|
||||||
tTHEN,
|
tTHEN,
|
||||||
|
tTHIS,
|
||||||
tTYPEDEF,
|
tTYPEDEF,
|
||||||
tUNION,
|
tUNION,
|
||||||
tVOID,
|
tVOID,
|
||||||
|
@ -3702,7 +3702,6 @@ int check_this_tag(methodmap_t *map, symbol *target)
|
|||||||
const arginfo *first_arg = &target->dim.arglist[0];
|
const arginfo *first_arg = &target->dim.arglist[0];
|
||||||
if (first_arg->ident == 0 ||
|
if (first_arg->ident == 0 ||
|
||||||
first_arg->ident != iVARIABLE ||
|
first_arg->ident != iVARIABLE ||
|
||||||
(first_arg->usage & uCONST) ||
|
|
||||||
first_arg->hasdefault ||
|
first_arg->hasdefault ||
|
||||||
first_arg->numtags != 1)
|
first_arg->numtags != 1)
|
||||||
{
|
{
|
||||||
@ -5576,6 +5575,7 @@ static int declargs(symbol *sym, int chkshadow, const int *thistag)
|
|||||||
argptr->tags = (int *)malloc(sizeof(int));
|
argptr->tags = (int *)malloc(sizeof(int));
|
||||||
argptr->tags[0] = *thistag;
|
argptr->tags[0] = *thistag;
|
||||||
argptr->numtags = 1;
|
argptr->numtags = 1;
|
||||||
|
argptr->usage = uCONST;
|
||||||
} else {
|
} else {
|
||||||
argptr = &sym->dim.arglist[0];
|
argptr = &sym->dim.arglist[0];
|
||||||
}
|
}
|
||||||
@ -5591,6 +5591,7 @@ static int declargs(symbol *sym, int chkshadow, const int *thistag)
|
|||||||
argptr->idxtag,
|
argptr->idxtag,
|
||||||
0
|
0
|
||||||
);
|
);
|
||||||
|
sym->usage |= uCONST;
|
||||||
markusage(sym, uREAD);
|
markusage(sym, uREAD);
|
||||||
|
|
||||||
argcnt++;
|
argcnt++;
|
||||||
|
@ -1973,7 +1973,7 @@ const char *sc_tokens[] = {
|
|||||||
"public",
|
"public",
|
||||||
"return",
|
"return",
|
||||||
"sizeof", "sleep", "static", "stock", "struct", "switch",
|
"sizeof", "sleep", "static", "stock", "struct", "switch",
|
||||||
"tagof", "*then", "typedef",
|
"tagof", "*then", "this", "typedef",
|
||||||
"union",
|
"union",
|
||||||
"void",
|
"void",
|
||||||
"while",
|
"while",
|
||||||
|
@ -2304,12 +2304,28 @@ static int primary(value *lval)
|
|||||||
|
|
||||||
clear_value(lval); /* clear lval */
|
clear_value(lval); /* clear lval */
|
||||||
tok=lex(&val,&st);
|
tok=lex(&val,&st);
|
||||||
|
|
||||||
|
if (tok == tTHIS) {
|
||||||
|
strcpy(lastsymbol, "this");
|
||||||
|
if ((sym = findloc("this")) == NULL) {
|
||||||
|
error(166); /* 'this' outside method body */
|
||||||
|
ldconst(0, sPRI);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(sym->ident == iVARIABLE);
|
||||||
|
lval->sym = sym;
|
||||||
|
lval->ident = sym->ident;
|
||||||
|
lval->tag = sym->tag;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
if (tok==tSYMBOL) {
|
if (tok==tSYMBOL) {
|
||||||
/* lastsymbol is char[sNAMEMAX+1], lex() should have truncated any symbol
|
/* lastsymbol is char[sNAMEMAX+1], lex() should have truncated any symbol
|
||||||
* to sNAMEMAX significant characters */
|
* to sNAMEMAX significant characters */
|
||||||
assert(strlen(st)<sizeof lastsymbol);
|
assert(strlen(st)<sizeof lastsymbol);
|
||||||
strcpy(lastsymbol,st);
|
strcpy(lastsymbol,st);
|
||||||
} /* if */
|
}
|
||||||
if (tok==tSYMBOL && !findconst(st,NULL)) {
|
if (tok==tSYMBOL && !findconst(st,NULL)) {
|
||||||
/* first look for a local variable */
|
/* first look for a local variable */
|
||||||
if ((sym=findloc(st))!=0) {
|
if ((sym=findloc(st))!=0) {
|
||||||
|
@ -209,6 +209,7 @@ static const char *errmsg[] = {
|
|||||||
/*163*/ "indeterminate array size in \"sizeof\" expression (symbol \"%s\")\n",
|
/*163*/ "indeterminate array size in \"sizeof\" expression (symbol \"%s\")\n",
|
||||||
/*164*/ "allocated array type '%s' doesn't match original type '%s'\n",
|
/*164*/ "allocated array type '%s' doesn't match original type '%s'\n",
|
||||||
/*165*/ "cannot create dynamic arrays in static scope - did you mean to create a fixed-length array with brackets after the variable name?\n",
|
/*165*/ "cannot create dynamic arrays in static scope - did you mean to create a fixed-length array with brackets after the variable name?\n",
|
||||||
|
/*166*/ "cannot use 'this' outside of a methodmap method or property\n",
|
||||||
#else
|
#else
|
||||||
"\315e\306\227\266k\217:\235\277bu\201fo\220\204\223\012",
|
"\315e\306\227\266k\217:\235\277bu\201fo\220\204\223\012",
|
||||||
"\202l\224\250s\205g\346\356e\233\201(\243\315\214\267\202) \253 f\255low ea\305 \042c\353e\042\012",
|
"\202l\224\250s\205g\346\356e\233\201(\243\315\214\267\202) \253 f\255low ea\305 \042c\353e\042\012",
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
native CloseHandle(Handle:this[]);
|
native CloseHandle(Handle:handle[]);
|
||||||
|
|
||||||
methodmap Handle {
|
methodmap Handle {
|
||||||
public Close() = CloseHandle;
|
public Close() = CloseHandle;
|
||||||
|
12
sourcepawn/compiler/tests/fail-assign-to-this.sp
Normal file
12
sourcepawn/compiler/tests/fail-assign-to-this.sp
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
methodmap Egg
|
||||||
|
{
|
||||||
|
public void illegal(Egg x) {
|
||||||
|
this = x;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
public main()
|
||||||
|
{
|
||||||
|
Egg egg;
|
||||||
|
egg.illegal(egg);
|
||||||
|
}
|
1
sourcepawn/compiler/tests/fail-assign-to-this.txt
Normal file
1
sourcepawn/compiler/tests/fail-assign-to-this.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
(4) : error 022: must be lvalue (non-constant)
|
@ -1,4 +1,4 @@
|
|||||||
native Q(X:this, a);
|
native Q(X:handle, a);
|
||||||
|
|
||||||
methodmap X {
|
methodmap X {
|
||||||
public ~X() = Q;
|
public ~X() = Q;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
Q(X:this)
|
Q(X:handle)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
native CloseHandle(Handle:this);
|
native CloseHandle(Handle:handle);
|
||||||
|
|
||||||
methodmap Handle {
|
methodmap Handle {
|
||||||
public Close() = CloseHandle;
|
public Close() = CloseHandle;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
native CloseHandle(Handle:this);
|
native CloseHandle(Handle:handle);
|
||||||
|
|
||||||
methodmap Handle {
|
methodmap Handle {
|
||||||
public Close() = CloseHandle;
|
public Close() = CloseHandle;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
native CloseHandle(HandleEgg:this);
|
native CloseHandle(HandleEgg:handle);
|
||||||
|
|
||||||
methodmap Handle {
|
methodmap Handle {
|
||||||
public Close() = CloseHandle;
|
public Close() = CloseHandle;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
native CloseHandle({Handle, Egg}:this);
|
native CloseHandle({Handle, Egg}:handle);
|
||||||
|
|
||||||
methodmap Handle {
|
methodmap Handle {
|
||||||
public Close() = CloseHandle;
|
public Close() = CloseHandle;
|
||||||
|
3
sourcepawn/compiler/tests/fail-this-outside-method.sp
Normal file
3
sourcepawn/compiler/tests/fail-this-outside-method.sp
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
public OnPluginStart() {
|
||||||
|
return this;
|
||||||
|
}
|
1
sourcepawn/compiler/tests/fail-this-outside-method.txt
Normal file
1
sourcepawn/compiler/tests/fail-this-outside-method.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
(2) : error 166: cannot use 'this' outside of a methodmap method or property
|
@ -1,4 +1,4 @@
|
|||||||
native CloseHandle(Handle:this);
|
native CloseHandle(Handle:handle);
|
||||||
|
|
||||||
methodmap Handle {
|
methodmap Handle {
|
||||||
};
|
};
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
native CloseHandle(Handle:this);
|
native CloseHandle(Handle:handle);
|
||||||
|
|
||||||
methodmap Handle {
|
methodmap Handle {
|
||||||
public Close() = CloseHandle;
|
public Close() = CloseHandle;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
native CloseHandle(Handle:this);
|
native CloseHandle(Handle:handle);
|
||||||
|
|
||||||
enum Handle {
|
enum Handle {
|
||||||
INVALID_HANDLE = 0,
|
INVALID_HANDLE = 0,
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
native CloseHandle(Handle:this);
|
native CloseHandle(Handle:handle);
|
||||||
|
|
||||||
methodmap Handle {
|
methodmap Handle {
|
||||||
public Close() = CloseHandle;
|
public Close() = CloseHandle;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
native CloseHandle(Handle:this);
|
native CloseHandle(Handle:handle);
|
||||||
|
|
||||||
methodmap Handle {
|
methodmap Handle {
|
||||||
public Close() = CloseHandle;
|
public Close() = CloseHandle;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
native CloseHandle(Handle:this);
|
native CloseHandle(Handle:handle);
|
||||||
|
|
||||||
methodmap Handle {
|
methodmap Handle {
|
||||||
public Close() = CloseHandle;
|
public Close() = CloseHandle;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
native CloneHandle(Handle:this);
|
native CloneHandle(Handle:handle);
|
||||||
native CloseHandle(Handle:this);
|
native CloseHandle(Handle:handle);
|
||||||
|
|
||||||
methodmap Handle {
|
methodmap Handle {
|
||||||
public Clone() = CloneHandle;
|
public Clone() = CloneHandle;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
native CloseHandle(Handle:this);
|
native CloseHandle(Handle:handle);
|
||||||
|
|
||||||
methodmap Handle {
|
methodmap Handle {
|
||||||
public Close() = CloseHandle;
|
public Close() = CloseHandle;
|
||||||
|
Loading…
Reference in New Issue
Block a user