2011
Dec
20
前言
這篇文章將會介紹 V8 Engine 讀取 Javascript File,以及執行並取得執行結果。
ReadFile ,取得 Javascript File Function
使用 Google 官方給的 ReadFile Function。
- v8::Handle<v8::String> ReadFile(const char* name) {
- FILE* file = fopen(name, "rb");
- if (file == NULL) {
- return v8::Handle<v8::String>();
- }
- fseek(file, 0, SEEK_END);
- int size = ftell(file);
- rewind(file);
- char* chars = new char[size + 1];
- chars[size] = '\0';
- for (int i = 0; i < size;) {
- int read = fread(&chars[i], 1, size - i, file);
- i += read;
- }
- fclose(file);
- v8::Handle<v8::String> result = v8::String::New(chars, size);
- delete[] chars;
- return result;
- }
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 字串的方式印出來。
- #include <iostream>
- #include "v8.h"
- using namespace std;
- using namespace v8;
- v8::Handle<v8::String> ReadFile(const char* name);
- int main (){
- HandleScope handle_scope;
- Persistent<Context> context= Context::New();
- Context::Scope context_scope(context);
- Handle<v8::String> source = ReadFile("sc.js");
- Handle<Script> script = Script::Compile(source);
- Handle<Value> result = script->Run();
- context.Dispose();
- String::Utf8Value str(result);
- script = Script::Compile(String::New("result"));
- result = script->Run();
- cout << *String::Utf8Value(result);
- return 0;
- }
Javascript Run: 測試 JS語法
有了執行的 C code ,接著我們就寫一段 Javascript 來測試! 請記得Javascript 的檔名要用 sc.js , JS 語法不要寫錯囉,這裡沒有用 Exception 處理,有錯誤的話,程式會直接當掉。
試一段簡單的 JS
- var a=5;
- var b=6;
- var result=a+b;
- //執行結果 回傳 11
測試 Javascript 內建的 function
測試一下,使用 Javascript 的function parseInt 看看。
- var a=5;
- var b=6;
- var result;
- var h="3aaa5";
- h=parseInt(h,10);
- result = a+b*h;
- //回傳結果 23
測試 Javascript 物件
再試更復雜點的,試看看 Javascript 物件的使用與 Prototype。
- var result;
- function ob(){
- this.title="test";
- this.price=10;
- }
- var o=ob.prototype;
- o.addPrice=function(p){
- this.price+=p;
- }
- o.getPrice=function(){
- return this.price;
- }
- o.getTitle=function(){
- return this.title;
- }
- var os= new ob();
- os.addPrice(10);
- result=os.getPrice();
- //回傳結果 20