Lower IR::Name nodes.
authorRoberto Raggi <roberto.raggi@nokia.com>
Wed, 6 Jun 2012 12:11:28 +0000 (14:11 +0200)
committerRoberto Raggi <roberto.raggi@nokia.com>
Wed, 6 Jun 2012 12:11:28 +0000 (14:11 +0200)
llvm_runtime.cpp
qv4isel_llvm.cpp

index 0f0ecfd69bc547478d475fd5ab9ce97785498a12..e7dab641c0b962f3dfb18053fa01575e2112c5ea 100644 (file)
@@ -15,6 +15,21 @@ Value *__qmljs_llvm_get_argument(Context *ctx, int index)
     return &ctx->arguments[index];
 }
 
+void __qmljs_llvm_init_undefined(Value *result)
+{
+    __qmljs_init_undefined(result);
+}
+
+void __qmljs_llvm_init_null(Value *result)
+{
+    __qmljs_init_null(result);
+}
+
+void __qmljs_llvm_init_boolean(Value *result, bool value)
+{
+    __qmljs_init_boolean(result, value);
+}
+
 void __qmljs_llvm_init_number(Value *result, double value)
 {
     __qmljs_init_number(result, value);
@@ -170,6 +185,16 @@ void __qmljs_llvm_construct_activation_property(Context *context, Value *result,
     __qmljs_construct_activation_property(context, result, name, args, argc);
 }
 
+void __qmljs_llvm_get_activation_property(Context *ctx, Value *result, String *name)
+{
+    __qmljs_get_activation_property(ctx, result, name);
+}
+
+void __qmljs_llvm_set_activation_property(Context *ctx, String *name, Value *value)
+{
+    __qmljs_set_activation_property(ctx, name, value);
+}
+
 void __qmljs_llvm_get_property(Context *ctx, Value *result, Value *object, String *name)
 {
     __qmljs_get_property(ctx, result, object, name);
@@ -190,6 +215,11 @@ void __qmljs_llvm_get_element(Context *ctx, Value *result, Value *object, Value
     __qmljs_get_element(ctx, result, object, index);
 }
 
+void __qmljs_llvm_set_element(Context *ctx, Value *object, Value *index, Value *value)
+{
+    __qmljs_set_element(ctx, object, index, value);
+}
+
 void __qmljs_llvm_set_property(Context *ctx, Value *object, String *name, Value *value)
 {
     __qmljs_set_property(ctx, object, name, value);
index fbe1568b1abcb0ec8679b29e08116d90e29f3547..54623adae337296d790f6da40c3d993bb5ddd900 100644 (file)
@@ -2,6 +2,8 @@
 #include "qv4isel_llvm_p.h"
 #include "qv4ir_p.h"
 
+#include <QtCore/QTextStream>
+
 #include <llvm/Support/system_error.h>
 #include <llvm/Support/MemoryBuffer.h>
 #include <llvm/Bitcode/ReaderWriter.h>
 
 using namespace QQmlJS;
 
+namespace {
+QTextStream qout(stdout, QIODevice::WriteOnly);
+}
+
 LLVMInstructionSelection::LLVMInstructionSelection(llvm::LLVMContext &context)
     : llvm::IRBuilder<>(context)
     , _llvmModule(0)
@@ -247,13 +253,20 @@ void LLVMInstructionSelection::visitMove(IR::Move *s)
         genMoveSubscript(s);
     } else if (s->target->asMember()) {
         genMoveMember(s);
+    } else if (IR::Name *n = s->target->asName()) {
+        llvm::Value *name = getIdentifier(*n->id);
+        llvm::Value *source = getLLVMTempReference(s->source);
+        CreateCall3(_llvmModule->getFunction("__qmljs_llvm_set_activation_property"),
+                    _llvmFunction->arg_begin(), name, source);
     } else if (IR::Temp *t = s->target->asTemp()) {
         llvm::Value *target = getLLVMTemp(t);
         llvm::Value *source = getLLVMValue(s->source);
         CreateStore(source, target);
-        return;
+    } else {
+        s->dump(qout, IR::Stmt::HIR);
+        qout << endl;
+        Q_UNIMPLEMENTED();
     }
-    Q_UNIMPLEMENTED();
 }
 
 void LLVMInstructionSelection::visitJump(IR::Jump *s)
@@ -281,9 +294,31 @@ void LLVMInstructionSelection::visitRet(IR::Ret *s)
 
 void LLVMInstructionSelection::visitConst(IR::Const *e)
 {
-    llvm::Value *k = llvm::ConstantFP::get(_numberTy, e->value);
     llvm::Value *tmp = newLLVMTemp(_valueTy);
-    CreateCall2(_llvmModule->getFunction("__qmljs_llvm_init_number"), tmp, k);
+
+    switch (e->type) {
+    case IR::UndefinedType:
+        CreateCall(_llvmModule->getFunction("__qmljs_llvm_init_undefined"), tmp);
+        break;
+
+    case IR::NullType:
+        CreateCall(_llvmModule->getFunction("__qmljs_llvm_init_null"), tmp);
+        break;
+
+    case IR::BoolType:
+        CreateCall2(_llvmModule->getFunction("__qmljs_llvm_init_boolean"), tmp,
+                    getInt1(e->value ? 1 : 0));
+        break;
+
+    case IR::NumberType:
+        CreateCall2(_llvmModule->getFunction("__qmljs_llvm_init_number"), tmp,
+                    llvm::ConstantFP::get(_numberTy, e->value));
+        break;
+
+    default:
+        Q_UNREACHABLE();
+    }
+
     _llvmValue = CreateLoad(tmp);
 }
 
@@ -296,9 +331,14 @@ void LLVMInstructionSelection::visitString(IR::String *e)
     _llvmValue = CreateLoad(tmp);
 }
 
-void LLVMInstructionSelection::visitName(IR::Name *)
+void LLVMInstructionSelection::visitName(IR::Name *e)
 {
-    Q_UNIMPLEMENTED();
+    llvm::Value *result = newLLVMTemp(_valueTy);
+    llvm::Value *name = getIdentifier(*e->id);
+    CreateCall3(_llvmModule->getFunction("__qmljs_get_activation_property"),
+                _llvmFunction->arg_begin(), result, name);
+    _llvmValue = CreateLoad(result);
+
 }
 
 void LLVMInstructionSelection::visitTemp(IR::Temp *e)