[前][次][番号順一覧][スレッド一覧][生データ]

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

[前][次][番号順一覧][スレッド一覧][生データ]