控制指令

IF

条件判断。如果条件判断失败那么 GOTO 到指定位置,否则继续往下执行

  • 参数说明:共1参数;参数1:GOTO 的位置

  • 栈行为:消费1,产出0

  • 堆行为:无

  1. 代码:if (1 == 1) return true; else return false
  2. 指令:
  3. ...(部分略)...
  4. #02 DO ==
  5. #03 IF 7 <- 如果判断失败那么跳转到 #07 行指令
  6. ...(部分略)...
  7. #07 LABEL 7 <- LABEL 7 之后的相当于 else 部分
  8. ...(部分略)...

GOTO

执行跳转,指令执行序列指针跳转,DataQL 语言本身并不支持 goto 语句。goto 的产生会在 if/数组类型结果转换时产生。

  • 参数说明:共1参数;参数1:GOTO 的位置

  • 栈行为:消费0,产出0

  • 堆行为:无

  1. 代码:if (1 == 1) return true; else return false
  2. 指令:
  3. ...(部分略)...
  4. #06 GOTO 11 <- 通常 goto 会跳转到一个 LABEL 指令上
  5. ...(部分略)...
  6. #11 LABEL 11

HINT

设置 Hint,影响执行引擎的参数选项。

  • 参数说明:共2参数;参数1:选项Key;参数2:选项Value

  • 栈行为:消费2,产出0

  • 堆行为:无

  1. 代码:hint a = 'abc' return 1
  2. 指令:
  3. #0 LDC_S a
  4. #1 LDC_S abc
  5. #2 HINT
  6. ...(部分略)...

CAST_I

类型转换指令(转换为迭代器)。将栈顶元素转换为迭代器,作为迭代器有三个特殊操作:data(数据)、next(移动到下一个,如果成功返回true)

  • 参数说明:共0参数

  • 栈行为:消费1,产出1

  • 堆行为:无

  1. 代码:return a => [ field1 ]
  2. 指令:
  3. ...(部分略)...
  4. #01 GET a
  5. #02 CAST_I
  6. #03 E_PUSH
  7. ...(部分略)...

CAST_O

类型转换指令(转换为对象),将栈顶元素转换为一个对象,如果是集合那么取第一条记录(可以通过CAST_I方式解决,但会多消耗大约8条左右的指令)

  • 参数说明:共0参数

  • 栈行为:消费1,产出1

  • 堆行为:无

  1. 代码:return a => { 'field1','field2' }
  2. 指令:
  3. ...(部分略)...
  4. #01 GET a
  5. #02 CAST_O
  6. #03 E_PUSH
  7. ...(部分略)...

LOAD_C

加载用户数据集,通过 CustomizeScope 接口获取用户数据集

  • 参数说明:共1参数;参数1:[@#$]符号之一

  • 栈行为:消费0,产出1

  • 堆行为:无

  1. 代码:return ${a}.b
  2. 指令:
  3. #0 LOAD_C $ <- 可能的符号参数有三个"@#$",例如:${a} 产生 $,#{a} 产生 #
  4. #1 GET a
  5. #2 GET b
  6. #3 RETURN 0

POP

丢弃栈顶数据。丢弃栈顶数据,该指令目前在编译结果转换时会通过转换语句优化产生,平常语句不会编译出该指令。

  • 参数说明:共0参数;

  • 栈行为:消费1,产出0

  • 堆行为:无

  1. 代码:return a => []
  2. 指令:
  3. #0 E_LOAD #
  4. #1 GET a
  5. #2 POP
  6. #3 NEW_A
  7. #4 RETURN 0

E_PUSH

数据交换到环境栈。取出当前栈顶数据,并压入环境栈。通常和 CAST_I与CAST_O联合出现,每一个E_PUSH都会存在一个对应的E_POP。

  • 参数说明:共0参数;

  • 栈行为:消费1,产出0

  • 环境栈行为:消费0,产出1

  • 堆行为:无

  1. 代码:return a => { 'field1','field2' }
  2. 指令:
  3. ...(部分略)...
  4. #01 GET a
  5. #02 CAST_O
  6. #03 E_PUSH
  7. ...(部分略)...
  8. #11 E_POP
  9. #12 RETURN 0

E_POP

丢弃环境栈元素。

  • 参数说明:共0参数;

  • 栈行为:消费0,产出0

  • 环境栈行为:消费1,产出0

  • 堆行为:无

  1. 代码:return a => [ field1 ]
  2. 指令:
  3. ...(部分略)...
  4. #01 GET a
  5. #02 CAST_I
  6. #03 E_PUSH
  7. ...(部分略)...
  8. #18 E_POP
  9. #19 RETURN 0

E_LOAD

数据从环境栈交换到数据栈,加载环境栈顶的数据到数据栈,一个有效的 E_LOAD 前面肯定会有一个 E_PUSH;除此之外E_LOAD也有单独出现的时候,但通常都不具备运行上的任何意义。例如:”return a => []” 的编译结果中的 E_LOAD 就拿不到任何数据,除了编译毫无任何意义。因为根层的 E_LOAD 数据肯定是空的。

  • 参数说明:共1参数;参数1:操作符号@#$

  • 栈行为:消费0,产出1

  • 环境栈行为:消费0,产出0

  • 堆行为:无

  1. 代码:return a => { 'field1','field2' }
  2. 指令:
  3. ...(部分略)...
  4. #03 E_PUSH
  5. #04 NEW_O
  6. #05 E_LOAD #
  7. #06 GET field1
  8. #07 PUT field1
  9. ...(部分略)...