Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Libraries
Kross Interpreters
Commits
db509111
Commit
db509111
authored
Jun 21, 2013
by
Jonathan Esk-Riddell
🏄
Browse files
BUG:243565
Fix "kross ruby doesn't compile with ruby 1.9" Patch from SuSE and Johannes Huber
parent
f31b5a9b
Changes
8
Hide whitespace changes
Inline
Side-by-side
ruby/CMakeLists.txt
View file @
db509111
find_package
(
Ruby 1.
8
QUIET
)
find_package
(
Ruby 1.
9
QUIET
)
if
(
RUBY_VERSION VERSION_GREATER
"1.
9
"
)
message
(
STATUS
"Found Ruby:
${
RUBY_EXECUTABLE
}
(found version
\"
${
RUBY_VERSION
}
\"
) but only 1.
8
.x supported"
)
if
(
RUBY_VERSION VERSION_GREATER
"1.
10
"
)
message
(
STATUS
"Found Ruby:
${
RUBY_EXECUTABLE
}
(found version
\"
${
RUBY_VERSION
}
\"
) but only 1.
9
.x supported"
)
set
(
RUBY_FOUND False
)
else
()
message
(
STATUS
"Found Ruby:
${
RUBY_EXECUTABLE
}
(found version
\"
${
RUBY_VERSION
}
\"
)"
)
endif
()
macro_log_feature
(
RUBY_FOUND
"Ruby"
"Ruby libraries"
"http://www.ruby-lang.org"
FALSE
"1.
8
.x"
"Needed to compile the Ruby bindings"
)
"Ruby"
"Ruby libraries"
"http://www.ruby-lang.org"
FALSE
"1.
9
.x"
"Needed to compile the Ruby bindings"
)
set
(
krossruby_PART_SRCS
rubyvariant.cpp
...
...
ruby/rubyconfig.h
View file @
db509111
...
...
@@ -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>
...
...
ruby/rubyextension.cpp
View file @
db509111
...
...
@@ -218,7 +218,7 @@ VALUE RubyExtension::property(int argc, VALUE *argv, VALUE self)
}
RubyExtension
*
extension
=
toExtension
(
self
);
Q_ASSERT
(
extension
);
return
RubyType
<
QVariant
>::
toVALUE
(
extension
->
d
->
m_object
->
property
(
S
TR2CSTR
(
name
))
);
return
RubyType
<
QVariant
>::
toVALUE
(
extension
->
d
->
m_object
->
property
(
S
tringValuePtr
(
name
))
);
}
VALUE
RubyExtension
::
setProperty
(
int
argc
,
VALUE
*
argv
,
VALUE
self
)
...
...
@@ -231,7 +231,7 @@ VALUE RubyExtension::setProperty(int argc, VALUE *argv, VALUE self)
}
RubyExtension
*
extension
=
toExtension
(
self
);
Q_ASSERT
(
extension
&&
extension
->
d
->
m_object
);
return
RubyType
<
bool
>::
toVALUE
(
extension
->
d
->
m_object
->
setProperty
(
S
TR2CSTR
(
name
),
RubyType
<
QVariant
>::
toVariant
(
value
))
);
return
RubyType
<
bool
>::
toVALUE
(
extension
->
d
->
m_object
->
setProperty
(
S
tringValuePtr
(
name
),
RubyType
<
QVariant
>::
toVariant
(
value
))
);
}
VALUE
RubyExtension
::
callConnect
(
int
argc
,
VALUE
*
argv
,
VALUE
self
)
...
...
@@ -291,7 +291,7 @@ VALUE RubyExtension::callConnect(int argc, VALUE *argv, VALUE self)
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,7 +308,7 @@ VALUE RubyExtension::callConnect(int argc, VALUE *argv, VALUE self)
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
());
return
Qfalse
;
...
...
ruby/rubyfunction.h
View file @
db509111
...
...
@@ -56,7 +56,7 @@ namespace Kross {
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
(
S
TR2CSTR
(
rb_inspect
(
method
))
);
.
arg
(
S
tringValuePtr
(
rb_inspect
(
method
))
);
krossdebug
(
QString
(
"RubyFunction Ctor %1"
).
arg
(
m_debuginfo
)
);
#endif
rb_gc_register_address
(
&
m_method
);
...
...
@@ -80,19 +80,22 @@ namespace Kross {
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
(
S
TR2CSTR
(
rb_inspect
(
args
)
)
).
arg
(
S
TR2CSTR
(
rb_inspect
(
error
)
)
)
);
.
arg
(
S
tringValuePtr
(
v_
args
)
).
arg
(
S
tringValuePtr
(
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
,
"
\t
from %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
,
"
\t
from %s
\n
"
,
StringValuePtr
(
RARRAY_PTR
(
bt
)[
i
]));
//ruby_nerrs++;
return
Qnil
;
}
...
...
@@ -105,7 +108,7 @@ namespace Kross {
static
VALUE
callFunction
(
VALUE
args
)
{
#ifdef KROSS_RUBY_FUNCTION_DEBUG
krossdebug
(
QString
(
"RubyFunction callFunction args=%1"
).
arg
(
S
TR2CSTR
(
rb_inspect
(
args
)))
);
krossdebug
(
QString
(
"RubyFunction callFunction args=%1"
).
arg
(
S
tringValuePtr
(
rb_inspect
(
args
)))
);
#endif
Q_ASSERT
(
TYPE
(
args
)
==
T_ARRAY
);
VALUE
self
=
rb_ary_entry
(
args
,
0
);
...
...
@@ -116,9 +119,9 @@ namespace Kross {
{
argumentsP
[
idx
]
=
rb_ary_entry
(
arguments
,
idx
+
1
);
}
//krossdebug(QString("RubyScript::callExecute script=%1").arg(S
TR2CSTR
( rb_inspect(script) )));
//krossdebug(QString("RubyScript::callExecute fileName=%1").arg(S
TR2CSTR
( rb_inspect(fileName) )));
//krossdebug(QString("RubyScript::callExecute src=%1").arg(S
TR2CSTR
( rb_inspect(src) )));
//krossdebug(QString("RubyScript::callExecute script=%1").arg(S
tringValuePtr
( rb_inspect(script) )));
//krossdebug(QString("RubyScript::callExecute fileName=%1").arg(S
tringValuePtr
( rb_inspect(fileName) )));
//krossdebug(QString("RubyScript::callExecute src=%1").arg(S
tringValuePtr
( rb_inspect(src) )));
VALUE
result
=
rb_funcall2
(
self
,
rb_intern
(
"call"
),
argsize
,
argumentsP
);
delete
[]
argumentsP
;
return
result
;
...
...
@@ -198,19 +201,19 @@ namespace Kross {
//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
(
S
TR2CSTR
(
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
(
S
tringValuePtr
(
rb_inspect
(
result
))).
arg
(
m_tmpResult
.
toString
())
);
#endif
//_a[0] = Kross::MetaTypeVariant<QVariant>(d->tmpResult).toVoidStar();
_a
[
0
]
=
&
(
m_tmpResult
);
...
...
ruby/rubyobject.cpp
View file @
db509111
...
...
@@ -34,25 +34,26 @@ static VALUE callExecuteException(VALUE self, VALUE error)
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
(
S
TR2CSTR
(
message
)
)
.
arg
(
S
TR2CSTR
(
rb_obj_as_string
(
info
)
)
)
.
arg
(
S
tringValuePtr
(
message
)
)
.
arg
(
S
tringValuePtr
(
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 callExecuteException(VALUE self, VALUE error)
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 @@ static VALUE callFunction2(VALUE args)
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 @@ RubyObject::RubyObject(const VALUE& object)
,
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 @@ RubyObject::RubyObject(const VALUE& object)
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
;
}
...
...
ruby/rubyscript.cpp
View file @
db509111
...
...
@@ -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
(
S
TR2CSTR
(
rb_inspect
(
self
)
)
).
arg
(
S
TR2CSTR
(
rb_inspect
(
error
)
)
)
);
.
arg
(
S
tringValuePtr
(
v_
self
)
).
arg
(
S
tringValuePtr
(
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
(
S
TR2CSTR
(
message
)
)
.
arg
(
S
TR2CSTR
(
rb_obj_as_string
(
info
)
)
)
.
arg
(
S
tringValuePtr
(
message
)
)
.
arg
(
S
tringValuePtr
(
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
(
S
TR2CSTR
(
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
(
S
tringValuePtr
(
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 callExecuteException(VALUE self, VALUE error)
static
VALUE
callExecute
(
VALUE
args
)
{
#ifdef KROSS_RUBY_SCRIPT_DEBUG
krossdebug
(
QString
(
"RubyScript::callExecute args=%1"
).
arg
(
S
TR2CSTR
(
rb_inspect
(
args
))
)
);
krossdebug
(
QString
(
"RubyScript::callExecute args=%1"
).
arg
(
S
tringValuePtr
(
rb_inspect
(
args
))
)
);
#endif
Q_ASSERT
(
TYPE
(
args
)
==
T_ARRAY
);
VALUE
self
=
rb_ary_entry
(
args
,
0
);
...
...
@@ -88,9 +87,9 @@ static VALUE callExecute(VALUE args)
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(S
TR2CSTR
( rb_inspect(script) )));
//krossdebug(QString("RubyScript::callExecute fileName=%1").arg(S
TR2CSTR
( rb_inspect(fileName) )));
//krossdebug(QString("RubyScript::callExecute src=%1").arg(S
TR2CSTR
( rb_inspect(src) )));
//krossdebug(QString("RubyScript::callExecute script=%1").arg(S
tringValuePtr
( rb_inspect(script) )));
//krossdebug(QString("RubyScript::callExecute fileName=%1").arg(S
tringValuePtr
( rb_inspect(fileName) )));
//krossdebug(QString("RubyScript::callExecute src=%1").arg(S
tringValuePtr
( rb_inspect(src) )));
return
rb_funcall
(
self
,
rb_intern
(
"module_eval"
),
2
,
src
,
fileName
);
}
...
...
@@ -124,11 +123,11 @@ namespace Kross {
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
(
S
TR2CSTR
(
rb_inspect
(
self
)
)).
arg
(
S
TR2CSTR
(
rb_inspect
(
module
)
)));
krossdebug
(
QString
(
"RubyScriptPrivate::method_added methodname=%1 self=%2 module=%3"
).
arg
(
methodname
).
arg
(
S
tringValuePtr
(
rb_inspect
(
self
)
)).
arg
(
S
tringValuePtr
(
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(S
TR2CSTR
( rb_inspect(rubyscriptvalue) )));
//krossdebug(QString("RubyScriptPrivate::method_added rubyscriptvalue=%1").arg(S
tringValuePtr
( rb_inspect(rubyscriptvalue) )));
RubyScript
*
rubyscript
;
Data_Get_Struct
(
rubyscriptvalue
,
RubyScript
,
rubyscript
);
...
...
@@ -142,7 +141,7 @@ namespace Kross {
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
(
S
TR2CSTR
(
rb_inspect
(
method
)
)));
krossdebug
(
QString
(
"RubyScriptPrivate::method_added method=%1"
).
arg
(
S
tringValuePtr
(
rb_inspect
(
method
)
)));
#endif
RubyFunction
*
function
=
rubyscript
->
connectFunction
(
f
.
first
,
f
.
second
.
toLatin1
(),
method
);
...
...
@@ -173,11 +172,8 @@ namespace Kross {
// 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 @@ namespace Kross {
}
*/
ruby_in_eval
++
;
VALUE
result
=
rb_rescue2
((
VALUE
(
*
)(...))
callExecute
,
args
,
(
VALUE
(
*
)(...))
callExecuteException
,
m_script
,
rb_eException
,
0
);
ruby_in_eval
--
;
if
(
r
uby_nerrs
!=
0
)
{
if
(
r
b_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 @@ namespace Kross {
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 @@ QStringList RubyScript::functionNames()
static
VALUE
callFunction2
(
VALUE
args
)
{
#ifdef KROSS_RUBY_SCRIPT_DEBUG
krossdebug
(
QString
(
"RubyScript::callFunction2 args=%1"
).
arg
(
S
TR2CSTR
(
rb_inspect
(
args
))
)
);
krossdebug
(
QString
(
"RubyScript::callFunction2 args=%1"
).
arg
(
S
tringValuePtr
(
rb_inspect
(
args
))
)
);
#endif
Q_ASSERT
(
TYPE
(
args
)
==
T_ARRAY
);
VALUE
self
=
rb_ary_entry
(
args
,
0
);
...
...
@@ -361,7 +356,7 @@ static VALUE callFunction2(VALUE args)
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 @@ QVariant RubyScript::callFunction(const QString& name, const QVariantList& args)
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 @@ QVariant RubyScript::callFunction(const QString& name, const QVariantList& args)
#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(S
TR2CSTR
(rb_inspect(self))));
//krossdebug(QString("RubyScript::callFunction() ===> %1").arg(S
tringValuePtr
(rb_inspect(self))));
const
int
rnargs
=
args
.
size
();
VALUE
*
rargs
=
new
VALUE
[
rnargs
];
...
...
@@ -413,8 +409,7 @@ QVariant RubyScript::callFunction(const QString& name, const QVariantList& args)
// 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 @@ RubyFunction* RubyScript::connectFunction(QObject* sender, const QByteArray& sig
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
(
S
TR2CSTR
(
rb_inspect
(
method
)))
);
krossdebug
(
QString
(
"RubyScript::method_added connected object='%1' signal='%2' method='%3'"
).
arg
(
sender
->
objectName
()).
arg
(
signature
.
data
()).
arg
(
S
tringValuePtr
(
rb_inspect
(
method
)))
);
#endif
d
->
m_rubyfunctions
.
append
(
function
);
return
function
;
...
...
ruby/rubyvariant.cpp
View file @
db509111
...
...
@@ -487,7 +487,7 @@ MetaType* RubyMetaTypeFactory::create(const char* typeName, int typeId, int meta
#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
;
}
...
...
ruby/rubyvariant.h
View file @
db509111
...
...
@@ -124,7 +124,7 @@ namespace Kross {
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 @@ namespace Kross {
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 @@ namespace Kross {
//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 @@ namespace Kross {
rb_raise
(
rb_eTypeError
,
"QString must be a string"
);
return
QString
();
}
return
S
TR2CSTR
(
value
);
return
S
tringValuePtr
(
value
);
}
};
...
...
@@ -261,7 +261,7 @@ namespace Kross {
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 @@ namespace Kross {
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 @@ namespace Kross {
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 @@ namespace Kross {
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 @@ namespace Kross {
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 @@ namespace Kross {
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 @@ namespace Kross {
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 @@ namespace Kross {
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 @@ namespace Kross {
QVariantMap
*
map
;
Data_Get_Struct
(
vmap
,
QVariantMap
,
map
);
if
(
key
!=
Qundef
)
map
->
insert
(
S
TR2CSTR
(
key
),
RubyType
<
QVariant
>::
toVariant
(
value
));
map
->
insert
(
S
tringValuePtr
(
key
),
RubyType
<
QVariant
>::
toVariant
(
value
));
return
ST_CONTINUE
;
}
inline
static
QVariantMap
toVariant
(
VALUE
value
)
{
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment