about summary refs log tree commit diff stats
path: root/archive/2.vm/081print.mu
Commit message (Expand)AuthorAgeFilesLines
* 5485 - promote SubX to top-levelKartik Agaram2019-07-271-0/+914
f='/akkartik/mu/blame/064rewrite_literal_string.cc?h=hlt&id=f466a648b7a424d96c14bd671f9915f274397e04'>^
4a943d4e ^














38104e76 ^
8b095f80 ^

e9390236 ^
8b095f80 ^




23d3a022 ^
8b095f80 ^
387f9c93 ^
ac8acc7b ^
8b095f80 ^

8b095f80 ^

8b095f80 ^



bd5d3936 ^

639922e8 ^
8b095f80 ^

d8509b41 ^
8b095f80 ^
c442a5ad ^
8b095f80 ^
8b095f80 ^
6c96a437 ^
8b095f80 ^

6c96a437 ^
78c50205 ^
8b095f80 ^

d559f68b ^
3c4c9c08 ^
8b095f80 ^









8b095f80 ^
2badd89a ^

6c96a437 ^
2badd89a ^
6c96a437 ^
2badd89a ^

6c96a437 ^
2badd89a ^




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81

                                                                           














                                         
 

                                                         
                                                                   




                                                            
                                                  
                                                  
                                                       
                                                   

                                                 

                                               



                                                                       

                                                                                    
                                                              

 
                                                             
                                  
                                                                                              
                                                 
                                       
                                                  

                                                                                                 
                                                          
                                                               

                                      
                                                                        
                         









                                                                
 

                                                       
                                                  
                                                 
                                                         

                                                       
                                                         




                                                     
//: allow using literal strings anywhere that will accept immutable strings

void test_passing_literals_to_recipes() {
  run(
      "def main [\n"
      "  1:num/raw <- foo [abc]\n"
      "]\n"
      "def foo x:text -> n:num [\n"
      "  local-scope\n"
      "  load-ingredients\n"
      "  n <- length *x\n"
      "]\n"
  );
  CHECK_TRACE_CONTENTS(
      "mem: storing 3 in location 1\n"
  );
}

:(before "End Instruction Inserting/Deleting Transforms")
initialize_transform_rewrite_literal_string_to_text();
Transform.push_back(rewrite_literal_string_to_text);  // idempotent

:(before "End Globals")
set<string> recipes_taking_literal_strings;
:(code)
void initialize_transform_rewrite_literal_string_to_text() {
  recipes_taking_literal_strings.insert("assert");
  recipes_taking_literal_strings.insert("$print");
  recipes_taking_literal_strings.insert("$dump-trace");
  recipes_taking_literal_strings.insert("$system");
  recipes_taking_literal_strings.insert("trace");
  recipes_taking_literal_strings.insert("stash");
  recipes_taking_literal_strings.insert("new");
  recipes_taking_literal_strings.insert("run");
  recipes_taking_literal_strings.insert("memory-should-contain");
  recipes_taking_literal_strings.insert("trace-should-contain");
  recipes_taking_literal_strings.insert("trace-should-not-contain");
  recipes_taking_literal_strings.insert("check-trace-count-for-label");
  recipes_taking_literal_strings.insert("check-trace-count-for-label-greater-than");
  recipes_taking_literal_strings.insert("check-trace-count-for-label-lesser-than");
  // End initialize_transform_rewrite_literal_string_to_text()
}

void rewrite_literal_string_to_text(const recipe_ordinal r) {
  recipe& caller = get(Recipe, r);
  trace(101, "transform") << "--- rewrite literal strings in recipe " << caller.name << end();
  if (contains_numeric_locations(caller)) return;
  vector<instruction> new_instructions;
  for (int i = 0;  i < SIZE(caller.steps);  ++i) {
    instruction& inst = caller.steps.at(i);
    if (recipes_taking_literal_strings.find(inst.name) == recipes_taking_literal_strings.end()) {
      for (int j = 0;  j < SIZE(inst.ingredients);  ++j) {
        if (!is_literal_text(inst.ingredients.at(j))) continue;
        instruction def;
        ostringstream ingredient_name;
        ingredient_name << inst.name << '_' << i << '_' << j << ":text";
        def.name = "new";
        def.ingredients.push_back(inst.ingredients.at(j));
        def.products.push_back(reagent(ingredient_name.str()));
        new_instructions.push_back(def);
        inst.ingredients.at(j).clear();  // reclaim old memory
        inst.ingredients.at(j) = reagent(ingredient_name.str());
      }
    }
    new_instructions.push_back(inst);
  }
  caller.steps.swap(new_instructions);
}

bool contains_numeric_locations(const recipe& caller) {
  for (int i = 0;  i < SIZE(caller.steps);  ++i) {
    const instruction& inst = caller.steps.at(i);
    for (int in = 0;  in < SIZE(inst.ingredients);  ++in)
      if (is_numeric_location(inst.ingredients.at(in)))
        return true;
    for (int out = 0;  out < SIZE(inst.products);  ++out)
      if (is_numeric_location(inst.products.at(out)))
        return true;
  }
  return false;
}