yarv-diff:320
From: ko1 atdot.net
Date: 11 Apr 2006 02:31:22 -0000
Subject: [yarv-diff:320] r485 - in trunk: . rb
Author: ko1
Date: 2006-04-11 11:31:21 +0900 (Tue, 11 Apr 2006)
New Revision: 485
Modified:
trunk/
trunk/ChangeLog
trunk/compile.c
trunk/rb/yasm.rb
trunk/yarvcore.c
Log:
r748@lermite: ko1 | 2006-04-09 03:05:39 +0900
* compile.c : change to accept method iseq object when loading from
simple data
* yarvcore.c : add a debug output
* rb/yasm.rb : change some interfaces
Property changes on: trunk
___________________________________________________________________
Name: svk:merge
- 81cd9672-7512-7e48-ae48-6936450e977d:/local/yarv/trunk:747
+ 81cd9672-7512-7e48-ae48-6936450e977d:/local/yarv/trunk:748
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog 2006-04-11 02:30:45 UTC (rev 484)
+++ trunk/ChangeLog 2006-04-11 02:31:21 UTC (rev 485)
@@ -4,6 +4,16 @@
# from Mon, 03 May 2004 01:24:19 +0900
#
+2006-04-09(Sun) 03:04:04 +0900 Koichi Sasada <ko1 atdot.net>
+
+ * compile.c : change to accept method iseq object when loading from
+ simple data
+
+ * yarvcore.c : add a debug output
+
+ * rb/yasm.rb : change some interfaces
+
+
2006-04-07(Fri) 20:25:03 +0900 Koichi Sasada <ko1 atdot.net>
* compile.c : fix miss about range of catch "next"
Modified: trunk/compile.c
===================================================================
--- trunk/compile.c 2006-04-11 02:30:45 UTC (rev 484)
+++ trunk/compile.c 2006-04-11 02:31:21 UTC (rev 485)
@@ -4633,8 +4633,18 @@
case TS_ISEQ:
{
if (op != Qnil) {
- argv[j] =
- iseq_load_simpledata(0, op, iseq->self);
+ if (TYPE(op) == T_ARRAY) {
+ argv[j] =
+ iseq_load_simpledata(0, op, iseq->self);
+ }
+ else if (CLASS_OF(op) == cYarvISeq) {
+ yarv_iseq_t *iseq;
+ argv[j] = op;
+ }
+ else {
+ /* TODO: exception */
+ rb_bug("not an iseq");
+ }
}
else {
argv[j] = 0;
Modified: trunk/rb/yasm.rb
===================================================================
--- trunk/rb/yasm.rb 2006-04-11 02:30:45 UTC (rev 484)
+++ trunk/rb/yasm.rb 2006-04-11 02:31:21 UTC (rev 485)
@@ -8,25 +8,51 @@
module YARVCore
class Assembler
+ def self.simpledata_to_iseq sd
+ YARVCore::InstructionSequence.load_simpledata sd
+ end
+
def self.toplevel vars = [], &b
- sdb = SimpleDataBuilder.new(
- :toplevel, "<toplevel@yasm>", "<yasm>",
- [], vars, [nil], nil
- )
- sdb.instance_eval(&b)
- sdb
+ simpledata_to_iseq SimpleDataBuilder.toplevel(vars, &b)
end
def self.method name, args = [], vars = [], &b
- sdb = SimpleDataBuilder.new(
- :method, name, "TODO: filename",
- args, vars, [nil], nil
- )
- sdb.instance_eval(&b)
- sdb
+ simpledata_to_iseq SimpleDataBuilder.method(name, args, vars, &b)
end
+
+ def self.class name, vars = [], &b
+ simpledata_to_iseq SimpleDataBuilder.class(name, vars = [], &b)
+ end
class SimpleDataBuilder
+
+ def self.toplevel vars, &b
+ sdb = SimpleDataBuilder.new(
+ :toplevel, "<toplevel@yasm>", "<yasm>",
+ [], vars, [nil], nil
+ )
+ sdb.instance_eval(&b)
+ sdb.to_simpledata
+ end
+
+ def self.method name, args = [], vars = [], &b
+ sdb = SimpleDataBuilder.new(
+ :method, name, "TODO: filename",
+ args, vars, [nil], nil
+ )
+ sdb.instance_eval(&b)
+ sdb.to_simpledata
+ end
+
+ def self.class name, vars = [], &b
+ sdb = SimpleDataBuilder.new(
+ :method, name, "TODO: filename",
+ args, vars, [nil], nil
+ )
+ sdb.instance_eval(&b)
+ sdb.to_simpledata
+ end
+
def initialize type, name, filename, args, vars, lopt, parent
@type = type
@name = name
@@ -54,10 +80,6 @@
@type, @args, @vars, @exception, @body]
end
- def to_iseq
- YARVCore::InstructionSequence.load_simpledata(self.to_simpledata)
- end
-
def method name, args=[], vars=[], &b
YASM.method(name, args, vars, &b).to_simpledata
end
@@ -144,7 +166,6 @@
YASM = YARVCore::Assembler
-
if __FILE__ == $0
#
@@ -153,7 +174,7 @@
######################################################
-result = YASM.toplevel([:a, :b]){
+iseq = YASM.toplevel([:a, :b]){
#
# a = 10
# b = 20
@@ -179,20 +200,17 @@
}
leave
}
-data = result.to_simpledata
-iseq = result.to_iseq
-
-p data
+p iseq
iseq.eval #=> 30
###########################################################
#
-# def m1(a, b)
+# def show_args(a, b)
# p [a, b]
# end
# =>
-m1 = YASM.method(:m1, [:a, :b]){
+m_show_args = YASM.method(:show_args, [:a, :b]){
putself
getlocal :a
getlocal :b
@@ -202,14 +220,14 @@
}
#
-# def m3(a) # abs
+# def abs(a)
# if a > 0
# a
# else
# -a
# end
# end
-m3 = YASM.method(:m3, [:a]){
+m_abs = YASM.method(:abs, [:a]){
getlocal :a
putobject 0
send :>, 1
@@ -218,42 +236,37 @@
jump :label_end
_ :label_else
getlocal :a
- send :+@, 0
+ send :-@, 0
_ :label_end
leave
}
#
-# def m5(a)
-# b = a * 2
-# end
-m5 = YASM.method(:m5, [:a], [:b]){
- getlocal :a
- putobject 2
- send :*, 1
- dup
- setlocal :b
- leave
-}
-
-
-#
-# def m1(...); ...; end
-#
-# m1(1, 2)
+# def show_args(...) ... end
+# def abs(a) ... end
+# show_args(1, -1)
# =>
top = YASM.toplevel{
putnil
- definemethod(:m1, m1.to_simpledata)
+ definemethod(:show_args, m_show_args)
+ putnil
+ definemethod(:abs, m_abs)
putself
- putobject 1
- putobject 2
- call :m1, 2
+ # abs(1)
+ putself
+ putobject 1
+ call :abs, 1
+ # abs(-1)
+ putself
+ putobject -1
+ call :abs, 1
+ # show_args(...)
+ call :show_args, 2
leave
}
#=> run
-top.to_iseq.eval
+top.eval
###########################################################
end
Modified: trunk/yarvcore.c
===================================================================
--- trunk/yarvcore.c 2006-04-11 02:30:45 UTC (rev 484)
+++ trunk/yarvcore.c 2006-04-11 02:31:21 UTC (rev 485)
@@ -516,6 +516,7 @@
if (st_lookup(type_map,
type, &iseq_type) == 0) {
+ dp(type);
rb_raise(rb_eTypeError, "unsupport type: %p", type);
}
--
ML: yarv-diff quickml.atdot.net
Info: http://www.atdot.net/~ko1/quickml