sweet-moon 0.0.4 → 0.0.5

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,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
 
@@ -41,7 +42,7 @@ module Component
41
42
  },
42
43
 
43
44
  push_value!: ->(api, state, value) {
44
- Writer[:push!].(api, state, value)
45
+ Writer[:push!].(api, state, Component::V51, value)
45
46
  { state: state }
46
47
  },
47
48
 
@@ -59,7 +60,7 @@ module Component
59
60
  unless key.nil?
60
61
  if api.lua_typename(state[:lua],
61
62
  api.lua_type(state[:lua], -1)).read_string == 'table'
62
- Table[:read_field!].(api, state, key, -1)
63
+ Table[:read_field!].(api, state, Component::V51, key, -1)
63
64
  else
64
65
  api.lua_pushnil(state[:lua])
65
66
  end
@@ -74,7 +75,7 @@ module Component
74
75
  },
75
76
 
76
77
  read_and_pop!: ->(api, state, stack_index = -1, extra_pop: false) {
77
- result = Component::V51::Reader[:read!].(api, state, stack_index)
78
+ result = Reader[:read!].(api, state, Component::V51, stack_index)
78
79
 
79
80
  api.lua_settop(state[:lua], -2) if result[:pop]
80
81
  api.lua_settop(state[:lua], -2) if extra_pop
@@ -83,7 +84,7 @@ module Component
83
84
  },
84
85
 
85
86
  read_all!: ->(api, state) {
86
- result = Reader[:read_all!].(api, state)
87
+ result = Reader[:read_all!].(api, state, Component::V51)
87
88
 
88
89
  { state: state, output: result }
89
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' || key[:value].instance_of?(Proc)
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
@@ -1,55 +1,111 @@
1
1
  require_relative '../../../logic/interpreters/interpreter_54'
2
2
  require_relative '../../../dsl/errors'
3
3
 
4
- require_relative 'writer'
4
+ require_relative 'interpreter'
5
5
  require_relative 'reader'
6
+ require_relative 'writer'
6
7
 
7
8
  module Component
8
9
  module V54
9
10
  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
- }
11
+ push!: ->(api, state, component, closure) {
12
+ handler = component::Function[:build_handler!].(
13
+ api, state, component, closure
14
+ )
18
15
 
19
16
  state[:avoid_gc] << handler
20
17
 
18
+ lua_name = "_sweet_moon_ruby_#{handler.object_id}"
19
+
21
20
  api.lua_pushcclosure(state[:lua], handler, 0)
22
- },
21
+ component::Interpreter[:pop_and_set_as!].(api, state, lua_name)
23
22
 
24
- read!: ->(api, state, _stack_index) {
25
- reference = api.luaL_ref(
26
- state[:lua], Logic::V54::Interpreter[:LUA_REGISTRYINDEX]
23
+ result = component::Interpreter[:push_chunk!].(
24
+ api, state, component::LUA_HANDLER.sub('_ruby', lua_name)
27
25
  )
28
26
 
27
+ unless result[:error].nil?
28
+ raise SweetMoon::Errors::SweetMoonErrorHelper.for(
29
+ result[:error][:status]
30
+ ), result[:error][:value]
31
+ end
32
+
33
+ component::Interpreter[:call!].(api, state, 0, 1)
34
+ },
35
+
36
+ build_handler!: ->(api, state, component, closure) {
37
+ ->(current_state) {
38
+ updated_state = state.merge(lua: current_state)
39
+ input = component::Reader[:read_all!].(api, updated_state, component)
40
+ begin
41
+ result = closure.(*input)
42
+ component::Writer[:push!].(
43
+ api, updated_state, component, { error: nil, output: result }
44
+ )
45
+ rescue Exception => e
46
+ state[:ruby_error_info] = e
47
+ component::Writer[:push!].(
48
+ api, updated_state, component, {
49
+ error: true, output: "#{e.class}: #{e.message}"
50
+ }
51
+ )
52
+ end
53
+ return 1
54
+ }
55
+ },
56
+
57
+ read!: ->(api, state, component, _stack_index) {
58
+ lua_registry_index = component::Interpreter[:logic]::Interpreter[
59
+ :LUA_REGISTRYINDEX
60
+ ]
61
+
62
+ reference = api.luaL_ref(state[:lua], lua_registry_index)
63
+
29
64
  { value: ->(input = [], output = 1) {
30
- api.lua_rawgeti(
31
- state[:lua], Logic::V54::Interpreter[:LUA_REGISTRYINDEX], reference
32
- )
65
+ api.lua_rawgeti(state[:lua], lua_registry_index, reference)
33
66
 
34
67
  input.each do |value|
35
- Writer[:push!].(api, state, value)
68
+ component::Writer[:push!].(api, state, component, value)
36
69
  end
37
70
 
38
- result = Interpreter[:call!].(api, state, input.size, output)
71
+ result = component::Interpreter[:call!].(api, state, input.size, output)
39
72
 
40
- if result[:error]
41
- raise SweetMoon::Errors::SweetMoonErrorHelper.for(
42
- result[:error][:status]
43
- ), result[:error][:value]
44
- end
73
+ component::Function[:raise_error!].(state, result) if result[:error]
45
74
 
46
- result = Reader[:read_all!].(api, state)
75
+ result = component::Reader[:read_all!].(api, state, component)
47
76
 
48
77
  return result.first if output == 1
49
78
 
50
79
  result
51
80
  }, pop: false }
81
+ },
82
+
83
+ raise_error!: ->(state, result) {
84
+ if state[:ruby_error_info].nil?
85
+ raise SweetMoon::Errors::SweetMoonErrorHelper.for(
86
+ result[:error][:status]
87
+ ), result[:error][:value]
88
+ else
89
+ ruby_error = state[:ruby_error_info]
90
+ state[:ruby_error_info] = nil
91
+
92
+ raise SweetMoon::Errors::SweetMoonErrorHelper.merge_traceback!(
93
+ ruby_error, result[:error][:value]
94
+ )
95
+ end
52
96
  }
53
97
  }
98
+
99
+ LUA_HANDLER = <<LUA
100
+ return function (...)
101
+ result = _ruby(...)
102
+
103
+ if result['error'] then
104
+ error(result['output'] .. ' ' .. debug.traceback())
105
+ else
106
+ return result['output']
107
+ end
108
+ end
109
+ LUA
54
110
  end
55
111
  end
@@ -1,17 +1,19 @@
1
1
  require_relative '../../../logic/interpreters/interpreter_54'
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 V54
9
10
  Interpreter = {
10
11
  version: Logic::V54::Interpreter[:version],
12
+ logic: Logic::V54,
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
 
@@ -40,7 +42,7 @@ module Component
40
42
  },
41
43
 
42
44
  push_value!: ->(api, state, value) {
43
- Writer[:push!].(api, state, value)
45
+ Writer[:push!].(api, state, Component::V54, value)
44
46
  { state: state }
45
47
  },
46
48
 
@@ -55,7 +57,7 @@ module Component
55
57
  unless key.nil?
56
58
  if api.lua_typename(state[:lua],
57
59
  api.lua_type(state[:lua], -1)).read_string == 'table'
58
- Table[:read_field!].(api, state, key, -1)
60
+ Table[:read_field!].(api, state, Component::V54, key, -1)
59
61
  else
60
62
  api.lua_pushnil(state[:lua])
61
63
  end
@@ -70,7 +72,8 @@ module Component
70
72
  },
71
73
 
72
74
  read_and_pop!: ->(api, state, stack_index = -1, extra_pop: false) {
73
- result = Component::V54::Reader[:read!].(api, state, stack_index)
75
+ result = Component::V54::Reader[:read!].(api, state, Component::V54,
76
+ stack_index)
74
77
 
75
78
  api.lua_settop(state[:lua], -2) if result[:pop]
76
79
  api.lua_settop(state[:lua], -2) if extra_pop
@@ -79,7 +82,7 @@ module Component
79
82
  },
80
83
 
81
84
  read_all!: ->(api, state) {
82
- result = Reader[:read_all!].(api, state)
85
+ result = Reader[:read_all!].(api, state, Component::V54)
83
86
 
84
87
  { state: state, output: result }
85
88
  },
@@ -7,33 +7,34 @@ require_relative 'table'
7
7
  module Component
8
8
  module V54
9
9
  Reader = {
10
- read_all!: ->(api, state) {
10
+ read_all!: ->(api, state, component) {
11
11
  (1..api.lua_gettop(state[:lua])).map do
12
- Interpreter[:read_and_pop!].(api, state)[:output]
12
+ component::Interpreter[:read_and_pop!].(api, state)[:output]
13
13
  end.reverse
14
14
  },
15
15
 
16
- read!: ->(api, state, stack_index = -1) {
16
+ read!: ->(api, state, component, stack_index = -1) {
17
17
  stack_index = api.lua_gettop(state[:lua]) if stack_index == -1
18
18
 
19
- type = api.lua_typename(state[:lua],
20
- 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
21
22
 
22
23
  case type
23
24
  when 'string'
24
- Reader[:read_string!].(api, state, stack_index)
25
+ component::Reader[:read_string!].(api, state, stack_index)
25
26
  when 'number'
26
- Reader[:read_number!].(api, state, stack_index)
27
+ component::Reader[:read_number!].(api, state, stack_index)
27
28
  when 'no value'
28
29
  { value: nil, pop: true, type: type }
29
30
  when 'nil'
30
31
  { value: nil, pop: true }
31
32
  when 'boolean'
32
- Reader[:read_boolean!].(api, state, stack_index)
33
+ component::Reader[:read_boolean!].(api, state, stack_index)
33
34
  when 'table'
34
- Table[:read!].(api, state, stack_index)
35
+ component::Table[:read!].(api, state, component, stack_index)
35
36
  when 'function'
36
- Function[:read!].(api, state, stack_index)
37
+ component::Function[:read!].(api, state, component, stack_index)
37
38
  else
38
39
  # none nil boolean lightuserdata number
39
40
  # string table function userdata thread
@@ -6,31 +6,36 @@ require_relative 'reader'
6
6
  module Component
7
7
  module V54
8
8
  Table = {
9
- push!: ->(api, state, list, stack_index = -1) {
9
+ create_table!: ->(api, state, list) {
10
+ api.lua_createtable(state[:lua], list.size, 0)
11
+ },
12
+
13
+ push!: ->(api, state, component, list, stack_index = -1) {
10
14
  stack_index = api.lua_gettop(state[:lua]) if stack_index == -1
11
15
 
12
- api.lua_createtable(state[:lua], list.size, 0)
16
+ component::Table[:create_table!].(api, state, list)
13
17
 
14
18
  if list.is_a? Hash
15
19
  list.each_key do |key|
16
- Writer[:push!].(api, state, key)
17
- Writer[:push!].(api, state, list[key])
20
+ component::Writer[:push!].(api, state, component, key)
21
+ component::Writer[:push!].(api, state, component, list[key])
18
22
  api.lua_settable(state[:lua], stack_index + 1)
19
23
  end
20
24
  else
21
25
  list.each_with_index do |value, index|
22
- Writer[:push!].(api, state, index + 1)
23
- Writer[:push!].(api, state, value)
26
+ component::Writer[:push!].(api, state, component, index + 1)
27
+ component::Writer[:push!].(api, state, component, value)
24
28
  api.lua_settable(state[:lua], stack_index + 1)
25
29
  end
26
30
  end
27
31
  },
28
32
 
29
- read!: ->(api, state, stack_index) {
33
+ read!: ->(api, state, component, stack_index) {
30
34
  stack_index = api.lua_gettop(state[:lua]) if stack_index == -1
31
35
 
32
- type = api.lua_typename(state[:lua],
33
- api.lua_type(state[:lua], stack_index)).read_string
36
+ type = api.lua_typename(
37
+ state[:lua], api.lua_type(state[:lua], stack_index)
38
+ ).read_string
34
39
 
35
40
  api.lua_pushnil(state[:lua])
36
41
 
@@ -39,8 +44,8 @@ module Component
39
44
  tuples = []
40
45
 
41
46
  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)
47
+ value = component::Reader[:read!].(api, state, component, stack_index + 2)
48
+ key = component::Reader[:read!].(api, state, component, stack_index + 1)
44
49
  api.lua_settop(state[:lua], -2) if value[:pop]
45
50
 
46
51
  tuples << [key[:value], value[:value]]
@@ -51,7 +56,7 @@ module Component
51
56
  { value: Logic::Tables[:to_hash_or_array].(tuples), pop: true }
52
57
  },
53
58
 
54
- read_field!: ->(api, state, expected_key, stack_index) {
59
+ read_field!: ->(api, state, _component, expected_key, stack_index) {
55
60
  expected_key = expected_key.to_s if expected_key.is_a? Symbol
56
61
 
57
62
  api.lua_getfield(state[:lua], stack_index, expected_key)
@@ -4,8 +4,8 @@ require_relative 'table'
4
4
  module Component
5
5
  module V54
6
6
  Writer = {
7
- push!: ->(api, state, value) {
8
- case Writer[:_to_lua_type].(value)
7
+ push!: ->(api, state, component, value) {
8
+ case component::Writer[:_to_lua_type].(value)
9
9
  when 'string'
10
10
  api.lua_pushstring(state[:lua], value.to_s)
11
11
  when 'number'
@@ -21,9 +21,9 @@ module Component
21
21
  when 'boolean'
22
22
  api.lua_pushboolean(state[:lua], value ? 1 : 0)
23
23
  when 'table'
24
- Table[:push!].(api, state, value)
24
+ component::Table[:push!].(api, state, component, value)
25
25
  when 'function'
26
- Function[:push!].(api, state, value)
26
+ component::Function[:push!].(api, state, component, value)
27
27
  else
28
28
  api.lua_pushstring(
29
29
  state[:lua], "#<#{value.class}:0x#{format('%016x', value.object_id)}>"
@@ -1,6 +1,6 @@
1
1
  # Available at https://github.com/gbaptista/sweet-moon-test
2
2
 
3
- fennel-dev: '/home/me/sweet-moon-test/fennel-dev.lua'
3
+ fennel-dev: '/home/me/sweet-moon-test/fennel/dev/?.lua'
4
4
 
5
5
  luarocks:
6
6
  path:
@@ -12,32 +12,32 @@ luarocks:
12
12
  jit:2.0.5:
13
13
  description: 'Lua Jit 2.0.5 + Fennel 1.0.0'
14
14
  shared_object: /home/me/sweet-moon-test/libluajit.so.2.0.5
15
- fennel: /home/me/sweet-moon-test/fennel-100.lua
15
+ fennel: /home/me/sweet-moon-test/fennel/100/?.lua
16
16
 
17
17
  5.4.4:
18
18
  description: 'Lua 5.4.4 + Fennel 1.0.0'
19
19
  shared_object: /home/me/sweet-moon-test/liblua.so.5.4.4
20
- fennel: /home/me/sweet-moon-test/fennel-100.lua
20
+ fennel: /home/me/sweet-moon-test/fennel/100/?.lua
21
21
 
22
22
  5.4.2:
23
23
  description: 'Lua 5.4.2 + Fennel 1.0.0'
24
24
  shared_object: /home/me/sweet-moon-test/liblua.so.5.4.2
25
- fennel: /home/me/sweet-moon-test/fennel-100.lua
25
+ fennel: /home/me/sweet-moon-test/fennel/100/?.lua
26
26
 
27
27
  5.3.3:
28
28
  description: 'Lua 5.3.3'
29
29
  shared_object: /home/me/sweet-moon-test/liblua.so.5.3.3
30
- fennel: /home/me/sweet-moon-test/fennel-100.lua
30
+ fennel: /home/me/sweet-moon-test/fennel/100/?.lua
31
31
 
32
32
  5.2.4:
33
33
  description: 'Lua 5.2.4'
34
34
  shared_object: /home/me/sweet-moon-test/liblua.so.5.2.4
35
- fennel: /home/me/sweet-moon-test/fennel-100.lua
35
+ fennel: /home/me/sweet-moon-test/fennel/100/?.lua
36
36
 
37
37
  5.1.5:
38
38
  description: 'Lua 5.1.5'
39
39
  shared_object: /home/me/sweet-moon-test/liblua.so.5.1.5
40
- fennel: /home/me/sweet-moon-test/fennel-100.lua
40
+ fennel: /home/me/sweet-moon-test/fennel/100/?.lua
41
41
 
42
42
  5.0.3:
43
43
  description: 'Lua 5.0.3'
data/controllers/state.rb CHANGED
@@ -87,10 +87,20 @@ module Controller
87
87
  },
88
88
 
89
89
  _check!: ->(result) {
90
+ ruby_error = result[:state] && result[:state][:ruby_error_info]
91
+
92
+ result[:state][:ruby_error_info] = nil if ruby_error
93
+
90
94
  if result[:error]
91
- raise SweetMoon::Errors::SweetMoonErrorHelper.for(
92
- result[:error][:status]
93
- ), result[:error][:value]
95
+ if ruby_error
96
+ raise SweetMoon::Errors::SweetMoonErrorHelper.merge_traceback!(
97
+ ruby_error, result[:error][:value]
98
+ )
99
+ else
100
+ raise SweetMoon::Errors::SweetMoonErrorHelper.for(
101
+ result[:error][:status]
102
+ ), result[:error][:value]
103
+ end
94
104
  end
95
105
 
96
106
  result
data/dsl/errors.rb CHANGED
@@ -10,6 +10,14 @@ module SweetMoon
10
10
  class LuaFileError < LuaError; end
11
11
 
12
12
  module SweetMoonErrorHelper
13
+ def merge_traceback!(ruby_error, lua_traceback)
14
+ ruby_error.set_backtrace(
15
+ ruby_error.backtrace.concat(lua_traceback.split("\n"))
16
+ )
17
+
18
+ ruby_error
19
+ end
20
+
13
21
  def for(status)
14
22
  case status
15
23
  when :runtime then LuaRuntimeError
@@ -22,7 +30,7 @@ module SweetMoon
22
30
  end
23
31
  end
24
32
 
25
- module_function :for
33
+ module_function :for, :merge_traceback!
26
34
  end
27
35
  end
28
36
  end
data/dsl/fennel.rb CHANGED
@@ -11,8 +11,7 @@ module DSL
11
11
  'table.insert(package.loaders or package.searchers, fennel.searcher)'
12
12
  )
13
13
 
14
- # TODO: Makes sense?
15
- # debug.traceback = fennel.traceback
14
+ @state.eval('debug.traceback = fennel.traceback')
16
15
 
17
16
  @eval = @state.get(:fennel, :eval)
18
17
  @dofile = @state.get(:fennel, :dofile)