summaryrefslogtreecommitdiff
path: root/src/nb_opcode.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/nb_opcode.h')
-rw-r--r--src/nb_opcode.h224
1 files changed, 224 insertions, 0 deletions
diff --git a/src/nb_opcode.h b/src/nb_opcode.h
new file mode 100644
index 0000000..7bd9710
--- /dev/null
+++ b/src/nb_opcode.h
@@ -0,0 +1,224 @@
+#ifndef NB_OPCODE_H
+#define NB_OPCODE_H
+
+typedef enum {
+ // import a external module
+ OP_IMPORT, // IMPORT
+
+ // load class, enum, or mask from a module
+ OP_LOAD_EXTERNAL, // LOAD_EXTERNAL nameOfModule |
+
+ OP_PUSH_CONSTANT, // PUSH_CONSTANT i | 1
+ OP_PUSH_NULL, // PUSH_NULL | 1
+ OP_PUSH_TRUE, // PUSH_TRUE | 1
+ OP_PUSH_FALSE, // PUSH_FALSE | 1
+
+ // local-scoped variables
+ OP_LOAD_LOCAL, // LOAD_LOCAL i | 1
+ OP_STORE_LOCAL, // STORE_LOCAL i | -1
+
+ // load or store upvalue
+ OP_LOAD_UPVALUE, // LOAD_UPVALUE i | 1
+ OP_STORE_UPVALUE, // STORE_UPVALUE i | -1
+
+ // file-scoped variables
+ OP_LOAD_MODULE, // LOAD_MODULE i | 1
+ OP_STORE_MODULE, // STORE_MODULE i | -1
+
+ OP_POP, // POP | 1
+ OP_POPN, // POPN numOfValue | n
+
+ OP_JUMP, // JUMP i | 0
+ OP_JUMP_IF_FALSE, // JUMP_IF_FALSE |
+ OP_RETURN, // RETURN numOfReturn | -numOfReturn
+ OP_RETURN_NULL, // RETURN_NULL |
+
+ // instansiate class
+ OP_INSTANTIATE, // INSTANTIATE numOfArgs |
+
+ // call methods or functions
+ OP_CALL, // CALL numOfArgs | -(1+numOfArgs)
+ OP_OPERATOR, // OPERATOR operatorId | -(1+numOfArgs)
+
+ // define class and method
+ OP_CLASS, // CLASS | 0
+ OP_METHOD, // METHOD
+ OP_METHOD_STATIC, // METHOD_STATIC
+
+ // load and store member of object or static member of class
+ OP_LOAD_FIELD, // LOAD_FIELD
+ OP_STORE_FIELD, // STORE_FIELD
+
+ // call base class method, handle base. in methods
+ OP_CALL_BASE, // CALL_BASE numOfArgs |
+
+ OP_TYPEOF, //
+ OP_INSTANCEOF, //
+
+ // define enum or mask
+ OP_ENUM, // ENUM numOfElements | -(numOfElements)
+ OP_MASK, // MASK numOfElements | -(numOfElements)
+
+ // create map, list or hashset
+ OP_MAP,
+ OP_LIST,
+ OP_HASHSET,
+
+} OpCode;
+
+// 对于运算符,使用 CALL 指令,运算符的操作数个数是确定的
+// operator numOfArgs pop
+// + 2
+// ++ 1
+// += 2
+// - 2
+// -- 1
+// -= 2
+// * 2
+// *= 2
+// / 2
+// /= 2
+// ^ 2
+// ^= 2
+// % 2
+// %= 2
+// >> 2
+// >>= 2
+// << 2
+// <<= 2
+// & 2
+// | 2
+// ! 1
+//
+// && 2
+// &= 2
+// || 2
+// |= 2
+// == 2
+// > 2
+// >= 2
+// < 2
+// <= 2
+// != 2
+//
+
+
+// 导入模块流程
+// import Test;
+// IMPORT
+//
+// import Test for CFoo;
+// IMPORT "Test"
+// STORE_MODULE
+// POP
+//
+// import Test for CFoo as CClass;
+// IMPORT "Test"
+// LOAD_EXTERNAL "CFoo"
+// STORE_MODULE 0 // "CClass"
+// POPN 2
+
+
+// 方法调用
+// var foo = new CClass();
+// var b = 20;
+// foo.Func(10, b);
+// LOAD_LOCAL 1 // foo
+// LOAD_FIELD "Func"
+// LOAD_LOCAL 1 // foo
+// PUSH_CONSTANT 10
+// LOAD_LOCAL 2 // b
+// CALL 3
+//
+// var c = a + b;
+// LOAD_LOCAL 1 // a
+// LOAD_LOCAL 2 // b
+// OPERATOR 1 // +
+
+
+// 函数调用
+// foo = func(10);
+// LOAD_MODULE 1 // func
+// PUSH_CONSTANT 1 // 10
+// CALL 1
+// STORE_LOCAL 2 // foo
+
+// 对象方法和函数\类方法的不同在于对象方法会把self放在某个upvalue
+// 处理self.调用
+// class CFoo {
+// function foo(a) { print(self.b);}
+// static function foo2(a) { print(a);}
+// }
+// function foo3(a) {print(a);}
+// foo和另两个的差别在于后两个索引到的self upvalue是空的,而foo的
+// 能够索引到这个upvalue,
+//
+
+// 实例化
+// foo = new CClass(10, 30);
+// LOAD_MODULE 1 // CClass
+// PUSH_CONSTANT 4 // 10
+// PUSH_CONSTANT 5 // 30
+// INSTANTIATE 2
+// STORE_LOCAL 2 // foo
+
+
+// 创建enum\mask
+// enum EColor { White = 1, Blue = 2, Yellow = 3 }
+// CONSTANT "EColor"
+// ENUM // EColor
+// CONSTANT 1
+// STORE_FIELD "White" // White = 1
+// CONSTANT 2
+// STORE_FIELD "Blue" // Blue = 1
+// CONSTANT 3
+// STORE_FIELD "Yellow" // Yellow = 1
+// POP // EColor
+
+
+// 创建map
+// var foo = {"keyA" : 10, "keyB" : "hello"};
+// foo["keyC"] = 20;
+// MAP
+// CONSTANT 1 // 10
+// STORE_FIELD "keyA" // "keyA" : 10
+// CONSTANT "hello"
+// STORE_FIELD "keyB" // "keyB" : "hello"
+// LOAD_LOCAL 1 // foo
+// CONSTATN 20
+// STORE_FIELD "keyC"
+
+
+// 创建list\hashset
+// var foo = [1,2,3];
+// LIST
+// CONSTANT 1 // 1
+// STORE_FIELD
+// CONSTANT 2
+// STORE_FIELD
+// CONSTANT 3
+// STORE_FIELD
+
+
+// 构建闭包,实现观察者模式的方法
+// class CFoo {
+// function OnEnable() {
+// var this = self;
+// // self 这里会作为upvalue
+// onClick += function(...){this.OnClickCallback(...);};
+// }
+// }
+
+// self.用来索引self upvalue,如果是方法,就会索引对象
+// base.用来索引base upvalue
+// type.用来索引type upvalue
+// basetype.用来索引基类的upvalue
+
+// .运算符只能运用于对象或者map\list\hashset,会设置的upvalue:
+// * self
+
+// 类不能用::或者.索引对象方法,只能索引到static成员
+
+// 在init外部不能创建新的对象成员
+
+#endif \ No newline at end of file