asmrb 0.0.2.6.1.2 → 0.0.2.6.1.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 +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.