execjs 2.3.0 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e37eb677376847f2bfe3abf9691b02bb7ac413eb
4
- data.tar.gz: 0e44ddbc91755ce29cf30dc4f4bf775afde29f89
3
+ metadata.gz: fde57c2c3957d81859359cf4c369f608a644551b
4
+ data.tar.gz: e28210a8d96d0c21c113f3cf7be58f763f42fb87
5
5
  SHA512:
6
- metadata.gz: 5d1e57303da891beb4ed994fe590bfa1480785edebc12c6babd02075a0dbf8051d1e2f73089aea28e3da70c41f3702fd0c65cbd76fd8d316d63cabbfbe974279
7
- data.tar.gz: 2e12d615380795a7ea63b519f9c3ae556536fc72aa4856e56a5cb467167c941cd78c3e03e87eaf943c753f527957f29a79277fc81a01e81ab05a0fde2c9def01
6
+ metadata.gz: 8ee2ee0d5407bda28d4351701bbcfd0a9b39bbb0de18843c78c258cd89ee39ee73fbfb9ec2f1172b43027c2ffcf8320d9471dc98de80c3c9cfb4804be8dac8f5
7
+ data.tar.gz: ac21345c3a7c2283d70f65f86f7b4577f694d184783d5d93e4d1a72d93fe3fa95c6e31612728efeb503f8216d8f4dfd7558f77cf9e94440b62ed5dbf000cdffb
data/README.md CHANGED
@@ -64,7 +64,7 @@ older stock runtimes like JSC on OSX and JScript on Windows may not. You should
64
64
  only count on ES3 features being available. Prefer feature checking these APIs
65
65
  rather than hard coding support for specific runtimes.
66
66
 
67
- **Can I ExecJS be used to sandbox scripts?**
67
+ **Can ExecJS be used to sandbox scripts?**
68
68
 
69
69
  No, ExecJS shouldn't be used for any security related sandboxing. Since runtimes
70
70
  are automatically detected, each runtime has different sandboxing properties.
@@ -24,12 +24,12 @@ module ExecJS
24
24
 
25
25
  def exec(source, options = {})
26
26
  source = encode(source)
27
- source = "#{@source}\n#{source}" if @source
27
+ source = "#{@source}\n#{source}" if @source != ""
28
28
  source = @runtime.compile_source(source)
29
29
 
30
30
  tmpfile = write_to_tempfile(source)
31
31
  begin
32
- extract_result(@runtime.exec_runtime(tmpfile.path))
32
+ extract_result(@runtime.exec_runtime(tmpfile.path), tmpfile.path)
33
33
  ensure
34
34
  File.unlink(tmpfile)
35
35
  end
@@ -57,14 +57,25 @@ module ExecJS
57
57
  tmpfile
58
58
  end
59
59
 
60
- def extract_result(output)
61
- status, value = output.empty? ? [] : ::JSON.parse(output, create_additions: false)
60
+ def extract_result(output, filename)
61
+ status, value, stack = output.empty? ? [] : ::JSON.parse(output, create_additions: false)
62
62
  if status == "ok"
63
63
  value
64
- elsif value =~ /SyntaxError:/
65
- raise RuntimeError, value
66
64
  else
67
- raise ProgramError, value
65
+ stack ||= ""
66
+ real_filename = File.realpath(filename)
67
+ stack = stack.split("\n").map do |line|
68
+ line.sub(" at ", "")
69
+ .sub(real_filename, "(execjs)")
70
+ .sub(filename, "(execjs)")
71
+ .strip
72
+ end
73
+ stack.reject! { |line| ["eval code", "eval@[native code]"].include?(line) }
74
+ stack.shift unless stack[0].to_s.include?("(execjs)")
75
+ error_class = value =~ /SyntaxError:/ ? RuntimeError : ProgramError
76
+ error = error_class.new(value)
77
+ error.set_backtrace(stack + caller)
78
+ raise error
68
79
  end
69
80
  end
70
81
  end
@@ -158,7 +169,7 @@ module ExecJS
158
169
  if $?.success?
159
170
  output
160
171
  else
161
- raise RuntimeError, output
172
+ raise exec_runtime_error(output)
162
173
  end
163
174
  end
164
175
 
@@ -181,7 +192,7 @@ module ExecJS
181
192
  if $?.success?
182
193
  output
183
194
  else
184
- raise RuntimeError, output
195
+ raise exec_runtime_error(output)
185
196
  end
186
197
  end
187
198
  else
@@ -193,13 +204,22 @@ module ExecJS
193
204
  if $?.success?
194
205
  output
195
206
  else
196
- raise RuntimeError, output
207
+ raise exec_runtime_error(output)
197
208
  end
198
209
  end
199
210
  end
200
211
  # Internally exposed for Context.
201
212
  public :exec_runtime
202
213
 
214
+ def exec_runtime_error(output)
215
+ error = RuntimeError.new(output)
216
+ lines = output.split("\n")
217
+ lineno = lines[0][/:(\d+)$/, 1] if lines[0]
218
+ lineno ||= 1
219
+ error.set_backtrace(["(execjs):#{lineno}"] + caller)
220
+ error
221
+ end
222
+
203
223
  def which(command)
204
224
  Array(command).find do |name|
205
225
  name, args = name.split(/\s+/, 2)
@@ -12,11 +12,7 @@ module ExecJS
12
12
  begin
13
13
  @v8_context.eval(source)
14
14
  rescue ::V8::JSError => e
15
- if e.value["name"] == "SyntaxError"
16
- raise RuntimeError, e.value.to_s
17
- else
18
- raise ProgramError, e.value.to_s
19
- end
15
+ raise wrap_error(e)
20
16
  end
21
17
  end
22
18
  end
@@ -37,11 +33,7 @@ module ExecJS
37
33
  begin
38
34
  unbox @v8_context.eval("(#{source})")
39
35
  rescue ::V8::JSError => e
40
- if e.value["name"] == "SyntaxError"
41
- raise RuntimeError, e.value.to_s
42
- else
43
- raise ProgramError, e.value.to_s
44
- end
36
+ raise wrap_error(e)
45
37
  end
46
38
  end
47
39
  end
@@ -52,11 +44,7 @@ module ExecJS
52
44
  begin
53
45
  unbox @v8_context.eval(properties).call(*args)
54
46
  rescue ::V8::JSError => e
55
- if e.value["name"] == "SyntaxError"
56
- raise RuntimeError, e.value.to_s
57
- else
58
- raise ProgramError, e.value.to_s
59
- end
47
+ raise wrap_error(e)
60
48
  end
61
49
  end
62
50
  end
@@ -96,6 +84,20 @@ module ExecJS
96
84
  result
97
85
  end
98
86
  end
87
+
88
+ def wrap_error(e)
89
+ error_class = e.value["name"] == "SyntaxError" ? RuntimeError : ProgramError
90
+
91
+ stack = e.value["stack"] || ""
92
+ stack = stack.split("\n")
93
+ stack.shift
94
+ stack = [e.message[/<eval>:\d+:\d+/, 0]].compact if stack.empty?
95
+ stack = stack.map { |line| line.sub(" at ", "").sub("<eval>", "(execjs)").strip }
96
+
97
+ error = error_class.new(e.value.to_s)
98
+ error.set_backtrace(stack + caller)
99
+ error
100
+ end
99
101
  end
100
102
 
101
103
  def name
@@ -10,7 +10,7 @@ module ExecJS
10
10
  fix_memory_limit! @rhino_context
11
11
  @rhino_context.eval(source)
12
12
  rescue Exception => e
13
- reraise_error(e)
13
+ raise wrap_error(e)
14
14
  end
15
15
 
16
16
  def exec(source, options = {})
@@ -28,13 +28,13 @@ module ExecJS
28
28
  unbox @rhino_context.eval("(#{source})")
29
29
  end
30
30
  rescue Exception => e
31
- reraise_error(e)
31
+ raise wrap_error(e)
32
32
  end
33
33
 
34
34
  def call(properties, *args)
35
35
  unbox @rhino_context.eval(properties).call(*args)
36
36
  rescue Exception => e
37
- reraise_error(e)
37
+ raise wrap_error(e)
38
38
  end
39
39
 
40
40
  def unbox(value)
@@ -58,17 +58,18 @@ module ExecJS
58
58
  end
59
59
  end
60
60
 
61
- def reraise_error(e)
62
- case e
63
- when ::Rhino::JSError
64
- if e.message == "syntax error"
65
- raise RuntimeError, e.message
66
- else
67
- raise ProgramError, e.message
68
- end
69
- else
70
- raise e
71
- end
61
+ def wrap_error(e)
62
+ return e unless e.is_a?(::Rhino::JSError)
63
+
64
+ error_class = e.message == "syntax error" ? RuntimeError : ProgramError
65
+
66
+ stack = e.backtrace
67
+ stack = stack.map { |line| line.sub(" at ", "").sub("<eval>", "(execjs)").strip }
68
+ stack.unshift("(execjs):1") if e.javascript_backtrace.empty?
69
+
70
+ error = error_class.new(e.value.to_s)
71
+ error.set_backtrace(stack)
72
+ error
72
73
  end
73
74
 
74
75
  private
@@ -9,10 +9,10 @@
9
9
  try {
10
10
  print(JSON.stringify(['ok', result]));
11
11
  } catch (err) {
12
- print('["err"]');
12
+ print(JSON.stringify(['err', '' + err, err.stack]));
13
13
  }
14
14
  }
15
15
  } catch (err) {
16
- print(JSON.stringify(['err', '' + err]));
16
+ print(JSON.stringify(['err', '' + err, err.stack]));
17
17
  }
18
18
  });
@@ -13,10 +13,10 @@
13
13
  try {
14
14
  print(JSON.stringify(['ok', result]));
15
15
  } catch (err) {
16
- print('["err"]');
16
+ print(JSON.stringify(['err', err.name + ': ' + err.message, err.stack]));
17
17
  }
18
18
  }
19
19
  } catch (err) {
20
- print(JSON.stringify(['err', err.name + ': ' + err.message]));
20
+ print(JSON.stringify(['err', err.name + ': ' + err.message, err.stack]));
21
21
  }
22
22
  });
@@ -11,10 +11,10 @@
11
11
  try {
12
12
  print(JSON.stringify(['ok', result]));
13
13
  } catch (err) {
14
- print('["err"]');
14
+ print(JSON.stringify(['err', '' + err, err.stack]));
15
15
  }
16
16
  }
17
17
  } catch (err) {
18
- print(JSON.stringify(['err', '' + err]));
18
+ print(JSON.stringify(['err', '' + err, err.stack]));
19
19
  }
20
20
  });
@@ -9,10 +9,10 @@
9
9
  try {
10
10
  print(JSON.stringify(['ok', result]));
11
11
  } catch (err) {
12
- print('["err"]');
12
+ print(JSON.stringify(['err', '' + err, err.stack]));
13
13
  }
14
14
  }
15
15
  } catch (err) {
16
- print(JSON.stringify(['err', '' + err]));
16
+ print(JSON.stringify(['err', '' + err, err.stack]));
17
17
  }
18
18
  });
@@ -1,3 +1,3 @@
1
1
  module ExecJS
2
- VERSION = "2.3.0"
2
+ VERSION = "2.4.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: execjs
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.0
4
+ version: 2.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sam Stephenson
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-02-03 00:00:00.000000000 Z
12
+ date: 2015-03-05 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -70,7 +70,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
70
70
  version: '0'
71
71
  requirements: []
72
72
  rubyforge_project:
73
- rubygems_version: 2.2.2
73
+ rubygems_version: 2.4.5
74
74
  signing_key:
75
75
  specification_version: 4
76
76
  summary: Run JavaScript code from Ruby