diff options
Diffstat (limited to 'src/nb_opcode.h')
-rw-r--r-- | src/nb_opcode.h | 224 |
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 |