add destructor for obj_file & change arguments in test/tetris.nas

This commit is contained in:
ValKmjolnir 2022-03-12 23:37:16 +08:00
parent 6a1338bb23
commit 82e9e97a26
3 changed files with 26 additions and 12 deletions

View File

@ -732,6 +732,11 @@ nasal_ref builtin_chr(nasal_ref* local,nasal_gc& gc)
ret.str()=" ";
return ret;
}
void obj_file_destructor(void* ptr)
{
fclose((FILE*)ptr);
return;
}
nasal_ref builtin_open(nasal_ref* local,nasal_gc& gc)
{
nasal_ref filename=local[1];
@ -746,14 +751,16 @@ nasal_ref builtin_open(nasal_ref* local,nasal_gc& gc)
nasal_ref ret=gc.alloc(vm_obj);
ret.obj().type=obj_file;
ret.obj().ptr=(void*)res;
ret.obj().destructor=obj_file_destructor;
return ret;
}
nasal_ref builtin_close(nasal_ref* local,nasal_gc& gc)
{
nasal_ref filehandle=local[1];
if(filehandle.type!=vm_obj || filehandle.obj().type!=obj_file)
nasal_ref fd=local[1];
if(fd.type!=vm_obj || fd.obj().type!=obj_file)
return builtin_err("close","not a correct filehandle");
fclose((FILE*)filehandle.obj().ptr);
fclose((FILE*)fd.obj().ptr);
fd.obj().ptr=nullptr;
return nil;
}
nasal_ref builtin_read(nasal_ref* local,nasal_gc& gc)

View File

@ -148,16 +148,21 @@ struct nasal_upval
struct nasal_obj
{
/* RAII constructor */
/* new object is initialized when creating */
uint32_t type;
void* ptr;
void* destructor;
/* RAII destroyer */
typedef void (*dest)(void*);
dest destructor;
nasal_obj():ptr(nullptr),destructor(nullptr){}
~nasal_obj(){clear();}
void clear()
{
typedef void (*func)(void*);
if(destructor)
(func(destructor))(ptr);
{
if(destructor && ptr)
destructor(ptr);
ptr=nullptr;
}
};

View File

@ -238,6 +238,7 @@ var mapgen=func(mapx,mapy){
}
var checkmap=func(){
var lines=1;
for(var y=mapy-1;y>=0;y-=1){
# check if this line is full of blocks
var tmp=0;
@ -249,7 +250,8 @@ var mapgen=func(mapx,mapy){
# if is full, clear this line and
# all the lines above fall one block
if(x==mapx){
score+=tmp;
score+=lines*tmp;
lines*=2;
for(var t=y;t>=1;t-=1)
for(var x=0;x<mapx;x+=1)
map[t][x]=map[t-1][x];
@ -296,7 +298,7 @@ var main=func(){
libkey.getch();
print("\ec");
var counter=15;
var counter=30;
while(1){
# nonblock input one character
var ch=libkey.nonblock();
@ -326,9 +328,9 @@ var main=func(){
map.checkmap();
if(map.gameover())
break;
counter=15;
counter=30;
}
unix.sleep(0.04);
unix.sleep(0.02);
counter-=1;
}
libkey.close();