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