2011
Dec
20

前言

这篇文章将会介绍 V8 Engine 读取 Javascript File,以及执行并取得执行结果。

ReadFile ,取得 Javascript File Function

使用 Google 官方给的 ReadFile Function。

  1. v8::Handle<v8::String> ReadFile(const char* name) {
  2.  
  3. FILE* file = fopen(name, "rb");
  4.  
  5. if (file == NULL) {
  6. return v8::Handle<v8::String>();
  7. }
  8.  
  9. fseek(file, 0, SEEK_END);
  10. int size = ftell(file);
  11. rewind(file);
  12.  
  13. char* chars = new char[size + 1];
  14. chars[size] = '\0';
  15.  
  16. for (int i = 0; i < size;) {
  17. int read = fread(&chars[i], 1, size - i, file);
  18. i += read;
  19. }
  20.  
  21. fclose(file);
  22.  
  23. v8::Handle<v8::String> result = v8::String::New(chars, size);
  24. delete[] chars;
  25. return result;
  26. }
  27.  

JavaScript Compile : 编译 c 语法去执行 JS

基本流程大概就是下列的四步。首先我们要先读取 Javascript原始内容,当然你也可以写死在 C code 里面,接著把 Javascript 语法放进 Compile 编译,如果编译有错的话,程式就会吐出 Error 讯息,正常编译结束,接著执行 Javascript 语法,这步就很像是浏览器执行的结果,最后呢,我们再把 Javascript中的资料取出来,这样就完成罗。

  • Source : Javascript 原始档
  • Script Compile : 编译 Javascript 语法
  • Script Run : 执行 Javascript 语法
  • result : 取得 Javascript 的变数值

c 语言范例程式 (请自已加上 ReadFile function),这个范例会读取 sc.js 档案,执行并去抓 Javascript 「result」 这个变数值,并且以 UTF8 字串的方式印出来。

  1. #include <iostream>
  2. #include "v8.h"
  3. using namespace std;
  4. using namespace v8;
  5. v8::Handle<v8::String> ReadFile(const char* name);
  6. int main (){
  7. HandleScope handle_scope;
  8. Persistent<Context> context= Context::New();
  9. Context::Scope context_scope(context);
  10. Handle<v8::String> source = ReadFile("sc.js");
  11. Handle<Script> script = Script::Compile(source);
  12. Handle<Value> result = script->Run();
  13. context.Dispose();
  14. String::Utf8Value str(result);
  15. script = Script::Compile(String::New("result"));
  16. result = script->Run();
  17. cout << *String::Utf8Value(result);
  18. return 0;
  19. }

Javascript Run: 测试 JS语法

有了执行的 C code ,接著我们就写一段 Javascript 来测试! 请记得Javascript 的档名要用 sc.js , JS 语法不要写错罗,这里没有用 Exception 处理,有错误的话,程式会直接当掉。

试一段简单的 JS

  1. var a=5;
  2. var b=6;
  3. var result=a+b;
  4. //执行结果 回传 11

测试 Javascript 内建的 function

测试一下,使用 Javascript 的function parseInt 看看。

  1. var a=5;
  2. var b=6;
  3. var result;
  4. var h="3aaa5";
  5. h=parseInt(h,10);
  6. result = a+b*h;
  7. //回传结果 23

测试 Javascript 物件

再试更复杂点的,试看看 Javascript 物件的使用与 Prototype。

  1. var result;
  2. function ob(){
  3. this.title="test";
  4. this.price=10;
  5. }
  6. var o=ob.prototype;
  7. o.addPrice=function(p){
  8. this.price+=p;
  9. }
  10. o.getPrice=function(){
  11. return this.price;
  12. }
  13.  
  14. o.getTitle=function(){
  15. return this.title;
  16. }
  17.  
  18. var os= new ob();
  19. os.addPrice(10);
  20. result=os.getPrice();
  21. //回传结果 20

回應 (Leave a comment)