asmrb 0.0.2.1 → 0.0.2.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/asmrb.rb +53 -49
  3. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f3068def65f664536adb24c11b82d0b7e63d6a85
4
- data.tar.gz: 33f463277925245b25ef4f62fa78e4188c27b1c7
3
+ metadata.gz: c8b8ea4a6ef9586d90b45b4fbea0d27c3fe25d2c
4
+ data.tar.gz: 457793531698daf895a1f3b878a437570fce2b51
5
5
  SHA512:
6
- metadata.gz: 3382c649f7a80fa31f28570003e5b56beaf8cc6c016bd3a94249cf1ffcc720d6d9b6622a9b5a1f44c4ec2c7acc17b4615846a42d71b369951d51ec3fce8d48ae
7
- data.tar.gz: dfb30e2a85d3e595b34d36f4df32355946876811a7fd9bbdbad8976df6b8f3abd2d7c3fdcd97d19f358bfb1389413b4dc326dbca3a290e83dc588cdc1449ffe9
6
+ metadata.gz: 57207355602fa8b5440d45d64de9e62644e2b3e30ec3f97458b98858ea7698a31ec814289e4fa88a2b8ddf05c7ef2d565c34f9d618c4563f90898d9382a1844f
7
+ data.tar.gz: 3b82fb7f49b70dc03be8adbd223d7dd253522d1ab1f2a90a55eae70063244a7e947677c6d48ed04a52ef9e31cea8285fd69a7ab1484e2e2af594d61b6c4ce333
data/lib/asmrb.rb CHANGED
@@ -2,7 +2,35 @@ require 'benchmark'
2
2
  require 'colorize'
3
3
  require 'pry'
4
4
 
5
+ # You can make an instruction-based function with high level ruby by this Asm class.
5
6
  class Asm
7
+ # Sample with recursion:
8
+ #
9
+ # Asm.new do
10
+ # defn :rec_print # define a function, also a label to jump.
11
+ # arg arr # arguments
12
+ # len arr # get length of arr as array
13
+ # pop l # get value to l variable
14
+ # cmp l , 0 # is l > 0 ?
15
+ # jge :print # then jump to :print block
16
+ # jmp :exit # else, jump to :exit block
17
+ # label :print # start of :print
18
+ # car arr # get out first element of arr
19
+ # call :puts # call ruby's puts
20
+ # cdr arr # get rest of arr Array
21
+ # jmp :rec_print # jump back to :rec_print ( or start of this function )
22
+ # label :exit # ending label.
23
+ # end
24
+ # => $rec_print
25
+ #
26
+ # debug:
27
+ # => $rec_print.is_debug = true
28
+ #
29
+ # calling:
30
+ # => $rec_print.invoke [1,2,3]
31
+ #
32
+ #
33
+
6
34
  attr_reader :variables, :stack, :name, :is_debug, :result, :functions, :params
7
35
  attr_writer :is_debug
8
36
 
@@ -12,10 +40,6 @@ class Asm
12
40
  assemble &block
13
41
  end
14
42
 
15
- def export
16
-
17
- end
18
-
19
43
  def new_scope
20
44
  @variables = {}
21
45
  @program = []
@@ -27,20 +51,33 @@ class Asm
27
51
  @name = "it"
28
52
  end
29
53
 
30
- def new_var(dest)
31
- eval("def #{dest}; #{@variables[dest]}; end")
32
- end
33
-
34
54
  def refvar(val)
35
55
  val.is_a?(Symbol) ? @variables[val] : val
36
56
  end
37
57
 
58
+ def req_type(f,types)
59
+ s = types.is_a?(Array) ? types.join(', ') : types
60
+ raise Exception.new "[#{f}] got problem with #{lst}. need to be #{s}."
61
+ end
62
+
38
63
  def req_args(func,amount)
39
64
  raise Exception.new "[#{func}]: require #{amount} args to compare." if @stack.length < amount
40
65
  end
41
66
 
42
67
  OPS = {
43
68
 
69
+ "len" => lambda { | lst |
70
+ @stack.push @variables[lst].length
71
+ },
72
+
73
+ "cdr" => lambda { | lst |
74
+ @stack.push @variables[lst].drop(@variables[lst].first)
75
+ },
76
+
77
+ "car" => lambda { | lst |
78
+ @stack.push @variables[lst].first
79
+ },
80
+
44
81
  "rdu" => lambda { | ops |
45
82
  e = eval "@stack.reduce(:#{ops})"
46
83
  @stack.push e
@@ -107,7 +144,6 @@ class Asm
107
144
 
108
145
  "pop" => lambda {|val|
109
146
  @variables[val] = @stack.pop
110
- #new_var val
111
147
  },
112
148
 
113
149
  "push" => lambda {|src|
@@ -131,7 +167,7 @@ class Asm
131
167
 
132
168
  "dbg" => lambda {
133
169
  puts "#{@stack} > #{@program[@pc][0]}".light_green
134
- binding.pry
170
+ binding.pry if @is_debug
135
171
  },
136
172
 
137
173
  "func" => lambda {|name|
@@ -156,15 +192,15 @@ class Asm
156
192
  #binding.pry
157
193
  },
158
194
 
159
- "ivok" => lambda { |obj, f |
160
- req_args "ivok",1 # obj.send(:func, args)
161
- args = @stack.pop # should be [ 1, 2, 3 ]
162
- result = @variables[obj].send(f, args)
195
+ "ivok" => lambda { |obj, f , n|
196
+ req_args "ivok",n # obj.send(:func, args)
197
+ args = []
198
+ n.times { args << @stack.pop } if n > 0
199
+ result = @variables[obj].send(f, eval("args.join(', ')"))
163
200
  @stack.push result
164
201
  },
165
202
 
166
203
  "call" => lambda {|fname|
167
- #binding.pry
168
204
  _method = method(fname)
169
205
  if _method.parameters.length > 0
170
206
  args = []
@@ -175,7 +211,6 @@ class Asm
175
211
  else
176
212
  invoke = _method.call
177
213
  end
178
- #binding.pry
179
214
  @stack.push invoke if !invoke.nil?
180
215
  },
181
216
 
@@ -279,7 +314,6 @@ class Asm
279
314
 
280
315
  # ranging...
281
316
  (debug_start..debug_end).each do | i |
282
-
283
317
  instr = @program[i]
284
318
  color = i != @pc ? :light_green : :magenta
285
319
  puts "#{i}: #{instr[0]} #{instr[1]}".colorize color #if !instr.nil?
@@ -321,41 +355,11 @@ class Asm
321
355
  def self.fac(acc, n)
322
356
  if(n > 0)
323
357
  fac(
324
- (acc * n),
325
- (n - 1))
358
+ (acc * n),
359
+ (n - 1))
326
360
  else
327
361
  acc
328
362
  end
329
363
  end
330
364
 
331
- def self.compare_speed
332
- # recursive fac:
333
- Asm.assemble do
334
- defn :factorial
335
- arg acc, n
336
- cmp n, 1
337
- jge :cont
338
-
339
- push acc
340
- jmp :exit
341
-
342
- label :cont
343
- mul acc, n
344
- sub n, 1
345
- jmp :factorial
346
-
347
- label :exit
348
-
349
- #dbg
350
- end
351
-
352
- $factorial.is_debug = false
353
-
354
- puts "Asm version vs primitive factorial (both recursive):".light_green
355
- Benchmark.bm do |x|
356
- x.report { $factorial.invoke 1, 8000 }
357
- x.report { fac 1, 8000 }
358
- end
359
- puts "Run: 1 -> 8710, which is primitive version limitation".light_green
360
- end
361
365
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: asmrb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2.1
4
+ version: 0.0.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - The Trung
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-31 00:00:00.000000000 Z
11
+ date: 2015-02-04 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Inteprete your assembly style code inside ruby.
14
14
  email: deulamco@gmail.com