sweet-moon 0.0.3 → 0.0.6

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.
@@ -1,17 +1,19 @@
1
1
  require_relative '../../../logic/interpreters/interpreter_50'
2
2
 
3
+ require_relative 'function'
3
4
  require_relative 'reader'
4
- require_relative 'writer'
5
5
  require_relative 'table'
6
+ require_relative 'writer'
6
7
 
7
8
  module Component
8
9
  module V50
9
10
  Interpreter = {
10
11
  version: Logic::V50::Interpreter[:version],
12
+ logic: Logic::V50,
11
13
 
12
14
  create_state!: ->(api) {
13
15
  state = api.lua_open
14
- { state: { lua: state, avoid_gc: [] },
16
+ { state: { lua: state, avoid_gc: [], ruby_error_info: nil },
15
17
  error: state ? nil : :MemoryAllocation }
16
18
  },
17
19
 
@@ -38,12 +40,17 @@ module Component
38
40
  { state: state, error: Interpreter[:_error].(api, state, result, pull: true) }
39
41
  },
40
42
 
41
- set_table!: ->(api, state, variable, value) {
42
- Table[:set!].(api, state, variable, value)
43
+ set_table!: ->(api, state) {
44
+ result = api.lua_settable(state[:lua], -3)
45
+
46
+ api.lua_settop(state[:lua], -2)
47
+
48
+ { state: state,
49
+ error: Interpreter[:_error].(api, state, result, pull: false) }
43
50
  },
44
51
 
45
52
  push_value!: ->(api, state, value) {
46
- Writer[:push!].(api, state, value)
53
+ Writer[:push!].(api, state, Component::V50, value)
47
54
  { state: state }
48
55
  },
49
56
 
@@ -55,12 +62,22 @@ module Component
55
62
  },
56
63
 
57
64
  get_variable_and_push!: ->(api, state, variable, key = nil) {
65
+ extra_pop = true
66
+ if variable == '_G'
67
+ variable = key
68
+ key = nil
69
+ extra_pop = false
70
+ end
71
+
58
72
  api.lua_pushstring(state[:lua], variable.to_s)
59
73
  api.lua_gettable(state[:lua], Logic::V50::Interpreter[:LUA_GLOBALSINDEX])
60
74
 
61
- Table[:read_field_and_push!].(api, state, key, -1) unless key.nil?
75
+ unless key.nil?
76
+ Table[:read_field_and_push!].(api, state, Component::V50, key,
77
+ -1)
78
+ end
62
79
 
63
- { state: state }
80
+ { state: state, extra_pop: extra_pop }
64
81
  },
65
82
 
66
83
  call!: ->(api, state, inputs = 0, outputs = 1) {
@@ -69,7 +86,8 @@ module Component
69
86
  },
70
87
 
71
88
  read_and_pop!: ->(api, state, stack_index = -1, extra_pop: false) {
72
- result = Component::V50::Reader[:read!].(api, state, stack_index)
89
+ result = Component::V50::Reader[:read!].(api, state, Component::V50,
90
+ stack_index)
73
91
 
74
92
  api.lua_settop(state[:lua], -2) if result[:pop]
75
93
  api.lua_settop(state[:lua], -2) if extra_pop
@@ -78,7 +96,7 @@ module Component
78
96
  },
79
97
 
80
98
  read_all!: ->(api, state) {
81
- result = Reader[:read_all!].(api, state)
99
+ result = Reader[:read_all!].(api, state, Component::V50)
82
100
 
83
101
  { state: state, output: result }
84
102
  },
@@ -1,67 +1,7 @@
1
- require 'ffi'
2
-
3
- require_relative 'interpreter'
4
- require_relative 'function'
5
- require_relative 'table'
1
+ require_relative '../54/reader'
6
2
 
7
3
  module Component
8
4
  module V50
9
- Reader = {
10
- read_all!: ->(api, state) {
11
- (1..api.lua_gettop(state[:lua])).map do
12
- Interpreter[:read_and_pop!].(api, state)[:output]
13
- end.reverse
14
- },
15
-
16
- read!: ->(api, state, stack_index = -1) {
17
- stack_index = api.lua_gettop(state[:lua]) if stack_index == -1
18
-
19
- type = api.lua_typename(state[:lua],
20
- api.lua_type(state[:lua], stack_index)).read_string
21
-
22
- case type
23
- when 'string'
24
- Reader[:read_string!].(api, state, stack_index)
25
- when 'number'
26
- Reader[:read_number!].(api, state, stack_index)
27
- when 'no value'
28
- { value: nil, pop: true, type: type }
29
- when 'nil'
30
- { value: nil, pop: true }
31
- when 'boolean'
32
- Reader[:read_boolean!].(api, state, stack_index)
33
- when 'table'
34
- Table[:read!].(api, state, stack_index)
35
- when 'function'
36
- Function[:read!].(api, state, stack_index)
37
- else
38
- # none nil boolean lightuserdata number
39
- # string table function userdata thread
40
- { value:
41
- "#{type}: 0x#{api.lua_topointer(state[:lua], stack_index).address}",
42
- type: type, pop: true }
43
- end
44
- },
45
-
46
- read_string!: ->(api, state, stack_index) {
47
- { value: api.lua_tostring(state[:lua], stack_index).read_string,
48
- pop: true }
49
- },
50
-
51
- read_number!: ->(api, state, stack_index) {
52
- if api.respond_to?(:lua_isinteger) &&
53
- api.respond_to?(:lua_tointeger) &&
54
- api.lua_isinteger(state[:lua], stack_index) == 1
55
-
56
- return { value: api.lua_tointeger(state[:lua], stack_index), pop: true }
57
- end
58
-
59
- { value: api.lua_tonumber(state[:lua], stack_index), pop: true }
60
- },
61
-
62
- read_boolean!: ->(api, state, stack_index) {
63
- { value: api.lua_toboolean(state[:lua], stack_index) == 1, pop: true }
64
- }
65
- }
5
+ Reader = Component::V54::Reader
66
6
  end
67
7
  end
@@ -6,56 +6,19 @@ require_relative 'reader'
6
6
  module Component
7
7
  module V50
8
8
  Table = {
9
- push!: ->(api, state, list, stack_index = -1) {
10
- stack_index = api.lua_gettop(state[:lua]) if stack_index == -1
11
-
9
+ create_table!: ->(api, state, _list) {
12
10
  api.lua_newtable(state[:lua])
13
-
14
- if list.is_a? Hash
15
- list.each_key do |key|
16
- Writer[:push!].(api, state, key)
17
- Writer[:push!].(api, state, list[key])
18
- api.lua_settable(state[:lua], stack_index + 1)
19
- end
20
- else
21
- list.each_with_index do |value, index|
22
- Writer[:push!].(api, state, index + 1)
23
- Writer[:push!].(api, state, value)
24
- api.lua_settable(state[:lua], stack_index + 1)
25
- end
26
- end
27
11
  },
28
12
 
29
- read!: ->(api, state, stack_index) {
30
- stack_index = api.lua_gettop(state[:lua]) if stack_index == -1
31
-
32
- type = api.lua_typename(state[:lua],
33
- api.lua_type(state[:lua], stack_index)).read_string
34
-
35
- api.lua_pushnil(state[:lua])
36
-
37
- return nil if type != 'table'
38
-
39
- tuples = []
40
-
41
- while api.lua_next(state[:lua], stack_index).positive?
42
- value = Reader[:read!].(api, state, stack_index + 2)
43
- key = Reader[:read!].(api, state, stack_index + 1)
44
- api.lua_settop(state[:lua], -2) if value[:pop]
45
-
46
- tuples << [key[:value], value[:value]]
47
-
48
- break if value[:type] == 'no value'
49
- end
50
-
51
- { value: Logic::Tables[:to_hash_or_array].(tuples), pop: true }
52
- },
13
+ push!: Component::V54::Table[:push!],
14
+ read!: Component::V54::Table[:read!],
53
15
 
54
- read_field_and_push!: ->(api, state, expected_key, stack_index) {
16
+ read_field_and_push!: ->(api, state, component, expected_key, stack_index) {
55
17
  stack_index = api.lua_gettop(state[:lua]) if stack_index == -1
56
18
 
57
- type = api.lua_typename(state[:lua],
58
- api.lua_type(state[:lua], stack_index)).read_string
19
+ type = api.lua_typename(
20
+ state[:lua], api.lua_type(state[:lua], stack_index)
21
+ ).read_string
59
22
 
60
23
  api.lua_pushnil(state[:lua])
61
24
 
@@ -64,8 +27,8 @@ module Component
64
27
  result = nil
65
28
 
66
29
  while api.lua_next(state[:lua], stack_index).positive?
67
- value = Reader[:read!].(api, state, stack_index + 2)
68
- key = Reader[:read!].(api, state, stack_index + 1)
30
+ value = component::Reader[:read!].(api, state, component, stack_index + 2)
31
+ key = component::Reader[:read!].(api, state, component, stack_index + 1)
69
32
 
70
33
  api.lua_settop(state[:lua], -2) if value[:pop]
71
34
 
@@ -73,17 +36,17 @@ module Component
73
36
  state[:lua], api.lua_type(state[:lua], stack_index + 1)
74
37
  ).read_string
75
38
 
76
- if Table[:is_same_key].(key_type, key[:value], expected_key)
39
+ if component::Table[:is_same_key].(key_type, key[:value], expected_key)
77
40
  result = value[:value]
78
41
  break
79
42
  end
80
43
 
81
- break if value[:type] == 'no value'
44
+ break if value[:type] == 'no value' || key[:value].instance_of?(Proc)
82
45
  end
83
46
 
84
47
  api.lua_settop(state[:lua], -2)
85
48
 
86
- Writer[:push!].(api, state, result)
49
+ component::Writer[:push!].(api, state, component, result)
87
50
  },
88
51
 
89
52
  is_same_key: ->(lua_key_type, lua_key, ruby_key) {
@@ -1,45 +1,7 @@
1
- require_relative 'function'
2
- require_relative 'table'
1
+ require_relative '../54/writer'
3
2
 
4
3
  module Component
5
4
  module V50
6
- Writer = {
7
- push!: ->(api, state, value) {
8
- case Writer[:_to_lua_type].(value)
9
- when 'string'
10
- api.lua_pushstring(state[:lua], value.to_s)
11
- when 'number'
12
- api.lua_pushnumber(state[:lua], value)
13
- when 'integer'
14
- if api.respond_to? :lua_pushinteger
15
- api.lua_pushinteger(state[:lua], value)
16
- else
17
- api.lua_pushnumber(state[:lua], value)
18
- end
19
- when 'nil'
20
- api.lua_pushnil(state[:lua])
21
- when 'boolean'
22
- api.lua_pushboolean(state[:lua], value ? 1 : 0)
23
- when 'table'
24
- Table[:push!].(api, state, value)
25
- when 'function'
26
- Function[:push!].(api, state, value)
27
- else
28
- api.lua_pushstring(
29
- state[:lua], "#<#{value.class}:0x#{format('%016x', value.object_id)}>"
30
- )
31
- end
32
- },
33
-
34
- _to_lua_type: ->(value) {
35
- return 'nil' if value.nil?
36
- return 'function' if value.is_a?(Proc)
37
- return 'integer' if value.is_a? Integer
38
- return 'number' if value.is_a? Float
39
- return 'table' if value.is_a?(Hash) || value.is_a?(Array)
40
- return 'string' if value.is_a?(String) || value.instance_of?(Symbol)
41
- return 'boolean' if [true, false].include? value
42
- }
43
- }
5
+ Writer = Component::V54::Writer
44
6
  end
45
7
  end
@@ -1,55 +1,9 @@
1
- require_relative '../../../logic/interpreters/interpreter_51'
2
- require_relative '../../../dsl/errors'
3
-
4
- require_relative 'writer'
5
- require_relative 'reader'
1
+ require_relative '../54/function'
6
2
 
7
3
  module Component
8
4
  module V51
9
- Function = {
10
- push!: ->(api, state, closure) {
11
- handler = ->(current_state) {
12
- updated_state = state.merge(lua: current_state)
13
- input = Reader[:read_all!].(api, updated_state)
14
- result = closure.(*input)
15
- Writer[:push!].(api, updated_state, result)
16
- return 1
17
- }
18
-
19
- state[:avoid_gc] << handler
20
-
21
- api.lua_pushcclosure(state[:lua], handler, 0)
22
- },
23
-
24
- read!: ->(api, state, _stack_index) {
25
- reference = api.luaL_ref(
26
- state[:lua], Logic::V51::Interpreter[:LUA_REGISTRYINDEX]
27
- )
28
-
29
- { value: ->(input = [], output = 1) {
30
- api.lua_rawgeti(
31
- state[:lua], Logic::V51::Interpreter[:LUA_REGISTRYINDEX], reference
32
- )
33
-
34
- input.each do |value|
35
- Writer[:push!].(api, state, value)
36
- end
37
-
38
- result = Interpreter[:call!].(api, state, input.size, output)
39
-
40
- if result[:error]
41
- raise SweetMoon::Errors::SweetMoonErrorHelper.for(
42
- result[:error][:status]
43
- ), result[:error][:value]
44
- end
45
-
46
- result = Reader[:read_all!].(api, state)
47
-
48
- return result.first if output == 1
5
+ Function = Component::V54::Function
49
6
 
50
- result
51
- }, pop: false }
52
- }
53
- }
7
+ LUA_HANDLER = Component::V54::LUA_HANDLER
54
8
  end
55
9
  end
@@ -1,23 +1,24 @@
1
1
  require_relative '../../../logic/interpreters/interpreter_51'
2
2
 
3
+ require_relative 'function'
3
4
  require_relative 'reader'
4
- require_relative 'writer'
5
5
  require_relative 'table'
6
+ require_relative 'writer'
6
7
 
7
8
  module Component
8
9
  module V51
9
10
  Interpreter = {
10
11
  version: Logic::V51::Interpreter[:version],
12
+ logic: Logic::V51,
11
13
 
12
14
  create_state!: ->(api) {
13
15
  state = api.luaL_newstate
14
- { state: { lua: state, avoid_gc: [] },
16
+ { state: { lua: state, avoid_gc: [], ruby_error_info: nil },
15
17
  error: state ? nil : :MemoryAllocation }
16
18
  },
17
19
 
18
20
  open_standard_libraries!: ->(api, state) {
19
21
  api.luaL_openlibs(state[:lua])
20
-
21
22
  { state: state }
22
23
  },
23
24
 
@@ -31,12 +32,17 @@ module Component
31
32
  { state: state, error: Interpreter[:_error].(api, state, result, pull: true) }
32
33
  },
33
34
 
34
- set_table!: ->(api, state, variable, value) {
35
- Table[:set!].(api, state, variable, value)
35
+ set_table!: ->(api, state) {
36
+ result = api.lua_settable(state[:lua], -3)
37
+
38
+ api.lua_settop(state[:lua], -2)
39
+
40
+ { state: state,
41
+ error: Interpreter[:_error].(api, state, result, pull: false) }
36
42
  },
37
43
 
38
44
  push_value!: ->(api, state, value) {
39
- Writer[:push!].(api, state, value)
45
+ Writer[:push!].(api, state, Component::V51, value)
40
46
  { state: state }
41
47
  },
42
48
 
@@ -54,13 +60,13 @@ module Component
54
60
  unless key.nil?
55
61
  if api.lua_typename(state[:lua],
56
62
  api.lua_type(state[:lua], -1)).read_string == 'table'
57
- Table[:read_field!].(api, state, key, -1)
63
+ Table[:read_field!].(api, state, Component::V51, key, -1)
58
64
  else
59
65
  api.lua_pushnil(state[:lua])
60
66
  end
61
67
  end
62
68
 
63
- { state: state }
69
+ { state: state, extra_pop: true }
64
70
  },
65
71
 
66
72
  call!: ->(api, state, inputs = 0, outputs = 1) {
@@ -69,7 +75,7 @@ module Component
69
75
  },
70
76
 
71
77
  read_and_pop!: ->(api, state, stack_index = -1, extra_pop: false) {
72
- result = Component::V51::Reader[:read!].(api, state, stack_index)
78
+ result = Reader[:read!].(api, state, Component::V51, stack_index)
73
79
 
74
80
  api.lua_settop(state[:lua], -2) if result[:pop]
75
81
  api.lua_settop(state[:lua], -2) if extra_pop
@@ -78,7 +84,7 @@ module Component
78
84
  },
79
85
 
80
86
  read_all!: ->(api, state) {
81
- result = Reader[:read_all!].(api, state)
87
+ result = Reader[:read_all!].(api, state, Component::V51)
82
88
 
83
89
  { state: state, output: result }
84
90
  },
@@ -1,67 +1,7 @@
1
- require 'ffi'
2
-
3
- require_relative 'interpreter'
4
- require_relative 'function'
5
- require_relative 'table'
1
+ require_relative '../54/reader'
6
2
 
7
3
  module Component
8
4
  module V51
9
- Reader = {
10
- read_all!: ->(api, state) {
11
- (1..api.lua_gettop(state[:lua])).map do
12
- Interpreter[:read_and_pop!].(api, state)[:output]
13
- end.reverse
14
- },
15
-
16
- read!: ->(api, state, stack_index = -1) {
17
- stack_index = api.lua_gettop(state[:lua]) if stack_index == -1
18
-
19
- type = api.lua_typename(state[:lua],
20
- api.lua_type(state[:lua], stack_index)).read_string
21
-
22
- case type
23
- when 'string'
24
- Reader[:read_string!].(api, state, stack_index)
25
- when 'number'
26
- Reader[:read_number!].(api, state, stack_index)
27
- when 'no value'
28
- { value: nil, pop: true, type: type }
29
- when 'nil'
30
- { value: nil, pop: true }
31
- when 'boolean'
32
- Reader[:read_boolean!].(api, state, stack_index)
33
- when 'table'
34
- Table[:read!].(api, state, stack_index)
35
- when 'function'
36
- Function[:read!].(api, state, stack_index)
37
- else
38
- # none nil boolean lightuserdata number
39
- # string table function userdata thread
40
- { value:
41
- "#{type}: 0x#{api.lua_topointer(state[:lua], stack_index).address}",
42
- type: type, pop: true }
43
- end
44
- },
45
-
46
- read_string!: ->(api, state, stack_index) {
47
- { value: api.lua_tostring(state[:lua], stack_index).read_string,
48
- pop: true }
49
- },
50
-
51
- read_number!: ->(api, state, stack_index) {
52
- if api.respond_to?(:lua_isinteger) &&
53
- api.respond_to?(:lua_tointeger) &&
54
- api.lua_isinteger(state[:lua], stack_index) == 1
55
-
56
- return { value: api.lua_tointeger(state[:lua], stack_index), pop: true }
57
- end
58
-
59
- { value: api.lua_tonumber(state[:lua], stack_index), pop: true }
60
- },
61
-
62
- read_boolean!: ->(api, state, stack_index) {
63
- { value: api.lua_toboolean(state[:lua], stack_index) == 1, pop: true }
64
- }
65
- }
5
+ Reader = Component::V54::Reader
66
6
  end
67
7
  end
@@ -1,61 +1,7 @@
1
- require_relative '../../../logic/tables'
2
-
3
- require_relative 'writer'
4
- require_relative 'reader'
1
+ require_relative '../54/table'
5
2
 
6
3
  module Component
7
4
  module V51
8
- Table = {
9
- push!: ->(api, state, list, stack_index = -1) {
10
- stack_index = api.lua_gettop(state[:lua]) if stack_index == -1
11
-
12
- api.lua_createtable(state[:lua], list.size, 0)
13
-
14
- if list.is_a? Hash
15
- list.each_key do |key|
16
- Writer[:push!].(api, state, key)
17
- Writer[:push!].(api, state, list[key])
18
- api.lua_settable(state[:lua], stack_index + 1)
19
- end
20
- else
21
- list.each_with_index do |value, index|
22
- Writer[:push!].(api, state, index + 1)
23
- Writer[:push!].(api, state, value)
24
- api.lua_settable(state[:lua], stack_index + 1)
25
- end
26
- end
27
- },
28
-
29
- read!: ->(api, state, stack_index) {
30
- stack_index = api.lua_gettop(state[:lua]) if stack_index == -1
31
-
32
- type = api.lua_typename(state[:lua],
33
- api.lua_type(state[:lua], stack_index)).read_string
34
-
35
- api.lua_pushnil(state[:lua])
36
-
37
- return nil if type != 'table'
38
-
39
- tuples = []
40
-
41
- while api.lua_next(state[:lua], stack_index).positive?
42
- value = Reader[:read!].(api, state, stack_index + 2)
43
- key = Reader[:read!].(api, state, stack_index + 1)
44
- api.lua_settop(state[:lua], -2) if value[:pop]
45
-
46
- tuples << [key[:value], value[:value]]
47
-
48
- break if value[:type] == 'no value'
49
- end
50
-
51
- { value: Logic::Tables[:to_hash_or_array].(tuples), pop: true }
52
- },
53
-
54
- read_field!: ->(api, state, expected_key, stack_index) {
55
- expected_key = expected_key.to_s if expected_key.is_a? Symbol
56
-
57
- api.lua_getfield(state[:lua], stack_index, expected_key)
58
- }
59
- }
5
+ Table = Component::V54::Table
60
6
  end
61
7
  end
@@ -1,45 +1,7 @@
1
- require_relative 'function'
2
- require_relative 'table'
1
+ require_relative '../54/writer'
3
2
 
4
3
  module Component
5
4
  module V51
6
- Writer = {
7
- push!: ->(api, state, value) {
8
- case Writer[:_to_lua_type].(value)
9
- when 'string'
10
- api.lua_pushstring(state[:lua], value.to_s)
11
- when 'number'
12
- api.lua_pushnumber(state[:lua], value)
13
- when 'integer'
14
- if api.respond_to? :lua_pushinteger
15
- api.lua_pushinteger(state[:lua], value)
16
- else
17
- api.lua_pushnumber(state[:lua], value)
18
- end
19
- when 'nil'
20
- api.lua_pushnil(state[:lua])
21
- when 'boolean'
22
- api.lua_pushboolean(state[:lua], value ? 1 : 0)
23
- when 'table'
24
- Table[:push!].(api, state, value)
25
- when 'function'
26
- Function[:push!].(api, state, value)
27
- else
28
- api.lua_pushstring(
29
- state[:lua], "#<#{value.class}:0x#{format('%016x', value.object_id)}>"
30
- )
31
- end
32
- },
33
-
34
- _to_lua_type: ->(value) {
35
- return 'nil' if value.nil?
36
- return 'function' if value.is_a?(Proc)
37
- return 'integer' if value.is_a? Integer
38
- return 'number' if value.is_a? Float
39
- return 'table' if value.is_a?(Hash) || value.is_a?(Array)
40
- return 'string' if value.is_a?(String) || value.instance_of?(Symbol)
41
- return 'boolean' if [true, false].include? value
42
- }
43
- }
5
+ Writer = Component::V54::Writer
44
6
  end
45
7
  end