fancy 0.9.0 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/fancy +1 -1
- data/bin/fspec +1 -1
- data/bin/ifancy +1 -0
- data/boot/compiler/parser/ext/fancy_parser.bundle +0 -0
- data/boot/fancy_ext/array.rb +0 -1
- data/boot/fancy_ext/object.rb +10 -0
- data/boot/rbx-compiler/parser/Makefile +207 -0
- data/boot/rbx-compiler/parser/fancy_parser.bundle +0 -0
- data/boot/rbx-compiler/parser/lexer.c +2314 -0
- data/boot/rbx-compiler/parser/lexer.h +316 -0
- data/boot/rbx-compiler/parser/parser.c +3133 -0
- data/boot/rbx-compiler/parser/parser.h +131 -0
- data/doc/api/fancy.jsonp +1 -1
- data/examples/echo.fy +1 -1
- data/examples/stupid_quicksort.fy +1 -1
- data/lib/array.fy +4 -0
- data/lib/block.fy +11 -8
- data/lib/class.fy +21 -0
- data/lib/compiler/ast.fy +1 -0
- data/lib/compiler/ast/identifier.fy +1 -3
- data/lib/compiler/ast/method_spec.fy +6 -0
- data/lib/contracts.fy +2 -2
- data/lib/documentation.fy +25 -24
- data/lib/enumerable.fy +38 -21
- data/lib/fancy_spec.fy +24 -17
- data/lib/fdoc.fy +32 -16
- data/lib/future.fy +26 -1
- data/lib/object.fy +4 -1
- data/lib/parser/ext/Makefile +207 -0
- data/lib/parser/ext/fancy_parser.bundle +0 -0
- data/lib/parser/ext/lexer.c +2442 -0
- data/lib/parser/ext/lexer.h +316 -0
- data/lib/parser/ext/lexer.lex +4 -4
- data/lib/parser/ext/parser.c +3400 -0
- data/lib/parser/ext/parser.h +135 -0
- data/lib/parser/ext/parser.y +52 -74
- data/lib/parser/methods.fy +20 -8
- data/lib/parser/parse_error.fy +2 -2
- data/lib/range.fy +1 -1
- data/lib/rbx.fy +1 -0
- data/lib/rbx/block.fy +0 -12
- data/lib/rbx/class.fy +1 -1
- data/lib/rbx/compiled_method.fy +4 -0
- data/lib/{eval.fy → rbx/eval.fy} +3 -3
- data/lib/rbx/hash.fy +13 -3
- data/lib/rbx/method.fy +1 -0
- data/lib/rbx/object.fy +5 -1
- data/lib/rbx/range.fy +1 -1
- data/lib/rbx/scopes.fy +15 -0
- data/lib/rbx/symbol.fy +4 -0
- data/lib/rbx/thread.fy +1 -1
- data/lib/set.fy +11 -0
- data/lib/string.fy +17 -17
- data/lib/symbol.fy +7 -3
- data/lib/tuple.fy +3 -8
- data/lib/version.fy +1 -1
- data/ruby_lib/fancy +1 -1
- data/ruby_lib/fancy.rb +6 -19
- data/ruby_lib/interactive/hilight.rb +5 -5
- data/tests/block.fy +36 -13
- data/tests/class.fy +124 -120
- data/tests/contracts.fy +9 -8
- data/tests/future.fy +29 -10
- data/tests/method.fy +5 -0
- data/tests/range.fy +8 -0
- data/tests/set.fy +16 -6
- data/tests/struct.fy +4 -4
- metadata +60 -55
- data/lib/queue.fy +0 -7
- data/tests/future_proxy.fy +0 -8
@@ -0,0 +1,135 @@
|
|
1
|
+
/* A Bison parser, made by GNU Bison 2.7. */
|
2
|
+
|
3
|
+
/* Bison interface for Yacc-like parsers in C
|
4
|
+
|
5
|
+
Copyright (C) 1984, 1989-1990, 2000-2012 Free Software Foundation, Inc.
|
6
|
+
|
7
|
+
This program is free software: you can redistribute it and/or modify
|
8
|
+
it under the terms of the GNU General Public License as published by
|
9
|
+
the Free Software Foundation, either version 3 of the License, or
|
10
|
+
(at your option) any later version.
|
11
|
+
|
12
|
+
This program is distributed in the hope that it will be useful,
|
13
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
15
|
+
GNU General Public License for more details.
|
16
|
+
|
17
|
+
You should have received a copy of the GNU General Public License
|
18
|
+
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
19
|
+
|
20
|
+
/* As a special exception, you may create a larger work that contains
|
21
|
+
part or all of the Bison parser skeleton and distribute that work
|
22
|
+
under terms of your choice, so long as that work isn't itself a
|
23
|
+
parser generator using the skeleton or a modified version thereof
|
24
|
+
as a parser skeleton. Alternatively, if you modify or redistribute
|
25
|
+
the parser skeleton itself, you may (at your option) remove this
|
26
|
+
special exception, which will cause the skeleton and the resulting
|
27
|
+
Bison output files to be licensed under the GNU General Public
|
28
|
+
License without this special exception.
|
29
|
+
|
30
|
+
This special exception was added by the Free Software Foundation in
|
31
|
+
version 2.2 of Bison. */
|
32
|
+
|
33
|
+
#ifndef YY_YY_USERS_BAKKDOOR_PROJECTS_FANCY_FANCY_LIB_PARSER_EXT_PARSER_H_INCLUDED
|
34
|
+
# define YY_YY_USERS_BAKKDOOR_PROJECTS_FANCY_FANCY_LIB_PARSER_EXT_PARSER_H_INCLUDED
|
35
|
+
/* Enabling traces. */
|
36
|
+
#ifndef YYDEBUG
|
37
|
+
# define YYDEBUG 0
|
38
|
+
#endif
|
39
|
+
#if YYDEBUG
|
40
|
+
extern int yydebug;
|
41
|
+
#endif
|
42
|
+
|
43
|
+
/* Tokens. */
|
44
|
+
#ifndef YYTOKENTYPE
|
45
|
+
# define YYTOKENTYPE
|
46
|
+
/* Put the tokens into the symbol table, so that GDB and other debuggers
|
47
|
+
know about them. */
|
48
|
+
enum yytokentype {
|
49
|
+
LPAREN = 258,
|
50
|
+
RPAREN = 259,
|
51
|
+
FUTURE_SEND = 260,
|
52
|
+
ASYNC_SEND = 261,
|
53
|
+
AT_LCURLY = 262,
|
54
|
+
LCURLY = 263,
|
55
|
+
RCURLY = 264,
|
56
|
+
LBRACKET = 265,
|
57
|
+
RBRACKET = 266,
|
58
|
+
LEFTHASH = 267,
|
59
|
+
RIGHTHASH = 268,
|
60
|
+
STAB = 269,
|
61
|
+
ARROW = 270,
|
62
|
+
THIN_ARROW = 271,
|
63
|
+
COMMA = 272,
|
64
|
+
SEMI = 273,
|
65
|
+
NL = 274,
|
66
|
+
COLON = 275,
|
67
|
+
RETURN_LOCAL = 276,
|
68
|
+
RETURN = 277,
|
69
|
+
TRY = 278,
|
70
|
+
CATCH = 279,
|
71
|
+
FINALLY = 280,
|
72
|
+
RETRY = 281,
|
73
|
+
SUPER = 282,
|
74
|
+
CLASS = 283,
|
75
|
+
DEF = 284,
|
76
|
+
DOT = 285,
|
77
|
+
DOLLAR = 286,
|
78
|
+
EQUALS = 287,
|
79
|
+
MATCH = 288,
|
80
|
+
CASE = 289,
|
81
|
+
IDENTIFIER = 290,
|
82
|
+
SELECTOR = 291,
|
83
|
+
RUBY_SEND_OPEN = 292,
|
84
|
+
RUBY_OPER_OPEN = 293,
|
85
|
+
CONSTANT = 294,
|
86
|
+
INTEGER_LITERAL = 295,
|
87
|
+
HEX_LITERAL = 296,
|
88
|
+
OCT_LITERAL = 297,
|
89
|
+
BIN_LITERAL = 298,
|
90
|
+
DOUBLE_LITERAL = 299,
|
91
|
+
STRING_LITERAL = 300,
|
92
|
+
MULTI_STRING_LITERAL = 301,
|
93
|
+
SYMBOL_LITERAL = 302,
|
94
|
+
REGEX_LITERAL = 303,
|
95
|
+
OPERATOR = 304,
|
96
|
+
BACKTICK_LITERAL = 305
|
97
|
+
};
|
98
|
+
#endif
|
99
|
+
|
100
|
+
|
101
|
+
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
|
102
|
+
typedef union YYSTYPE
|
103
|
+
{
|
104
|
+
/* Line 2065 of yacc.c */
|
105
|
+
#line 18 "/Users/bakkdoor/projects/fancy/fancy/lib/parser/ext/parser.y"
|
106
|
+
|
107
|
+
VALUE object;
|
108
|
+
ID symbol;
|
109
|
+
|
110
|
+
|
111
|
+
/* Line 2065 of yacc.c */
|
112
|
+
#line 113 "/Users/bakkdoor/projects/fancy/fancy/lib/parser/ext/parser.h"
|
113
|
+
} YYSTYPE;
|
114
|
+
# define YYSTYPE_IS_TRIVIAL 1
|
115
|
+
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
|
116
|
+
# define YYSTYPE_IS_DECLARED 1
|
117
|
+
#endif
|
118
|
+
|
119
|
+
extern YYSTYPE yylval;
|
120
|
+
|
121
|
+
#ifdef YYPARSE_PARAM
|
122
|
+
#if defined __STDC__ || defined __cplusplus
|
123
|
+
int yyparse (void *YYPARSE_PARAM);
|
124
|
+
#else
|
125
|
+
int yyparse ();
|
126
|
+
#endif
|
127
|
+
#else /* ! YYPARSE_PARAM */
|
128
|
+
#if defined __STDC__ || defined __cplusplus
|
129
|
+
int yyparse (VALUE self);
|
130
|
+
#else
|
131
|
+
int yyparse ();
|
132
|
+
#endif
|
133
|
+
#endif /* ! YYPARSE_PARAM */
|
134
|
+
|
135
|
+
#endif /* !YY_YY_USERS_BAKKDOOR_PROJECTS_FANCY_FANCY_LIB_PARSER_EXT_PARSER_H_INCLUDED */
|
data/lib/parser/ext/parser.y
CHANGED
@@ -86,6 +86,8 @@ extern char *yytext;
|
|
86
86
|
%type <object> operator
|
87
87
|
%type <object> selector
|
88
88
|
|
89
|
+
%type <object> def
|
90
|
+
|
89
91
|
|
90
92
|
%type <object> identifier
|
91
93
|
%type <object> any_identifier
|
@@ -116,14 +118,10 @@ extern char *yytext;
|
|
116
118
|
%type <object> return_local_statement
|
117
119
|
%type <object> return_statement
|
118
120
|
|
119
|
-
%type <object> def
|
120
|
-
|
121
121
|
%type <object> const_identifier
|
122
122
|
%type <object> class_def
|
123
123
|
%type <object> class_no_super
|
124
124
|
%type <object> class_super
|
125
|
-
%type <object> class_method_w_args
|
126
|
-
%type <object> class_method_no_args
|
127
125
|
|
128
126
|
%type <object> method_def
|
129
127
|
%type <object> method_args
|
@@ -132,8 +130,8 @@ extern char *yytext;
|
|
132
130
|
%type <object> method_arg_default
|
133
131
|
%type <object> method_w_args
|
134
132
|
%type <object> method_no_args
|
135
|
-
%type <object>
|
136
|
-
%type <object>
|
133
|
+
%type <object> method_spec
|
134
|
+
%type <object> operator_spec
|
137
135
|
|
138
136
|
%type <object> message_send
|
139
137
|
%type <object> unary_send
|
@@ -321,9 +319,6 @@ const_identifier: constant {
|
|
321
319
|
}
|
322
320
|
;
|
323
321
|
|
324
|
-
def: DEF { $$ = rb_intern("public"); }
|
325
|
-
;
|
326
|
-
|
327
322
|
class_no_super: CLASS const_identifier expression_block {
|
328
323
|
$$ = rb_funcall(self, rb_intern("ast:class:parent:body:"), 4, INT2NUM(yylineno), $2, Qnil, $3);
|
329
324
|
}
|
@@ -340,103 +335,86 @@ class_super: CLASS const_identifier COLON const_identifier expression_block {
|
|
340
335
|
}
|
341
336
|
;
|
342
337
|
|
343
|
-
|
344
|
-
|
345
|
-
| class_method_w_args
|
346
|
-
| class_method_no_args
|
347
|
-
| operator_def
|
348
|
-
| class_operator_def
|
349
|
-
;
|
350
|
-
|
351
|
-
method_arg: selector identifier {
|
352
|
-
$$ = rb_funcall(self, rb_intern("ast:param:var:"), 3, INT2NUM(yylineno), $1, $2);
|
338
|
+
def: DEF {
|
339
|
+
$$ = rb_intern("def:");
|
353
340
|
}
|
354
341
|
;
|
355
342
|
|
356
|
-
|
357
|
-
$$ = rb_funcall(self, rb_intern("ast:
|
358
|
-
}
|
359
|
-
| method_args method_arg {
|
360
|
-
$$ = rb_funcall(self, rb_intern("ast:concat:into:"), 3, INT2NUM(yylineno), $2, $1);
|
361
|
-
}
|
362
|
-
| method_args method_args_default {
|
363
|
-
$$ = rb_funcall(self, rb_intern("ast:concat:into:"), 3, INT2NUM(yylineno), $2, $1);
|
364
|
-
}
|
365
|
-
| method_args_default {
|
366
|
-
$$ = rb_funcall(self, rb_intern("ast:concat:"), 2, INT2NUM(yylineno), $1);
|
343
|
+
method_def: def method_spec {
|
344
|
+
$$ = rb_funcall(self, rb_intern("ast:define:method:on:"), 4, INT2NUM(yylineno), $1, $2, Qnil);
|
367
345
|
}
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
346
|
+
| def any_identifier method_spec {
|
347
|
+
$$ = rb_funcall(self, rb_intern("ast:define:method:on:"), 4, INT2NUM(yylineno), $1, $3, $2);
|
348
|
+
}
|
349
|
+
| any_identifier def method_spec {
|
350
|
+
$$ = rb_funcall(self, rb_intern("ast:define:method:on:"), 4, INT2NUM(yylineno), $2, $3, $1);
|
372
351
|
}
|
373
352
|
;
|
374
353
|
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
| method_args_default space method_arg_default {
|
379
|
-
$$ = rb_funcall(self, rb_intern("ast:concat:into:"), 3, INT2NUM(yylineno), $3, $1);
|
380
|
-
}
|
354
|
+
method_spec: operator_spec
|
355
|
+
| method_w_args
|
356
|
+
| method_no_args
|
381
357
|
;
|
382
358
|
|
383
|
-
method_w_args:
|
384
|
-
$$ = rb_funcall(self, rb_intern("ast:
|
359
|
+
method_w_args: method_args expression_block {
|
360
|
+
$$ = rb_funcall(self, rb_intern("ast:method_spec:expand:"), 3, INT2NUM(yylineno), $1, $2);
|
385
361
|
}
|
386
|
-
|
|
387
|
-
$$ = rb_funcall(self, rb_intern("ast:
|
362
|
+
| method_args {
|
363
|
+
$$ = rb_funcall(self, rb_intern("ast:method_spec:expand:"), 3, INT2NUM(yylineno), $1, Qnil);
|
388
364
|
}
|
389
365
|
;
|
390
366
|
|
391
367
|
|
392
|
-
method_no_args:
|
393
|
-
$$ = rb_funcall(self, rb_intern("ast:
|
368
|
+
method_no_args: identifier expression_block {
|
369
|
+
$$ = rb_funcall(self, rb_intern("ast:method_spec:body:"), 3, INT2NUM(yylineno), $1, $2);
|
394
370
|
}
|
395
|
-
|
|
396
|
-
$$ = rb_funcall(self, rb_intern("ast:
|
371
|
+
| identifier {
|
372
|
+
$$ = rb_funcall(self, rb_intern("ast:method_spec:body:"), 3, INT2NUM(yylineno), $1, Qnil);
|
397
373
|
}
|
398
374
|
;
|
399
375
|
|
400
|
-
|
401
|
-
|
402
|
-
|
376
|
+
operator_spec: operator identifier expression_block {
|
377
|
+
$$ = rb_funcall(self, rb_intern("ast:oper:arg:body:"), 4, INT2NUM(yylineno), $1, $2, $3);
|
378
|
+
}
|
379
|
+
| LBRACKET identifier RBRACKET expression_block {
|
380
|
+
$$ = rb_funcall(self, rb_intern("ast:oper:arg:body:"), 4,
|
381
|
+
INT2NUM(yylineno), fy_terminal_node_from(self, "ast:identifier:", "[]"), $2, $4);
|
403
382
|
}
|
404
|
-
|
|
405
|
-
$$ = rb_funcall(self, rb_intern("ast:
|
383
|
+
| LBRACKET identifier RBRACKET COLON identifier expression_block {
|
384
|
+
$$ = rb_funcall(self, rb_intern("ast:oper:arg:arg:body:"), 5,
|
385
|
+
INT2NUM(yylineno), fy_terminal_node_from(self, "ast:identifier:", "[]:"), $2, $5, $6);
|
406
386
|
}
|
407
387
|
;
|
408
388
|
|
409
|
-
|
410
|
-
$$ = rb_funcall(self, rb_intern("ast:
|
411
|
-
}
|
412
|
-
| def any_identifier identifier {
|
413
|
-
$$ = rb_funcall(self, rb_intern("ast:method:body:access:owner:"), 5, INT2NUM(yylineno), $3, Qnil, $1, $2);
|
389
|
+
method_arg: selector identifier {
|
390
|
+
$$ = rb_funcall(self, rb_intern("ast:param:var:"), 3, INT2NUM(yylineno), $1, $2);
|
414
391
|
}
|
415
392
|
;
|
416
393
|
|
417
|
-
|
418
|
-
$$ = rb_funcall(self, rb_intern("ast:
|
394
|
+
method_args: method_arg {
|
395
|
+
$$ = rb_funcall(self, rb_intern("ast:concat:"), 2, INT2NUM(yylineno), $1);
|
419
396
|
}
|
420
|
-
|
|
421
|
-
$$ = rb_funcall(self, rb_intern("ast:
|
422
|
-
INT2NUM(yylineno), fy_terminal_node_from(self, "ast:identifier:", "[]"), $3, $5, $1);
|
397
|
+
| method_args method_arg {
|
398
|
+
$$ = rb_funcall(self, rb_intern("ast:concat:into:"), 3, INT2NUM(yylineno), $2, $1);
|
423
399
|
}
|
424
|
-
|
|
425
|
-
$$ = rb_funcall(self, rb_intern("ast:
|
426
|
-
|
400
|
+
| method_args method_args_default {
|
401
|
+
$$ = rb_funcall(self, rb_intern("ast:concat:into:"), 3, INT2NUM(yylineno), $2, $1);
|
402
|
+
}
|
403
|
+
| method_args_default {
|
404
|
+
$$ = rb_funcall(self, rb_intern("ast:concat:"), 2, INT2NUM(yylineno), $1);
|
427
405
|
}
|
428
406
|
;
|
429
407
|
|
430
|
-
|
431
|
-
$$ = rb_funcall(self, rb_intern("ast:
|
408
|
+
method_arg_default: selector identifier LPAREN space exp space RPAREN {
|
409
|
+
$$ = rb_funcall(self, rb_intern("ast:param:var:default:"), 4, INT2NUM(yylineno), $1, $2, $5);
|
432
410
|
}
|
433
|
-
|
434
|
-
|
435
|
-
|
411
|
+
;
|
412
|
+
|
413
|
+
method_args_default: method_arg_default {
|
414
|
+
$$ = rb_funcall(self, rb_intern("ast:concat:"), 2, INT2NUM(yylineno), $1);
|
436
415
|
}
|
437
|
-
|
|
438
|
-
$$ = rb_funcall(self, rb_intern("ast:
|
439
|
-
INT2NUM(yylineno), fy_terminal_node_from(self, "ast:identifier:", "[]:"), $4, $7, $8, $1, $2);
|
416
|
+
| method_args_default space method_arg_default {
|
417
|
+
$$ = rb_funcall(self, rb_intern("ast:concat:into:"), 3, INT2NUM(yylineno), $3, $1);
|
440
418
|
}
|
441
419
|
;
|
442
420
|
|
data/lib/parser/methods.fy
CHANGED
@@ -250,14 +250,22 @@ class Fancy {
|
|
250
250
|
}
|
251
251
|
}
|
252
252
|
|
253
|
-
def ast: line oper: op arg: arg body: body
|
253
|
+
def ast: line oper: op arg: arg body: body {
|
254
254
|
margs = [ast: line param: op var: arg]
|
255
|
-
ast: line
|
255
|
+
ast: line method_spec: margs body: body
|
256
256
|
}
|
257
257
|
|
258
|
-
def ast: line oper: op arg: arg1 arg: arg2 body: body
|
258
|
+
def ast: line oper: op arg: arg1 arg: arg2 body: body {
|
259
259
|
margs = [SelectorVarDefault new(op, arg1, nil), SelectorVarDefault new(ast: line identifier: "", arg2, nil)]
|
260
|
-
ast: line
|
260
|
+
ast: line method_spec: margs body: body
|
261
|
+
}
|
262
|
+
|
263
|
+
def ast: line define: define method: spec on: receiver {
|
264
|
+
ary = []
|
265
|
+
Array(spec) each: |spec| {
|
266
|
+
ary << $ ast: (spec line) method: (spec margs) body: (spec body) access: 'public owner: receiver
|
267
|
+
}
|
268
|
+
AST ExpressionList new: line list: ary
|
261
269
|
}
|
262
270
|
|
263
271
|
def ast: line method: margs body: body access: access ('public) owner: owner (nil) {
|
@@ -283,13 +291,17 @@ class Fancy {
|
|
283
291
|
}
|
284
292
|
}
|
285
293
|
|
286
|
-
def ast: line
|
294
|
+
def ast: line method_spec: margs expand: body {
|
287
295
|
defs = []
|
288
296
|
method: margs delegators: |sel fwd| {
|
289
|
-
defs << $ ast: line
|
297
|
+
defs << $ ast: line method_spec: sel body: fwd
|
290
298
|
}
|
291
|
-
defs << $ ast: line
|
292
|
-
|
299
|
+
defs << $ ast: line method_spec: margs body: body
|
300
|
+
defs
|
301
|
+
}
|
302
|
+
|
303
|
+
def ast: line method_spec: margs body: body {
|
304
|
+
AST MethodSpec new: line margs: margs body: body
|
293
305
|
}
|
294
306
|
|
295
307
|
def ast: line block: body {
|
data/lib/parser/parse_error.fy
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
class Fancy {
|
2
2
|
class Parser {
|
3
3
|
class ParseError : StdError {
|
4
|
-
read_slots: ['line, 'filename]
|
4
|
+
read_slots: ['line, 'filename, 'message]
|
5
5
|
def initialize: @line message: @message filename: @filename {
|
6
6
|
initialize: $ "Parse error near '" ++ @message ++ "' at line " ++ @line ++ " in " ++ @filename
|
7
7
|
}
|
8
8
|
}
|
9
9
|
}
|
10
|
-
}
|
10
|
+
}
|
data/lib/range.fy
CHANGED
data/lib/rbx.fy
CHANGED
data/lib/rbx/block.fy
CHANGED
data/lib/rbx/class.fy
CHANGED
data/lib/rbx/compiled_method.fy
CHANGED
data/lib/{eval.fy → rbx/eval.fy}
RENAMED
@@ -1,4 +1,4 @@
|
|
1
|
-
require: "compiler"
|
1
|
+
require: "../compiler"
|
2
2
|
|
3
3
|
def Fancy eval: code binding: binding (nil) file: file ("(fancy-eval)") line: line (1) {
|
4
4
|
"""
|
@@ -10,8 +10,8 @@ def Fancy eval: code binding: binding (nil) file: file ("(fancy-eval)") line: li
|
|
10
10
|
|
11
11
|
binding if_nil: {
|
12
12
|
binding = Binding setup(Rubinius VariableScope of_sender(),
|
13
|
-
|
14
|
-
|
13
|
+
Rubinius CompiledMethod of_sender(),
|
14
|
+
Rubinius StaticScope of_sender())
|
15
15
|
}
|
16
16
|
|
17
17
|
# The compiled method
|