add test case and update code gen for TOARRAY opcodes

gccjit-ravi534
Dibyendu Majumdar 8 years ago
parent f3d4a70102
commit 25cac0cd59

@ -1,4 +1,4 @@
mkdir buildllvm
cd buildllvm
#cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_JIT=ON -DCMAKE_INSTALL_PREFIX=$HOME/ravi -DLLVM_DIR=$HOME/LLVM/share/llvm/cmake ..
cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_JIT=ON -DCMAKE_INSTALL_PREFIX=$HOME/ravi -DLLVM_DIR=$HOME/LLVM39/lib/cmake/llvm ..
cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_JIT=ON -DCMAKE_INSTALL_PREFIX=$HOME/ravi -DLLVM_DIR=$HOME/LLVM/share/llvm/cmake ..
#cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_JIT=ON -DCMAKE_INSTALL_PREFIX=$HOME/ravi -DLLVM_DIR=$HOME/LLVM39/lib/cmake/llvm ..

@ -83,6 +83,9 @@ enum LuaTypeCode {
LUA__TNUMBER = LUA_TNUMBER,
LUA__TSTRING = ctb(LUA_TSTRING),
LUA__TTABLE = LUA_TTABLE,
RAVI__TLTABLE = ctb(LUA_TTABLE),
RAVI__TIARRAY = ctb(RAVI_TIARRAY),
RAVI__TFARRAY = ctb(RAVI_TFARRAY),
LUA__TFUNCTION = ctb(LUA_TFUNCTION),
LUA__TUSERDATA = ctb(LUA_TUSERDATA),
LUA__TTHREAD = ctb(LUA_TTHREAD),

@ -1209,6 +1209,21 @@ compile(event_test)
event_test();
print 'Test 51 OK'
function test_intarray_as_table(t)
t.a = 'a'
--print(ravitype(t))
end
function do_test_intarray_as_table()
local iarray: integer[] = {1}
test_intarray_as_table(iarray);
end
assert(not pcall(do_test_intarray_as_table));
compile(do_test_intarray_as_table);
compile(test_intarray_as_table);
assert(not pcall(do_test_intarray_as_table));
for k,v in pairs(opcodes_coverage)
do
print(k, v)

@ -281,6 +281,7 @@ void luaV_finishset (lua_State *L, const TValue *t, TValue *key,
else protect(luaV_finishget(L,t,key,val,aux)); \
}
#define GETTABLE_INLINE_SSKEY_PROTECTED(L, t, key, val) GETTABLE_INLINE_SSKEY_(L, t, key, val, Protect)
#define GETTABLE_INLINE_SSKEY(L, t, key, val) GETTABLE_INLINE_SSKEY_(L, t, key, val, Unprotect)

@ -943,9 +943,16 @@ void RaviCodeGenerator::emit_TOARRAY(RaviFunctionDef *def, int A,
int array_type_expected,
const char *errmsg, int pc) {
OpCode op = OP_RAVI_TOTAB;
LuaTypeCode expectedType = RAVI__TLTABLE;
switch (array_type_expected) {
case RAVI_TARRAYINT: op = OP_RAVI_TOARRAYI; break;
case RAVI_TARRAYFLT: op = OP_RAVI_TOARRAYF; break;
case RAVI_TARRAYINT:
op = OP_RAVI_TOARRAYI;
expectedType = RAVI__TIARRAY;
break;
case RAVI_TARRAYFLT:
op = OP_RAVI_TOARRAYF;
expectedType = RAVI__TFARRAY;
break;
case RAVI_TTABLE:
default: break;
}
@ -955,6 +962,24 @@ void RaviCodeGenerator::emit_TOARRAY(RaviFunctionDef *def, int A,
llvm::Value *ra = emit_gep_register(def, A);
llvm::Instruction *type = emit_load_type(def, ra);
// type != expectedType
llvm::Value *cmp1 =
emit_is_not_value_of_type(def, type, expectedType, "is.not.expected.type");
llvm::BasicBlock *raise_error = llvm::BasicBlock::Create(
def->jitState->context(), "if.not.expected_type", def->f);
llvm::BasicBlock *done =
llvm::BasicBlock::Create(def->jitState->context(), "done");
def->builder->CreateCondBr(cmp1, raise_error, done);
def->builder->SetInsertPoint(raise_error);
// Conversion failed, so raise error
emit_raise_lua_error(def, errmsg);
def->builder->CreateBr(done);
def->f->getBasicBlockList().push_back(done);
def->builder->SetInsertPoint(done);
#if 0
// type != LUA_TTABLE ?
llvm::Value *cmp1 =
emit_is_not_value_of_type_class(def, type, LUA__TTABLE, "is.not.table");
@ -989,6 +1014,7 @@ void RaviCodeGenerator::emit_TOARRAY(RaviFunctionDef *def, int A,
def->f->getBasicBlockList().push_back(done);
def->builder->SetInsertPoint(done);
#endif
}
void RaviCodeGenerator::emit_MOVEAI(RaviFunctionDef *def, int A, int B,

Loading…
Cancel
Save