Sophie

Sophie

distrib > Mageia > 3 > i586 > media > core-release-src > by-pkgid > 5129ed19500c0b4e7ac7dcabc3689f10 > files > 2

kross-interpreters-4.10.2-1.mga3.src.rpm

--- kross-interpreters-4.9.2/ruby/rubyconfig.h.0000	2012-09-28 08:39:49.000000000 +0800
+++ kross-interpreters-4.9.2/ruby/rubyconfig.h	2012-11-01 15:28:14.039952777 +0800
@@ -21,12 +21,10 @@
 #define KROSS_RUBY_CONFIG_H
 
 #include <ruby.h>
-#include <env.h>
-#include <rubysig.h>
-#include <node.h>
-#include <version.h>
+#include <ruby/backward/rubysig.h>
+#include <ruby/version.h>
 
-#include <st.h>
+#include <ruby/st.h>
 //#include <typeinfo>
 
 #include <kross/core/krossconfig.h>
--- kross-interpreters-4.9.2/ruby/rubyextension.cpp.0000	2012-09-28 08:39:49.000000000 +0800
+++ kross-interpreters-4.9.2/ruby/rubyextension.cpp	2012-11-01 15:36:46.534733909 +0800
@@ -218,7 +218,7 @@
     }
     RubyExtension* extension = toExtension(self);
     Q_ASSERT(extension);
-    return RubyType<QVariant>::toVALUE( extension->d->m_object->property(STR2CSTR(name)) );
+    return RubyType<QVariant>::toVALUE( extension->d->m_object->property(StringValuePtr(name)) );
 }
 
 VALUE RubyExtension::setProperty(int argc, VALUE *argv, VALUE self)
@@ -231,7 +231,7 @@
     }
     RubyExtension* extension = toExtension(self);
     Q_ASSERT(extension && extension->d->m_object);
-    return RubyType<bool>::toVALUE( extension->d->m_object->setProperty(STR2CSTR(name), RubyType<QVariant>::toVariant(value)) );
+    return RubyType<bool>::toVALUE( extension->d->m_object->setProperty(StringValuePtr(name), RubyType<QVariant>::toVariant(value)) );
 }
 
 VALUE RubyExtension::callConnect(int argc, VALUE *argv, VALUE self)
@@ -278,7 +278,7 @@
             sendersignal = RubyType<QByteArray>::toVariant(argv[1]);
             idx = 2;
             if( argc <= idx ) {
-                rb_raise(rb_eTypeError, ::QString("Expected at least %1 arguments.").arg(idx+1).toLatin1().constData());
+                rb_raise(rb_eTypeError, "%s", ::QString("Expected at least %1 arguments.").arg(idx+1).toLatin1().constData());
                 return Qfalse;
             }
         } break;
@@ -291,7 +291,7 @@
     QObject* receiver = 0; // the receiver object
     QByteArray receiverslot; // the receiver slot
     if( TYPE(argv[idx]) == T_DATA ) {
-#if(RUBY_VERSION_MAJOR==1 && RUBY_VERSION_MINOR==8 && RUBY_VERSION_TEENY==4)
+#if(RUBY_API_VERSION_MAJOR==1 && RUBY_API_VERSION_MINOR==8 && RUBY_API_VERSION_TEENY==4)
         //Ruby sucks sometimes; http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/201285
         { // just always assume the user provides a method here for now...
 #else
@@ -308,9 +308,9 @@
             receiver = receiverextension->object();
         }
         */
-#if(!(RUBY_VERSION_MAJOR==1 && RUBY_VERSION_MINOR==8 && RUBY_VERSION_TEENY==4))
+#if(!(RUBY_API_VERSION_MAJOR==1 && RUBY_API_VERSION_MINOR==8 && RUBY_API_VERSION_TEENY==4))
         else {
-            rb_raise(rb_eTypeError, ::QString("The argument number %1 is invalid.").arg(idx).toLatin1().constData());
+            rb_raise(rb_eTypeError, "%s", ::QString("The argument number %1 is invalid.").arg(idx).toLatin1().constData());
             return Qfalse;
         }
 #endif
@@ -462,19 +462,19 @@
         QMetaProperty property = metaobject->property( extension->d->m_properties[name] );
         if( name.endsWith('=') ) { // setter
             if(argc < 2) {
-                rb_raise(rb_eNameError, QString("Expected value-argument for \"%1\" setter.").arg(name.constData()).toLatin1().constData());
+                rb_raise(rb_eNameError, "%s", QString("Expected value-argument for \"%1\" setter.").arg(name.constData()).toLatin1().constData());
                 return Qnil;
             }
             QVariant v = RubyType<QVariant>::toVariant(argv[1]);
             if(! property.write(extension->d->m_object, v)) {
-                rb_raise(rb_eNameError, QString("Setting attribute \"%1\" failed.").arg(name.constData()).toLatin1().constData());
+                rb_raise(rb_eNameError, "%s", QString("Setting attribute \"%1\" failed.").arg(name.constData()).toLatin1().constData());
                 return Qnil;
             }
             return Qnil;
         }
         else { // getter
             if(! property.isReadable()) {
-                rb_raise(rb_eNameError, QString("Attribute \"%1\" is not readable.").arg(name.constData()).toLatin1().constData());
+                rb_raise(rb_eNameError, "%s", QString("Attribute \"%1\" is not readable.").arg(name.constData()).toLatin1().constData());
                 return Qnil;
             }
             return RubyType<QVariant>::toVALUE( property.read(extension->d->m_object) );
@@ -497,7 +497,7 @@
         return RubyExtension::toVALUE( new RubyExtension(object), true /*owner*/ );
     }
 
-    rb_raise(rb_eNameError, QString("No such method or variable \"%1\".").arg(name.constData()).toLatin1().constData());
+    rb_raise(rb_eNameError, "%s", QString("No such method or variable \"%1\".").arg(name.constData()).toLatin1().constData());
     return Qnil;
 }
 
--- kross-interpreters-4.9.2/ruby/rubyfunction.h.0000	2012-09-28 08:39:49.000000000 +0800
+++ kross-interpreters-4.9.2/ruby/rubyfunction.h	2012-11-01 15:28:14.039952777 +0800
@@ -56,7 +56,7 @@
                     m_debuginfo = QString("sender=%1 signature=%2 method=%3")
                         .arg( sender ? QString("%1 (%2)").arg(sender->objectName()).arg(sender->metaObject()->className()) : "NULL" )
                         .arg( signal.data() )
-                        .arg( STR2CSTR(rb_inspect(method)) );
+                        .arg( StringValuePtr(rb_inspect(method)) );
                     krossdebug( QString("RubyFunction Ctor %1").arg(m_debuginfo) );
                 #endif
                 rb_gc_register_address(&m_method);
@@ -80,19 +80,22 @@
             static VALUE callFunctionException(VALUE args, VALUE error)
             {
                 //#ifdef KROSS_RUBY_FUNCTION_DEBUG
+                    VALUE v_args = rb_inspect(args);
+                    VALUE v_error = rb_inspect(error);
                     krossdebug( QString("RubyFunction callFunctionException args=%1 error=%2")
-                                .arg( STR2CSTR(rb_inspect(args)) ).arg( STR2CSTR(rb_inspect(error)) ) );
+                                .arg( StringValuePtr(v_args) ).arg( StringValuePtr(v_error) ) );
                 //#else
                 //    Q_UNUSED(args);
                 //    Q_UNUSED(error);
                 //#endif
                 VALUE info = rb_gv_get("$!");
                 VALUE bt = rb_funcall(info, rb_intern("backtrace"), 0);
-                VALUE message = RARRAY(bt)->ptr[0];
-                fprintf(stderr,"%s: %s (%s)\n", STR2CSTR(message), STR2CSTR(rb_obj_as_string(info)), rb_class2name(CLASS_OF(info)));
-                for(int i = 1; i < RARRAY(bt)->len; ++i)
-                    if( TYPE(RARRAY(bt)->ptr[i]) == T_STRING )
-                        fprintf(stderr,"\tfrom %s\n", STR2CSTR(RARRAY(bt)->ptr[i]));
+                VALUE message = RARRAY_PTR(bt)[0];
+                VALUE v_info = rb_obj_as_string(info);
+                fprintf(stderr,"%s: %s (%s)\n", StringValuePtr(message), StringValuePtr(v_info), rb_class2name(CLASS_OF(info)));
+                for(int i = 1; i < RARRAY_LEN(bt); ++i)
+                    if( TYPE(RARRAY_PTR(bt)[i]) == T_STRING )
+                        fprintf(stderr,"\tfrom %s\n", StringValuePtr(RARRAY_PTR(bt)[i]));
                 //ruby_nerrs++;
                 return Qnil;
             }
@@ -105,7 +108,7 @@
             static VALUE callFunction(VALUE args)
             {
                 #ifdef KROSS_RUBY_FUNCTION_DEBUG
-                    krossdebug( QString("RubyFunction callFunction args=%1").arg(STR2CSTR(rb_inspect(args))) );
+                    krossdebug( QString("RubyFunction callFunction args=%1").arg(StringValuePtr(rb_inspect(args))) );
                 #endif
                 Q_ASSERT( TYPE(args) == T_ARRAY );
                 VALUE self = rb_ary_entry(args, 0);
@@ -116,9 +119,9 @@
                 {
                     argumentsP[idx] = rb_ary_entry(arguments, idx+1);
                 }
-                //krossdebug(QString("RubyScript::callExecute script=%1").arg(STR2CSTR( rb_inspect(script) )));
-                //krossdebug(QString("RubyScript::callExecute fileName=%1").arg(STR2CSTR( rb_inspect(fileName) )));
-                //krossdebug(QString("RubyScript::callExecute src=%1").arg(STR2CSTR( rb_inspect(src) )));
+                //krossdebug(QString("RubyScript::callExecute script=%1").arg(StringValuePtr( rb_inspect(script) )));
+                //krossdebug(QString("RubyScript::callExecute fileName=%1").arg(StringValuePtr( rb_inspect(fileName) )));
+                //krossdebug(QString("RubyScript::callExecute src=%1").arg(StringValuePtr( rb_inspect(src) )));
                 VALUE result = rb_funcall2(self, rb_intern("call"), argsize, argumentsP);
                 delete[] argumentsP;
                 return result;
@@ -198,19 +201,19 @@
                             //VALUE result = rb_funcall2(m_method, rb_intern("call"), argsize, args);
 
                             //TODO optimize
-                            ruby_in_eval++;
+                            //ruby_in_eval++
                             VALUE argarray = rb_ary_new2(3);
                             rb_ary_store(argarray, 0, m_method); //self
                             rb_ary_store(argarray, 1, INT2FIX(argsize));
                             rb_ary_store(argarray, 2, args);
                             VALUE result = rb_rescue2((VALUE(*)(...))callFunction, argarray, (VALUE(*)(...))callFunctionException, Qnil, rb_eException, 0);
-                            ruby_in_eval--;
+                            //ruby_in_eval--;
 
                             // finally set the returnvalue
                             m_tmpResult = RubyType<QVariant>::toVariant(result);
                             #ifdef KROSS_RUBY_FUNCTION_DEBUG
                                 QObject* sender = QObject::sender();
-                                krossdebug( QString("RubyFunction::qt_metacall sender.objectName=%1 sender.className=%2 result=%3 variantresult=%4").arg(sender->objectName()).arg(sender->metaObject()->className()).arg(STR2CSTR(rb_inspect(result))).arg(m_tmpResult.toString()) );
+                                krossdebug( QString("RubyFunction::qt_metacall sender.objectName=%1 sender.className=%2 result=%3 variantresult=%4").arg(sender->objectName()).arg(sender->metaObject()->className()).arg(StringValuePtr(rb_inspect(result))).arg(m_tmpResult.toString()) );
                             #endif
                             //_a[0] = Kross::MetaTypeVariant<QVariant>(d->tmpResult).toVoidStar();
                             _a[0] = &(m_tmpResult);
--- kross-interpreters-4.9.2/ruby/rubyobject.cpp.0000	2012-09-28 08:39:49.000000000 +0800
+++ kross-interpreters-4.9.2/ruby/rubyobject.cpp	2012-11-01 15:28:14.039952777 +0800
@@ -34,25 +34,26 @@
 
     VALUE info = rb_gv_get("$!");
     VALUE bt = rb_funcall(info, rb_intern("backtrace"), 0);
-    VALUE message = RARRAY(bt)->ptr[0];
+    VALUE message = RARRAY_PTR(bt)[0];
+    VALUE v_info = rb_obj_as_string(info);
 
     QString errormessage = QString("%1: %2 (%3)")
-                            .arg( STR2CSTR(message) )
-                            .arg( STR2CSTR(rb_obj_as_string(info)) )
+                            .arg( StringValuePtr(message) )
+                            .arg( StringValuePtr(v_info) )
                             .arg( rb_class2name(CLASS_OF(info)) );
     fprintf(stderr, "%s\n", errormessage.toLatin1().data());
 
     QString tracemessage;
-    for(int i = 1; i < RARRAY(bt)->len; ++i) {
-        if( TYPE(RARRAY(bt)->ptr[i]) == T_STRING ) {
-            QString s = QString("%1\n").arg( STR2CSTR(RARRAY(bt)->ptr[i]) );
+    for(int i = 1; i < RARRAY_LEN(bt); ++i) {
+        if( TYPE(RARRAY_PTR(bt)[i]) == T_STRING ) {
+            VALUE v = RARRAY_PTR(bt)[i];
+            QString s = QString("%1\n").arg( StringValuePtr(v) );
             Q_ASSERT( ! s.isNull() );
             tracemessage += s;
             fprintf(stderr, "\t%s", s.toLatin1().data());
         }
     }
 
-    ruby_nerrs++;
 /*
     VALUE rubyscriptvalue = rb_funcall(self, rb_intern("const_get"), 1, ID2SYM(rb_intern("RUBYSCRIPTOBJ")));
     RubyScript* rubyscript;
@@ -66,7 +67,8 @@
 static VALUE callFunction2(VALUE args)
 {
     #ifdef KROSS_RUBY_OBJECT_DEBUG
-        krossdebug( QString("RubyObject::callFunction2 args=%1").arg( STR2CSTR(rb_inspect(args)) ) );
+        VALUE v_args = rb_inspect(args);
+        krossdebug( QString("RubyObject::callFunction2 args=%1").arg( StringValuePtr(v_args) ) );
     #endif
     Q_ASSERT( TYPE(args) == T_ARRAY );
     VALUE self = rb_ary_entry(args, 0);
@@ -74,7 +76,7 @@
     ID functionId = rb_ary_entry(args, 1);
     VALUE arguments = rb_ary_entry(args, 2);
     Q_ASSERT( TYPE(arguments) == T_ARRAY );
-    return rb_funcall2(self, functionId, RARRAY(arguments)->len, RARRAY(arguments)->ptr);
+    return rb_funcall2(self, functionId, RARRAY_LEN(arguments), RARRAY_PTR(arguments));
 }
 
 class RubyObject::Private
@@ -104,7 +106,8 @@
     , d(new Private(object))
 {
     #ifdef KROSS_RUBY_OBJECT_DEBUG
-        d->debug = QString("type=%1 value=%2").arg(TYPE(object)).arg(STR2CSTR(rb_inspect(object)));
+        VALUE v_object = rb_inspect(object);
+        d->debug = QString("type=%1 value=%2").arg(TYPE(object)).arg(StringValuePtr(v_object));
         krossdebug( QString("RubyObject::RubyObject(const VALUE& object) constructor: %1").arg(d->debug) );
     #endif
 
@@ -112,8 +115,8 @@
     VALUE methods;
     const char* method;
     methods = rb_class_instance_methods(1, args, CLASS_OF(object));
-    for (int i = 0; i < RARRAY(methods)->len; i++) {
-        method = StringValuePtr(RARRAY(methods)->ptr[i]);
+    for (int i = 0; i < RARRAY_LEN(methods); i++) {
+        method = StringValuePtr(RARRAY_PTR(methods)[i]);
         krossdebug( QString("RubyObject::RubyObject() method=%1").arg( method ));
         d->calls << method;
     }
--- kross-interpreters-4.9.2/ruby/rubyscript.cpp.0000	2012-09-28 08:39:49.000000000 +0800
+++ kross-interpreters-4.9.2/ruby/rubyscript.cpp	2012-11-01 15:28:14.039952777 +0800
@@ -32,41 +32,40 @@
 #include <QMetaObject>
 #include <QMetaMethod>
 
-extern NODE *ruby_eval_tree;
-
 using namespace Kross;
 
 static VALUE callExecuteException(VALUE self, VALUE error)
 {
     //#ifdef KROSS_RUBY_SCRIPT_DEBUG
+        VALUE v_self = rb_inspect(self);
+        VALUE v_error = rb_inspect(error);
         krossdebug( QString("RubyScript::callExecuteException script=%1 error=%2")
-                    .arg( STR2CSTR(rb_inspect(self)) ).arg( STR2CSTR(rb_inspect(error)) ) );
+                    .arg( StringValuePtr(v_self) ).arg( StringValuePtr(v_error) ) );
     //#else
         //Q_UNUSED(error);
     //#endif
 
     VALUE info = rb_gv_get("$!");
     VALUE bt = rb_funcall(info, rb_intern("backtrace"), 0);
-    VALUE message = RARRAY(bt)->ptr[0];
+    VALUE message = RARRAY_PTR(bt)[0];
+    VALUE v_info = rb_obj_as_string(info);
 
     QString errormessage = QString("%1: %2 (%3)")
-                            .arg( STR2CSTR(message) )
-                            .arg( STR2CSTR(rb_obj_as_string(info)) )
+                            .arg( StringValuePtr(message) )
+                            .arg( StringValuePtr(v_info) )
                             .arg( rb_class2name(CLASS_OF(info)) );
     fprintf(stderr, "%s\n", errormessage.toLatin1().data());
 
     QString tracemessage;
-    for(int i = 1; i < RARRAY(bt)->len; ++i) {
-        if( TYPE(RARRAY(bt)->ptr[i]) == T_STRING ) {
-            QString s = QString("%1\n").arg( STR2CSTR(RARRAY(bt)->ptr[i]) );
+    for(int i = 1; i < RARRAY_LEN(bt); ++i) {
+        if( TYPE(RARRAY_PTR(bt)[i]) == T_STRING ) {
+            QString s = QString("%1\n").arg( StringValuePtr(RARRAY_PTR(bt)[i]) );
             Q_ASSERT( ! s.isNull() );
             tracemessage += s;
             fprintf(stderr, "\t%s", s.toLatin1().data());
         }
     }
 
-    ruby_nerrs++;
-
     VALUE rubyscriptvalue = rb_funcall(self, rb_intern("const_get"), 1, ID2SYM(rb_intern("RUBYSCRIPTOBJ")));
     RubyScript* rubyscript;
     Data_Get_Struct(rubyscriptvalue, RubyScript, rubyscript);
@@ -79,7 +78,7 @@
 static VALUE callExecute(VALUE args)
 {
     #ifdef KROSS_RUBY_SCRIPT_DEBUG
-        krossdebug( QString("RubyScript::callExecute args=%1").arg( STR2CSTR(rb_inspect(args)) ) );
+        krossdebug( QString("RubyScript::callExecute args=%1").arg( StringValuePtr(rb_inspect(args)) ) );
     #endif
     Q_ASSERT( TYPE(args) == T_ARRAY );
     VALUE self = rb_ary_entry(args, 0);
@@ -88,9 +87,9 @@
     Q_ASSERT( ! NIL_P(src) );
     VALUE fileName = rb_ary_entry(args, 2);
     Q_ASSERT( ! NIL_P(fileName) && TYPE(fileName) == T_STRING );
-    //krossdebug(QString("RubyScript::callExecute script=%1").arg(STR2CSTR( rb_inspect(script) )));
-    //krossdebug(QString("RubyScript::callExecute fileName=%1").arg(STR2CSTR( rb_inspect(fileName) )));
-    //krossdebug(QString("RubyScript::callExecute src=%1").arg(STR2CSTR( rb_inspect(src) )));
+    //krossdebug(QString("RubyScript::callExecute script=%1").arg(StringValuePtr( rb_inspect(script) )));
+    //krossdebug(QString("RubyScript::callExecute fileName=%1").arg(StringValuePtr( rb_inspect(fileName) )));
+    //krossdebug(QString("RubyScript::callExecute src=%1").arg(StringValuePtr( rb_inspect(src) )));
     return rb_funcall(self, rb_intern("module_eval"), 2, src, fileName);
 }
 
@@ -124,11 +123,11 @@
 
             const char *methodname = rb_id2name(SYM2ID(unit));
             #ifdef KROSS_RUBY_SCRIPT_METHODADDED_DEBUG
-                krossdebug(QString("RubyScriptPrivate::method_added methodname=%1 self=%2 module=%3").arg(methodname).arg(STR2CSTR( rb_inspect(self) )).arg(STR2CSTR( rb_inspect(module) )));
+                krossdebug(QString("RubyScriptPrivate::method_added methodname=%1 self=%2 module=%3").arg(methodname).arg(StringValuePtr( rb_inspect(self) )).arg(StringValuePtr( rb_inspect(module) )));
             #endif
 
             VALUE rubyscriptvalue = rb_funcall(self, rb_intern("const_get"), 1, ID2SYM(rb_intern("RUBYSCRIPTOBJ")));
-            //krossdebug(QString("RubyScriptPrivate::method_added rubyscriptvalue=%1").arg(STR2CSTR( rb_inspect(rubyscriptvalue) )));
+            //krossdebug(QString("RubyScriptPrivate::method_added rubyscriptvalue=%1").arg(StringValuePtr( rb_inspect(rubyscriptvalue) )));
 
             RubyScript* rubyscript;
             Data_Get_Struct(rubyscriptvalue, RubyScript, rubyscript);
@@ -142,7 +141,7 @@
 
                 VALUE method = rb_funcall(self, rb_intern("method"), 1, rb_str_new2(methodname));
                 #ifdef KROSS_RUBY_SCRIPT_METHODADDED_DEBUG
-                    krossdebug(QString("RubyScriptPrivate::method_added method=%1").arg(STR2CSTR( rb_inspect(method) )));
+                    krossdebug(QString("RubyScriptPrivate::method_added method=%1").arg(StringValuePtr( rb_inspect(method) )));
                 #endif
 
                 RubyFunction* function = rubyscript->connectFunction(f.first, f.second.toLatin1(), method);
@@ -173,11 +172,8 @@
             // needed to prevent infinitive loops ifour scripting call uses e.g. callFunction
             m_hasBeenSuccessFullyExecuted = true;
 
-            const int critical = rb_thread_critical;
-            rb_thread_critical = Qtrue;
-
-            ruby_nerrs = 0;
-            ruby_errinfo = Qnil;
+            VALUE mutex;
+            rb_mutex_lock(mutex);
 
             VALUE args = rb_ary_new2(3);
             rb_ary_store(args, 0, m_script); //self
@@ -192,11 +188,9 @@
             }
             */
 
-            ruby_in_eval++;
             VALUE result = rb_rescue2((VALUE(*)(...))callExecute, args, (VALUE(*)(...))callExecuteException, m_script, rb_eException, 0);
-            ruby_in_eval--;
 
-            if (ruby_nerrs != 0) {
+            if (rb_obj_is_kind_of(result, rb_eException)) {
                 //#ifdef KROSS_RUBY_SCRIPT_EXECUTE_DEBUG
                     krossdebug( QString("Compilation has failed. errorMessage=%1 errorTrace=\n%2\n").arg(q->errorMessage()).arg(q->errorTrace()) );
                 //#endif
@@ -205,11 +199,12 @@
                 m_hasBeenSuccessFullyExecuted = true;
             }
 
+
             #ifdef KROSS_RUBY_EXPLICIT_GC
                 rb_gc();
             #endif
 
-            rb_thread_critical = critical;
+            rb_mutex_unlock(mutex);
             return result;
         }
 
@@ -353,7 +348,7 @@
 static VALUE callFunction2(VALUE args)
 {
     #ifdef KROSS_RUBY_SCRIPT_DEBUG
-        krossdebug( QString("RubyScript::callFunction2 args=%1").arg( STR2CSTR(rb_inspect(args)) ) );
+        krossdebug( QString("RubyScript::callFunction2 args=%1").arg( StringValuePtr(rb_inspect(args)) ) );
     #endif
     Q_ASSERT( TYPE(args) == T_ARRAY );
     VALUE self = rb_ary_entry(args, 0);
@@ -361,7 +356,7 @@
     ID functionId = rb_ary_entry(args, 1);
     VALUE arguments = rb_ary_entry(args, 2);
     Q_ASSERT( TYPE(arguments) == T_ARRAY );
-    return rb_funcall2(self, functionId, RARRAY(arguments)->len, RARRAY(arguments)->ptr);
+    return rb_funcall2(self, functionId, RARRAY_LEN(arguments), RARRAY_PTR(arguments));
 }
 
 QVariant RubyScript::callFunction(const QString& name, const QVariantList& args)
@@ -371,10 +366,10 @@
         krossdebug( QString("RubyScript::callFunction() name=%1").arg(name) );
     #endif
 
-    const int critical = rb_thread_critical;
-    rb_thread_critical = Qtrue;
-    ruby_in_eval++;
     //ruby_current_node
+    VALUE mutex;
+    rb_mutex_lock(mutex);
+
 
     if( ! d->m_hasBeenSuccessFullyExecuted ) {
         execute();
@@ -383,11 +378,12 @@
         #ifdef KROSS_RUBY_SCRIPT_CALLFUNCTION_DEBUG
             krossdebug("RubyScript::callFunction failed");
         #endif
-        setError( QString("Failed to call function \"%1\": %2").arg(name).arg(STR2CSTR( rb_obj_as_string(ruby_errinfo) )) ); // TODO: get the error
+        VALUE v_errinfo = rb_obj_as_string(rb_errinfo());
+        setError( QString("Failed to call function \"%1\": %2").arg(name).arg(StringValuePtr( v_errinfo )) ); // TODO: get the error
     }
     else {
         //VALUE self = rb_eval_string("self");
-        //krossdebug(QString("RubyScript::callFunction() ===> %1").arg(STR2CSTR(rb_inspect(self))));
+        //krossdebug(QString("RubyScript::callFunction() ===> %1").arg(StringValuePtr(rb_inspect(self))));
 
         const int rnargs = args.size();
         VALUE *rargs = new VALUE[rnargs];
@@ -413,8 +409,7 @@
 //         rb_gc(); // This one is plainly wrong, since there is a good deal of chance that it will delete the content of result before it is used
     #endif
 
-    ruby_in_eval--;
-    rb_thread_critical = critical;
+    rb_mutex_unlock(mutex);
 
     return result;
 }
@@ -433,12 +428,13 @@
     QByteArray sendersignal = QString("2%1").arg(signature.data()).toLatin1(); //prepanding 2 means SIGNAL()
     QByteArray receiverslot = QString("1%1").arg(signature.data()).toLatin1(); //prepanding 1 means SLOT()
     if( ! QObject::connect(sender, sendersignal, function, receiverslot) ) {
-        krosswarning( QString("RubyScript::method_added failed to connect object='%1' signal='%2' method='%3'").arg(sender->objectName()).arg(signature.data()).arg(STR2CSTR(rb_inspect(method))) );
+        VALUE v_method = rb_inspect(method);
+        krosswarning( QString("RubyScript::method_added failed to connect object='%1' signal='%2' method='%3'").arg(sender->objectName()).arg(signature.data()).arg(StringValuePtr(v_method)) );
         delete function;
         return 0;
     }
     #ifdef KROSS_RUBY_SCRIPT_CONNECTFUNCTION_DEBUG
-        krossdebug( QString("RubyScript::method_added connected object='%1' signal='%2' method='%3'").arg(sender->objectName()).arg(signature.data()).arg(STR2CSTR(rb_inspect(method))) );
+        krossdebug( QString("RubyScript::method_added connected object='%1' signal='%2' method='%3'").arg(sender->objectName()).arg(signature.data()).arg(StringValuePtr(rb_inspect(method))) );
     #endif
     d->m_rubyfunctions.append( function );
     return function;
--- kross-interpreters-4.9.2/ruby/rubyvariant.cpp.0000	2012-09-28 08:39:49.000000000 +0800
+++ kross-interpreters-4.9.2/ruby/rubyvariant.cpp	2012-11-01 15:28:14.039952777 +0800
@@ -487,7 +487,7 @@
                 #endif
                 QList<void*> list;
                 if( TYPE(value) == T_ARRAY ) {
-                    for(int i = 0; i < RARRAY(value)->len; i++)
+                    for(int i = 0; i < RARRAY_LEN(value); i++)
                         if( void *ptr = VoidList::extractVoidStar(rb_ary_entry(value, i)) )
                             list << ptr;
                 }
--- kross-interpreters-4.9.2/ruby/rubyvariant.h.0000	2012-09-28 08:39:49.000000000 +0800
+++ kross-interpreters-4.9.2/ruby/rubyvariant.h	2012-11-01 15:28:14.039952777 +0800
@@ -124,7 +124,7 @@
                 case T_BIGNUM:
                     return rb_big2int(value);
                 case T_FLOAT:
-                    return (int)(RFLOAT(value)->value);
+                    return (int)(RFLOAT_VALUE(value));
                 default:
                     break;
             }
@@ -147,7 +147,7 @@
                 case T_BIGNUM:
                     return rb_big2uint(value);
                 case T_FLOAT:
-                    return (uint)(RFLOAT(value)->value);
+                    return (uint)(RFLOAT_VALUE(value));
                 default:
                     break;
             }
@@ -226,10 +226,10 @@
                 //return STR2CSTR( rb_inspect(value) );
                 return QByteArray("");
             }
-            long length = LONG2NUM( RSTRING(value)->len );
+            long length = LONG2NUM( RSTRING_LEN(value) );
             if( length < 0 )
                 return QByteArray("");
-            char* ca = rb_str2cstr(value, &length);
+            char* ca = RSTRING_PTR(StringValue(value));
             return QByteArray(ca, length);
         }
     };
@@ -246,7 +246,7 @@
                 rb_raise(rb_eTypeError, "QString must be a string");
                 return QString();
             }
-            return STR2CSTR(value);
+            return StringValuePtr(value);
         }
     };
 
@@ -261,7 +261,7 @@
             return l;
         }
         inline static QSize toVariant(VALUE value) {
-            if( TYPE(value) != T_ARRAY || RARRAY(value)->len != 2 ) {
+            if( TYPE(value) != T_ARRAY || RARRAY_LEN(value) != 2 ) {
                 rb_raise(rb_eTypeError, "QSize must be an array with 2 elements");
                 return QSize();
             }
@@ -280,7 +280,7 @@
             return l;
         }
         inline static QSizeF toVariant(VALUE value) {
-            if( TYPE(value) != T_ARRAY || RARRAY(value)->len != 2 ) {
+            if( TYPE(value) != T_ARRAY || RARRAY_LEN(value) != 2 ) {
                 rb_raise(rb_eTypeError, "QSizeF must be an array with 2 elements");
                 return QSizeF();
             }
@@ -300,7 +300,7 @@
             return l;
         }
         inline static QPoint toVariant(VALUE value) {
-            if( TYPE(value) != T_ARRAY || RARRAY(value)->len != 2 ) {
+            if( TYPE(value) != T_ARRAY || RARRAY_LEN(value) != 2 ) {
                 rb_raise(rb_eTypeError, "QPoint must be an array with 2 elements");
                 return QPoint();
             }
@@ -319,7 +319,7 @@
             return l;
         }
         inline static QPointF toVariant(VALUE value) {
-            if( TYPE(value) != T_ARRAY || RARRAY(value)->len != 2 ) {
+            if( TYPE(value) != T_ARRAY || RARRAY_LEN(value) != 2 ) {
                 rb_raise(rb_eTypeError, "QPointF must be an array with 2 elements");
                 return QPointF();
             }
@@ -340,7 +340,7 @@
             return l;
         }
         inline static QRect toVariant(VALUE value) {
-            if( TYPE(value) != T_ARRAY || RARRAY(value)->len != 4 ) {
+            if( TYPE(value) != T_ARRAY || RARRAY_LEN(value) != 4 ) {
                 rb_raise(rb_eTypeError, "QRect must be an array with 4 elements");
                 return QRect();
             }
@@ -362,7 +362,7 @@
             return l;
         }
         inline static QRectF toVariant(VALUE value) {
-            if( TYPE(value) != T_ARRAY || RARRAY(value)->len != 4 ) {
+            if( TYPE(value) != T_ARRAY || RARRAY_LEN(value) != 4 ) {
                 rb_raise(rb_eTypeError, "QRectF must be an array with 4 elements");
                 return QRectF();
             }
@@ -447,7 +447,7 @@
                 return QStringList();
             }
             QStringList l;
-            for(int i = 0; i < RARRAY(value)->len; i++)
+            for(int i = 0; i < RARRAY_LEN(value); i++)
                 l.append( RubyType<QString>::toVariant( rb_ary_entry(value, i) ) );
             return l;
         }
@@ -469,7 +469,7 @@
                 return QVariantList();
             }
             QVariantList l;
-            for(int i = 0; i < RARRAY(value)->len; i++)
+            for(int i = 0; i < RARRAY_LEN(value); i++)
                 l.append( RubyType<QVariant>::toVariant( rb_ary_entry(value, i) ) );
             return l;
         }
@@ -490,7 +490,7 @@
             QVariantMap* map; 
             Data_Get_Struct(vmap, QVariantMap, map);
             if (key != Qundef)
-                map->insert(STR2CSTR(key), RubyType<QVariant>::toVariant(value));
+                map->insert(StringValuePtr(key), RubyType<QVariant>::toVariant(value));
             return ST_CONTINUE;
         }
         inline static QVariantMap toVariant(VALUE value) {