Google v8 javascript Engine 관련 질문 드립니다.
조회수 2284회
안녕하세요.
구글에서 진행하는 오픈소스 프로젝트인 v8 javascript Engine 이란걸 사용중인데요.
사용을 하다가 막히는 부분이 있어 이렇게 질문을 드립니다.
전에 v8 자료를 찾는다고 여기 저기 물어봤지만 국내에서는 아시는분이 거의 없으셔서 답변을 받을 수 있을지 모르겠네요. 아시는 분께서는 꼭 답변 부탁드리겠습니다.(__).
일단 v8 버전은 5.4.0을 사용 중이구요.
v8 오픈소스를 다운받아 gyp를 이용해 visual studio 솔루션 파일로 생성하고, 해당 솔루션 파일을 빌드해lib와 h, dll을 추출하여 c++프로젝트에 적용했습니다.
목적은 c++에서 javascript를 실행하고 결과 값을 받을려고 합니다.
현재, 테스트 하고 있는 소스는 오픈소스에 있던 예제 shell.cc 파일을 사용하여 테스트를 하고있구요.
예제를 보니 js파일을 읽어들여 결과 값 확인이 가능한것을 확인하였습니다.
Function Template를 사용하여 별도로 만든 함수와 bind 하여 alert 같은 메소드는 처리를 하였지만, location.href 같은 속성의 값은 받아오지 못 하고 있습니다.
제가 알기론 Accessor를 이용하여, 속성에 접근 한뒤 값을 받아올수 있는 것으로 아는데 구글 홈페이지의 예문을 적용하면 오버로링 되지않은 인스턴스 입니다.
라며 오류가 나는 상황이고, 예전에 Handle<Object Template>
같이 쓰거나 isolate
를 사용하지 않을 때의 자료를 찾아 참고하면서 소스를 수정하였지만 속성값에 접근을 못하고 실행시 프로그램 작동이 중지되었습니다. 라며 오류가 나는 상황입니다.
일단 v8 참고 자료 링크 입니다.
전체 코드 입니다.
디버깅을 해보면 오류는
// Creates a new execution environment containing the built-in
// functions.
v8::Local<v8::Context> CreateShellContext(v8::Isolate* isolate) {
// Create a template for the global object.
v8::Local<v8::ObjectTemplate> global = v8::ObjectTemplate::New(isolate);
// Bind the global 'print' function to the C++ Print callback.
global->Set(
v8::String::NewFromUtf8(isolate, "print", v8::NewStringType::kNormal)
.ToLocalChecked(),
v8::FunctionTemplate::New(isolate, Print));
// Bind the global 'read' function to the C++ Read callback.
global->Set(v8::String::NewFromUtf8(
isolate, "read", v8::NewStringType::kNormal).ToLocalChecked(),
v8::FunctionTemplate::New(isolate, Read));
// Bind the global 'load' function to the C++ Load callback.
global->Set(v8::String::NewFromUtf8(
isolate, "load", v8::NewStringType::kNormal).ToLocalChecked(),
v8::FunctionTemplate::New(isolate, Load));
// Bind the 'quit' function
global->Set(v8::String::NewFromUtf8(
isolate, "quit", v8::NewStringType::kNormal).ToLocalChecked(),
v8::FunctionTemplate::New(isolate, Quit));
// Bind the 'version' function
global->Set(
v8::String::NewFromUtf8(isolate, "version", v8::NewStringType::kNormal)
.ToLocalChecked(),
v8::FunctionTemplate::New(isolate, Version));
// Bind the 'Alert' function
global->Set(
v8::String::NewFromUtf8(isolate, "alert", v8::NewStringType::kNormal)
.ToLocalChecked(),
v8::FunctionTemplate::New(isolate, Alert));
// Bind the 'Prompt' function
global->Set(
v8::String::NewFromUtf8(isolate, "prompt", v8::NewStringType::kNormal)
.ToLocalChecked(),
v8::FunctionTemplate::New(isolate, Prompt));
// Bind the 'location' function
v8::Local<v8::ObjectTemplate> MLTempl = MakeLocationObjectTemplate(isolate);
v8::Local<v8::Object> MLObject = MLTempl->NewInstance();
global->Set(
v8::String::NewFromUtf8(isolate, "location", v8::NewStringType::kInternalized)
.ToLocalChecked(), MLObject);
return v8::Context::New(isolate, NULL, global);
}
코드 중에서
v8::Local<v8::Object> MLObject = MLTempl->NewInstance();
이 부분에서 발생하고 있구요. 실 발생 지점을 찾아 들어가 보면 isolate-inl.h의 110번째 라인인
NATIVE_CONTEXT_FIELDS (NATIVE_CONTEXT_FIELD_ACCESSOR)
이 부분에서 오류가 발생합니다.
어떤 부분이 문제 일까요? 얼추 보기에 초기화 쪽 관련이 있는거 같은데 자료가 참 찾기 힘드네요.
아니면 v8 javascript engine의 accessor 사용하는 예제 자료라도 링크 해주시면 정말 감사드리겠습니다. (제가 검색을 못 하는 건지 아니면 자료가 정말로 없는건지.. ㅠㅠ)
-
(•́ ✖ •̀)
알 수 없는 사용자
댓글 입력