Explorar el Código

feat: af_Code添加in_protect字段

in_protect字段表示字面量是否从保护空间获取函数
SongZihuan hace 3 años
padre
commit
c41efbcfd7
Se han modificado 5 ficheros con 19 adiciones y 11 borrados
  1. 1 1
      include/code.h
  2. 1 0
      src/core/__code.h
  3. 9 2
      src/core/code.c
  4. 6 6
      src/main.c
  5. 2 2
      test/test_byte_code.c

+ 1 - 1
include/code.h

@@ -10,7 +10,7 @@ enum af_BlockType {
     curly,  // 大括号
 };
 
-af_Code *makeLiteralCode(char *literal_data, char *func, char prefix, FileLine line, FilePath path);
+af_Code *makeLiteralCode(char *literal_data, char *func, bool in_protect, char prefix, FileLine line, FilePath path);
 af_Code *makeVariableCode(char *var, char prefix, FileLine line, FilePath path);
 af_Code *makeBlockCode(enum af_BlockType type, af_Code *element, char prefix, FileLine line, FilePath path, af_Code **next);
 af_Code *connectCode(af_Code **base, af_Code *next);

+ 1 - 0
src/core/__code.h

@@ -24,6 +24,7 @@ struct af_Code {  // 一个 Code 的结构体
         struct {
             char *literal_data;
             char *func;  // 函数名称
+            bool in_protect;  // 是否在保护区域
         } literal;
 
         struct {

+ 9 - 2
src/core/code.c

@@ -17,11 +17,12 @@ static af_Code *makeCode(char prefix, FileLine line, FilePath path) {
     return bt;
 }
 
-af_Code *makeLiteralCode(char *literal_data, char *func, char prefix, FileLine line, FilePath path) {
+af_Code *makeLiteralCode(char *literal_data, char *func, bool in_protect, char prefix, FileLine line, FilePath path) {
     af_Code *bt = makeCode(prefix, line, path);
     bt->type = literal;
     bt->literal.literal_data = strCopy(literal_data);
     bt->literal.func = strCopy(func);
+    bt->literal.in_protect = in_protect;
     return bt;
 }
 
@@ -99,6 +100,7 @@ af_Code *copyCode(af_Code *base, FilePath *path) {
             case literal:
                 (*pdest)->literal.literal_data = strCopy(base->literal.literal_data);
                 (*pdest)->literal.func = strCopy(base->literal.func);
+                (*pdest)->literal.in_protect = base->literal.in_protect;
                 break;
 
             case variable:
@@ -190,6 +192,7 @@ static bool writeCode(af_Code *bt, FILE *file) {
         case literal:
             Done(byteWriteStr(file, bt->literal.literal_data));
             Done(byteWriteStr(file, bt->literal.func));
+            Done(byteWriteUint_8(file, bt->literal.in_protect));
             break;
         case variable:
             Done(byteWriteStr(file, bt->variable.name));
@@ -248,10 +251,14 @@ static bool readCode(af_Code **bt, FILE *file) {
     (*bt)->type = type;
 
     switch (type) {
-        case literal:
+        case literal: {
+            uint8_t in_protect;
             Done(byteReadStr(file, &((*bt)->literal.literal_data)));
             Done(byteReadStr(file, &((*bt)->literal.func)));
+            Done(byteReadUint_8(file, &in_protect));
+            (*bt)->literal.in_protect = in_protect;
             break;
+        }
         case variable:
             Done(byteReadStr(file, &((*bt)->variable.name)));
             break;

+ 6 - 6
src/main.c

@@ -34,10 +34,10 @@ int main() {
     }
 
     {  // 正常程序
-        af_Code *bt1 = makeLiteralCode("data", "func", ',', 0, "Unknow");
+        af_Code *bt1 = makeLiteralCode("data", "func", false, ',', 0, "Unknow");
         af_Code *bt2 = makeVariableCode("object", 0, 1, NULL);
 
-        af_Code *bt3 = makeLiteralCode("data2", "func", 0, 0, NULL);
+        af_Code *bt3 = makeLiteralCode("data2", "func", false, 0, 0, NULL);
         af_Code *bt4 = makeVariableCode("global", 0, 1, NULL);
         af_Code *bt6 = makeVariableCode("object", 0, 1, NULL);
 
@@ -53,10 +53,10 @@ int main() {
     }
 
     {  // 测试错误 (object2 Var not found)
-        af_Code *bt1 = makeLiteralCode("data", "func", ',', 0, "Unknow");
+        af_Code *bt1 = makeLiteralCode("data", "func", false, ',', 0, "Unknow");
         af_Code *bt2 = makeVariableCode("object2", 0, 1, NULL);
 
-        af_Code *bt3 = makeLiteralCode("data2", "func", 0, 0, NULL);
+        af_Code *bt3 = makeLiteralCode("data2", "func", false, 0, 0, NULL);
         af_Code *bt4 = makeVariableCode("global", 0, 1, NULL);
         af_Code *bt6 = makeVariableCode("object", 0, 1, NULL);
 
@@ -72,7 +72,7 @@ int main() {
     }
 
     {  // 测试顺序执行 '(xxx)
-        af_Code *bt3 = makeLiteralCode("data2", "func", 0, 0, NULL);
+        af_Code *bt3 = makeLiteralCode("data2", "func", false, 0, 0, NULL);
         af_Code *bt4 = makeVariableCode("global", 0, 1, NULL);
 
         connectCode(&bt3, bt4);
@@ -84,7 +84,7 @@ int main() {
     }
 
     {  // 测试顺序执行 ,[xxx]
-        af_Code *bt3 = makeLiteralCode("data2", "func", 0, 0, NULL);
+        af_Code *bt3 = makeLiteralCode("data2", "func", false, 0, 0, NULL);
         af_Code *bt4 = makeVariableCode("global", 0, 1, NULL);
 
         connectCode(&bt3, bt4);

+ 2 - 2
test/test_byte_code.c

@@ -3,10 +3,10 @@
 #include "aFun.h"
 
 int main() {
-    af_Code *bt1 = makeLiteralCode("data", "func", ',', 0, "Unknow");
+    af_Code *bt1 = makeLiteralCode("data", "func", false, ',', 0, "Unknow");
     af_Code *bt2 = makeVariableCode("var1", 0, 1, NULL);
 
-    af_Code *bt3 = makeLiteralCode("data2", "func", 0, 0, NULL);
+    af_Code *bt3 = makeLiteralCode("data2", "func", false, 0, 0, NULL);
     af_Code *bt4 = makeVariableCode("var2", 0, 1, NULL);
 
     connectCode(&bt1, bt2);