627 |
627 |
628 var fs=require("fs"); |
628 var fs=require("fs"); |
629 var sys=require("sys"); |
629 var sys=require("sys"); |
630 var c = new LBinaryChunk(testvm, fs.readFileSync("luac.out", "binary")); |
630 var c = new LBinaryChunk(testvm, fs.readFileSync("luac.out", "binary")); |
631 |
631 |
632 var default_environment = testvm.LValue({}); |
632 var _G = testvm.LValue({}); |
633 |
633 |
634 // Standard library |
634 // Standard library |
635 |
635 |
636 var baselib = { |
636 var baselib = { |
637 print: function () |
637 print: function () |
661 throw message; |
661 throw message; |
662 return [expr]; |
662 return [expr]; |
663 } |
663 } |
664 }; |
664 }; |
665 |
665 |
666 for(var name in baselib) |
666 var math = { |
667 { |
667 ldexp: function (m, e) |
668 default_environment.setIndex(testvm.LValue(name), testvm.LValue(baselib[name])); |
668 { |
669 } |
669 sys.puts("ldexp(): m: "+sys.inspect(m)+" e: "+sys.inspect(e)); |
|
670 return [this.LValue(m.value*Math.pow(2, e.value))]; |
|
671 }, |
|
672 floor: function (x) |
|
673 { |
|
674 return [this.LValue(Math.floor(x.value))]; |
|
675 } |
|
676 }; |
|
677 |
|
678 testvm.registerLib(_G, null, baselib); |
|
679 testvm.registerLib(_G, "math", math); |
670 |
680 |
671 // Metatable on environment to print out nil global accesses |
681 // Metatable on environment to print out nil global accesses |
672 var mt = testvm.LValue({}); |
682 var mt = testvm.LValue({}); |
673 mt.setIndex( |
683 mt.setIndex( |
674 testvm.LValue("__index"), |
684 testvm.LValue("__index"), |
675 testvm.LValue(function (t, k) { sys.puts("Access of nil global: "+k); }) |
685 testvm.LValue(function (t, k) { sys.puts("Access of nil global: "+k); }) |
676 ); |
686 ); |
677 default_environment.setMetatable(mt); |
687 _G.setMetatable(mt); |
678 |
688 |
679 |
689 |
680 var f = new LFunction(testvm, c, default_environment); |
690 var f = new LFunction(testvm, c, _G); |
681 |
691 |
682 var ret = testvm.call(f); |
692 var ret = testvm.call(f); |
683 if(ret) |
693 if(ret) |
684 sys.puts("Returned: "+sys.inspect(ret)); |
694 sys.puts("Returned: "+sys.inspect(ret)); |
685 } |
695 } |