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)