jaseci 1.4.2.6__py3-none-any.whl → 2.0.0__py3-none-any.whl

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.

Potentially problematic release.


This version of jaseci might be problematic. Click here for more details.

Files changed (187) hide show
  1. jaseci/__init__.py +3 -37
  2. jaseci-2.0.0.dist-info/METADATA +65 -0
  3. jaseci-2.0.0.dist-info/RECORD +4 -0
  4. {jaseci-1.4.2.6.dist-info → jaseci-2.0.0.dist-info}/WHEEL +1 -2
  5. jaseci/VERSION +0 -1
  6. jaseci/cli_tools/__init__.py +0 -0
  7. jaseci/cli_tools/book_tools.py +0 -457
  8. jaseci/cli_tools/jsctl.py +0 -500
  9. jaseci/cli_tools/tests/__init__.py +0 -0
  10. jaseci/cli_tools/tests/test_jsctl.py +0 -556
  11. jaseci/extens/__init__.py +0 -0
  12. jaseci/extens/act_lib/__init__.py +0 -0
  13. jaseci/extens/act_lib/date.py +0 -118
  14. jaseci/extens/act_lib/elastic.py +0 -87
  15. jaseci/extens/act_lib/file.py +0 -77
  16. jaseci/extens/act_lib/file_handler.py +0 -190
  17. jaseci/extens/act_lib/internal.py +0 -19
  18. jaseci/extens/act_lib/jaseci.py +0 -62
  19. jaseci/extens/act_lib/mail.py +0 -10
  20. jaseci/extens/act_lib/maths.py +0 -168
  21. jaseci/extens/act_lib/net.py +0 -192
  22. jaseci/extens/act_lib/rand.py +0 -83
  23. jaseci/extens/act_lib/regex.py +0 -85
  24. jaseci/extens/act_lib/request.py +0 -170
  25. jaseci/extens/act_lib/std.py +0 -236
  26. jaseci/extens/act_lib/storage.py +0 -53
  27. jaseci/extens/act_lib/stripe.py +0 -338
  28. jaseci/extens/act_lib/task.py +0 -14
  29. jaseci/extens/act_lib/tests/__init__.py +0 -0
  30. jaseci/extens/act_lib/tests/std_test_code.py +0 -37
  31. jaseci/extens/act_lib/tests/test_date.py +0 -26
  32. jaseci/extens/act_lib/tests/test_elastic.py +0 -159
  33. jaseci/extens/act_lib/tests/test_file.py +0 -116
  34. jaseci/extens/act_lib/tests/test_file_lib.py +0 -40
  35. jaseci/extens/act_lib/tests/test_mail_lib.py +0 -33
  36. jaseci/extens/act_lib/tests/test_maths.py +0 -147
  37. jaseci/extens/act_lib/tests/test_net_lib.py +0 -62
  38. jaseci/extens/act_lib/tests/test_regex.py +0 -61
  39. jaseci/extens/act_lib/tests/test_std.py +0 -51
  40. jaseci/extens/act_lib/tests/test_std_lib.py +0 -36
  41. jaseci/extens/act_lib/tests/test_url.py +0 -32
  42. jaseci/extens/act_lib/tests/test_vector.py +0 -36
  43. jaseci/extens/act_lib/tests/test_webtool.py +0 -44
  44. jaseci/extens/act_lib/tests/test_zlib.py +0 -24
  45. jaseci/extens/act_lib/url.py +0 -80
  46. jaseci/extens/act_lib/vector.py +0 -158
  47. jaseci/extens/act_lib/webtool.py +0 -29
  48. jaseci/extens/act_lib/zip.py +0 -34
  49. jaseci/extens/api/__init__.py +0 -0
  50. jaseci/extens/api/actions_api.py +0 -171
  51. jaseci/extens/api/alias_api.py +0 -140
  52. jaseci/extens/api/architype_api.py +0 -197
  53. jaseci/extens/api/config_api.py +0 -129
  54. jaseci/extens/api/global_api.py +0 -85
  55. jaseci/extens/api/graph_api.py +0 -168
  56. jaseci/extens/api/health_api.py +0 -21
  57. jaseci/extens/api/interface.py +0 -269
  58. jaseci/extens/api/jac_api.py +0 -172
  59. jaseci/extens/api/jsorc_api.py +0 -317
  60. jaseci/extens/api/logger_api.py +0 -90
  61. jaseci/extens/api/master_api.py +0 -134
  62. jaseci/extens/api/object_api.py +0 -102
  63. jaseci/extens/api/prometheus_api.py +0 -75
  64. jaseci/extens/api/queue_api.py +0 -141
  65. jaseci/extens/api/sentinel_api.py +0 -271
  66. jaseci/extens/api/share_api.py +0 -64
  67. jaseci/extens/api/super_api.py +0 -65
  68. jaseci/extens/api/tests/__init__.py +0 -0
  69. jaseci/extens/api/tests/test_architype_api.py +0 -66
  70. jaseci/extens/api/tests/test_global_api.py +0 -179
  71. jaseci/extens/api/tests/test_graph_api.py +0 -64
  72. jaseci/extens/api/tests/test_logger_api.py +0 -43
  73. jaseci/extens/api/tests/test_object_api.py +0 -20
  74. jaseci/extens/api/tests/test_sentinel_api.py +0 -66
  75. jaseci/extens/api/tests/test_uncommon.py +0 -107
  76. jaseci/extens/api/tests/test_user_api.py +0 -32
  77. jaseci/extens/api/tests/test_walker_api.py +0 -316
  78. jaseci/extens/api/user_api.py +0 -166
  79. jaseci/extens/api/walker_api.py +0 -299
  80. jaseci/extens/api/webhook_api.py +0 -77
  81. jaseci/extens/svc/__init__.py +0 -0
  82. jaseci/extens/svc/elastic_svc.py +0 -366
  83. jaseci/extens/svc/kube_svc.py +0 -432
  84. jaseci/extens/svc/mail_svc.py +0 -156
  85. jaseci/extens/svc/prome_svc.py +0 -378
  86. jaseci/extens/svc/redis_svc.py +0 -63
  87. jaseci/extens/svc/storage_svc.py +0 -193
  88. jaseci/extens/svc/stripe_svc.py +0 -51
  89. jaseci/extens/svc/task_svc.py +0 -155
  90. jaseci/extens/svc/tasks.py +0 -302
  91. jaseci/jac/__init__.py +0 -0
  92. jaseci/jac/interpreter/__init__.py +0 -0
  93. jaseci/jac/interpreter/architype_interp.py +0 -219
  94. jaseci/jac/interpreter/interp.py +0 -1784
  95. jaseci/jac/interpreter/sentinel_interp.py +0 -260
  96. jaseci/jac/interpreter/tests/__init__.py +0 -0
  97. jaseci/jac/interpreter/tests/test_interp.py +0 -42
  98. jaseci/jac/interpreter/walker_interp.py +0 -249
  99. jaseci/jac/ir/__init__.py +0 -0
  100. jaseci/jac/ir/ast.py +0 -73
  101. jaseci/jac/ir/ast_builder.py +0 -249
  102. jaseci/jac/ir/jac_code.py +0 -151
  103. jaseci/jac/ir/passes/__init__.py +0 -6
  104. jaseci/jac/ir/passes/ast_prune_pass.py +0 -9
  105. jaseci/jac/ir/passes/codegen_pass.py +0 -244
  106. jaseci/jac/ir/passes/ir_pass.py +0 -29
  107. jaseci/jac/ir/passes/printer_pass.py +0 -23
  108. jaseci/jac/ir/passes/pt_prune_pass.py +0 -29
  109. jaseci/jac/ir/passes/schedule.py +0 -23
  110. jaseci/jac/ir/passes/stats_pass.py +0 -16
  111. jaseci/jac/jac.g4 +0 -450
  112. jaseci/jac/jac_parse/__init__.py +0 -0
  113. jaseci/jac/jac_parse/jacLexer.py +0 -809
  114. jaseci/jac/jac_parse/jacListener.py +0 -853
  115. jaseci/jac/jac_parse/jacParser.py +0 -9192
  116. jaseci/jac/jac_set.py +0 -120
  117. jaseci/jac/jsci_vm/__init__.py +0 -0
  118. jaseci/jac/jsci_vm/disasm.py +0 -94
  119. jaseci/jac/jsci_vm/inst_ptr.py +0 -31
  120. jaseci/jac/jsci_vm/machine.py +0 -188
  121. jaseci/jac/jsci_vm/op_codes.py +0 -82
  122. jaseci/jac/jsci_vm/tests/__init__.py +0 -0
  123. jaseci/jac/jsci_vm/tests/test_codegen.py +0 -31
  124. jaseci/jac/machine/__init__.py +0 -0
  125. jaseci/jac/machine/jac_scope.py +0 -86
  126. jaseci/jac/machine/jac_value.py +0 -227
  127. jaseci/jac/machine/machine_state.py +0 -386
  128. jaseci/jac/tests/__init__.py +0 -0
  129. jaseci/jac/tests/book_code.py +0 -624
  130. jaseci/jac/tests/test_book.py +0 -380
  131. jaseci/jac/tests/test_lang_14.py +0 -49
  132. jaseci/jsorc/__init__.py +0 -7
  133. jaseci/jsorc/jsorc.py +0 -642
  134. jaseci/jsorc/jsorc_settings.py +0 -211
  135. jaseci/jsorc/jsorc_utils.py +0 -298
  136. jaseci/jsorc/live_actions.py +0 -365
  137. jaseci/jsorc/manifests/__init__.py +0 -0
  138. jaseci/jsorc/manifests/database.yaml +0 -109
  139. jaseci/jsorc/manifests/elastic.yaml +0 -6029
  140. jaseci/jsorc/manifests/prometheus.yaml +0 -1383
  141. jaseci/jsorc/manifests/redis.yaml +0 -64
  142. jaseci/jsorc/memory.py +0 -258
  143. jaseci/jsorc/redis.py +0 -140
  144. jaseci/jsorc/remote_actions.py +0 -158
  145. jaseci/jsorc/tests/__init__.py +0 -0
  146. jaseci/jsorc/tests/test_actions.py +0 -542
  147. jaseci/jsorc/tests/test_jsorc.py +0 -112
  148. jaseci/prim/__init__.py +0 -0
  149. jaseci/prim/ability.py +0 -94
  150. jaseci/prim/architype.py +0 -90
  151. jaseci/prim/edge.py +0 -173
  152. jaseci/prim/element.py +0 -233
  153. jaseci/prim/graph.py +0 -27
  154. jaseci/prim/master.py +0 -67
  155. jaseci/prim/node.py +0 -533
  156. jaseci/prim/obj_mixins.py +0 -238
  157. jaseci/prim/sentinel.py +0 -282
  158. jaseci/prim/super_master.py +0 -31
  159. jaseci/prim/walker.py +0 -261
  160. jaseci/svc/__init__.py +0 -0
  161. jaseci/tests/__init__.py +0 -0
  162. jaseci/tests/infer.py +0 -39
  163. jaseci/tests/jac_test_code.py +0 -1293
  164. jaseci/tests/jac_test_progs.py +0 -774
  165. jaseci/tests/test_core.py +0 -153
  166. jaseci/tests/test_jac.py +0 -824
  167. jaseci/tests/test_node.py +0 -89
  168. jaseci/tests/test_progs.py +0 -702
  169. jaseci/tests/test_stack.py +0 -220
  170. jaseci/tests/test_stripe.py +0 -225
  171. jaseci/utils/__init__.py +0 -0
  172. jaseci/utils/actions/__init__.py +0 -0
  173. jaseci/utils/actions/actions_manager.py +0 -254
  174. jaseci/utils/actions/actions_optimizer.py +0 -517
  175. jaseci/utils/actions/actions_state.py +0 -95
  176. jaseci/utils/file_handler.py +0 -171
  177. jaseci/utils/gprof2dot.py +0 -3786
  178. jaseci/utils/id_list.py +0 -169
  179. jaseci/utils/json_handler.py +0 -70
  180. jaseci/utils/log_utils.py +0 -57
  181. jaseci/utils/test_core.py +0 -62
  182. jaseci/utils/utils.py +0 -387
  183. jaseci-1.4.2.6.dist-info/LICENSE +0 -21
  184. jaseci-1.4.2.6.dist-info/METADATA +0 -39
  185. jaseci-1.4.2.6.dist-info/RECORD +0 -185
  186. jaseci-1.4.2.6.dist-info/entry_points.txt +0 -3
  187. jaseci-1.4.2.6.dist-info/top_level.txt +0 -1
@@ -1,249 +0,0 @@
1
- import os
2
- from antlr4 import ParseTreeListener
3
- from antlr4.error.ErrorListener import ErrorListener
4
- from jaseci.utils.utils import logger, parse_str_token
5
- from jaseci.jac.jac_parse.jacParser import jacParser, ParseTreeWalker
6
- from jaseci.jac.jac_parse.jacLexer import jacLexer
7
- from antlr4 import InputStream, CommonTokenStream
8
- from jaseci.jac.ir.ast import Ast
9
-
10
-
11
- class JacAstBuilder:
12
- """
13
- Jac Code to AST Tree
14
- """
15
-
16
- _ast_head_map = {}
17
-
18
- def __init__(
19
- self,
20
- mod_name,
21
- mod_dir="./",
22
- jac_text=None,
23
- start_rule="start",
24
- ):
25
- self.root = Ast(mod_name)
26
- self._parse_errors = []
27
- self._start_rule = start_rule
28
- self._mod_dir = mod_dir
29
- self.dependencies = []
30
- if jac_text:
31
- self.jac_code_to_ast(jac_text)
32
-
33
- def jac_code_to_ast(self, jac_str):
34
- """Parse language and build ast from string"""
35
- JacAstBuilder._ast_head_map[self._mod_dir + self.root.loc[2]] = self
36
- input_stream = InputStream(jac_str)
37
- lexer = jacLexer(input_stream)
38
- stream = CommonTokenStream(lexer)
39
- errors = JacTreeError(self)
40
- parser = jacParser(stream)
41
- parser.removeErrorListeners()
42
- parser.addErrorListener(errors)
43
- tree = getattr(parser, self._start_rule)()
44
- builder = JacTreeBuilder(builder=self, code=jac_str)
45
- walker = ParseTreeWalker()
46
- walker.walk(builder, tree)
47
-
48
- if self._parse_errors:
49
- logger.error(str(f"Parse errors encountered - {self}"))
50
-
51
-
52
- class JacTreeBuilder(ParseTreeListener):
53
- """Converter class from Antlr trees to Jaseci Tree"""
54
-
55
- def __init__(self, builder, code):
56
- self.builder = builder
57
- self.code = code
58
- self.node_stack = []
59
-
60
- def run_import_module(self, jac_ast):
61
- """
62
- import_module:
63
- KW_IMPORT LBRACE (import_items | '*') RBRACE
64
- KW_WITH STRING SEMI;
65
-
66
- TODO: Check for duplicate imports and ignore if imported
67
- """
68
- kid = jac_ast.kid
69
- fn = os.path.join(self.builder._mod_dir, parse_str_token(kid[-2].token_text()))
70
- full_path = os.path.realpath(fn)
71
- mod_name = os.path.basename(fn)
72
- mdir = os.path.dirname(full_path) + "/"
73
- from_mod = self.builder.root.loc[2]
74
- logger.debug(f"Importing items from {mod_name} to {from_mod}...")
75
- pre_build = None
76
- if (mdir + mod_name) in JacAstBuilder._ast_head_map.keys():
77
- pre_build = JacAstBuilder._ast_head_map[mdir + mod_name]
78
- elif os.path.isfile(fn):
79
- with open(fn, "r") as file:
80
- jac_text = file.read()
81
- pre_build = JacAstBuilder(
82
- jac_text=jac_text,
83
- mod_name=mod_name,
84
- mod_dir=mdir,
85
- )
86
- else:
87
- err = (
88
- f"Module not found for import! {mod_name} from" + f" {from_mod} - {fn}"
89
- )
90
- self.builder._parse_errors.append(err)
91
- if pre_build:
92
- self.builder._parse_errors += pre_build._parse_errors
93
- self.builder.dependencies += pre_build.dependencies
94
- import_elements = list(
95
- filter(lambda x: x.name == "element", pre_build.root.kid)
96
- )
97
- if kid[2].name == "STAR_MUL":
98
- ret = import_elements
99
- else:
100
- ret = self.run_import_items(kid[2], import_elements)
101
- for i in ret:
102
- self.builder.dependencies.append(i)
103
- return ret
104
- else:
105
- return []
106
-
107
- def run_import_items(self, jac_ast, import_elements):
108
- """
109
- import_items:
110
- WALKER_DBL_COLON (STAR_MUL | import_names) (
111
- COMMA import_items
112
- )?
113
- | NODE_DBL_COLON (STAR_MUL | import_names) (
114
- COMMA import_items
115
- )?
116
- | EDGE_DBL_COLON (STAR_MUL | import_names) (
117
- COMMA import_items
118
- )?
119
- | GRAPH_DBL_COLON (STAR_MUL | import_names) (
120
- COMMA import_items
121
- )?
122
- | KW_GLOBAL DBL_COLON (STAR_MUL | import_names) (
123
- COMMA import_items
124
- )?
125
- | TYPE_DBL_COLON (STAR_MUL | import_names) (
126
- COMMA import_items
127
- )?;
128
- """
129
- kid = jac_ast.kid
130
- type_name = (
131
- "KW_" + kid[0].name.split("_")[0]
132
- if not kid[0].name.startswith("KW_")
133
- else kid[0].name
134
- )
135
- kid = kid[2:] if kid[1].name == "DBL_COLON" else kid[1:]
136
- ret_elements = list(
137
- filter(
138
- lambda x: x in self.builder.dependencies
139
- or x.kid[0].kid[0].name == type_name,
140
- import_elements,
141
- )
142
- )
143
- if kid[0].name == "import_names":
144
- import_names = self.run_import_names(kid[0])
145
- ret_elements = list(
146
- filter(
147
- lambda x: x in self.builder.dependencies
148
- or x.kid[0].kid[1].token_text() in import_names,
149
- ret_elements,
150
- )
151
- )
152
- if len(ret_elements) < len(import_names):
153
- err = (
154
- f"{kid[0].loc[2]}: Line {kid[0].loc[0]}: "
155
- + "Module name not found!"
156
- )
157
- self.builder._parse_errors.append(err)
158
-
159
- if kid[-1].name == "import_items":
160
- return ret_elements + self.run_import_items(kid[-1], import_elements)
161
-
162
- return ret_elements
163
-
164
- def run_import_names(self, jac_ast):
165
- """
166
- import_names: NAME | LBRACE name_list RBRACE;
167
- """
168
- kid = jac_ast.kid
169
- if kid[0].name == "NAME":
170
- return [kid[0].token_text()]
171
- else:
172
- return self.run_name_list(kid[1])
173
-
174
- def run_name_list(self, jac_ast):
175
- """
176
- name_list: NAME (COMMA NAME)*;
177
- """
178
- kid = jac_ast.kid
179
- ret = []
180
- for i in kid:
181
- if i.name == "NAME":
182
- ret.append(i.token_text())
183
- return ret
184
-
185
- def enterEveryRule(self, ctx): # noqa
186
- """Visits every node in antlr parse tree"""
187
- if len(self.node_stack) == 0:
188
- new_node = self.builder.root
189
- else:
190
- new_node = Ast(mod_name=self.builder.root.loc[2])
191
- new_node.name = jacParser.ruleNames[ctx.getRuleIndex()]
192
- new_node.loc[0] = ctx.start.line
193
- if new_node.name == "architype":
194
- new_node.src = self.get_code(ctx)
195
- new_node.loc[1] = ctx.start.column
196
-
197
- if len(self.node_stack) and new_node.name != "import_module":
198
- self.node_stack[-1].kid.append(new_node)
199
- self.node_stack.append(new_node)
200
-
201
- def exitEveryRule(self, ctx): # noqa
202
- """Overloaded function that visits every node on exit"""
203
- top = self.node_stack.pop()
204
- if top.name == "import_module":
205
- for i in self.run_import_module(top):
206
- if i not in self.node_stack[-1].kid:
207
- self.node_stack[-1].kid.append(i)
208
-
209
- def visitTerminal(self, node): # noqa
210
- """Visits terminals as walker walks, adds ast node"""
211
- new_node = Ast(mod_name=self.builder.root.loc[2])
212
- new_node.name = jacParser.symbolicNames[node.getSymbol().type]
213
- new_node.loc[0] = node.getSymbol().line
214
- new_node.loc[1] = node.getSymbol().column
215
-
216
- token = {
217
- "symbol": jacParser.symbolicNames[node.getSymbol().type],
218
- "text": node.getSymbol().text,
219
- }
220
- new_node.loc[3]["token"] = token
221
-
222
- self.node_stack[-1].kid.append(new_node)
223
-
224
- def get_code(self, ctx):
225
- out = ""
226
- lines = self.code.split("\n")
227
-
228
- for idx, i in enumerate(lines[ctx.start.line - 1 : ctx.stop.line]):
229
- out += i
230
- if idx != ctx.stop.line - 1:
231
- out += "\n"
232
-
233
- return out
234
-
235
-
236
- class JacTreeError(ErrorListener):
237
- """Accumulate errors as parse tree is walked"""
238
-
239
- def __init__(self, builder):
240
- self.builder = builder
241
-
242
- def syntaxError( # noqa
243
- self, recognizer, offendingSymbol, line, column, msg, e # noqa
244
- ):
245
- """Add error to error list"""
246
- root = self.builder.root
247
- self.builder._parse_errors.append(
248
- f"{str(root.loc[2])}: line {str(line)}:" f"{str(column)} - {root} - {msg}"
249
- )
jaseci/jac/ir/jac_code.py DELETED
@@ -1,151 +0,0 @@
1
- """
2
- Mix in for jac code object in Jaseci
3
- """
4
-
5
- import json
6
- from jaseci.utils.utils import logger
7
- from jaseci.jac.ir.ast_builder import JacAstBuilder
8
- from jaseci.jac.ir.passes.schedule import multi_pass_optimizer
9
- from jaseci.jac.ir.ast import Ast
10
- import hashlib
11
- from pathlib import Path
12
- from os.path import dirname
13
-
14
- from jaseci.jac.ir.passes.printer_pass import PrinterPass
15
-
16
- # Used to check ir matches grammar of current Jaseci instance
17
- grammar_hash = hashlib.md5(
18
- Path(dirname(__file__) + "/../jac.g4").read_text().encode()
19
- ).hexdigest()
20
-
21
-
22
- class JacJsonEnc(json.JSONEncoder):
23
- """Custom Json encoder for Jac ASTs"""
24
-
25
- def default(self, obj):
26
- if isinstance(obj, Ast):
27
- retd = {}
28
- for i in obj.__dict__.keys():
29
- if not i.startswith("_"):
30
- retd[i] = obj.__dict__[i]
31
- return retd
32
- return super().default(obj)
33
-
34
-
35
- class JacJsonDec(json.JSONDecoder):
36
- """Custom hook for decoding Jac ASTs"""
37
-
38
- def __init__(self, *args, **kwargs):
39
- json.JSONDecoder.__init__(self, object_hook=self.object_hook, *args, **kwargs)
40
-
41
- def object_hook(self, obj):
42
- if isinstance(obj, dict) and "loc" in obj and "kid" in obj:
43
- ret = Ast(mod_name=obj["loc"][2])
44
- for i in obj.keys():
45
- setattr(ret, i, obj[i])
46
- return ret
47
- return obj
48
-
49
-
50
- def jac_ast_to_ir(jac_ast: Ast):
51
- """Convert AST to IR string"""
52
- return json.dumps(cls=JacJsonEnc, obj={"gram_hash": grammar_hash, "ir": jac_ast})
53
-
54
-
55
- def jac_ir_to_ast(ir: str):
56
- """Convert IR string to AST"""
57
- ir_load = json.loads(cls=JacJsonDec, s=ir)
58
- if (
59
- not isinstance(ir_load, dict)
60
- or "gram_hash" not in ir_load
61
- or ir_load["gram_hash"] != grammar_hash
62
- or (not isinstance(ir_load["ir"], Ast) and not ir_load["ir"] is None)
63
- ):
64
- logger.error(
65
- "Jac IR invalid or incompatible with current Jaseci "
66
- f"(valid gram_hash: {grammar_hash}!"
67
- )
68
- return ir_load["ir"]
69
-
70
-
71
- class JacCode:
72
- """Obj mixin to code pickling"""
73
-
74
- def __init__(self, code_ir=None):
75
- self.is_active = False
76
- self.code_ir = None
77
- self.code_sig = None
78
- self._jac_ast = None
79
- self.errors = []
80
- self.apply_ir(code_ir)
81
-
82
- def reset(self):
83
- JacCode.__init__(self)
84
-
85
- def refresh(self):
86
- self._jac_ast = jac_ir_to_ast(self.code_ir) if self.code_ir else None
87
- if self._jac_ast:
88
- self.is_active = True
89
- else:
90
- self.is_active = False
91
-
92
- def apply_ir(self, ir):
93
- """Apply's IR to object"""
94
- self.code_ir = (
95
- ir.strip()
96
- if (isinstance(ir, str))
97
- else json.dumps(ir) if (isinstance(ir, dict)) else jac_ast_to_ir(ir)
98
- )
99
- self.code_sig = hashlib.md5(self.code_ir.encode()).hexdigest()
100
- JacCode.refresh(self) # should disregard overloaded versions
101
-
102
- def compile_jac(self, code, dir, start_rule="start", opt_level=4):
103
- """Generate AST tree from Jac code text"""
104
- tree = JacAstBuilder(
105
- jac_text=code, start_rule=start_rule, mod_name=self.name, mod_dir=dir
106
- )
107
- # Must clear this state across compiles (so fresh imports dont use stale data)
108
- JacAstBuilder._ast_head_map = {}
109
-
110
- self.errors = tree._parse_errors
111
- if tree._parse_errors:
112
- logger.error(str(f"{self.name}: Invalid syntax in Jac code!"))
113
- for i in tree._parse_errors:
114
- logger.error(i)
115
- return None
116
-
117
- multi_pass_optimizer(
118
- tree.root, opt_level=opt_level
119
- ) # run analysis and optimizers
120
-
121
- return tree.root
122
-
123
- def get_jac_ast(self):
124
- if not self._jac_ast:
125
- self.refresh()
126
- return self._jac_ast
127
-
128
- def print_ir(self, to_screen=True):
129
- irout = PrinterPass(ir=self.get_jac_ast(), to_screen=to_screen)
130
- irout.run()
131
- return irout.output
132
-
133
- def register(self, code, dir, opt_level=4):
134
- """
135
- Parses Jac code and saves IR
136
- """
137
- start_rule = "start" if self.j_type == "sentinel" else self.j_type
138
- tree = self.compile_jac(code, dir, start_rule=start_rule, opt_level=opt_level)
139
-
140
- if not tree:
141
- self.is_active = False
142
- else:
143
- self.apply_ir(tree)
144
-
145
- if not self.is_active:
146
- logger.error(str(f"{self.name}: Code not registered"))
147
- return self.is_active
148
-
149
- def ir_dict(self):
150
- """Return IR as dictionary"""
151
- return json.loads(self.code_ir)
@@ -1,6 +0,0 @@
1
- from jaseci.jac.ir.passes.ir_pass import IrPass # noqa
2
- from jaseci.jac.ir.passes.pt_prune_pass import ParseTreePrunePass # noqa
3
- from jaseci.jac.ir.passes.printer_pass import PrinterPass # noqa
4
- from jaseci.jac.ir.passes.stats_pass import StatsPass # noqa
5
- from jaseci.jac.ir.passes.codegen_pass import CodeGenPass # noqa
6
- from jaseci.jac.ir.passes.ast_prune_pass import AstPrunePass # noqa
@@ -1,9 +0,0 @@
1
- from jaseci.jac.ir.passes.ir_pass import IrPass
2
- from base64 import b64encode
3
-
4
-
5
- class AstPrunePass(IrPass):
6
- def enter_node(self, node):
7
- if hasattr(node, "bytecode") and node.bytecode:
8
- node.bytecode = b64encode(node.bytecode).decode()
9
- node.kid = [] if node.name != "inc_assign" else [node.kid[0]]
@@ -1,244 +0,0 @@
1
- from jaseci.jac.ir.passes import IrPass
2
- from jaseci.jac.jsci_vm.op_codes import JsCmp, JsOp, JsType
3
- from struct import pack
4
-
5
- from jaseci.utils.utils import parse_str_token
6
-
7
-
8
- def byte_length(val):
9
- if type(val) == str:
10
- return len(bytes(val, "unicode_escape"))
11
- else:
12
- return (val.bit_length() + 7) // 8
13
-
14
-
15
- def to_bytes(val):
16
- if type(val) == str:
17
- return bytes(val, "unicode_escape")
18
- elif type(val) == float:
19
- return pack("d", val)
20
- elif type(val) == int:
21
- return val.to_bytes(byte_length(val), "little")
22
-
23
-
24
- def has_bytecode(node):
25
- if not hasattr(node, "bytecode"):
26
- return False
27
- return True
28
-
29
-
30
- def is_bytecode_complete(node):
31
- for i in node.kid:
32
- if not i.is_terminal() and not has_bytecode(i) and i.name != "cmp_op":
33
- return False
34
- return True
35
-
36
-
37
- class CodeGenPass(IrPass):
38
- def __init__(self, debug_info=True, **kwargs):
39
- super().__init__(**kwargs)
40
- self.debug_info = debug_info
41
- self.cur_loc = None
42
- self.create_var_mode = 0
43
-
44
- def emit(self, node, *items):
45
- if not has_bytecode(node):
46
- node.bytecode = bytearray()
47
- node_loc = [node.loc[0], node.loc[2]]
48
- if self.debug_info and self.cur_loc != node_loc:
49
- debug_inst = [
50
- JsOp.DEBUG_INFO,
51
- byte_length(node_loc[0]),
52
- to_bytes(node_loc[0]),
53
- ]
54
- if not self.cur_loc or self.cur_loc[1] != node_loc[1]:
55
- debug_inst += [byte_length(node_loc[1]), to_bytes(node_loc[1])]
56
- else:
57
- debug_inst += [0]
58
- self.cur_loc = node_loc
59
- items = debug_inst + list(items)
60
- for i in items:
61
- if type(i) in [bytes, bytearray]:
62
- node.bytecode += bytearray(i)
63
- elif type(i) is str:
64
- node.bytecode += bytearray(i, "utf-8")
65
- else:
66
- node.bytecode.append(i)
67
-
68
- def enter_node(self, node):
69
- # print("entering", node)
70
- if hasattr(self, f"enter_{node.name}"):
71
- getattr(self, f"enter_{node.name}")(node)
72
-
73
- def exit_node(self, node):
74
- # print("exiting", node)
75
- if hasattr(self, f"exit_{node.name}"):
76
- getattr(self, f"exit_{node.name}")(node)
77
- if hasattr(node, "_create_flag"):
78
- self.create_var_mode -= 1
79
-
80
- def enter_expression(self, node):
81
- kid = node.kid
82
- if len(kid) > 1 and kid[-1].name == "assignment":
83
- kid[-1]._create_flag = True
84
- self.create_var_mode += 1
85
-
86
- def exit_expression(self, node): # TODO: Incomplete
87
- kid = node.kid
88
- if is_bytecode_complete(node):
89
- for i in reversed(node.kid):
90
- if has_bytecode(i):
91
- self.emit(node, i.bytecode)
92
- if len(kid) > 1 and kid[1].name == "assignment":
93
- self.emit(node, JsOp.ASSIGN)
94
- elif len(kid) > 1 and kid[1].name == "copy_assign":
95
- self.emit(node, JsOp.COPY_FIELDS)
96
- elif len(kid) > 1 and kid[1].name == "inc_assign":
97
- self.emit(node, JsOp.INCREMENT, JsCmp[kid[1].kid[0].name])
98
-
99
- def exit_assignment(self, node):
100
- if is_bytecode_complete(node):
101
- if has_bytecode(node.kid[-1]):
102
- self.emit(node, node.kid[-1].bytecode)
103
-
104
- def exit_copy_assign(self, node):
105
- if is_bytecode_complete(node):
106
- if has_bytecode(node.kid[-1]):
107
- self.emit(node, node.kid[-1].bytecode)
108
-
109
- def exit_inc_assign(self, node):
110
- if is_bytecode_complete(node):
111
- if has_bytecode(node.kid[-1]):
112
- self.emit(node, node.kid[-1].bytecode)
113
-
114
- def exit_logical(self, node):
115
- if is_bytecode_complete(node):
116
- for i in reversed(node.kid):
117
- if has_bytecode(i):
118
- self.emit(node, i.bytecode)
119
- for i in node.kid:
120
- if i.name == "KW_AND":
121
- self.emit(node, JsOp.AND)
122
- elif i.name == "KW_OR":
123
- self.emit(node, JsOp.OR)
124
-
125
- def exit_compare(self, node):
126
- if is_bytecode_complete(node):
127
- for i in reversed(node.kid):
128
- if has_bytecode(i):
129
- self.emit(node, i.bytecode)
130
- for i in node.kid:
131
- if i.name == "NOT":
132
- self.emit(node, JsOp.COMPARE, JsCmp.NOT)
133
- elif i.name == "cmp_op" and i.kid[0].name == "EE":
134
- self.emit(node, JsOp.COMPARE, JsCmp.EE)
135
- elif i.name == "cmp_op" and i.kid[0].name == "LT":
136
- self.emit(node, JsOp.COMPARE, JsCmp.LT)
137
- elif i.name == "cmp_op" and i.kid[0].name == "GT":
138
- self.emit(node, JsOp.COMPARE, JsCmp.GT)
139
- elif i.name == "cmp_op" and i.kid[0].name == "LTE":
140
- self.emit(node, JsOp.COMPARE, JsCmp.LTE)
141
- elif i.name == "cmp_op" and i.kid[0].name == "GTE":
142
- self.emit(node, JsOp.COMPARE, JsCmp.GTE)
143
- elif i.name == "cmp_op" and i.kid[0].name == "NE":
144
- self.emit(node, JsOp.COMPARE, JsCmp.NE)
145
- elif i.name == "cmp_op" and i.kid[0].name == "KW_IN":
146
- self.emit(node, JsOp.COMPARE, JsCmp.IN)
147
- elif i.name == "cmp_op" and i.kid[0].name == "nin":
148
- self.emit(node, JsOp.COMPARE, JsCmp.NIN)
149
-
150
- def exit_arithmetic(self, node):
151
- if is_bytecode_complete(node):
152
- for i in reversed(node.kid):
153
- if has_bytecode(i):
154
- self.emit(node, i.bytecode)
155
- for i in node.kid:
156
- if i.name == "PLUS":
157
- self.emit(node, JsOp.ADD)
158
- elif i.name == "MINUS":
159
- self.emit(node, JsOp.SUBTRACT)
160
-
161
- def exit_term(self, node):
162
- if is_bytecode_complete(node):
163
- for i in reversed(node.kid):
164
- if has_bytecode(i):
165
- self.emit(node, i.bytecode)
166
- for i in node.kid:
167
- if i.name == "STAR_MUL":
168
- self.emit(node, JsOp.MULTIPLY)
169
- elif i.name == "DIV":
170
- self.emit(node, JsOp.DIVIDE)
171
- elif i.name == "MOD":
172
- self.emit(node, JsOp.MODULO)
173
-
174
- def exit_factor(self, node):
175
- if is_bytecode_complete(node):
176
- self.emit(node, node.kid[-1].bytecode)
177
- if node.kid[0].name == "MINUS":
178
- self.emit(node, JsOp.NEGATE)
179
-
180
- def exit_power(self, node):
181
- if is_bytecode_complete(node):
182
- for i in reversed(node.kid):
183
- if has_bytecode(i):
184
- self.emit(node, i.bytecode)
185
- for i in node.kid:
186
- if i.name == "POW":
187
- self.emit(node, JsOp.POWER)
188
-
189
- def exit_atom(self, node): # TODO: Incomplete
190
- kid = node.kid
191
- if kid[0].name == "INT":
192
- val = int(kid[0].token_text())
193
- self.emit(
194
- node, JsOp.LOAD_CONST, JsType.INT, byte_length(val), to_bytes(val)
195
- )
196
- elif kid[0].name == "FLOAT":
197
- val = float(kid[0].token_text())
198
- self.emit(node, JsOp.LOAD_CONST, JsType.FLOAT, to_bytes(val))
199
- elif kid[0].name == "multistring":
200
- val = ""
201
- for i in kid[0].kid:
202
- val += parse_str_token(i.token_text())
203
- str_len = byte_length(val)
204
- self.emit(
205
- node,
206
- JsOp.LOAD_CONST,
207
- JsType.STRING,
208
- byte_length(str_len),
209
- to_bytes(str_len),
210
- )
211
- if str_len > 0:
212
- self.emit(node, to_bytes(val))
213
- elif kid[0].name == "BOOL":
214
- val = int(kid[0].token_text() == "true")
215
- self.emit(node, JsOp.LOAD_CONST, JsType.BOOL, val)
216
- elif kid[0].name == "NULL":
217
- self.emit(node, JsOp.LOAD_CONST, JsType.TYPE, JsType.NULL)
218
- elif kid[0].name == "NAME":
219
- name = kid[0].token_text()
220
- if self.create_var_mode:
221
- self.emit(node, JsOp.CREATE_VAR, byte_length(name), to_bytes(name))
222
- else:
223
- self.emit(node, JsOp.LOAD_VAR, byte_length(name), to_bytes(name))
224
-
225
- def exit_any_type(self, node):
226
- kid = node.kid
227
- if kid[0].name == "TYP_STRING":
228
- self.emit(node, JsOp.LOAD_CONST, JsType.TYPE, JsType.STRING)
229
- elif kid[0].name == "TYP_INT":
230
- self.emit(node, JsOp.LOAD_CONST, JsType.TYPE, JsType.INT)
231
- elif kid[0].name == "TYP_FLOAT":
232
- self.emit(node, JsOp.LOAD_CONST, JsType.TYPE, JsType.FLOAT)
233
- elif kid[0].name == "TYP_LIST":
234
- self.emit(node, JsOp.LOAD_CONST, JsType.TYPE, JsType.LIST)
235
- elif kid[0].name == "TYP_DICT":
236
- self.emit(node, JsOp.LOAD_CONST, JsType.TYPE, JsType.DICT)
237
- elif kid[0].name == "TYP_BOOL":
238
- self.emit(node, JsOp.LOAD_CONST, JsType.TYPE, JsType.BOOL)
239
- elif kid[0].name == "KW_NODE":
240
- self.emit(node, JsOp.LOAD_CONST, JsType.TYPE, JsType.NODE)
241
- elif kid[0].name == "KW_EDGE":
242
- self.emit(node, JsOp.LOAD_CONST, JsType.TYPE, JsType.EDGE)
243
- elif kid[0].name == "KW_TYPE":
244
- self.emit(node, JsOp.LOAD_CONST, JsType.TYPE, JsType.TYPE)
@@ -1,29 +0,0 @@
1
- class IrPass:
2
- def __init__(self, ir=None):
3
- self.ir = ir
4
-
5
- def before_pass(self):
6
- pass
7
-
8
- def after_pass(self):
9
- pass
10
-
11
- def enter_node(self, node):
12
- pass
13
-
14
- def exit_node(self, node):
15
- pass
16
-
17
- def run(self):
18
- self.before_pass()
19
- self.traverse()
20
- self.after_pass()
21
- return self
22
-
23
- def traverse(self, node=None):
24
- if node is None:
25
- node = self.ir
26
- self.enter_node(node)
27
- for i in node.kid:
28
- self.traverse(i)
29
- self.exit_node(node)