koi-vm-ruby 0.0.4

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 (111) hide show
  1. data/.gitignore +2 -0
  2. data/README.rdoc +64 -0
  3. data/Rakefile +42 -0
  4. data/VERSION +1 -0
  5. data/architecture.rdoc +112 -0
  6. data/examples/blastoff.rb +20 -0
  7. data/examples/hello_world.rb +8 -0
  8. data/koi-vm.gemspec +198 -0
  9. data/lib/.gitkeep +0 -0
  10. data/lib/koi-vm-ruby.rb +10 -0
  11. data/lib/koi-vm-ruby/accessors.rb +63 -0
  12. data/lib/koi-vm-ruby/core.rb +48 -0
  13. data/lib/koi-vm-ruby/exceptions.rb +8 -0
  14. data/lib/koi-vm-ruby/helpers.rb +5 -0
  15. data/lib/koi-vm-ruby/opcodes/_opcode_constants.rb +68 -0
  16. data/lib/koi-vm-ruby/opcodes/_value_constants.rb +11 -0
  17. data/lib/koi-vm-ruby/opcodes/comparative_operations/equal.rb +11 -0
  18. data/lib/koi-vm-ruby/opcodes/comparative_operations/greater_than.rb +14 -0
  19. data/lib/koi-vm-ruby/opcodes/comparative_operations/invert.rb +12 -0
  20. data/lib/koi-vm-ruby/opcodes/comparative_operations/less_than.rb +14 -0
  21. data/lib/koi-vm-ruby/opcodes/control_operations/exit.rb +10 -0
  22. data/lib/koi-vm-ruby/opcodes/control_operations/no_op.rb +9 -0
  23. data/lib/koi-vm-ruby/opcodes/flow_control_operations/jump.rb +11 -0
  24. data/lib/koi-vm-ruby/opcodes/flow_control_operations/jump_if.rb +16 -0
  25. data/lib/koi-vm-ruby/opcodes/flow_control_operations/jump_unless.rb +16 -0
  26. data/lib/koi-vm-ruby/opcodes/function_operations/call.rb +13 -0
  27. data/lib/koi-vm-ruby/opcodes/function_operations/push_function.rb +19 -0
  28. data/lib/koi-vm-ruby/opcodes/function_operations/return.rb +11 -0
  29. data/lib/koi-vm-ruby/opcodes/function_operations/tailcall.rb +12 -0
  30. data/lib/koi-vm-ruby/opcodes/hash_operations/get_key.rb +14 -0
  31. data/lib/koi-vm-ruby/opcodes/hash_operations/has_key.rb +18 -0
  32. data/lib/koi-vm-ruby/opcodes/hash_operations/length.rb +19 -0
  33. data/lib/koi-vm-ruby/opcodes/hash_operations/num_pairs.rb +12 -0
  34. data/lib/koi-vm-ruby/opcodes/hash_operations/pairs.rb +22 -0
  35. data/lib/koi-vm-ruby/opcodes/hash_operations/push_hash.rb +10 -0
  36. data/lib/koi-vm-ruby/opcodes/hash_operations/set_key.rb +14 -0
  37. data/lib/koi-vm-ruby/opcodes/io_operations/gets.rb +10 -0
  38. data/lib/koi-vm-ruby/opcodes/io_operations/print.rb +13 -0
  39. data/lib/koi-vm-ruby/opcodes/math_operations/add.rb +14 -0
  40. data/lib/koi-vm-ruby/opcodes/math_operations/divide.rb +14 -0
  41. data/lib/koi-vm-ruby/opcodes/math_operations/multiply.rb +14 -0
  42. data/lib/koi-vm-ruby/opcodes/math_operations/subtract.rb +14 -0
  43. data/lib/koi-vm-ruby/opcodes/push_operations/push_bool.rb +12 -0
  44. data/lib/koi-vm-ruby/opcodes/push_operations/push_float.rb +12 -0
  45. data/lib/koi-vm-ruby/opcodes/push_operations/push_int.rb +12 -0
  46. data/lib/koi-vm-ruby/opcodes/push_operations/push_nil.rb +10 -0
  47. data/lib/koi-vm-ruby/opcodes/push_operations/push_string.rb +12 -0
  48. data/lib/koi-vm-ruby/opcodes/stack_operations/dup.rb +11 -0
  49. data/lib/koi-vm-ruby/opcodes/stack_operations/pop.rb +11 -0
  50. data/lib/koi-vm-ruby/opcodes/stack_operations/stksize.rb +10 -0
  51. data/lib/koi-vm-ruby/opcodes/stack_operations/swap.rb +11 -0
  52. data/lib/koi-vm-ruby/opcodes/stack_operations/top.rb +13 -0
  53. data/lib/koi-vm-ruby/opcodes/stack_operations/typeof.rb +18 -0
  54. data/lib/koi-vm-ruby/opcodes/string_operations/concat.rb +12 -0
  55. data/lib/koi-vm-ruby/opcodes/string_operations/strlen.rb +12 -0
  56. data/lib/koi-vm-ruby/opcodes/string_operations/to_string.rb +16 -0
  57. data/lib/koi-vm-ruby/opcodes/variable_operations/get_global.rb +10 -0
  58. data/lib/koi-vm-ruby/opcodes/variable_operations/get_local.rb +10 -0
  59. data/lib/koi-vm-ruby/opcodes/variable_operations/set_global.rb +11 -0
  60. data/lib/koi-vm-ruby/opcodes/variable_operations/set_local.rb +11 -0
  61. data/test/.gitkeep +0 -0
  62. data/test/performance/.gitignore +1 -0
  63. data/test/performance/simple_benchmark.rb +87 -0
  64. data/test/setup/test_unit_extensions.rb +21 -0
  65. data/test/test_helper.rb +13 -0
  66. data/test/unit/opcodes/comparative_operations/equal_test.rb +116 -0
  67. data/test/unit/opcodes/comparative_operations/greater_than_test.rb +53 -0
  68. data/test/unit/opcodes/comparative_operations/invert_test.rb +44 -0
  69. data/test/unit/opcodes/comparative_operations/less_than_test.rb +53 -0
  70. data/test/unit/opcodes/control_operations/exit_test.rb +20 -0
  71. data/test/unit/opcodes/control_operations/no_op_test.rb +17 -0
  72. data/test/unit/opcodes/flow_control_operations/jump_if_test.rb +50 -0
  73. data/test/unit/opcodes/flow_control_operations/jump_test.rb +36 -0
  74. data/test/unit/opcodes/flow_control_operations/jump_unless_test.rb +50 -0
  75. data/test/unit/opcodes/function_operations/call_test.rb +39 -0
  76. data/test/unit/opcodes/function_operations/push_function_test.rb +41 -0
  77. data/test/unit/opcodes/function_operations/return_test.rb +31 -0
  78. data/test/unit/opcodes/function_operations/tailcall_test.rb +41 -0
  79. data/test/unit/opcodes/hash_operations/get_key_test.rb +56 -0
  80. data/test/unit/opcodes/hash_operations/has_key_test.rb +56 -0
  81. data/test/unit/opcodes/hash_operations/length_test.rb +46 -0
  82. data/test/unit/opcodes/hash_operations/num_pairs_test.rb +46 -0
  83. data/test/unit/opcodes/hash_operations/pairs_test.rb +67 -0
  84. data/test/unit/opcodes/hash_operations/push_hash_test.rb +16 -0
  85. data/test/unit/opcodes/hash_operations/set_key_test.rb +56 -0
  86. data/test/unit/opcodes/io_operations/gets_test.rb +38 -0
  87. data/test/unit/opcodes/io_operations/print_test.rb +42 -0
  88. data/test/unit/opcodes/math_operations/add_test.rb +62 -0
  89. data/test/unit/opcodes/math_operations/divide_test.rb +62 -0
  90. data/test/unit/opcodes/math_operations/multiply_test.rb +62 -0
  91. data/test/unit/opcodes/math_operations/subtract_test.rb +62 -0
  92. data/test/unit/opcodes/push_operations/push_bool_test.rb +36 -0
  93. data/test/unit/opcodes/push_operations/push_float_test.rb +27 -0
  94. data/test/unit/opcodes/push_operations/push_int_test.rb +27 -0
  95. data/test/unit/opcodes/push_operations/push_nil_test.rb +16 -0
  96. data/test/unit/opcodes/push_operations/push_string_test.rb +27 -0
  97. data/test/unit/opcodes/stack_operations/dup_test.rb +25 -0
  98. data/test/unit/opcodes/stack_operations/pop_test.rb +28 -0
  99. data/test/unit/opcodes/stack_operations/stksize_test.rb +20 -0
  100. data/test/unit/opcodes/stack_operations/swap_test.rb +36 -0
  101. data/test/unit/opcodes/stack_operations/top_test.rb +45 -0
  102. data/test/unit/opcodes/stack_operations/typeof_test.rb +79 -0
  103. data/test/unit/opcodes/string_operations/concat_test.rb +65 -0
  104. data/test/unit/opcodes/string_operations/strlen_test.rb +44 -0
  105. data/test/unit/opcodes/string_operations/to_string_test.rb +70 -0
  106. data/test/unit/opcodes/variable_operations/get_global_test.rb +18 -0
  107. data/test/unit/opcodes/variable_operations/get_local_test.rb +18 -0
  108. data/test/unit/opcodes/variable_operations/set_global_test.rb +27 -0
  109. data/test/unit/opcodes/variable_operations/set_local_test.rb +27 -0
  110. data/test/unit/vm_initialization_test.rb +86 -0
  111. metadata +224 -0
@@ -0,0 +1,56 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', '..', 'test_helper.rb'))
2
+
3
+ class SetKeyTest < Test::Unit::TestCase
4
+
5
+ include KoiVMRuby
6
+
7
+ test "should set key in hash" do
8
+ vm = VM.new
9
+ vm.data_stack = [[HASH_, {}], [INTEGER_, 1], [STRING_, "yay"]]
10
+ vm.run [
11
+ SET_KEY
12
+ ]
13
+ assert_equal [[HASH_, {[INTEGER_, 1] => [STRING_, "yay"]}]], vm.data_stack
14
+ assert_equal 1, vm.instruction_pointer
15
+ end
16
+
17
+ test "should raise StackError if stack[-3] is not a hash" do
18
+ assert_raises StackError do
19
+ vm = VM.new
20
+ vm.data_stack = [[INTEGER_, 1], [INTEGER_, 1], [STRING_, "yay"]]
21
+ vm.run [
22
+ SET_KEY
23
+ ]
24
+ end
25
+ end
26
+
27
+ test "should raise StackError if there are only 2 items on the stack" do
28
+ assert_raises StackError do
29
+ vm = VM.new
30
+ vm.data_stack = [[HASH_, {}], [INTEGER_, 1]]
31
+ vm.run [
32
+ SET_KEY
33
+ ]
34
+ end
35
+ end
36
+
37
+ test "should raise StackError if there is only 1 item on the stack" do
38
+ assert_raises StackError do
39
+ vm = VM.new
40
+ vm.data_stack = [[HASH_, {}]]
41
+ vm.run [
42
+ SET_KEY
43
+ ]
44
+ end
45
+ end
46
+
47
+ test "should raise StackError if there are no items on the stack" do
48
+ assert_raises StackError do
49
+ vm = VM.new
50
+ vm.run [
51
+ SET_KEY
52
+ ]
53
+ end
54
+ end
55
+
56
+ end
@@ -0,0 +1,38 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', '..', 'test_helper.rb'))
2
+
3
+ class GetsTest < Test::Unit::TestCase
4
+
5
+ include KoiVMRuby
6
+
7
+ require "stringio"
8
+
9
+ test "should get string from stdin and push it onto stack as a string" do
10
+ input = "Test"
11
+ old_stdin = $stdin
12
+ buffer = StringIO.new
13
+ $stdin = buffer
14
+ buffer.string = input
15
+ vm = VM.new
16
+ vm.run [
17
+ GETS
18
+ ]
19
+ assert_equal [[STRING_, input]], vm.data_stack
20
+ $stdin = old_stdin
21
+ end
22
+
23
+ test "should get newline separated strings from stdin and push onto stack as a string" do
24
+ input = "Test\nstring"
25
+ old_stdin = $stdin
26
+ buffer = StringIO.new
27
+ $stdin = buffer
28
+ buffer.string = input
29
+ vm = VM.new
30
+ vm.run [
31
+ GETS,
32
+ GETS
33
+ ]
34
+ assert_equal [[STRING_, "Test\n"], [STRING_, "string"]], vm.data_stack
35
+ $stdin = old_stdin
36
+ end
37
+
38
+ end
@@ -0,0 +1,42 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', '..', 'test_helper.rb'))
2
+
3
+ class PrintTest < Test::Unit::TestCase
4
+
5
+ include KoiVMRuby
6
+
7
+ require "stringio"
8
+
9
+ test "should print topmost string value from stack" do
10
+ old_stdout = $stdout
11
+ buffer = StringIO.new
12
+ $stdout = buffer
13
+ vm = VM.new
14
+ vm.data_stack = [[STRING_, "test"]]
15
+ vm.run [
16
+ PRINT
17
+ ]
18
+ assert_equal [], vm.data_stack
19
+ assert_equal "test", buffer.string
20
+ $stdout = old_stdout
21
+ end
22
+
23
+ test "should raise StackError if topmost item is not a string" do
24
+ assert_raises StackError do
25
+ vm = VM.new
26
+ vm.data_stack = [[INTEGER_, 1]]
27
+ vm.run [
28
+ PRINT
29
+ ]
30
+ end
31
+ end
32
+
33
+ test "should raise StackError if there are no items on the stack" do
34
+ assert_raises StackError do
35
+ vm = VM.new
36
+ vm.run [
37
+ PRINT
38
+ ]
39
+ end
40
+ end
41
+
42
+ end
@@ -0,0 +1,62 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', '..', 'test_helper.rb'))
2
+
3
+ class AddTest < Test::Unit::TestCase
4
+
5
+ include KoiVMRuby
6
+
7
+ test "should add top two integers on stack" do
8
+ vm = VM.new
9
+ vm.data_stack = [[INTEGER_, 9], [INTEGER_, 9]]
10
+ vm.run [
11
+ ADD
12
+ ]
13
+ assert_equal [[INTEGER_, 18]], vm.data_stack
14
+ end
15
+
16
+ test "should add top two floats on stack" do
17
+ vm = VM.new
18
+ vm.data_stack = [[FLOAT_, 9.0], [FLOAT_, 9.0]]
19
+ vm.run [
20
+ ADD
21
+ ]
22
+ assert_equal [[FLOAT_, 18.0]], vm.data_stack
23
+ end
24
+
25
+ test "should add top two numbers on stack and implicitly convert them to floats" do
26
+ vm = VM.new
27
+ vm.data_stack = [[INTEGER_, 9], [FLOAT_, 9.0]]
28
+ vm.run [
29
+ ADD
30
+ ]
31
+ assert_equal [[FLOAT_, 18.0]], vm.data_stack
32
+ end
33
+
34
+ test "should add top two numbers on stack and implicitly convert them to floats if receiver is a float" do
35
+ vm = VM.new
36
+ vm.data_stack = [[FLOAT_, 9.0], [INTEGER_, 9]]
37
+ vm.run [
38
+ ADD
39
+ ]
40
+ assert_equal [[FLOAT_, 18.0]], vm.data_stack
41
+ end
42
+
43
+ test "should raise StackError if there is only one item on the stack" do
44
+ assert_raises StackError do
45
+ vm = VM.new
46
+ vm.data_stack = [1]
47
+ vm.run [
48
+ ADD
49
+ ]
50
+ end
51
+ end
52
+
53
+ test "should raise StackError if there are no items on the stack" do
54
+ assert_raises StackError do
55
+ vm = VM.new
56
+ vm.run [
57
+ ADD
58
+ ]
59
+ end
60
+ end
61
+
62
+ end
@@ -0,0 +1,62 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', '..', 'test_helper.rb'))
2
+
3
+ class DivideTest < Test::Unit::TestCase
4
+
5
+ include KoiVMRuby
6
+
7
+ test "should divide top two integers on stack" do
8
+ vm = VM.new
9
+ vm.data_stack = [[INTEGER_, 10], [INTEGER_, 3]]
10
+ vm.run [
11
+ DIVIDE
12
+ ]
13
+ assert_equal [[INTEGER_, 3]], vm.data_stack
14
+ end
15
+
16
+ test "should divide top two floats on stack" do
17
+ vm = VM.new
18
+ vm.data_stack = [[FLOAT_, 10.0], [FLOAT_, 3.0]]
19
+ vm.run [
20
+ DIVIDE
21
+ ]
22
+ assert_equal [[FLOAT_, 10.0 / 3.0]], vm.data_stack
23
+ end
24
+
25
+ test "should divide top two numbers on stack and implicitly convert them to floats" do
26
+ vm = VM.new
27
+ vm.data_stack = [[INTEGER_, 10], [FLOAT_, 3.0]]
28
+ vm.run [
29
+ DIVIDE
30
+ ]
31
+ assert_equal [[FLOAT_, 10.0 / 3.0]], vm.data_stack
32
+ end
33
+
34
+ test "should divide top two numbers on stack and implicitly convert them to floats if receiver is a float" do
35
+ vm = VM.new
36
+ vm.data_stack = [[FLOAT_, 10.0], [INTEGER_, 3]]
37
+ vm.run [
38
+ DIVIDE
39
+ ]
40
+ assert_equal [[FLOAT_, 10.0 / 3.0]], vm.data_stack
41
+ end
42
+
43
+ test "should raise StackError if there is only one item on the stack" do
44
+ assert_raises StackError do
45
+ vm = VM.new
46
+ vm.data_stack = [1]
47
+ vm.run [
48
+ DIVIDE
49
+ ]
50
+ end
51
+ end
52
+
53
+ test "should raise StackError if there are no items on the stack" do
54
+ assert_raises StackError do
55
+ vm = VM.new
56
+ vm.run [
57
+ DIVIDE
58
+ ]
59
+ end
60
+ end
61
+
62
+ end
@@ -0,0 +1,62 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', '..', 'test_helper.rb'))
2
+
3
+ class MultiplyTest < Test::Unit::TestCase
4
+
5
+ include KoiVMRuby
6
+
7
+ test "should multiply top two integers on stack" do
8
+ vm = VM.new
9
+ vm.data_stack = [[INTEGER_, 5], [INTEGER_, 2]]
10
+ vm.run [
11
+ MULTIPLY
12
+ ]
13
+ assert_equal [[INTEGER_, 10]], vm.data_stack
14
+ end
15
+
16
+ test "should multiply top two floats on stack" do
17
+ vm = VM.new
18
+ vm.data_stack = [[FLOAT_, 5.0], [FLOAT_, 2.0]]
19
+ vm.run [
20
+ MULTIPLY
21
+ ]
22
+ assert_equal [[FLOAT_, 10.0]], vm.data_stack
23
+ end
24
+
25
+ test "should multiply top two numbers on stack and implicitly convert them to floats" do
26
+ vm = VM.new
27
+ vm.data_stack = [[INTEGER_, 5], [FLOAT_, 2.0]]
28
+ vm.run [
29
+ MULTIPLY
30
+ ]
31
+ assert_equal [[FLOAT_, 10.0]], vm.data_stack
32
+ end
33
+
34
+ test "should multiply top two numbers on stack and implicitly convert them to floats if receiver is a float" do
35
+ vm = VM.new
36
+ vm.data_stack = [[FLOAT_, 5.0], [INTEGER_, 2]]
37
+ vm.run [
38
+ MULTIPLY
39
+ ]
40
+ assert_equal [[FLOAT_, 10.0]], vm.data_stack
41
+ end
42
+
43
+ test "should raise StackError if there is only one item on the stack" do
44
+ assert_raises StackError do
45
+ vm = VM.new
46
+ vm.data_stack = [1]
47
+ vm.run [
48
+ MULTIPLY
49
+ ]
50
+ end
51
+ end
52
+
53
+ test "should raise StackError if there are no items on the stack" do
54
+ assert_raises StackError do
55
+ vm = VM.new
56
+ vm.run [
57
+ MULTIPLY
58
+ ]
59
+ end
60
+ end
61
+
62
+ end
@@ -0,0 +1,62 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', '..', 'test_helper.rb'))
2
+
3
+ class SubtractTest < Test::Unit::TestCase
4
+
5
+ include KoiVMRuby
6
+
7
+ test "should subtract top two integers on stack" do
8
+ vm = VM.new
9
+ vm.data_stack = [[INTEGER_, 5], [INTEGER_, 2]]
10
+ vm.run [
11
+ SUBTRACT
12
+ ]
13
+ assert_equal [[INTEGER_, 3]], vm.data_stack
14
+ end
15
+
16
+ test "should subtract top two floats on stack" do
17
+ vm = VM.new
18
+ vm.data_stack = [[FLOAT_, 5.0], [FLOAT_, 2.0]]
19
+ vm.run [
20
+ SUBTRACT
21
+ ]
22
+ assert_equal [[FLOAT_, 3.0]], vm.data_stack
23
+ end
24
+
25
+ test "should subtract top two numbers on stack and implicitly convert them to floats" do
26
+ vm = VM.new
27
+ vm.data_stack = [[INTEGER_, 5], [FLOAT_, 2.0]]
28
+ vm.run [
29
+ SUBTRACT
30
+ ]
31
+ assert_equal [[FLOAT_, 3.0]], vm.data_stack
32
+ end
33
+
34
+ test "should subtract top two numbers on stack and implicitly convert them to floats if receiver is a float" do
35
+ vm = VM.new
36
+ vm.data_stack = [[FLOAT_, 5.0], [INTEGER_, 2]]
37
+ vm.run [
38
+ SUBTRACT
39
+ ]
40
+ assert_equal [[FLOAT_, 3.0]], vm.data_stack
41
+ end
42
+
43
+ test "should raise StackError if there is only one item on the stack" do
44
+ assert_raises StackError do
45
+ vm = VM.new
46
+ vm.data_stack = [1]
47
+ vm.run [
48
+ SUBTRACT
49
+ ]
50
+ end
51
+ end
52
+
53
+ test "should raise StackError if there are no items on the stack" do
54
+ assert_raises StackError do
55
+ vm = VM.new
56
+ vm.run [
57
+ SUBTRACT
58
+ ]
59
+ end
60
+ end
61
+
62
+ end
@@ -0,0 +1,36 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', '..', 'test_helper.rb'))
2
+
3
+ class PushBoolTest < Test::Unit::TestCase
4
+
5
+ include KoiVMRuby
6
+
7
+ test "should put true onto stack" do
8
+ vm = VM.new
9
+ vm.run [
10
+ PUSH_BOOL, true
11
+ ]
12
+ assert_equal [[BOOL_, true]], vm.data_stack
13
+ assert_equal 2, vm.instruction_pointer
14
+ end
15
+
16
+ test "should put false onto stack" do
17
+ vm = VM.new
18
+ vm.run [
19
+ PUSH_BOOL, false
20
+ ]
21
+ assert_equal [[BOOL_, false]], vm.data_stack
22
+ assert_equal 2, vm.instruction_pointer
23
+ end
24
+
25
+ test "should raise error if operand is not a boolean value" do
26
+ [1,2.0,"string", [1], {:t=>1}].each do |x|
27
+ assert_raises OperandError do
28
+ vm = VM.new
29
+ vm.run [
30
+ PUSH_BOOL, x
31
+ ]
32
+ end
33
+ end
34
+ end
35
+
36
+ end
@@ -0,0 +1,27 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', '..', 'test_helper.rb'))
2
+
3
+ class PushFloatTest < Test::Unit::TestCase
4
+
5
+ include KoiVMRuby
6
+
7
+ test "should push float onto stack" do
8
+ vm = VM.new
9
+ vm.run [
10
+ PUSH_FLOAT, 99.9
11
+ ]
12
+ assert_equal [[FLOAT_, 99.9]], vm.data_stack
13
+ assert_equal 2, vm.instruction_pointer
14
+ end
15
+
16
+ test "should raise error if operand is not a float" do
17
+ [false, 2, "string", [1], {:t=>1}].each do |x|
18
+ assert_raises OperandError do
19
+ vm = VM.new
20
+ vm.run [
21
+ PUSH_FLOAT, x
22
+ ]
23
+ end
24
+ end
25
+ end
26
+
27
+ end