source: EcnlProtoTool/trunk/webapp/webmrbc/Ruby/Procedures.cs@ 321

Last change on this file since 321 was 321, checked in by coas-nagasima, 7 years ago

文字コードを設定

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csharp;charset=UTF-8
File size: 2.4 KB
Line 
1// Porting from
2// https://github.com/jeanlazarou/blockly2ruby
3// Copyright (c) 2014 Jean Lazarou
4// MIT Lisence
5using System;
6using Bridge;
7using System.Collections.Generic;
8
9namespace WebMrbc
10{
11 partial class Ruby
12 {
13 public node procedures_defreturn(ProceduresDefBlock block)
14 {
15 var lv = local_switch();
16
17 var args = new arg_node[0];
18 for (var x = 0; x < block.arguments_.Length; x++) {
19 args.Push(new arg_node(this, local_add_f(block.arguments_[x])));
20 }
21 var funcName = intern(block.getFieldValue("NAME"));
22 var branch = statementToCode(block, "STACK");
23 var returnValue = valueToCode(block, "RETURN");
24 if (returnValue == null) {
25 returnValue = new return_node(this, returnValue);
26 }
27 ((begin_node)branch).progs.Push(returnValue);
28 var code = new def_node(this, funcName, args, branch);
29
30 local_resume(lv);
31
32 return code;
33 }
34
35 // Defining a procedure without a return value uses the same generator as
36 // a procedure with a return value.
37 public node procedures_defnoreturn(ProceduresDefnoreturnBlock block)
38 {
39 return procedures_defreturn(block);
40 }
41
42 public node procedures_callreturn(ProceduresCallreturnBlock block)
43 {
44 // Call a procedure with a return value.
45 var funcName = intern(block.getFieldValue("NAME"));
46 var args = new node[0];
47 for (var x = 0; x < block.arguments_.Length; x++) {
48 args.Push(valueToCode(block, "ARG" + x));
49 if (args[x] == null)
50 args[x] = new nil_node(this);
51 }
52 return new fcall_node(this, funcName, args, null);
53 }
54
55 public node procedures_callnoreturn(ProceduresCallnoreturnBlock block)
56 {
57 // Call a procedure with no return value.
58 var funcName = intern(block.getFieldValue("NAME"));
59 var args = new node[0];
60 for (var x = 0; x < block.arguments_.Length; x++) {
61 args.Push(valueToCode(block, "ARG" + x));
62 if (args[x] == null)
63 args[x] = new nil_node(this);
64 }
65 return new fcall_node(this, funcName, args, null);
66 }
67
68 public node procedures_ifreturn(ProceduresIfreturnBlock block)
69 {
70 // Conditionally return value from a procedure.
71 var condition = valueToCode(block, "CONDITION");
72 if (condition == null) condition = new false_node(this);
73 node code = null;
74 if (block.hasReturnValue_) {
75 var value = valueToCode(block, "VALUE");
76 if (value == null) value = new nil_node(this);
77 code = new return_node(this, value);
78 }
79 else {
80 code = new return_node(this, null);
81 }
82 return new if_node(this, condition, code, null, false);
83 }
84 }
85}
Note: See TracBrowser for help on using the repository browser.