asmrb 0.0.2.6.1.2 → 0.0.2.6.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/asmrb.rb +86 -86
  3. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 57d706ea40276b6485207d9090aa93329ef6090c
4
- data.tar.gz: a7b388a89846c4a280419790c4139578afdb0722
3
+ metadata.gz: 43288f18e0561f0edf394d9522578c582ea0956e
4
+ data.tar.gz: 3007f21ca287b145f4a04222c653433c74065cfc
5
5
  SHA512:
6
- metadata.gz: 5ac464f3459c2ac32f4454b25a3597b39392791124a05dc7a76fdbe7b30240de7051d8394979f06e27bedf7d094f0f86c32066a331d750ba0715601591213de6
7
- data.tar.gz: 7eaa37903c8dd999209ab4fd78512fd29ba5ba2e8ab15fd2ff63d88eed461bee1bf7819674ade9430c4c31ba4645022d0d51bc8ff18415959e648c21489516b3
6
+ metadata.gz: 922176943cbb5921580c25157f6845f2453976a68d8fa93807f7656065c2ad4d236d0d13a28f3d353e035a127e27ca46103184343f25c7bffcd9811bb2db29c2
7
+ data.tar.gz: c27e8a276ae85073b5422e4b61c50bba94e6a27d85de9345ecb369277bee13a175b6eb7de6690d232014e0f6593e6b6efc213c8cdd46b78ff336dfc8d87a67a9
data/lib/asmrb.rb CHANGED
@@ -70,6 +70,9 @@ class Asmrb
70
70
  end
71
71
 
72
72
  OPS = {
73
+ "lea" => lambda { | name |
74
+ @variables[name] = @stack.pop
75
+ },
73
76
 
74
77
  "len" => lambda { | lst |
75
78
  @stack.push @variables[lst].length
@@ -89,7 +92,7 @@ class Asmrb
89
92
  @stack.push e
90
93
  },
91
94
 
92
- "dupl" => lambda {
95
+ "dup" => lambda {
93
96
  @stack.push @stack.last
94
97
  },
95
98
 
@@ -109,11 +112,11 @@ class Asmrb
109
112
  @stack.push @stack.pop / @stack.pop
110
113
  },
111
114
 
112
- "incr" => lambda { |dest, incval = 1|
115
+ "icr" => lambda { |dest, incval = 1|
113
116
  @variables[dest] += incval
114
117
  },
115
118
 
116
- "decr" => lambda { |dest, decrval = 1|
119
+ "dcr" => lambda { |dest, decrval = 1|
117
120
  @variables[dest] -= decrval
118
121
  },
119
122
 
@@ -123,6 +126,11 @@ class Asmrb
123
126
  @variables[src] : src
124
127
  },
125
128
 
129
+ "jnl" => lambda { | name |
130
+ req_args "jnl", 1
131
+ @pc = @labels[name] if @stack.pop.nil?
132
+ },
133
+
126
134
  "jz" => lambda { | name |
127
135
  req_args "jz", 1
128
136
  @pc = @labels[name] if @stack.pop == 0
@@ -166,7 +174,7 @@ class Asmrb
166
174
  @variables[val] = @stack.pop
167
175
  },
168
176
 
169
- "push" => lambda {|src|
177
+ "psh" => lambda {|src|
170
178
  @stack.push(
171
179
  src.is_a?(Symbol) ? @variables[src] : src )
172
180
  },
@@ -190,7 +198,7 @@ class Asmrb
190
198
  #binding.pry if @is_debug
191
199
  },
192
200
 
193
- "func" => lambda {|name|
201
+ "fn" => lambda {|name|
194
202
  args = []
195
203
  params = eval "$#{name}.params"
196
204
  params.times do
@@ -202,15 +210,15 @@ class Asmrb
202
210
  #binding.pry
203
211
  },
204
212
 
205
- "ivok" => lambda { |obj, f , n|
206
- req_args "ivok",n # obj.send(:func, args)
213
+ "inv" => lambda { |obj, f , n|
214
+ req_args "inv",n # obj.send(:func, args)
207
215
  args = []
208
216
  n.times { args << @stack.pop } if n > 0
209
217
  result = @variables[obj].send(f, eval("args.join(', ')"))
210
218
  @stack.push result
211
219
  },
212
220
 
213
- "call" => lambda {|fname|
221
+ "cal" => lambda {|fname|
214
222
  _method = method(fname)
215
223
  if _method.parameters.length > 0
216
224
  args = []
@@ -223,7 +231,7 @@ class Asmrb
223
231
  end
224
232
  @stack.push invoke if !invoke.nil?
225
233
  },
226
- "recur" => lambda {
234
+ "rec" => lambda {
227
235
  @pc = -1
228
236
  },
229
237
 
@@ -231,14 +239,14 @@ class Asmrb
231
239
  @pc = @program.length-1
232
240
  },
233
241
 
234
- "exit" => lambda {
242
+ "end" => lambda {
235
243
  exit
236
244
  }
237
245
  }
238
246
 
239
- def create_label lbl
240
- @labels[lbl] = @program.length-1
241
- puts "#{@label[lbl]}: #{lbl}".purple if @is_debug
247
+ def create_label blo
248
+ @labels[blo] = @program.length-1
249
+ puts "#{@label[blo]}: #{blo}".purple if @is_debug
242
250
  end
243
251
 
244
252
  def method_missing(name, *args)
@@ -246,7 +254,7 @@ class Asmrb
246
254
  @source << [name, args]
247
255
 
248
256
  # :name => "name"
249
- sname = name.to_s
257
+ sname = name.to_s.gsub "_", ""
250
258
 
251
259
  if OPS.keys.include?(sname)
252
260
  @program << [sname, args]
@@ -255,10 +263,10 @@ class Asmrb
255
263
  else
256
264
  case sname
257
265
 
258
- when "label"
266
+ when "blo"
259
267
  create_label args.first
260
268
 
261
- when "defn"
269
+ when "def"
262
270
  @name = args.first
263
271
  #create_label args.first
264
272
 
@@ -280,7 +288,7 @@ class Asmrb
280
288
  until @pc == @program.length
281
289
  # get instruction:
282
290
  instr = @program[@pc]
283
- puts "#{@pc}: #{instr[0]} #{instr[1]}".light_green if debug
291
+ puts "#{@pc}: #{instr[0]} #{instr[1].join " "}".light_green if debug
284
292
  # execute proc: arg , proc
285
293
  self.instance_exec *instr[1], &OPS[instr[0]]
286
294
  #binding.pry if debug
@@ -378,89 +386,81 @@ class Asmrb
378
386
  eval "$#{@name}"
379
387
  end
380
388
 
381
- #primitive fac: that will overflow
382
- def self.fac(acc, n)
383
- if(n > 0)
384
- fac(
385
- (acc * n),
386
- (n - 1))
387
- else
388
- acc
389
- end
390
- end
391
-
392
- def llvm_init
393
- LLVM.init_jit
394
- @mod = LLVM::Module.new @name.to_s
395
- puts "[LLVM]: initialized".light_green
396
- end
397
-
398
- def llvm_finalize
399
- @mod.verify
400
- @mod.dump
401
- @engine = LLVM::JITCompiler.new(@mod)
402
- end
403
-
404
- def llvm_partition
389
+ def partition
405
390
  puts "partitioning...".light_green if@is_debug
406
391
  if @labels.empty?
407
- @partitions = { @name => @source }
392
+ @partitions = { @name => @program }
408
393
  else
409
- @partitions = {}
410
- index = 0
394
+ @partitions = Hash.new
411
395
  @labels.each do |label|
412
- puts "block #{label[0]}:".light_yellow
413
- partition = []
414
- (@source.length - index).times.each do
415
- if @source[index][0] != :label
416
- puts " #{index}: #{@source[index]}".white if@is_debug
417
- partition.push @source[index]
418
- index+=1
419
- else
420
- index+=1
421
- break
396
+ puts "#{label[1]+1}:#{label[0]}".magenta
397
+ partition = Array.new
398
+ # navigate down to the block:
399
+ @program[label.last+1..@program.length-1].each.with_index do |instruction, index|
400
+ break if instruction.first == :label
401
+ if@is_debug
402
+ message = " #{index}: #{instruction.first}" +
403
+ " #{instruction.last.join(" ") unless instruction.last.empty?}"
404
+ puts message.light_yellow
422
405
  end
406
+ partition << instruction
423
407
  end
424
408
  @partitions[label[0]] = partition.dup
425
409
  end
426
410
  end
427
- puts "[LLVM]: partitioning completed.".light_green
411
+ puts "partitioning completed.".light_green
428
412
  @partitions if@is_debug
429
413
  end
430
-
431
- def llvm_emit
432
- # Checkout kaleidescope sample of ruby-llvm
433
- end
434
-
435
- def compile
436
- llvm_init
437
- llvm_partition
438
- llvm_emit
439
- #llvm_finalize
440
- end
441
-
442
414
  end
443
415
 
444
416
  #testing :
445
- Asmrb.new do
446
- defn :factorial
447
- arg :acc, :n
448
- push 1
449
- push :n
450
- cmp
451
- jge :recursion
452
- push :acc
453
- ret
454
-
455
- label :recursion
456
- push :acc
457
- push :n
458
- mul
459
- push 1
460
- push :n
461
- sub
462
- recur
463
- end
417
+ # @a = Asmrb.new do
418
+ # _def :factorial
419
+ # _arg :acc, :n
420
+ # _psh 1
421
+ # _psh :n
422
+ # _cmp
423
+ # _jge :recursion
424
+ # _psh :acc
425
+ # _ret
426
+
427
+ # _blo :recursion
428
+
429
+ # _psh :times
430
+ # _jnl :init_counter
431
+
432
+ # _psh 1
433
+ # _psh :times
434
+ # _add
435
+ # _lea :times
436
+ # _jmp :for_fun
437
+ # _blo :comeback
438
+
439
+ # _psh :acc
440
+ # _psh :n
441
+ # _mul
442
+ # _psh 1
443
+ # _psh :n
444
+ # _sub
445
+ # _rec
446
+
447
+ # _blo :for_fun
448
+ # _psh "recursions counts:"
449
+ # _cal :puts
450
+ # _psh :times
451
+ # _cal :puts
452
+ # _jmp :comeback
453
+
454
+ # _blo :init_counter
455
+ # _psh 0
456
+ # _lea :times
457
+ # _jmp :recursion
458
+
459
+ # end
460
+
461
+ #@a.is_debug = true
462
+ #@a.partition
463
+ #puts "partitioning test completed."
464
464
 
465
465
  #$factorial.is_debug = true
466
466
  #puts $factorial.invoke 1,3
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.6.1.2
4
+ version: 0.0.2.6.1.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-04-20 00:00:00.000000000 Z
11
+ date: 2015-04-29 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: create a toy assembly-like DSL in ruby, checkout the homepage for usage
14
14
  & syntax.