| OLD | NEW |
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 | 6 |
| 7 #include "xfa/fxjse/class.h" | 7 #include "xfa/fxjse/class.h" |
| 8 | 8 |
| 9 #include "xfa/fxjse/cfxjse_arguments.h" | 9 #include "xfa/fxjse/cfxjse_arguments.h" |
| 10 #include "xfa/fxjse/context.h" | 10 #include "xfa/fxjse/context.h" |
| (...skipping 24 matching lines...) Expand all Loading... |
| 35 static_cast<FXJSE_FUNCTION_DESCRIPTOR*>( | 35 static_cast<FXJSE_FUNCTION_DESCRIPTOR*>( |
| 36 info.Data().As<v8::External>()->Value()); | 36 info.Data().As<v8::External>()->Value()); |
| 37 if (!lpFunctionInfo) { | 37 if (!lpFunctionInfo) { |
| 38 return; | 38 return; |
| 39 } | 39 } |
| 40 CFX_ByteStringC szFunctionName(lpFunctionInfo->name); | 40 CFX_ByteStringC szFunctionName(lpFunctionInfo->name); |
| 41 std::unique_ptr<CFXJSE_Value> lpThisValue( | 41 std::unique_ptr<CFXJSE_Value> lpThisValue( |
| 42 new CFXJSE_Value(info.GetIsolate())); | 42 new CFXJSE_Value(info.GetIsolate())); |
| 43 lpThisValue->ForceSetValue(info.This()); | 43 lpThisValue->ForceSetValue(info.This()); |
| 44 std::unique_ptr<CFXJSE_Value> lpRetValue(new CFXJSE_Value(info.GetIsolate())); | 44 std::unique_ptr<CFXJSE_Value> lpRetValue(new CFXJSE_Value(info.GetIsolate())); |
| 45 CFXJSE_ArgumentsImpl impl = {&info, lpRetValue.get()}; | 45 CFXJSE_Arguments impl(&info, lpRetValue.get()); |
| 46 lpFunctionInfo->callbackProc(lpThisValue.get(), szFunctionName, | 46 lpFunctionInfo->callbackProc(lpThisValue.get(), szFunctionName, impl); |
| 47 reinterpret_cast<CFXJSE_Arguments&>(impl)); | |
| 48 if (!lpRetValue->DirectGetValue().IsEmpty()) { | 47 if (!lpRetValue->DirectGetValue().IsEmpty()) { |
| 49 info.GetReturnValue().Set(lpRetValue->DirectGetValue()); | 48 info.GetReturnValue().Set(lpRetValue->DirectGetValue()); |
| 50 } | 49 } |
| 51 } | 50 } |
| 52 | 51 |
| 53 static void FXJSE_V8ClassGlobalConstructorCallback_Wrapper( | 52 static void FXJSE_V8ClassGlobalConstructorCallback_Wrapper( |
| 54 const v8::FunctionCallbackInfo<v8::Value>& info) { | 53 const v8::FunctionCallbackInfo<v8::Value>& info) { |
| 55 const FXJSE_CLASS_DESCRIPTOR* lpClassDefinition = | 54 const FXJSE_CLASS_DESCRIPTOR* lpClassDefinition = |
| 56 static_cast<FXJSE_CLASS_DESCRIPTOR*>( | 55 static_cast<FXJSE_CLASS_DESCRIPTOR*>( |
| 57 info.Data().As<v8::External>()->Value()); | 56 info.Data().As<v8::External>()->Value()); |
| 58 if (!lpClassDefinition) { | 57 if (!lpClassDefinition) { |
| 59 return; | 58 return; |
| 60 } | 59 } |
| 61 CFX_ByteStringC szFunctionName(lpClassDefinition->name); | 60 CFX_ByteStringC szFunctionName(lpClassDefinition->name); |
| 62 std::unique_ptr<CFXJSE_Value> lpThisValue( | 61 std::unique_ptr<CFXJSE_Value> lpThisValue( |
| 63 new CFXJSE_Value(info.GetIsolate())); | 62 new CFXJSE_Value(info.GetIsolate())); |
| 64 lpThisValue->ForceSetValue(info.This()); | 63 lpThisValue->ForceSetValue(info.This()); |
| 65 std::unique_ptr<CFXJSE_Value> lpRetValue(new CFXJSE_Value(info.GetIsolate())); | 64 std::unique_ptr<CFXJSE_Value> lpRetValue(new CFXJSE_Value(info.GetIsolate())); |
| 66 CFXJSE_ArgumentsImpl impl = {&info, lpRetValue.get()}; | 65 CFXJSE_Arguments impl(&info, lpRetValue.get()); |
| 67 lpClassDefinition->constructor(lpThisValue.get(), szFunctionName, | 66 lpClassDefinition->constructor(lpThisValue.get(), szFunctionName, impl); |
| 68 reinterpret_cast<CFXJSE_Arguments&>(impl)); | |
| 69 if (!lpRetValue->DirectGetValue().IsEmpty()) { | 67 if (!lpRetValue->DirectGetValue().IsEmpty()) { |
| 70 info.GetReturnValue().Set(lpRetValue->DirectGetValue()); | 68 info.GetReturnValue().Set(lpRetValue->DirectGetValue()); |
| 71 } | 69 } |
| 72 } | 70 } |
| 73 | 71 |
| 74 static void FXJSE_V8GetterCallback_Wrapper( | 72 static void FXJSE_V8GetterCallback_Wrapper( |
| 75 v8::Local<v8::String> property, | 73 v8::Local<v8::String> property, |
| 76 const v8::PropertyCallbackInfo<v8::Value>& info) { | 74 const v8::PropertyCallbackInfo<v8::Value>& info) { |
| 77 const FXJSE_PROPERTY_DESCRIPTOR* lpPropertyInfo = | 75 const FXJSE_PROPERTY_DESCRIPTOR* lpPropertyInfo = |
| 78 static_cast<FXJSE_PROPERTY_DESCRIPTOR*>( | 76 static_cast<FXJSE_PROPERTY_DESCRIPTOR*>( |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 116 static_cast<FXJSE_CLASS_DESCRIPTOR*>( | 114 static_cast<FXJSE_CLASS_DESCRIPTOR*>( |
| 117 info.Data().As<v8::External>()->Value()); | 115 info.Data().As<v8::External>()->Value()); |
| 118 if (!lpClassDefinition) { | 116 if (!lpClassDefinition) { |
| 119 return; | 117 return; |
| 120 } | 118 } |
| 121 ASSERT(info.This()->InternalFieldCount()); | 119 ASSERT(info.This()->InternalFieldCount()); |
| 122 info.This()->SetAlignedPointerInInternalField(0, NULL); | 120 info.This()->SetAlignedPointerInInternalField(0, NULL); |
| 123 } | 121 } |
| 124 | 122 |
| 125 v8::Isolate* CFXJSE_Arguments::GetRuntime() const { | 123 v8::Isolate* CFXJSE_Arguments::GetRuntime() const { |
| 126 const CFXJSE_ArgumentsImpl* lpArguments = | 124 return m_pRetValue->GetIsolate(); |
| 127 reinterpret_cast<const CFXJSE_ArgumentsImpl* const>(this); | |
| 128 return lpArguments->m_pRetValue->GetIsolate(); | |
| 129 } | 125 } |
| 130 | 126 |
| 131 int32_t CFXJSE_Arguments::GetLength() const { | 127 int32_t CFXJSE_Arguments::GetLength() const { |
| 132 const CFXJSE_ArgumentsImpl* lpArguments = | 128 return m_pInfo->Length(); |
| 133 reinterpret_cast<const CFXJSE_ArgumentsImpl* const>(this); | |
| 134 return lpArguments->m_pInfo->Length(); | |
| 135 } | 129 } |
| 136 | 130 |
| 137 std::unique_ptr<CFXJSE_Value> CFXJSE_Arguments::GetValue(int32_t index) const { | 131 std::unique_ptr<CFXJSE_Value> CFXJSE_Arguments::GetValue(int32_t index) const { |
| 138 const CFXJSE_ArgumentsImpl* lpArguments = | |
| 139 reinterpret_cast<const CFXJSE_ArgumentsImpl* const>(this); | |
| 140 std::unique_ptr<CFXJSE_Value> lpArgValue( | 132 std::unique_ptr<CFXJSE_Value> lpArgValue( |
| 141 new CFXJSE_Value(v8::Isolate::GetCurrent())); | 133 new CFXJSE_Value(v8::Isolate::GetCurrent())); |
| 142 lpArgValue->ForceSetValue((*lpArguments->m_pInfo)[index]); | 134 lpArgValue->ForceSetValue((*m_pInfo)[index]); |
| 143 return lpArgValue; | 135 return lpArgValue; |
| 144 } | 136 } |
| 145 | 137 |
| 146 FX_BOOL CFXJSE_Arguments::GetBoolean(int32_t index) const { | 138 FX_BOOL CFXJSE_Arguments::GetBoolean(int32_t index) const { |
| 147 const CFXJSE_ArgumentsImpl* lpArguments = | 139 return (*m_pInfo)[index]->BooleanValue(); |
| 148 reinterpret_cast<const CFXJSE_ArgumentsImpl* const>(this); | |
| 149 return (*lpArguments->m_pInfo)[index]->BooleanValue(); | |
| 150 } | 140 } |
| 151 | 141 |
| 152 int32_t CFXJSE_Arguments::GetInt32(int32_t index) const { | 142 int32_t CFXJSE_Arguments::GetInt32(int32_t index) const { |
| 153 const CFXJSE_ArgumentsImpl* lpArguments = | 143 return static_cast<int32_t>((*m_pInfo)[index]->NumberValue()); |
| 154 reinterpret_cast<const CFXJSE_ArgumentsImpl* const>(this); | |
| 155 return static_cast<int32_t>((*lpArguments->m_pInfo)[index]->NumberValue()); | |
| 156 } | 144 } |
| 157 | 145 |
| 158 FX_FLOAT CFXJSE_Arguments::GetFloat(int32_t index) const { | 146 FX_FLOAT CFXJSE_Arguments::GetFloat(int32_t index) const { |
| 159 const CFXJSE_ArgumentsImpl* lpArguments = | 147 return static_cast<FX_FLOAT>((*m_pInfo)[index]->NumberValue()); |
| 160 reinterpret_cast<const CFXJSE_ArgumentsImpl* const>(this); | |
| 161 return static_cast<FX_FLOAT>((*lpArguments->m_pInfo)[index]->NumberValue()); | |
| 162 } | 148 } |
| 163 | 149 |
| 164 CFX_ByteString CFXJSE_Arguments::GetUTF8String(int32_t index) const { | 150 CFX_ByteString CFXJSE_Arguments::GetUTF8String(int32_t index) const { |
| 165 const CFXJSE_ArgumentsImpl* lpArguments = | 151 v8::Local<v8::String> hString = (*m_pInfo)[index]->ToString(); |
| 166 reinterpret_cast<const CFXJSE_ArgumentsImpl* const>(this); | |
| 167 v8::Local<v8::String> hString = (*lpArguments->m_pInfo)[index]->ToString(); | |
| 168 v8::String::Utf8Value szStringVal(hString); | 152 v8::String::Utf8Value szStringVal(hString); |
| 169 return CFX_ByteString(*szStringVal); | 153 return CFX_ByteString(*szStringVal); |
| 170 } | 154 } |
| 171 | 155 |
| 172 void* CFXJSE_Arguments::GetObject(int32_t index, CFXJSE_Class* pClass) const { | 156 void* CFXJSE_Arguments::GetObject(int32_t index, CFXJSE_Class* pClass) const { |
| 173 const CFXJSE_ArgumentsImpl* lpArguments = | 157 v8::Local<v8::Value> hValue = (*m_pInfo)[index]; |
| 174 reinterpret_cast<const CFXJSE_ArgumentsImpl* const>(this); | |
| 175 v8::Local<v8::Value> hValue = (*lpArguments->m_pInfo)[index]; | |
| 176 ASSERT(!hValue.IsEmpty()); | 158 ASSERT(!hValue.IsEmpty()); |
| 177 if (!hValue->IsObject()) { | 159 if (!hValue->IsObject()) |
| 178 return NULL; | 160 return nullptr; |
| 179 } | |
| 180 return FXJSE_RetrieveObjectBinding(hValue.As<v8::Object>(), pClass); | 161 return FXJSE_RetrieveObjectBinding(hValue.As<v8::Object>(), pClass); |
| 181 } | 162 } |
| 182 | 163 |
| 183 CFXJSE_Value* CFXJSE_Arguments::GetReturnValue() { | 164 CFXJSE_Value* CFXJSE_Arguments::GetReturnValue() { |
| 184 const CFXJSE_ArgumentsImpl* lpArguments = | 165 return m_pRetValue; |
| 185 reinterpret_cast<const CFXJSE_ArgumentsImpl* const>(this); | |
| 186 return lpArguments->m_pRetValue; | |
| 187 } | 166 } |
| 167 |
| 188 static void FXJSE_Context_GlobalObjToString( | 168 static void FXJSE_Context_GlobalObjToString( |
| 189 const v8::FunctionCallbackInfo<v8::Value>& info) { | 169 const v8::FunctionCallbackInfo<v8::Value>& info) { |
| 190 const FXJSE_CLASS_DESCRIPTOR* lpClass = static_cast<FXJSE_CLASS_DESCRIPTOR*>( | 170 const FXJSE_CLASS_DESCRIPTOR* lpClass = static_cast<FXJSE_CLASS_DESCRIPTOR*>( |
| 191 info.Data().As<v8::External>()->Value()); | 171 info.Data().As<v8::External>()->Value()); |
| 192 if (!lpClass) { | 172 if (!lpClass) { |
| 193 return; | 173 return; |
| 194 } | 174 } |
| 195 if (info.This() == info.Holder() && lpClass->name) { | 175 if (info.This() == info.Holder() && lpClass->name) { |
| 196 CFX_ByteString szStringVal; | 176 CFX_ByteString szStringVal; |
| 197 szStringVal.Format("[object %s]", lpClass->name); | 177 szStringVal.Format("[object %s]", lpClass->name); |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 298 } | 278 } |
| 299 | 279 |
| 300 CFXJSE_Class* CFXJSE_Class::GetClassFromContext(CFXJSE_Context* pContext, | 280 CFXJSE_Class* CFXJSE_Class::GetClassFromContext(CFXJSE_Context* pContext, |
| 301 const CFX_ByteStringC& szName) { | 281 const CFX_ByteStringC& szName) { |
| 302 for (const auto& pClass : pContext->m_rgClasses) { | 282 for (const auto& pClass : pContext->m_rgClasses) { |
| 303 if (pClass->m_szClassName == szName) | 283 if (pClass->m_szClassName == szName) |
| 304 return pClass.get(); | 284 return pClass.get(); |
| 305 } | 285 } |
| 306 return nullptr; | 286 return nullptr; |
| 307 } | 287 } |
| OLD | NEW |