yarv-diff:321
From: ko1 atdot.net
Date: 11 Apr 2006 02:31:51 -0000
Subject: [yarv-diff:321] r486 - in trunk: . lib rb
Author: ko1
Date: 2006-04-11 11:31:50 +0900 (Tue, 11 Apr 2006)
New Revision: 486
Added:
trunk/lib/yasm.rb
Removed:
trunk/rb/yasm.rb
Modified:
trunk/
trunk/ChangeLog
Log:
r749@lermite: ko1 | 2006-04-11 11:27:46 +0900
* rb/yasm.rb : move to lib/yasm.rb
Property changes on: trunk
___________________________________________________________________
Name: svk:merge
- 81cd9672-7512-7e48-ae48-6936450e977d:/local/yarv/trunk:748
+ 81cd9672-7512-7e48-ae48-6936450e977d:/local/yarv/trunk:749
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog 2006-04-11 02:31:21 UTC (rev 485)
+++ trunk/ChangeLog 2006-04-11 02:31:50 UTC (rev 486)
@@ -4,6 +4,11 @@
# from Mon, 03 May 2004 01:24:19 +0900
#
+2006-04-11(Tue) 11:26:53 +0900 Koichi Sasada <ko1 atdot.net>
+
+ * rb/yasm.rb : move to lib/yasm.rb
+
+
2006-04-09(Sun) 03:04:04 +0900 Koichi Sasada <ko1 atdot.net>
* compile.c : change to accept method iseq object when loading from
Added: trunk/lib/yasm.rb
===================================================================
--- trunk/lib/yasm.rb 2006-04-11 02:31:21 UTC (rev 485)
+++ trunk/lib/yasm.rb 2006-04-11 02:31:50 UTC (rev 486)
@@ -0,0 +1,272 @@
+#
+# YASM: YARV Assembler
+#
+# Usage: See examples on the end of this file.
+#
+
+require 'yasmdata'
+
+module YARVCore
+ class Assembler
+ def self.simpledata_to_iseq sd
+ YARVCore::InstructionSequence.load_simpledata sd
+ end
+
+ def self.toplevel vars = [], &b
+ simpledata_to_iseq SimpleDataBuilder.toplevel(vars, &b)
+ end
+
+ def self.method name, args = [], vars = [], &b
+ 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
+ @filename = filename
+ @args = args || []
+ @vars = vars || []
+ @locals = args + vars + lopt
+ @line = []
+ @body = []
+ @exception = []
+ @parent_sdb = parent
+ @local_sdb = parent ? parent.local_sdb : self
+ end
+
+ attr_reader :body
+ attr_reader :locals
+ attr_reader :local_sdb, :parent_sdb
+
+ def to_simpledata
+ # [magic, major_version, minor_version, format_type, misc,
+ # name, filename, line,
+ # type, args, vars, exception_table, body]
+ ['YARVInstructionSimpledataFormat', 1, 1, 1, nil,
+ @name, @filename, @line,
+ @type, @args, @vars, @exception, @body]
+ end
+
+ def method name, args=[], vars=[], &b
+ YASM.method(name, args, vars, &b).to_simpledata
+ end
+
+ def block args=[], vars=[], &b
+ sdb = SimpleDataBuilder.new(
+ :block, "block", "TODO: filename",
+ args, vars, [], self
+ )
+ sdb.instance_eval(&b)
+ sdb.to_simpledata
+ end
+
+ # label
+
+ def label sym
+ raise "Label must be Symbol, but #{sym.class}" unless Symbol === sym
+ @body << sym
+ end
+
+ alias _ label
+ alias l label
+
+ YARVCore::InstructionSequence::Instruction::InsnID2NO.each_key{|insn|
+ define_method(insn){|*ops|
+ @body << [insn, *ops]
+ }
+ }
+
+ # support instructions
+
+ def send id, argc, block = nil, flag = 0
+ @body << [:send, id, argc, block, flag, nil]
+ end
+
+ def call id, argc, block = nil
+ @body << [:send, id, argc, block, 0x04, nil]
+ end
+
+ def sym2lidx sym
+ raise unless @locals.index(sym)
+ @local_sdb.locals.size - @local_sdb.locals.index(sym)
+ end
+
+ def setlocal sym
+ @body << [:setlocal, sym2lidx(sym)]
+ end
+
+ def getlocal sym
+ @body << [:getlocal, sym2lidx(sym)]
+ end
+
+ def sym2didx sym
+ sdb = self
+ level = 0
+ while sdb
+ if idx = sdb.locals.index(sym)
+ return [sdb.locals.size - idx, level]
+ end
+ level += 1
+ sdb = sdb.parent_sdb
+ end
+ raise "unknown local dynamic variable: #{sym}"
+ end
+
+ def getdynamic sym
+ @body << [:getdynamic, *sym2didx(sym)]
+ end
+
+ def setdynamic sym
+ @body << [:setdynamic, *sym2didx(sym)]
+ end
+
+ def definemethod name, method
+ @body << [:definemethod, name, method, 0]
+ end
+
+ def definesingletonmethod name, method
+ @body << [:definemethod, name, method, 1]
+ end
+ end
+ end
+end
+
+YASM = YARVCore::Assembler
+
+if __FILE__ == $0
+
+#
+# samples
+#
+
+######################################################
+
+iseq = YASM.toplevel([:a, :b]){
+ #
+ # a = 10
+ # b = 20
+ # p(a+b)
+ # 3.times{|i| p i}
+ #
+ putobject 10
+ setlocal :a
+ putobject 20
+ setlocal :b
+ putself
+ getlocal :a
+ getlocal :b
+ send :+, 1
+ call :p, 1 # call means send with flags 4
+ pop
+ putobject 3
+ send :times, 0, block([:i]){
+ putself
+ getdynamic :i
+ call :p, 1
+ leave
+ }
+ leave
+}
+p iseq
+iseq.eval #=> 30
+
+###########################################################
+
+#
+# def show_args(a, b)
+# p [a, b]
+# end
+# =>
+m_show_args = YASM.method(:show_args, [:a, :b]){
+ putself
+ getlocal :a
+ getlocal :b
+ newarray 2
+ call :p, 1
+ leave
+}
+
+#
+# def abs(a)
+# if a > 0
+# a
+# else
+# -a
+# end
+# end
+m_abs = YASM.method(:abs, [:a]){
+ getlocal :a
+ putobject 0
+ send :>, 1
+ branchunless :label_else
+ getlocal :a
+ jump :label_end
+_ :label_else
+ getlocal :a
+ send :-@, 0
+_ :label_end
+ leave
+}
+
+#
+# def show_args(...) ... end
+# def abs(a) ... end
+# show_args(1, -1)
+# =>
+top = YASM.toplevel{
+ putnil
+ definemethod(:show_args, m_show_args)
+ putnil
+ definemethod(:abs, m_abs)
+ putself
+ # 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.eval
+
+###########################################################
+end
Deleted: trunk/rb/yasm.rb
===================================================================
--- trunk/rb/yasm.rb 2006-04-11 02:31:21 UTC (rev 485)
+++ trunk/rb/yasm.rb 2006-04-11 02:31:50 UTC (rev 486)
@@ -1,272 +0,0 @@
-#
-# YASM: YARV Assembler
-#
-# Usage: See examples on the end of this file.
-#
-
-require 'yasmdata'
-
-module YARVCore
- class Assembler
- def self.simpledata_to_iseq sd
- YARVCore::InstructionSequence.load_simpledata sd
- end
-
- def self.toplevel vars = [], &b
- simpledata_to_iseq SimpleDataBuilder.toplevel(vars, &b)
- end
-
- def self.method name, args = [], vars = [], &b
- 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
- @filename = filename
- @args = args || []
- @vars = vars || []
- @locals = args + vars + lopt
- @line = []
- @body = []
- @exception = []
- @parent_sdb = parent
- @local_sdb = parent ? parent.local_sdb : self
- end
-
- attr_reader :body
- attr_reader :locals
- attr_reader :local_sdb, :parent_sdb
-
- def to_simpledata
- # [magic, major_version, minor_version, format_type, misc,
- # name, filename, line,
- # type, args, vars, exception_table, body]
- ['YARVInstructionSimpledataFormat', 1, 1, 1, nil,
- @name, @filename, @line,
- @type, @args, @vars, @exception, @body]
- end
-
- def method name, args=[], vars=[], &b
- YASM.method(name, args, vars, &b).to_simpledata
- end
-
- def block args=[], vars=[], &b
- sdb = SimpleDataBuilder.new(
- :block, "block", "TODO: filename",
- args, vars, [], self
- )
- sdb.instance_eval(&b)
- sdb.to_simpledata
- end
-
- # label
-
- def label sym
- raise "Label must be Symbol, but #{sym.class}" unless Symbol === sym
- @body << sym
- end
-
- alias _ label
- alias l label
-
- YARVCore::InstructionSequence::Instruction::InsnID2NO.each_key{|insn|
- define_method(insn){|*ops|
- @body << [insn, *ops]
- }
- }
-
- # support instructions
-
- def send id, argc, block = nil, flag = 0
- @body << [:send, id, argc, block, flag, nil]
- end
-
- def call id, argc, block = nil
- @body << [:send, id, argc, block, 0x04, nil]
- end
-
- def sym2lidx sym
- raise unless @locals.index(sym)
- @local_sdb.locals.size - @local_sdb.locals.index(sym)
- end
-
- def setlocal sym
- @body << [:setlocal, sym2lidx(sym)]
- end
-
- def getlocal sym
- @body << [:getlocal, sym2lidx(sym)]
- end
-
- def sym2didx sym
- sdb = self
- level = 0
- while sdb
- if idx = sdb.locals.index(sym)
- return [sdb.locals.size - idx, level]
- end
- level += 1
- sdb = sdb.parent_sdb
- end
- raise "unknown local dynamic variable: #{sym}"
- end
-
- def getdynamic sym
- @body << [:getdynamic, *sym2didx(sym)]
- end
-
- def setdynamic sym
- @body << [:setdynamic, *sym2didx(sym)]
- end
-
- def definemethod name, method
- @body << [:definemethod, name, method, 0]
- end
-
- def definesingletonmethod name, method
- @body << [:definemethod, name, method, 1]
- end
- end
- end
-end
-
-YASM = YARVCore::Assembler
-
-if __FILE__ == $0
-
-#
-# samples
-#
-
-######################################################
-
-iseq = YASM.toplevel([:a, :b]){
- #
- # a = 10
- # b = 20
- # p(a+b)
- # 3.times{|i| p i}
- #
- putobject 10
- setlocal :a
- putobject 20
- setlocal :b
- putself
- getlocal :a
- getlocal :b
- send :+, 1
- call :p, 1 # call means send with flags 4
- pop
- putobject 3
- send :times, 0, block([:i]){
- putself
- getdynamic :i
- call :p, 1
- leave
- }
- leave
-}
-p iseq
-iseq.eval #=> 30
-
-###########################################################
-
-#
-# def show_args(a, b)
-# p [a, b]
-# end
-# =>
-m_show_args = YASM.method(:show_args, [:a, :b]){
- putself
- getlocal :a
- getlocal :b
- newarray 2
- call :p, 1
- leave
-}
-
-#
-# def abs(a)
-# if a > 0
-# a
-# else
-# -a
-# end
-# end
-m_abs = YASM.method(:abs, [:a]){
- getlocal :a
- putobject 0
- send :>, 1
- branchunless :label_else
- getlocal :a
- jump :label_end
-_ :label_else
- getlocal :a
- send :-@, 0
-_ :label_end
- leave
-}
-
-#
-# def show_args(...) ... end
-# def abs(a) ... end
-# show_args(1, -1)
-# =>
-top = YASM.toplevel{
- putnil
- definemethod(:show_args, m_show_args)
- putnil
- definemethod(:abs, m_abs)
- putself
- # 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.eval
-
-###########################################################
-end
--
ML: yarv-diff quickml.atdot.net
Info: http://www.atdot.net/~ko1/quickml