Google v8 javascript Engine 관련 질문 드립니다.

조회수 2261회

안녕하세요.

구글에서 진행하는 오픈소스 프로젝트인 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 사용하는 예제 자료라도 링크 해주시면 정말 감사드리겠습니다. (제가 검색을 못 하는 건지 아니면 자료가 정말로 없는건지.. ㅠㅠ)

  • (•́ ✖ •̀)
    알 수 없는 사용자
  • 아무래도 아시는 분이 안게시나 보네요 ㅠ_ㅠ 알 수 없는 사용자 2016.9.5 17:34
  • 예제쪽으로는 참고하실 수 있는 자료같아서 구글 크롬 코드 검색엔진을 링크해드립니다. Xref도 볼수 있어요! http://cs.chromium.org/ 알 수 없는 사용자 2016.9.17 01:31
  • 문제 해결했습니다 ^^ 답변 주셔서 감사합니다. 위의 오류는 Context 잘못 된 사용 때문에 Accessor 접근이 안되어서 그런거 같습니다. Context를 통일해 주니 정상적으로 나오네요. 알 수 없는 사용자 2016.9.19 09:25

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)