loxxy 0.1.05 → 0.1.06

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c8eae41b5b093b55c02a81bbe81b08202eb4ecd64c1dd288246c0cd4af44c627
4
- data.tar.gz: 208158a80e89e789d74c66f295ee4cbec6d37e6d9f3185dedfbcaa30a156fe35
3
+ metadata.gz: 293bf5f6fb0eb5a1daf2723484a2867909c03cc99b20270e562d288d334f0bdc
4
+ data.tar.gz: 9e26854c6d4334f9869d0cd420ebd4365c0f978666e7ede8310d25e600cf5834
5
5
  SHA512:
6
- metadata.gz: dc1393417a3cdb013fdbcc085dcb3ba7dda45784e73a26ef44c1ee21b4322a9a18063d16c0cae7d3266be829ce31c6090773ba1631712211c388d84b21e0161d
7
- data.tar.gz: 2f07cb2e882fbff31b73eee169a99849729b8f4136888335b2915a183ff32ed8aa78a66d93ea7765f0b09f0747b4b09cfae2aece5ca7478f41892b173a0ce2ab
6
+ metadata.gz: 2ac692f16a41b162001fee869d426abf634f1a2bb82bf17eac26d8c35939a8ca63234246a6ff88cc04db3833057b445e2650773652ce102a0dcc4f3aa90182e8
7
+ data.tar.gz: 2764cb3d1703fdc948180cb2060f93a0ef72148f2877f5b711ecacd17d2ba52a9d3b9f7736eb53130850635cb0d127f2a5161a8361cb4a2268fc6275d15a6b1c
data/CHANGELOG.md CHANGED
@@ -1,3 +1,12 @@
1
+ ## [0.1.06] - 2021-03-06
2
+ - Parameters/arguments checks in function declaration and call
3
+
4
+ ### Changed
5
+ - Method `Ast::AstBuilder#reduce_call_arglist` raises a `Loxxy::RuntimeError` when more than 255 arguments are used.
6
+ - Method `BackEnd::Engine#after_call_expr` raises a `Loxxy::RuntimeError` when argument count doesn't match the arity of function.
7
+
8
+ - Class `BackEnd::Function` renamed to `LoxFunction`
9
+
1
10
  ## [0.1.05] - 2021-03-05
2
11
  - Test for Fibbonacci recursive function is now passing.
3
12
 
@@ -273,7 +273,7 @@ module Loxxy
273
273
  def reduce_call_arglist(_production, _range, tokens, theChildren)
274
274
  args = theChildren[1] || []
275
275
  if args.size > 255
276
- raise StandardError, "Can't have more than 255 arguments."
276
+ raise Loxxy::RuntimeError, "Can't have more than 255 arguments."
277
277
  end
278
278
 
279
279
  LoxCallExpr.new(tokens[0].position, args)
@@ -303,6 +303,10 @@ module Loxxy
303
303
  def reduce_function(_production, _range, _tokens, theChildren)
304
304
  first_child = theChildren.first
305
305
  pos = first_child.token.position
306
+ if theChildren[2] && theChildren[2].size > 255
307
+ msg = "Can't have more than 255 parameters."
308
+ raise Loxxy::SyntaxError, msg
309
+ end
306
310
  LoxFunStmt.new(pos, first_child.token.lexeme, theChildren[2], theChildren[4])
307
311
  end
308
312
 
@@ -3,7 +3,7 @@
3
3
  # Load all the classes implementing AST nodes
4
4
  require_relative '../ast/all_lox_nodes'
5
5
  require_relative 'binary_operator'
6
- require_relative 'function'
6
+ require_relative 'lox_function'
7
7
  require_relative 'symbol_table'
8
8
  require_relative 'unary_operator'
9
9
 
@@ -199,18 +199,18 @@ module Loxxy
199
199
  case callee
200
200
  when NativeFunction
201
201
  stack.push callee.call # Pass arguments
202
- when Function
202
+ when LoxFunction
203
+ arg_count = aCallExpr.arguments.size
204
+ if arg_count != callee.arity
205
+ msg = "Expected #{callee.arity} arguments but got #{arg_count}."
206
+ raise Loxxy::RuntimeError, msg
207
+ end
203
208
  callee.call(self, aVisitor)
204
209
  else
205
210
  raise Loxxy::RuntimeError, 'Can only call functions and classes.'
206
211
  end
207
212
  end
208
213
 
209
- def complete_call
210
- callee = ret_stack.pop
211
- symbol_table.leave_environment if callee.kind_of?(Function)
212
- end
213
-
214
214
  def after_grouping_expr(_groupingExpr)
215
215
  # Do nothing: work was already done by visiting /evaluating the subexpression
216
216
  end
@@ -234,7 +234,7 @@ module Loxxy
234
234
  end
235
235
 
236
236
  def after_fun_stmt(aFunStmt, _visitor)
237
- function = Function.new(aFunStmt.name, aFunStmt.params, aFunStmt.body, stack)
237
+ function = LoxFunction.new(aFunStmt.name, aFunStmt.params, aFunStmt.body, stack)
238
238
  new_var = Variable.new(aFunStmt.name, function)
239
239
  symbol_table.insert(new_var)
240
240
  end
@@ -260,7 +260,7 @@ module Loxxy
260
260
  unary_operators[:-@] = negate_op
261
261
 
262
262
  negation_op = UnaryOperator.new('!', [Datatype::BuiltinDatatype,
263
- BackEnd::Function])
263
+ BackEnd::LoxFunction])
264
264
  unary_operators[:!] = negation_op
265
265
  end
266
266
 
@@ -7,7 +7,7 @@ module Loxxy
7
7
  # rubocop: disable Style/AccessorGrouping
8
8
  # Representation of a Lox function.
9
9
  # It is a named slot that can be associated with a value at the time.
10
- class Function
10
+ class LoxFunction
11
11
  # @return [String]
12
12
  attr_reader :name
13
13
 
@@ -26,6 +26,10 @@ module Loxxy
26
26
  @stack = aStack
27
27
  end
28
28
 
29
+ def arity
30
+ parameters ? parameters.size : 0
31
+ end
32
+
29
33
  def accept(_visitor)
30
34
  stack.push self
31
35
  end
data/lib/loxxy/error.rb CHANGED
@@ -6,4 +6,7 @@ module Loxxy
6
6
 
7
7
  # Error occurring while Loxxy executes some invalid Lox code.
8
8
  class RuntimeError < Error; end
9
+
10
+ # Error occurring while Loxxy parses some invalid Lox code.
11
+ class SyntaxError < Error; end
9
12
  end
data/lib/loxxy/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Loxxy
4
- VERSION = '0.1.05'
4
+ VERSION = '0.1.06'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: loxxy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.05
4
+ version: 0.1.06
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dimitri Geshef
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-03-05 00:00:00.000000000 Z
11
+ date: 2021-03-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rley
@@ -113,7 +113,7 @@ files:
113
113
  - lib/loxxy/back_end/engine.rb
114
114
  - lib/loxxy/back_end/entry.rb
115
115
  - lib/loxxy/back_end/environment.rb
116
- - lib/loxxy/back_end/function.rb
116
+ - lib/loxxy/back_end/lox_function.rb
117
117
  - lib/loxxy/back_end/symbol_table.rb
118
118
  - lib/loxxy/back_end/unary_operator.rb
119
119
  - lib/loxxy/back_end/variable.rb